chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
68 / 79
86.1%
Branches:
142 / 272
52.2%
Functions:
8 / 8, 2 excl
100.0%

device/tensor.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #pragma once
3
4 #include <cstddef>
5 #include <cstdint>
6 #include <stdexcept>
7 #include <type_traits>
8 #include <vector>
9
10 #include <dlpack/dlpack.h>
11
12 #if !defined(DLPACK_MAJOR_VERSION) || DLPACK_MAJOR_VERSION < 1
13 #error "Chrono Batch Render needs DLPack 1.0 or later, but an older dlpack.h was included first"
14 #endif
15
16 #include "chrono_batch_render/device/operation.h"
17 #include "chrono_batch_render/device/ref.h"
18 #include "chrono_batch_render/export.h"
19 #include "chrono_batch_render/util/span.h"
20
21 namespace chrono::batch_render::device {
22
23 class Buffer;
24 class Device;
25
26 enum class DType : uint8_t { UInt8, UInt32, Float32, Float64, Int32, UInt64, Int64 };
27
28 154202 constexpr uint32_t ElementBytes(DType dtype) {
29
4/4
✓ Branch 0 taken 295 times.
✓ Branch 1 taken 938 times.
✓ Branch 2 taken 40 times.
✓ Branch 3 taken 152929 times.
154202 return dtype == DType::UInt8 ? 1
30 : dtype == DType::Float64 || dtype == DType::UInt64 || dtype == DType::Int64 ? 8
31 154202 : 4;
32 }
33
34 template <class T> constexpr DType ElementType() {
35 if constexpr (std::is_same_v<T, uint8_t>) {
36 return DType::UInt8;
37 } else if constexpr (std::is_same_v<T, uint32_t>) {
38 return DType::UInt32;
39 } else if constexpr (std::is_same_v<T, float>) {
40 return DType::Float32;
41 } else if constexpr (std::is_same_v<T, double>) {
42 return DType::Float64;
43 } else if constexpr (std::is_same_v<T, int32_t>) {
44 return DType::Int32;
45 } else if constexpr (std::is_same_v<T, int64_t>) {
46 return DType::Int64;
47 } else {
48 static_assert(std::is_same_v<T, uint64_t>, "Tensors hold no elements of this type");
49 return DType::UInt64;
50 }
51 }
52
53 class CHRONO_BATCH_RENDER_API Tensor {
54 public:
55 Tensor();
56 ~Tensor();
57 Tensor(const Tensor& other);
58 Tensor(Tensor&& other) noexcept;
59 Tensor& operator=(const Tensor& other);
60 Tensor& operator=(Tensor&& other) noexcept;
61 Tensor(Ref<Buffer> buffer, uint64_t offset, DType dtype, std::vector<int64_t> shape,
62 std::vector<int64_t> strides = {});
63
64 197361 bool Empty() const {
65
41/80
<unknown function 64>:
✗ Branch 0 not taken.
✓ Branch 0 taken 330 times.
✓ Branch 1 taken 1 time.
✓ Branch 1 taken 35143 times.
✗ Branch 2 not taken.
✗ Branch 2 not taken.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 1 time.
✓ Branch 3 taken 48 times.
✓ Branch 3 taken 35422 times.
✓ Branch 4 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 5 taken 869 times.
✓ Branch 6 taken 2 times.
✓ Branch 6 taken 591 times.
✗ Branch 7 not taken.
✓ Branch 7 taken 872 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 6 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 1 time.
✓ Branch 24 taken 1 time.
✓ Branch 25 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 8 times.
✓ Branch 30 taken 334 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✓ Branch 55 taken 12 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✓ Branch 59 taken 143 times.
✓ Branch 60 taken 6 times.
✓ Branch 61 taken 143 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 143 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 66 taken 143 times.
chrono::batch_render::device::ElementBytes(chrono::batch_render::device::DType):
✓ Branch 0 taken 35120 times.
✓ Branch 1 taken 4316 times.
✓ Branch 2 taken 83647 times.
✓ Branch 3 taken 4 times.
196606 return m_buffer == nullptr;
66 }
67
68 274 Buffer& GetBuffer() const {
69
10/15
<unknown function 64>:
✗ Branch 0 not taken.
✓ Branch 1 taken 23 times.
chrono::batch_render::device::ElementBytes(chrono::batch_render::device::DType):
✓ Branch 1 taken 29 times.
✓ Branch 1 taken 11 times.
✓ Branch 2 taken 4 times.
✓ Branch 2 taken 1 time.
✓ Branch 4 taken 21 times.
✓ Branch 4 taken 1 time.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 82 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 4 times.
✓ Branch 13 taken 1 time.
287 return *m_buffer;
70 }
71
72 Device& GetDevice() const;
73
74 242 uint64_t Offset() const {
75
9/10
✓ Branch 1 taken 28 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1 time.
✓ Branch 4 taken 20 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 4 times.
✓ Branch 7 taken 82 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 4 times.
✓ Branch 13 taken 1 time.
242 return m_offset;
76 }
77
78 uint64_t Address() const;
79
80 241606 DType Type() const {
81
15/27
<unknown function 64>:
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 35123 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1182 times.
✓ Branch 4 taken 33966 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 33965 times.
✗ Branch 9 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 137008 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
chrono::batch_render::device::ElementBytes(chrono::batch_render::device::DType):
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
chrono::batch_render::device::Tensor::Type() const:
✓ Branch 1 taken 222 times.
241605 return m_dtype;
82 }
83
84 275662 Span<const int64_t> Shape() const {
85
35/79
<unknown function 64>:
✓ Branch 1 taken 31 times.
✗ Branch 2 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 6 taken 137023 times.
✗ Branch 7 not taken.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 5 times.
✓ Branch 13 taken 1178 times.
✓ Branch 14 taken 15 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
<unknown function 84>:
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
chrono::batch_render::device::ElementBytes(chrono::batch_render::device::DType):
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 52 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 4 times.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 8 taken 6 times.
✓ Branch 10 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 time.
✓ Branch 18 taken 5 times.
✓ Branch 18 taken 4 times.
✗ Branch 19 not taken.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
chrono::batch_render::device::Tensor::Type() const:
✓ Branch 3 taken 222 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
275683 return m_shape;
86 }
87
88 138330 Span<const int64_t> Strides() const {
89
8/21
<unknown function 64>:
✓ Branch 1 taken 1182 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
chrono::batch_render::device::ElementBytes(chrono::batch_render::device::DType):
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 6 taken 10 times.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
138317 return m_strides;
90 }
91
92 int64_t Elements() const;
93 Tensor Select(int64_t index) const;
94
95 std::vector<std::byte> ToHostBytes() const;
96 Download ToHostAsync() const;
97 DLTensor DLPack() const;
98 DLManagedTensorVersioned* Export() const;
99
100 4040 template <class T> std::vector<T> ToHost() const {
101
7/12
std::vector<double, std::allocator<double> > chrono::batch_render::device::Tensor::ToHost<double>() const:
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 223 times.
std::vector<float, std::allocator<float> > chrono::batch_render::device::Tensor::ToHost<float>() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 3538 times.
std::vector<int, std::allocator<int> > chrono::batch_render::device::Tensor::ToHost<int>() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
std::vector<long, std::allocator<long> > chrono::batch_render::device::Tensor::ToHost<long>() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
std::vector<unsigned char, std::allocator<unsigned char> > chrono::batch_render::device::Tensor::ToHost<unsigned char>() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
std::vector<unsigned int, std::allocator<unsigned int> > chrono::batch_render::device::Tensor::ToHost<unsigned int>() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 231 times.
4040 if (sizeof(T) != ElementBytes(m_dtype)) {
102
1/6
std::vector<double, std::allocator<double> > chrono::batch_render::device::Tensor::ToHost<double>() const:
✓ Branch 2 taken 1 time.
std::vector<float, std::allocator<float> > chrono::batch_render::device::Tensor::ToHost<float>() const:
✗ Branch 2 not taken.
std::vector<int, std::allocator<int> > chrono::batch_render::device::Tensor::ToHost<int>() const:
✗ Branch 2 not taken.
std::vector<long, std::allocator<long> > chrono::batch_render::device::Tensor::ToHost<long>() const:
✗ Branch 2 not taken.
std::vector<unsigned char, std::allocator<unsigned char> > chrono::batch_render::device::Tensor::ToHost<unsigned char>() const:
✗ Branch 2 not taken.
std::vector<unsigned int, std::allocator<unsigned int> > chrono::batch_render::device::Tensor::ToHost<unsigned int>() const:
✗ Branch 2 not taken.
1 throw std::invalid_argument("ToHost of a type unlike the tensor's elements");
103 }
104 4039 std::vector<T> values(static_cast<size_t>(Elements()));
105
6/12
std::vector<double, std::allocator<double> > chrono::batch_render::device::Tensor::ToHost<double>() const:
✓ Branch 0 taken 223 times.
✗ Branch 1 not taken.
std::vector<float, std::allocator<float> > chrono::batch_render::device::Tensor::ToHost<float>() const:
✓ Branch 0 taken 3538 times.
✗ Branch 1 not taken.
std::vector<int, std::allocator<int> > chrono::batch_render::device::Tensor::ToHost<int>() const:
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
std::vector<long, std::allocator<long> > chrono::batch_render::device::Tensor::ToHost<long>() const:
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
std::vector<unsigned char, std::allocator<unsigned char> > chrono::batch_render::device::Tensor::ToHost<unsigned char>() const:
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
std::vector<unsigned int, std::allocator<unsigned int> > chrono::batch_render::device::Tensor::ToHost<unsigned int>() const:
✓ Branch 0 taken 231 times.
✗ Branch 1 not taken.
4039 if (!values.empty()) {
106
6/6
std::vector<double, std::allocator<double> > chrono::batch_render::device::Tensor::ToHost<double>() const:
✓ Branch 1 taken 223 times.
std::vector<float, std::allocator<float> > chrono::batch_render::device::Tensor::ToHost<float>() const:
✓ Branch 1 taken 3538 times.
std::vector<int, std::allocator<int> > chrono::batch_render::device::Tensor::ToHost<int>() const:
✓ Branch 1 taken 1 time.
std::vector<long, std::allocator<long> > chrono::batch_render::device::Tensor::ToHost<long>() const:
✓ Branch 1 taken 10 times.
std::vector<unsigned char, std::allocator<unsigned char> > chrono::batch_render::device::Tensor::ToHost<unsigned char>() const:
✓ Branch 1 taken 36 times.
std::vector<unsigned int, std::allocator<unsigned int> > chrono::batch_render::device::Tensor::ToHost<unsigned int>() const:
✓ Branch 1 taken 231 times.
4039 ReadInto(values.data());
107 }
108 4039 return values;
109 ✗ }
110
111 private:
112 void ReadInto(void* out) const;
113
114 Ref<Buffer> m_buffer;
115 uint64_t m_offset = 0;
116 DType m_dtype = DType::Float32;
117 std::vector<int64_t> m_shape;
118 std::vector<int64_t> m_strides;
119 };
120
121 }
122