Open3D (C++ API)  0.20.0
Loading...
Searching...
No Matches
ContinuousConvTransposeSYCL.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2026 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8// SYCL port of ContinuousConvTranspose.cuh. See ContinuousConvSYCL.h's file
9// header for the general porting notes. Uses FillColumnTransposeSYCL, the
10// <ColumnMajor, ColumnMajor> GEMM layout combo (same as the forward op), and
11// MultiplyColumnsSYCL for the optional output-importance scaling.
12#pragma once
13
18
20
21namespace open3d {
22namespace ml {
23namespace impl {
24
28template <class TFeat, class TOut, class TReal, class TIndex>
30 sycl::queue& queue,
31 void* temp,
32 size_t& temp_size,
33 size_t& max_temp_size,
34 int texture_alignment,
35 TOut* out_features,
36 const std::vector<int>& filter_dims,
37 const TFeat* filter,
38 TIndex num_out,
39 const TReal* out_positions,
40 const TFeat* out_importance,
41 TIndex num_inp,
42 const TReal* inp_positions,
43 const TFeat* inp_features,
44 const TFeat* inp_neighbors_importance_sum,
45 const int64_t* inp_neighbors_prefix_sum,
46 size_t neighbors_index_size,
47 const TIndex* neighbors_index,
48 const TFeat* neighbors_importance,
49 const int64_t* neighbors_row_splits,
50 const TReal* extents,
51 const TReal* offsets,
52 InterpolationMode interpolation,
53 CoordinateMapping coordinate_mapping,
54 bool align_corners,
55 bool individual_extent,
56 bool isotropic_extent,
57 bool normalize,
58 bool allow_tf32) {
59 const bool get_temp_size = !temp;
60
61 if (get_temp_size) {
62 temp = (char*)1; // worst case alignment
63 temp_size = std::numeric_limits<int64_t>::max();
64 }
65
66 MemoryAllocation mem_temp(temp, temp_size, texture_alignment);
67
68 const int in_channels = filter_dims[filter_dims.size() - 2];
69 const int out_channels = filter_dims[filter_dims.size() - 1];
70
71 int spatial_filter_size = 1;
72 for (int i = 0; i < 3; ++i) spatial_filter_size *= filter_dims[i];
73
74 // this defines how much temporary storage we need at least.
75 // we want to allocate memory for at least 32 output points.
76 const size_t min_num_cols_per_run = std::min(size_t(num_out), size_t(32));
77 const size_t max_num_cols_per_run = num_out;
78 const size_t bytes_per_column =
79 sizeof(TFeat) * (spatial_filter_size * in_channels);
80 const size_t min_temp_size_bytes = min_num_cols_per_run * bytes_per_column;
81 const size_t max_temp_size_bytes = max_num_cols_per_run * bytes_per_column;
82
83 if (get_temp_size) {
84 std::pair<char*, size_t> tmp =
85 mem_temp.Alloc<char>(min_temp_size_bytes);
86 temp_size = mem_temp.MaxUsed();
87 mem_temp.Free(tmp);
88 mem_temp.Alloc<char>(max_temp_size_bytes);
89 max_temp_size = mem_temp.MaxUsed();
90 return;
91 }
92
93 // Request segment using all of the temporary memory
94 std::pair<void*, size_t> mem_columns = mem_temp.AllocLargestSegment();
95
96 if (mem_columns.second < min_temp_size_bytes) {
97 std::stringstream ss;
98 ss << "temp is too small " << mem_columns.second
99 << " bytes. Expected at least " << min_temp_size_bytes << " bytes\n";
100 throw std::runtime_error(ss.str());
101 }
102
103 // init output
104 sycl::event out_features_fill_event =
105 queue.fill(out_features, TOut(0), size_t(num_out) * out_channels);
106
107 size_t num_cols_per_run =
108 std::min(mem_columns.second / bytes_per_column, size_t(num_out));
109
110 TFeat* columns = (TFeat*)mem_columns.first;
111
112 // if we cannot process all data at once we need multiple runs. See
113 // ContinuousConvSYCL.h for the event-dependency reasoning.
114 size_t num_runs = DivUp(num_out, num_cols_per_run);
115 sycl::event prev_gemm_event;
116 for (size_t run_i = 0; run_i < num_runs; ++run_i) {
117 const TIndex begin_idx = TIndex(run_i * num_cols_per_run);
118 const TIndex end_idx = TIndex(
119 std::min(size_t(num_out), (run_i + 1) * num_cols_per_run));
120 const size_t num_cols_this_run = end_idx - begin_idx;
121
122 sycl::event fill_column_event = FillColumnTransposeSYCL<TFeat, TReal,
123 TIndex>(
124 queue, columns, in_channels, begin_idx, end_idx, num_out,
125 out_positions, num_inp, inp_positions, inp_features,
126 inp_neighbors_importance_sum, inp_neighbors_prefix_sum,
127 neighbors_index_size, neighbors_index, neighbors_importance,
128 neighbors_row_splits, extents, offsets, filter_dims,
129 interpolation, coordinate_mapping, align_corners,
130 individual_extent, isotropic_extent, normalize,
131 run_i == 0 ? std::vector<sycl::event>{out_features_fill_event}
132 : std::vector<sycl::event>{prev_gemm_event});
133
134 // C is MxN
135 // B is KxN
136 // A is MxK
137 const int m = out_channels;
138 const int k = spatial_filter_size * in_channels;
139 const int n = static_cast<int>(num_cols_this_run);
140 const float alpha = 1;
141 const float* const A = filter;
142 const int lda = m;
143 const float* const B = columns;
144 const int ldb = k;
145 const float beta = 1;
146 float* C = out_features + (run_i * num_cols_per_run * out_channels);
147 const int ldc = m;
148
149 prev_gemm_event = GemmColumnMajorSYCL<cutlass::layout::ColumnMajor,
150 cutlass::layout::ColumnMajor>(
151 queue, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc, allow_tf32,
152 {fill_column_event});
153 }
154
155 if (out_importance) {
156 // Must depend on the last chunk's GEMM: GemmColumnMajorSYCL no
157 // longer blocks (see GemmSYCL.h), and this in-place scale reads/
158 // writes the same out_features region that GEMM just wrote.
159 MultiplyColumnsSYCL(queue, out_channels, num_out, out_features,
160 out_importance, {prev_gemm_event});
161 }
162}
163
164} // namespace impl
165} // namespace ml
166} // namespace open3d
const NeighborOffsets & offsets
Definition NormalDistributionsTransform.cpp:254
Eigen::Matrix3d B
Definition PointCloudPlanarPatchDetection.cpp:523
sycl::queue queue
Definition SYCLContext.cpp:88
A class for managing memory segments within a memory allocation.
Definition MemoryAllocation.h:21
void Free(const std::pair< T *, size_t > &segment)
Frees a previously returned segment.
Definition MemoryAllocation.h:85
std::pair< void *, size_t > AllocLargestSegment()
Returns the largest free segment.
Definition MemoryAllocation.h:75
size_t MaxUsed() const
Returns the peak memory usage in bytes.
Definition MemoryAllocation.h:145
std::pair< T *, size_t > Alloc(size_t size)
Definition MemoryAllocation.h:48
InterpolationMode
Definition ContinuousConvTypes.h:18
sycl::event FillColumnTransposeSYCL(sycl::queue &queue, TFeat *columns, int in_channels, TIndex begin_idx, TIndex end_idx, TIndex num_out, const TReal *const out_positions, TIndex num_inp, const TReal *const inp_positions, const TFeat *const inp_features, const TFeat *const inp_neighbors_importance_sum, const int64_t *const inp_neighbors_prefix_sum, size_t neighbors_index_size, const TIndex *const neighbors_index, const TFeat *const neighbors_importance, const int64_t *const neighbors_row_splits, const TReal *const extents, const TReal *const offsets, const std::vector< int > &filter_dims, InterpolationMode interpolation, CoordinateMapping coordinate_mapping, bool align_corners, bool individual_extent, bool isotropic_extent, bool normalize, const std::vector< sycl::event > &deps)
Definition ContinuousConvSYCLKernels.cpp:533
CoordinateMapping
Definition ContinuousConvTypes.h:26
sycl::event MultiplyColumnsSYCL(sycl::queue &queue, size_t rows, size_t cols, T *col_major_matrix, const T *const vector, const std::vector< sycl::event > &deps)
Definition ContinuousConvSYCLKernels.cpp:25
void CConvTransposeComputeFeaturesSYCL(sycl::queue &queue, void *temp, size_t &temp_size, size_t &max_temp_size, int texture_alignment, TOut *out_features, const std::vector< int > &filter_dims, const TFeat *filter, TIndex num_out, const TReal *out_positions, const TFeat *out_importance, TIndex num_inp, const TReal *inp_positions, const TFeat *inp_features, const TFeat *inp_neighbors_importance_sum, const int64_t *inp_neighbors_prefix_sum, size_t neighbors_index_size, const TIndex *neighbors_index, const TFeat *neighbors_importance, const int64_t *neighbors_row_splits, const TReal *extents, const TReal *offsets, InterpolationMode interpolation, CoordinateMapping coordinate_mapping, bool align_corners, bool individual_extent, bool isotropic_extent, bool normalize, bool allow_tf32)
Definition ContinuousConvTransposeSYCL.h:29
sycl::event GemmColumnMajorSYCL(sycl::queue &queue, int m, int n, int k, float alpha, const float *A, int64_t lda, const float *B, int64_t ldb, float beta, float *C, int64_t ldc, bool allow_tf32, const std::vector< sycl::event > &deps)
Definition GemmSYCL.cpp:462
int DivUp(int x, int y)
Computes the quotient of x/y with rounding up.
Definition Helper.h:176
Definition PinholeCameraIntrinsic.cpp:16