28 #include <tbb/parallel_for.h> 38 template <
class TFeat,
45 const std::vector<int>& filter_dims,
48 const TFeat* out_importance,
50 const TFeat* inp_features,
51 const TFeat* inp_neighbors_importance_sum,
52 const int64_t* inp_neighbors_row_splits,
53 const TIndex* neighbor_index,
54 const TKernelIndex* neighbors_kernel_index,
55 const TFeat* neighbor_importance,
56 const int64_t* neighbors_row_splits) {
57 const bool NEIGHBOR_IMPORTANCE = inp_neighbors_importance_sum;
59 const int in_channels = filter_dims[filter_dims.size() - 2];
60 const int out_channels = filter_dims[filter_dims.size() - 1];
62 int num_kernel_elements = 1;
63 for (
int i = 0; i < filter_dims.size() - 2; ++i)
64 num_kernel_elements *= filter_dims[i];
66 memset(out_features, 0,
sizeof(TOut) * num_out * out_channels);
69 tbb::blocked_range<size_t>(0, num_out, 32),
70 [&](
const tbb::blocked_range<size_t>& r) {
71 int range_length = r.end() - r.begin();
73 Eigen::Map<Eigen::Matrix<TOut, Eigen::Dynamic, Eigen::Dynamic>>
74 C(out_features + (r.begin() * out_channels),
75 out_channels, range_length);
77 for (
size_t out_idx = r.begin(); out_idx != r.end();
79 const int out_col = out_idx - r.begin();
80 const size_t neighbor_start = neighbors_row_splits[out_idx];
81 const size_t neighbor_end =
82 neighbors_row_splits[out_idx + 1];
84 for (
size_t n = neighbor_start; n < neighbor_end; ++n) {
85 const size_t inp_idx = neighbor_index[n];
86 const int kernel_idx = neighbors_kernel_index[n];
88 TFeat n_importance = NEIGHBOR_IMPORTANCE
89 ? neighbor_importance[n]
94 if (NEIGHBOR_IMPORTANCE) {
95 if (inp_neighbors_importance_sum[inp_idx] !=
97 normalizer /= inp_neighbors_importance_sum
100 size_t num_inp_neighbors;
101 const size_t inp_neighbor_start =
102 inp_neighbors_row_splits[inp_idx];
103 const size_t inp_neighbor_end =
104 inp_neighbors_row_splits[inp_idx + 1];
106 inp_neighbor_end - inp_neighbor_start;
107 if (num_inp_neighbors > 0)
108 normalizer /= TFeat(num_inp_neighbors);
112 Eigen::Map<
const Eigen::Matrix<TFeat, Eigen::Dynamic,
114 A(filter + kernel_idx * out_channels *
116 out_channels, in_channels);
118 Eigen::Map<
const Eigen::Matrix<TFeat, Eigen::Dynamic,
120 B(inp_features + inp_idx * in_channels,
122 TFeat scale = normalizer * n_importance;
124 (A * (scale * B)).template cast<TOut>();
129 if (out_importance) {
130 for (
int i = 0; i < range_length; ++i)
131 C.col(i) *= TOut(out_importance[r.begin() + i]);
182 template <
class TFeat,
class TOut,
class TIndex,
class TKernelIndex>
185 const std::vector<int>& filter_dims,
188 const TFeat* out_importance,
190 const TFeat* inp_features,
191 const TFeat* inp_neighbors_importance_sum,
192 const int64_t* inp_neighbors_row_splits,
193 const TIndex* neighbor_index,
194 const TKernelIndex* neighbors_kernel_index,
195 const TFeat* neighbor_importance,
196 const int64_t* neighbors_row_splits,
198 #define FN_PARAMETERS \ 199 out_features, filter_dims, filter, num_out, out_importance, num_inp, \ 200 inp_features, inp_neighbors_importance_sum, \ 201 inp_neighbors_row_splits, neighbor_index, neighbors_kernel_index, \ 202 neighbor_importance, neighbors_row_splits 204 #define CALL_TEMPLATE(NORMALIZE) \ 205 if (NORMALIZE == normalize) \ 206 _SparseConvTransposeComputeFeaturesCPU<TFeat, TOut, TIndex, \ 207 TKernelIndex, NORMALIZE>( \ 210 #define CALL_TEMPLATE2 \ 211 CALL_TEMPLATE(true) \ 217 #undef CALL_TEMPLATE2 Definition: PinholeCameraIntrinsic.cpp:35
void _SparseConvTransposeComputeFeaturesCPU(TOut *out_features, const std::vector< int > &filter_dims, const TFeat *filter, size_t num_out, const TFeat *out_importance, size_t num_inp, const TFeat *inp_features, const TFeat *inp_neighbors_importance_sum, const int64_t *inp_neighbors_row_splits, const TIndex *neighbor_index, const TKernelIndex *neighbors_kernel_index, const TFeat *neighbor_importance, const int64_t *neighbors_row_splits)
Definition: SparseConvTranspose.h:43
void SparseConvTransposeComputeFeaturesCPU(TOut *out_features, const std::vector< int > &filter_dims, const TFeat *filter, size_t num_out, const TFeat *out_importance, size_t num_inp, const TFeat *inp_features, const TFeat *inp_neighbors_importance_sum, const int64_t *inp_neighbors_row_splits, const TIndex *neighbor_index, const TKernelIndex *neighbors_kernel_index, const TFeat *neighbor_importance, const int64_t *neighbors_row_splits, bool normalize)
Definition: SparseConvTranspose.h:183