Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout > Class Template Reference

#include <TensorConvolution.h>

Public Member Functions

 IndexMapper (const InputDims &input_dims, const array< Index, NumKernelDims > &kernel_dims, const array< Index, NumKernelDims > &indices)
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputPlaneToTensorInputOffset (Index p) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputPlaneToTensorOutputOffset (Index p) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset (Index i) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset (Index i) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset (Index i, Index j) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset (Index i, Index j) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset (Index i, Index j, Index k) const
 
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset (Index i, Index j, Index k) const
 

Private Attributes

array< Index, NumDimsm_inputStrides
 
array< Index, NumDimsm_outputStrides
 
array< Index, NumDimsm_gpuInputStrides
 
array< Index, NumDimsm_gpuOutputStrides
 

Static Private Attributes

static constexpr int NumDims = internal::array_size<InputDims>::value
 

Constructor & Destructor Documentation

◆ IndexMapper()

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::IndexMapper ( const InputDims &  input_dims,
const array< Index, NumKernelDims > &  kernel_dims,
const array< Index, NumKernelDims > &  indices 
)
inline
31  {
32  array<Index, NumDims> dimensions = input_dims;
33  for (int i = 0; i < NumKernelDims; ++i) {
34  const Index index = indices[i];
35  const Index input_dim = input_dims[index];
36  const Index kernel_dim = kernel_dims[i];
37  const Index result_dim = input_dim - kernel_dim + 1;
38  dimensions[index] = result_dim;
39  }
40 
41  array<Index, NumDims> inputStrides;
42  array<Index, NumDims> outputStrides;
43  if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
44  inputStrides[0] = 1;
45  outputStrides[0] = 1;
46  for (int i = 1; i < NumDims; ++i) {
47  inputStrides[i] = inputStrides[i - 1] * input_dims[i - 1];
48  outputStrides[i] = outputStrides[i - 1] * dimensions[i - 1];
49  }
50  } else {
51  inputStrides[NumDims - 1] = 1;
52  outputStrides[NumDims - 1] = 1;
53  for (int i = static_cast<int>(NumDims) - 2; i >= 0; --i) {
54  inputStrides[i] = inputStrides[i + 1] * input_dims[i + 1];
55  outputStrides[i] = outputStrides[i + 1] * dimensions[i + 1];
56  }
57  }
58 
59  array<Index, NumDims> gpuInputDimensions;
60  array<Index, NumDims> gpuOutputDimensions;
61  array<Index, NumDims> tmp = dimensions;
62  array<Index, NumDims> ordering;
63  const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
64  for (int i = 0; i < NumKernelDims; ++i) {
65  const Index index = i + offset;
66  ordering[index] = indices[i];
67  tmp[indices[i]] = -1;
68  gpuInputDimensions[index] = input_dims[indices[i]];
69  gpuOutputDimensions[index] = dimensions[indices[i]];
70  }
71 
72  int written = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? NumKernelDims : 0;
73  for (int i = 0; i < NumDims; ++i) {
74  if (tmp[i] >= 0) {
75  ordering[written] = i;
76  gpuInputDimensions[written] = input_dims[i];
77  gpuOutputDimensions[written] = dimensions[i];
78  ++written;
79  }
80  }
81 
82  for (int i = 0; i < NumDims; ++i) {
83  m_inputStrides[i] = inputStrides[ordering[i]];
84  m_outputStrides[i] = outputStrides[ordering[i]];
85  }
86 
87  if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
88  for (int i = 0; i < NumDims; ++i) {
89  if (i > NumKernelDims) {
90  m_gpuInputStrides[i] = m_gpuInputStrides[i - 1] * gpuInputDimensions[i - 1];
91  m_gpuOutputStrides[i] = m_gpuOutputStrides[i - 1] * gpuOutputDimensions[i - 1];
92  } else {
93  m_gpuInputStrides[i] = 1;
94  m_gpuOutputStrides[i] = 1;
95  }
96  }
97  } else {
98  for (int i = NumDims - 1; i >= 0; --i) {
99  if (static_cast<size_t>(i + 1) < offset) {
100  m_gpuInputStrides[i] = m_gpuInputStrides[i + 1] * gpuInputDimensions[i + 1];
101  m_gpuOutputStrides[i] = m_gpuOutputStrides[i + 1] * gpuOutputDimensions[i + 1];
102  } else {
103  m_gpuInputStrides[i] = 1;
104  m_gpuOutputStrides[i] = 1;
105  }
106  }
107  }
108  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
array< Index, NumDims > m_inputStrides
Definition: TensorConvolution.h:194
array< Index, NumDims > m_gpuOutputStrides
Definition: TensorConvolution.h:197
array< Index, NumDims > m_outputStrides
Definition: TensorConvolution.h:195
static constexpr int NumDims
Definition: TensorConvolution.h:193
array< Index, NumDims > m_gpuInputStrides
Definition: TensorConvolution.h:196
@ ColMajor
Definition: Constants.h:318
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References Eigen::ColMajor, i, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuInputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuOutputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_inputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_outputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims, and tmp.

