22#ifdef BUILD_ISPC_MODULE
37static constexpr int64_t MAX_DIMS = 5;
41static constexpr int64_t MAX_INPUTS = 5;
45static constexpr int64_t MAX_OUTPUTS = 2;
47template <
int NARGS,
typename index_t = u
int32_t>
51 const int64_t*
const* strides)
53 if (
dims_ > MAX_DIMS) {
54 utility::LogError(
"tensor has too many (>{}) dims_", MAX_DIMS);
57 for (
int i = 0; i < MAX_DIMS; ++i) {
63 for (
int arg = 0; arg < NARGS; arg++) {
70 index_t linear_idx)
const {
72#if defined(__CUDA_ARCH__)
75 for (
int arg = 0; arg < NARGS; arg++) {
79#if defined(__CUDA_ARCH__)
82 for (
int dim = 0; dim < MAX_DIMS; ++dim) {
86 index_t mod = linear_idx %
sizes_[dim];
87 linear_idx = linear_idx /
sizes_[dim];
89#if defined(__CUDA_ARCH__)
92 for (
int arg = 0; arg < NARGS; arg++) {
112 if (
t.NumDims() > MAX_DIMS) {
113 utility::LogError(
"Tensor has too many dimensions {} > {}.",
114 t.NumDims(), MAX_DIMS);
116 data_ptr_ =
const_cast<void*
>(
t.GetDataPtr());
119 for (int64_t i = 0; i <
ndims_; ++i) {
131 int64_t num_elements = 1;
132 for (int64_t i = 0; i <
ndims_; ++i) {
133 num_elements *=
shape_[i];
137 if (num_elements == 0) {
142 for (int64_t d = 0; d <
ndims_; ++d) {
143 const int64_t max_coord =
shape_[d] - 1;
145 const int64_t dim_min =
stride >= 0 ? 0 : max_coord *
stride;
146 const int64_t dim_max =
stride >= 0 ? max_coord *
stride : 0;
170 if (
static_cast<int64_t
>(dims.
size()) !=
ndims_) {
171 utility::LogError(
"Number of dimensions mismatch {} != {}.",
174 std::vector<bool> seen_dims(
ndims_,
false);
175 for (
const int64_t& dim : dims) {
176 seen_dims[dim] =
true;
178 if (!std::all_of(seen_dims.begin(), seen_dims.end(),
179 [](
bool seen) { return seen; })) {
181 "Permute dims must be a permuntation from 0 to {}.",
188 for (int64_t i = 0; i <
ndims_; ++i) {
190 new_shape[i] =
shape_[old_dim];
193 for (int64_t i = 0; i <
ndims_; ++i) {
204 for (int64_t i = 0; i <
ndims_; ++i) {
218 for (int64_t i = 0; i <
ndims_; ++i) {
227#ifdef BUILD_ISPC_MODULE
229 ispc::TensorRef ToISPC()
const;
273 for (int64_t d =
ndims_ - 1; d >= 0; --d) {
283 int64_t num_workloads = 1;
284 for (int64_t i = 0; i <
ndims_; ++i) {
287 return num_workloads;
292 if (workload_idx < 0 || workload_idx >=
NumWorkloads()) {
300 int64_t remaining = workload_idx;
301 for (int64_t d =
ndims_ - 1; d >= 0; --d) {
308 "Index operation data pointer is out of range.");
335 Indexer(
const std::vector<Tensor>& input_tensors,
336 const Tensor& output_tensor,
340 Indexer(
const std::vector<Tensor>& input_tensors,
341 const std::vector<Tensor>& output_tensors,
411 utility::LogError(
"0 <= i < {} required, however, i = {}.",
418 utility::LogError(
"0 <= i < {} required, however, i = {}.",
427 utility::LogError(
"0 <= i < {} required, however, i = {}.",
434 utility::LogError(
"0 <= i < {} required, however, i = {}.",
444 utility::LogError(
"num_outputs_ == {} > 0, use GetOutput(i)",
451 utility::LogError(
"num_outputs_ == {} > 0, use GetOutput(i)",
471 int64_t workload_idx)
const {
487 template <
typename T>
489 int64_t workload_idx)
const {
493 return GetWorkloadDataPtr<T>(
inputs_[input_idx],
514 template <
typename T>
526 int64_t workload_idx)
const {
537 template <
typename T>
539 int64_t workload_idx)
const {
540 return GetWorkloadDataPtr<T>(
outputs_[output_idx],
545#ifdef BUILD_ISPC_MODULE
547 ispc::Indexer ToISPC()
const;
594 const int64_t* dst_shape);
600 const int64_t* src_shape,
608 int64_t workload_idx)
const {
611 if (workload_idx < 0) {
616 bool use_linear = tr_contiguous;
617 for (int64_t i = 0; i <
ndims_; ++i) {
624 int64_t tr_elements = 1;
625 for (int64_t i = 0; i < tr.
ndims_; ++i) {
626 tr_elements *= tr.
shape_[i];
628 int64_t primary_elements = 1;
629 for (int64_t i = 0; i <
ndims_; ++i) {
632 if (tr_elements != primary_elements) {
639 for (int64_t i = 0; i <
ndims_; ++i) {
647 "Index operation data pointer is out of range.");
657 template <
typename T>
660 int64_t workload_idx)
const {
664 return static_cast<T*
>(
static_cast<void*
>(
726 std::vector<std::unique_ptr<Indexer>>
vec_;
#define OPEN3D_HOST_DEVICE
Definition CUDAUtils.h:43
#define OPEN3D_ASSERT(...)
Definition Macro.h:58
double t
Definition SurfaceReconstructionPoisson.cpp:175
size_t stride
Definition TriangleMeshBuffers.cpp:163
Indexer indexer
Definition UnaryEWSYCL.cpp:35
const TensorRef & GetInput(int64_t i) const
Definition Indexer.h:416
void UpdatePrimaryStrides()
Update primary_strides_ based on primary_shape_.
Definition Indexer.cpp:556
void UpdateContiguousFlags()
Update input_contiguous_ and output_contiguous_.
Definition Indexer.cpp:565
bool inputs_contiguous_[MAX_INPUTS]
Array of contiguous flags for all input TensorRefs.
Definition Indexer.h:679
bool outputs_contiguous_[MAX_OUTPUTS]
Array of contiguous flags for all output TensorRefs.
Definition Indexer.h:682
Indexer()
Definition Indexer.h:328
OPEN3D_HOST_DEVICE T * GetOutputPtr(int64_t output_idx, int64_t workload_idx) const
Definition Indexer.h:538
int64_t num_outputs_
Definition Indexer.h:670
OPEN3D_HOST_DEVICE char * GetOutputPtr(int64_t output_idx, int64_t workload_idx) const
Definition Indexer.h:525
TensorRef & GetOutput(int64_t i)
Returns output TensorRef.
Definition Indexer.h:425
static void ReductionRestride(TensorRef &dst, int64_t src_ndims, const int64_t *src_shape, const SizeVector &reduction_dims)
Definition Indexer.cpp:602
TensorRef outputs_[MAX_OUTPUTS]
Array of output TensorRefs.
Definition Indexer.h:676
bool IsReductionDim(int64_t dim) const
Returns true if the dim -th dimension is reduced.
Definition Indexer.h:458
int64_t NumReductionDims() const
Returns the number of reduction dimensions.
Definition Indexer.cpp:395
int64_t NumInputs() const
Number of input Tensors.
Definition Indexer.h:403
int64_t primary_strides_[MAX_DIMS]
Definition Indexer.h:699
const TensorRef & GetOutput() const
Definition Indexer.h:449
Indexer(const Indexer &)=default
bool IsFinalOutput() const
Definition Indexer.h:363
void ReorderDimensions(const SizeVector &reduction_dims)
Definition Indexer.cpp:491
void CoalesceDimensions()
Definition Indexer.cpp:425
Indexer & operator=(const Indexer &)=default
int64_t NumOutputElements() const
Returns the number of output elements.
Definition Indexer.cpp:414
int64_t num_inputs_
Number of input and output Tensors.
Definition Indexer.h:669
bool accumulate_
Definition Indexer.h:711
bool CanUse32BitIndexing() const
Returns true iff the maximum_offsets in bytes are smaller than 2^31 - 1.
Definition Indexer.cpp:198
TensorRef inputs_[MAX_INPUTS]
Array of input TensorRefs.
Definition Indexer.h:673
OPEN3D_HOST_DEVICE char * GetWorkloadDataPtr(const TensorRef &tr, bool tr_contiguous, int64_t workload_idx) const
Definition Indexer.h:606
OPEN3D_HOST_DEVICE T * GetOutputPtr(int64_t workload_idx) const
Definition Indexer.h:515
bool ShouldAccumulate() const
Definition Indexer.h:361
const int64_t * GetPrimaryStrides() const
Definition Indexer.h:385
Indexer GetPerOutputIndexer(int64_t output_idx) const
Definition Indexer.cpp:303
std::unique_ptr< Indexer > SplitLargestDim()
Definition Indexer.cpp:238
OPEN3D_HOST_DEVICE T * GetWorkloadDataPtr(const TensorRef &tr, bool tr_contiguous, int64_t workload_idx) const
Definition Indexer.h:658
OPEN3D_HOST_DEVICE char * GetOutputPtr(int64_t workload_idx) const
Definition Indexer.h:502
OPEN3D_HOST_DEVICE T * GetInputPtr(int64_t input_idx, int64_t workload_idx) const
Definition Indexer.h:488
int64_t NumWorkloads() const
Definition Indexer.cpp:406
OPEN3D_HOST_DEVICE char * GetInputPtr(int64_t input_idx, int64_t workload_idx) const
Definition Indexer.h:470
IndexerIterator SplitTo32BitIndexing() const
Definition Indexer.cpp:234
const int64_t * GetPrimaryShape() const
Definition Indexer.h:380
TensorRef & GetInput(int64_t i)
Returns input TensorRef.
Definition Indexer.h:409
TensorRef & GetOutput()
Definition Indexer.h:442
static void BroadcastRestride(TensorRef &src, int64_t dst_ndims, const int64_t *dst_shape)
Definition Indexer.cpp:575
bool final_output_
Definition Indexer.h:707
const TensorRef & GetOutput(int64_t i) const
Definition Indexer.h:432
int64_t ndims_
Indexer's global number of dimensions.
Definition Indexer.h:702
void ShrinkDim(int64_t dim, int64_t start, int64_t size)
Definition Indexer.cpp:364
int64_t NumDims() const
Returns number of dimensions of the Indexer.
Definition Indexer.h:376
int64_t NumOutputs() const
Number of output Tensors.
Definition Indexer.h:406
int64_t * GetPrimaryShape()
Definition Indexer.h:381
int64_t primary_shape_[MAX_DIMS]
Definition Indexer.h:695
Iterator end() const
Definition Indexer.cpp:671
Iterator begin() const
Definition Indexer.cpp:667
Definition SizeVector.h:69
size_t size() const
Definition SmallVector.h:120
OPEN3D_HOST_DEVICE int64_t NumWorkloads() const
Definition Indexer.h:282
TensorRef input_
Definition Indexer.h:314
TensorIterator(const Tensor &tensor)
Definition Indexer.h:269
bool is_contiguous_
Definition Indexer.h:316
OPEN3D_HOST_DEVICE void * GetPtr(int64_t workload_idx) const
Pointer to the element at linear index workload_idx, or nullptr.
Definition Indexer.h:291
int64_t ndims_
Definition Indexer.h:315
int64_t WrapDim(int64_t dim, int64_t max_dim, bool inclusive)
Wrap around negative dim.
Definition ShapeUtil.cpp:131
SizeVector DefaultStrides(const SizeVector &shape)
Compute default strides for a shape when a tensor is contiguous.
Definition ShapeUtil.cpp:214
DtypePolicy
Definition Indexer.h:241
Definition PinholeCameraIntrinsic.cpp:16
bool operator!=(const Iterator &other) const
Definition Indexer.cpp:663
Iterator()
Definition Indexer.h:717
std::vector< std::unique_ptr< Indexer > > vec_
Definition Indexer.h:726
Iterator(Iterator &&other)=default
Indexer & operator*() const
Definition Indexer.cpp:649
bool operator==(const Iterator &other) const
Definition Indexer.cpp:660
Iterator & operator++()
Definition Indexer.cpp:651
index_t sizes_[MAX_DIMS]
Definition Indexer.h:100
OPEN3D_HOST_DEVICE utility::MiniVec< index_t, NARGS > get(index_t linear_idx) const
Definition Indexer.h:69
int dims_
Definition Indexer.h:99
OffsetCalculator(int dims, const int64_t *sizes, const int64_t *const *strides)
Definition Indexer.h:49
index_t strides_[MAX_DIMS][NARGS]
Definition Indexer.h:101
A minimalistic class that reference a Tensor.
Definition Indexer.h:105
int64_t dtype_byte_size_
Definition Indexer.h:234
void UpdateByteOffsetBounds()
Definition Indexer.h:130
int64_t min_byte_offset_
Definition Indexer.h:235
void Permute(const SizeVector &dims)
Permute (dimension shuffle) the reference to a Tensor.
Definition Indexer.h:168
int64_t ndims_
Definition Indexer.h:233
OPEN3D_HOST_DEVICE bool ContainsByteOffset(int64_t offset) const
Definition Indexer.h:154
bool operator!=(const TensorRef &other) const
Definition Indexer.h:225
TensorRef(const Tensor &t)
Definition Indexer.h:111
TensorRef()
Definition Indexer.h:109
int64_t shape_[MAX_DIMS]
Definition Indexer.h:237
bool IsContiguous() const
Definition Indexer.h:201
int64_t total_byte_size_
Definition Indexer.h:236
void * data_ptr_
Definition Indexer.h:232
bool operator==(const TensorRef &other) const
Definition Indexer.h:211
int64_t byte_strides_[MAX_DIMS]
Definition Indexer.h:238