/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ref/conv_common.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ref/conv_common.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ref/conv_common.hpp Source File
conv_common.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.
3 
4 #pragma once
5 
6 #include "ck_tile/core.hpp"
7 #include <array>
8 #include <vector>
9 
10 namespace ck_tile {
11 
12 // Helper function to convert std::vector to std::array for kernel parameters
13 template <ck_tile::index_t NDimSpatial>
14 inline std::array<ck_tile::long_index_t, NDimSpatial>
15 to_array(const std::vector<ck_tile::long_index_t>& vec)
16 {
17  std::array<ck_tile::long_index_t, NDimSpatial> arr;
18  for(ck_tile::index_t i = 0; i < NDimSpatial; ++i)
19  {
20  arr[i] = vec[i];
21  }
22  return arr;
23 }
24 
25 // Helper to fill missing dimensions with default value
26 template <ck_tile::index_t NDimSpatial>
27 inline std::array<ck_tile::long_index_t, NDimSpatial>
28 to_array_with_default(const std::vector<ck_tile::long_index_t>& vec,
29  ck_tile::long_index_t default_val = 1)
30 {
31  std::array<ck_tile::long_index_t, NDimSpatial> arr;
32  for(ck_tile::index_t i = 0; i < NDimSpatial; ++i)
33  {
34  arr[i] = (static_cast<size_t>(i) < vec.size()) ? vec[i] : default_val;
35  }
36  return arr;
37 }
38 
39 // Index calculation helpers for GPU reference kernels
40 namespace detail {
41 
42 // Calculate linear input index for grouped convolution
43 // Layout: [N, spatial..., G, C]
44 template <index_t NDimSpatial>
45 inline __device__ long_index_t
47  index_t g,
48  index_t c,
49  const std::array<index_t, NDimSpatial>& spatial_idx,
50  const std::array<long_index_t, NDimSpatial + 3>& strides)
51 {
52  long_index_t idx = n * strides[0];
53  for(index_t i = 0; i < NDimSpatial; ++i)
54  idx += spatial_idx[i] * strides[i + 1];
55  idx += g * strides[NDimSpatial + 1] + c;
56  return idx;
57 }
58 
59 // Calculate linear weight index for grouped convolution
60 // Layout: [G, K, spatial..., C]
61 template <index_t NDimSpatial>
62 inline __device__ long_index_t
64  index_t k,
65  index_t c,
66  const std::array<index_t, NDimSpatial>& spatial_idx,
67  const std::array<long_index_t, NDimSpatial + 3>& strides)
68 {
69  long_index_t idx = g * strides[0] + k * strides[1];
70  for(index_t i = 0; i < NDimSpatial; ++i)
71  idx += spatial_idx[i] * strides[i + 2];
72  idx += c * strides[NDimSpatial + 2];
73  return idx;
74 }
75 
76 // Calculate linear output index for grouped convolution
77 // Layout: [N, spatial..., G, K]
78 template <index_t NDimSpatial>
79 inline __device__ long_index_t
81  index_t g,
82  index_t k,
83  const std::array<index_t, NDimSpatial>& spatial_idx,
84  const std::array<long_index_t, NDimSpatial + 3>& strides)
85 {
86  long_index_t idx = n * strides[0];
87  for(index_t i = 0; i < NDimSpatial; ++i)
88  idx += spatial_idx[i] * strides[i + 1];
89  idx += g * strides[NDimSpatial + 1] + k;
90  return idx;
91 }
92 
93 } // namespace detail
94 
95 } // namespace ck_tile
__device__ long_index_t calculate_weight_index(index_t g, index_t k, index_t c, const std::array< index_t, NDimSpatial > &spatial_idx, const std::array< long_index_t, NDimSpatial+3 > &strides)
Definition: conv_common.hpp:63
__device__ long_index_t calculate_input_index(index_t n, index_t g, index_t c, const std::array< index_t, NDimSpatial > &spatial_idx, const std::array< long_index_t, NDimSpatial+3 > &strides)
Definition: conv_common.hpp:46
__device__ long_index_t calculate_output_index(index_t n, index_t g, index_t k, const std::array< index_t, NDimSpatial > &spatial_idx, const std::array< long_index_t, NDimSpatial+3 > &strides)
Definition: conv_common.hpp:80
Definition: cluster_descriptor.hpp:13
constexpr CK_TILE_HOST_DEVICE auto to_array(const std::vector< X > &x)
Definition: array.hpp:286
int32_t index_t
Definition: integer.hpp:9
std::array< ck_tile::long_index_t, NDimSpatial > to_array_with_default(const std::vector< ck_tile::long_index_t > &vec, ck_tile::long_index_t default_val=1)
Definition: conv_common.hpp:28
int64_t long_index_t
Definition: integer.hpp:11