Member Function Documentation

◆ mapGpuInputKernelToTensorInputOffset() [1/3]

◆ mapGpuInputKernelToTensorInputOffset() [2/3]

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuInputKernelToTensorInputOffset ( Index  i,
Index  j 
) const
inline
172  {
173  const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
174  return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1];
175  }
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::ColMajor, i, j, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_inputStrides, and Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims.

◆ mapGpuInputKernelToTensorInputOffset() [3/3]

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuInputKernelToTensorInputOffset ( Index  i,
Index  j,
Index  k 
) const
inline
182  {
183  const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
184  return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1] + k * m_inputStrides[offset + 2];
185  }
char char char int int * k
Definition: level2_impl.h:374

References Eigen::ColMajor, i, j, k, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_inputStrides, and Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims.

◆ mapGpuInputPlaneToTensorInputOffset()

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuInputPlaneToTensorInputOffset ( Index  p) const
inline
110  {
111  Index inputIndex = 0;
112  if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
113  for (int d = NumDims - 1; d > NumKernelDims; --d) {
114  const Index idx = p / m_gpuInputStrides[d];
115  inputIndex += idx * m_inputStrides[d];
116  p -= idx * m_gpuInputStrides[d];
117  }
118  if (NumKernelDims < NumDims) {
119  inputIndex += p * m_inputStrides[NumKernelDims];
120  }
121  } else {
122  std::ptrdiff_t limit = 0;
123  if (NumKernelDims < NumDims) {
124  limit = NumDims - NumKernelDims - 1;
125  }
126  for (int d = 0; d < limit; ++d) {
127  const Index idx = p / m_gpuInputStrides[d];
128  inputIndex += idx * m_inputStrides[d];
129  p -= idx * m_gpuInputStrides[d];
130  }
131  inputIndex += p * m_inputStrides[limit];
132  }
133  return inputIndex;
134  }
float * p
Definition: Tutorial_Map_using.cpp:9

References Eigen::ColMajor, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuInputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_inputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims, and p.

Referenced by Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV1D >::operator()(), Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV2D >::operator()(), and Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV3D >::operator()().

◆ mapGpuOutputKernelToTensorOutputOffset() [1/3]

◆ mapGpuOutputKernelToTensorOutputOffset() [2/3]

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuOutputKernelToTensorOutputOffset ( Index  i,
Index  j 
) const
inline
177  {
178  const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
179  return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1];
180  }

References Eigen::ColMajor, i, j, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_outputStrides, and Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims.

◆ mapGpuOutputKernelToTensorOutputOffset() [3/3]

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuOutputKernelToTensorOutputOffset ( Index  i,
Index  j,
Index  k 
) const
inline
187  {
188  const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
189  return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1] + k * m_outputStrides[offset + 2];
190  }

References Eigen::ColMajor, i, j, k, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_outputStrides, and Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims.

◆ mapGpuOutputPlaneToTensorOutputOffset()

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::mapGpuOutputPlaneToTensorOutputOffset ( Index  p) const
inline
136  {
137  Index outputIndex = 0;
138  if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
139  for (int d = NumDims - 1; d > NumKernelDims; --d) {
140  const Index idx = p / m_gpuOutputStrides[d];
141  outputIndex += idx * m_outputStrides[d];
142  p -= idx * m_gpuOutputStrides[d];
143  }
144  if (NumKernelDims < NumDims) {
145  outputIndex += p * m_outputStrides[NumKernelDims];
146  }
147  } else {
148  std::ptrdiff_t limit = 0;
149  if (NumKernelDims < NumDims) {
150  limit = NumDims - NumKernelDims - 1;
151  }
152  for (int d = 0; d < limit; ++d) {
153  const Index idx = p / m_gpuOutputStrides[d];
154  outputIndex += idx * m_outputStrides[d];
155  p -= idx * m_gpuOutputStrides[d];
156  }
157  outputIndex += p * m_outputStrides[limit];
158  }
159  return outputIndex;
160  }

References Eigen::ColMajor, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuOutputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_outputStrides, Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::NumDims, and p.

Referenced by Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV1D >::operator()(), Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV2D >::operator()(), and Eigen::EigenConvolutionKernel< Evaluator, CoeffReturnType, KernelType, Index, InputDims, Kernel_accessor, Buffer_accessor, convolution_type::CONV3D >::operator()().

Member Data Documentation

◆ m_gpuInputStrides

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
array<Index, NumDims> Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuInputStrides
private

◆ m_gpuOutputStrides

template<typename Index , typename InputDims , int NumKernelDims, int Layout>
array<Index, NumDims> Eigen::internal::IndexMapper< Index, InputDims, NumKernelDims, Layout >::m_gpuOutputStrides
private

◆ m_inputStrides

◆ m_outputStrides

◆ NumDims


The documentation for this class was generated from the following file: