NForge
Tensor library
Loading...
Searching...
No Matches
tensor_impl_CPU.h
1#ifndef TENSOR_IMPL_CPU_H
2#define TENSOR_IMPL_CPU_H
3
4#include "../tensor_impl.h"
5#include "nforge/core/tensor_layout.h"
6#include "nforge/core/tensor_shape.h"
7
15public:
16 CPUImpl(const Tensor::Shape& shape);
17 CPUImpl(const Tensor::Shape& shape, float value);
18 ~CPUImpl();
19
20 void fillAll(float value) override;
21 void fillRand() override;
22
23 void print() const override;
24 void print(const std::vector<size_t>& position) const override;
25
26 size_t getNumElements() const override;
27 Tensor::Shape getShape() const override;
28
30 float* dataPtr() const;
31 std::vector<float> toVector() const override;
32 std::string toString() const override;
33
34 std::unique_ptr<Tensor::Impl> clone() const override;
35
36 void copyFromHost(const float* data, size_t count) override;
37
38 void set(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
39 const TensorLayout& rhsLayout) override;
40
41 bool compare(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
42 const TensorLayout& rhsLayout) const override;
43
44 std::unique_ptr<Tensor::Impl> add(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
45 const TensorLayout& rhsLayout,
46 const TensorLayout& outLayout) const override;
47
48 std::unique_ptr<Tensor::Impl> sub(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
49 const TensorLayout& rhsLayout,
50 const TensorLayout& outLayout) const override;
51
52 std::unique_ptr<Tensor::Impl> mul(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
53 const TensorLayout& rhsLayout,
54 const TensorLayout& outLayout) const override;
55
56 std::unique_ptr<Tensor::Impl> div(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
57 const TensorLayout& rhsLayout,
58 const TensorLayout& outLayout) const override;
59
60 void iadd(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
61 const TensorLayout& rhsLayout) override;
62
63 void isub(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
64 const TensorLayout& rhsLayout) override;
65
66 void imul(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
67 const TensorLayout& rhsLayout) override;
68
69 void idiv(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
70 const TensorLayout& rhsLayout) override;
71
72 std::unique_ptr<Tensor::Impl> sum(const TensorLayout& layout, const TensorLayout& blockLayout,
73 const TensorLayout& outLayout) const override;
74
75 std::unique_ptr<Tensor::Impl> min(const TensorLayout& layout, const TensorLayout& blockLayout,
76 const TensorLayout& outLayout) const override;
77
78 std::unique_ptr<Tensor::Impl> max(const TensorLayout& layout, const TensorLayout& blockLayout,
79 const TensorLayout& outLayout) const override;
80
81 std::unique_ptr<Tensor::Impl> prod(const TensorLayout& layout, const TensorLayout& blockLayout,
82 const TensorLayout& outLayout) const override;
83
84 std::unique_ptr<Tensor::Impl> norm(const TensorLayout& layout) const override;
85
86 std::unique_ptr<Tensor::Impl> all(const TensorLayout& layout, const TensorLayout& blockLayout,
87 const TensorLayout& outLayout) const override;
88
89 std::unique_ptr<Tensor::Impl> any(const TensorLayout& layout, const TensorLayout& blockLayout,
90 const TensorLayout& outLayout) const override;
91
92
93 std::unique_ptr<Tensor::Impl> matmul(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
94 const TensorLayout& rhsLayout,
95 const TensorLayout& outLayout, size_t batch, size_t m,
96 size_t k, size_t p) const override;
97
98
99 std::unique_ptr<Tensor::Impl> equal(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
100 const TensorLayout& rhsLayout,
101 const TensorLayout& outLayout) const override;
102
103 std::unique_ptr<Tensor::Impl> notEqual(const TensorLayout& lhsLayout,
104 const Tensor::Impl* rhsImpl,
105 const TensorLayout& rhsLayout,
106 const TensorLayout& outLayout) const override;
107
108 std::unique_ptr<Tensor::Impl> less(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
109 const TensorLayout& rhsLayout,
110 const TensorLayout& outLayout) const override;
111
112 std::unique_ptr<Tensor::Impl> lessEqual(const TensorLayout& lhsLayout,
113 const Tensor::Impl* rhsImpl,
114 const TensorLayout& rhsLayout,
115 const TensorLayout& outLayout) const override;
116
117 std::unique_ptr<Tensor::Impl> greater(const TensorLayout& lhsLayout,
118 const Tensor::Impl* rhsImpl,
119 const TensorLayout& rhsLayout,
120 const TensorLayout& outLayout) const override;
121
122 std::unique_ptr<Tensor::Impl> greaterEqual(const TensorLayout& lhsLayout,
123 const Tensor::Impl* rhsImpl,
124 const TensorLayout& rhsLayout,
125 const TensorLayout& outLayout) const override;
126
127 std::unique_ptr<Tensor::Impl> isClose(const TensorLayout& lhsLayout,
128 const Tensor::Impl* rhsImpl,
129 const TensorLayout& rhsLayout,
130 const TensorLayout& outLayout,
131 float tolerance) const override;
132
133private:
134 Tensor::Shape m_shape;
135 std::vector<float> m_data;
136
137 template <typename BinaryOp>
138 std::unique_ptr<Tensor::Impl> applyBinaryOp(const TensorLayout& lhsLayout,
139 const Tensor::Impl* rhsImpl,
140 const TensorLayout& rhsLayout,
141 const TensorLayout& outLayout, BinaryOp op) const;
142
143 template <typename BinaryOp>
144 void applyInplaceBinaryOp(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
145 const TensorLayout& rhsLayout, BinaryOp op);
146
147
148 struct Identity {
149 template <typename T>
150 constexpr T&& operator()(T&& t) const noexcept {
151 return std::forward<T>(t);
152 }
153 };
154
155 // reduction must be associative
156 // x = f(x) must be true.
157 // transform is applied to the first element, so transform(x) = f(x) must be true.
158 template <typename ReductionOp, typename Transform = Identity>
159 std::unique_ptr<Tensor::Impl> applyReductionOp(const TensorLayout& layout,
160 const TensorLayout& blockLayout,
161 const TensorLayout& outLayout, ReductionOp op,
162 Transform transform = {}) const;
163};
164
165#endif // TENSOR_IMPL_CPU_H
Definition tensor_impl_CPU.h:14
Tensor::Shape getShape() const override
Returns the tensor shape.
Definition tensor_impl_CPU.cpp:101
bool compare(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) const override
Returns true if the data with lhsLayout matches rhsImpl with rhsLayout.
Definition tensor_impl_CPU.cpp:151
std::unique_ptr< Tensor::Impl > add(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise addition. Returns a new Impl with the result with outLayout.
Definition tensor_impl_CPU.cpp:198
std::unique_ptr< Tensor::Impl > div(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise division. Returns a new Impl with the result with outLayout.
Definition tensor_impl_CPU.cpp:222
void idiv(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) override
In-place elementwise division. Modifies lhsLayout in place.
Definition tensor_impl_CPU.cpp:263
std::unique_ptr< Tensor::Impl > lessEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise less or equal. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:419
std::unique_ptr< Tensor::Impl > greater(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise greater than. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:427
void isub(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) override
In-place elementwise subtraction. Modifies lhsLayout in place.
Definition tensor_impl_CPU.cpp:253
std::unique_ptr< Tensor::Impl > max(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Reduces dimensions [dim, rank) by taking the maximum. Output with outLayout.
Definition tensor_impl_CPU.cpp:312
void fillRand() override
Fills all elements with random values in [-1, 1].
Definition tensor_impl_CPU.cpp:24
std::unique_ptr< Tensor::Impl > prod(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Reduces dimensions [dim, rank) by taking the product. Output with outLayout.
Definition tensor_impl_CPU.cpp:319
std::unique_ptr< Tensor::Impl > isClose(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout, float tolerance) const override
Elementwise closeness within tolerance. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:443
std::string toString() const override
Returns a string representation of the data.
Definition tensor_impl_CPU.cpp:103
void print() const override
Prints the entire tensor to stdout.
Definition tensor_impl_CPU.cpp:33
std::unique_ptr< Tensor::Impl > equal(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise equal. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:395
void set(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) override
Copies data from rhsImpl with rhsLayout into this with lhsLayout.
Definition tensor_impl_CPU.cpp:136
float * dataPtr() const
Returns a raw pointer to the internal data buffer.
Definition tensor_impl_CPU.cpp:130
std::unique_ptr< Tensor::Impl > clone() const override
Deep copies this implementation.
Definition tensor_impl_CPU.cpp:132
std::unique_ptr< Tensor::Impl > notEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise not equal. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:403
void copyFromHost(const float *data, size_t count) override
Definition tensor_impl_CPU.cpp:126
std::unique_ptr< Tensor::Impl > mul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise multiplication. Returns a new Impl with the result with outLayout.
Definition tensor_impl_CPU.cpp:214
std::unique_ptr< Tensor::Impl > less(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise less than. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:411
std::unique_ptr< Tensor::Impl > greaterEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise greater or equal. Returns a tensor of 0.0 / 1.0 with outLayout.
Definition tensor_impl_CPU.cpp:435
std::unique_ptr< Tensor::Impl > sum(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Reduces dimensions [dim, rank) by summation. Output with outLayout.
Definition tensor_impl_CPU.cpp:299
std::unique_ptr< Tensor::Impl > all(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Definition tensor_impl_CPU.cpp:344
void imul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) override
In-place elementwise multiplication. Modifies lhsLayout in place.
Definition tensor_impl_CPU.cpp:258
std::unique_ptr< Tensor::Impl > sub(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const override
Elementwise subtraction. Returns a new Impl with the result with outLayout.
Definition tensor_impl_CPU.cpp:206
void fillAll(float value) override
Fills all elements with value.
Definition tensor_impl_CPU.cpp:22
size_t getNumElements() const override
Returns the total number of elements.
Definition tensor_impl_CPU.cpp:115
std::unique_ptr< Tensor::Impl > min(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Reduces dimensions [dim, rank) by taking the minimum. Output with outLayout.
Definition tensor_impl_CPU.cpp:305
std::unique_ptr< Tensor::Impl > any(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const override
Definition tensor_impl_CPU.cpp:354
std::unique_ptr< Tensor::Impl > matmul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout, size_t batch, size_t m, size_t k, size_t p) const override
Definition tensor_impl_CPU.cpp:363
void iadd(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) override
In-place elementwise addition. Modifies lhsLayout in place.
Definition tensor_impl_CPU.cpp:248
std::vector< float > toVector() const override
Copies all elements into a flat vector (row-major order).
Definition tensor_impl_CPU.cpp:124
Definition tensor_impl.h:15
Definition tensor_shape.h:15
Tensor norm() const
L2 norm (scalar tensor equal to sqrt(sum(x^2))).
Definition tensor.cpp:223
Definition tensor_layout.h:15