Skip to content

Commit 5686016

Browse files
author
DvirDukhan
authored
Merge pull request #581 from RedisAI/improve_tensor_len_calculation
tensor len member
2 parents 14e82db + 68534d6 commit 5686016

File tree

7 files changed

+33
-23
lines changed

7 files changed

+33
-23
lines changed

src/backends/onnxruntime.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ RAI_Tensor *RAI_TensorCreateFromOrtValue(OrtValue *v, size_t batch_offset, long
174174
return NULL;
175175
}
176176

177-
ret = RedisModule_Calloc(1, sizeof(*ret));
177+
ret = RAI_TensorNew();
178178

179179
DLContext ctx = (DLContext){.device_type = kDLCPU, .device_id = 0};
180180

@@ -261,7 +261,6 @@ RAI_Tensor *RAI_TensorCreateFromOrtValue(OrtValue *v, size_t batch_offset, long
261261
.manager_ctx = NULL,
262262
.deleter = NULL};
263263

264-
ret->refCount = 1;
265264
return ret;
266265
}
267266

src/backends/tensorflow.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ DLDataType RAI_GetDLDataTypeFromTF(TF_DataType dtype) {
8888

8989
RAI_Tensor *RAI_TensorCreateFromTFTensor(TF_Tensor *tensor, size_t batch_offset,
9090
long long batch_size) {
91-
RAI_Tensor *ret = RedisModule_Calloc(1, sizeof(*ret));
91+
RAI_Tensor *ret = RAI_TensorNew();
9292

9393
DLContext ctx = (DLContext){.device_type = kDLCPU, .device_id = 0};
9494

@@ -143,7 +143,6 @@ RAI_Tensor *RAI_TensorCreateFromTFTensor(TF_Tensor *tensor, size_t batch_offset,
143143
.manager_ctx = NULL,
144144
.deleter = NULL};
145145

146-
ret->refCount = 1;
147146
return ret;
148147
}
149148

src/serialization/RDB/decoder/current/v1/decode_v1.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void *RAI_RDBLoadTensor_v1(RedisModuleIO *io) {
4848
if (RedisModule_IsIOError(io))
4949
goto cleanup;
5050

51-
RAI_Tensor *ret = RedisModule_Calloc(1, sizeof(*ret));
51+
RAI_Tensor *ret = RAI_TensorNew();
5252
ret->tensor = (DLManagedTensor){.dl_tensor = (DLTensor){.ctx = ctx,
5353
.data = data,
5454
.ndim = ndims,
@@ -58,7 +58,6 @@ void *RAI_RDBLoadTensor_v1(RedisModuleIO *io) {
5858
.byte_offset = byte_offset},
5959
.manager_ctx = NULL,
6060
.deleter = NULL};
61-
ret->refCount = 1;
6261
return ret;
6362

6463
cleanup:

src/serialization/RDB/decoder/previous/v0/decode_v0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void *RAI_RDBLoadTensor_v0(RedisModuleIO *io) {
4141
if (RedisModule_IsIOError(io))
4242
goto cleanup;
4343

44-
RAI_Tensor *ret = RedisModule_Calloc(1, sizeof(*ret));
44+
RAI_Tensor *ret = RAI_TensorNew();
4545
ret->tensor = (DLManagedTensor){.dl_tensor = (DLTensor){.ctx = ctx,
4646
.data = data,
4747
.ndim = ndims,
@@ -51,7 +51,6 @@ void *RAI_RDBLoadTensor_v0(RedisModuleIO *io) {
5151
.byte_offset = byte_offset},
5252
.manager_ctx = NULL,
5353
.deleter = NULL};
54-
ret->refCount = 1;
5554
return ret;
5655

5756
cleanup:

src/tensor.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ int Tensor_DataTypeStr(DLDataType dtype, char *dtypestr) {
9595
return result;
9696
}
9797

98+
RAI_Tensor *RAI_TensorNew(void) {
99+
RAI_Tensor *ret = RedisModule_Calloc(1, sizeof(*ret));
100+
ret->refCount = 1;
101+
ret->len = LEN_UNKOWN;
102+
}
103+
98104
RAI_Tensor *RAI_TensorCreateWithDLDataType(DLDataType dtype, long long *dims, int ndims,
99105
int tensorAllocMode) {
100106

@@ -103,7 +109,7 @@ RAI_Tensor *RAI_TensorCreateWithDLDataType(DLDataType dtype, long long *dims, in
103109
return NULL;
104110
}
105111

106-
RAI_Tensor *ret = RedisModule_Alloc(sizeof(*ret));
112+
RAI_Tensor *ret = RAI_TensorNew();
107113
int64_t *shape = RedisModule_Alloc(ndims * sizeof(*shape));
108114
int64_t *strides = RedisModule_Alloc(ndims * sizeof(*strides));
109115

@@ -144,7 +150,6 @@ RAI_Tensor *RAI_TensorCreateWithDLDataType(DLDataType dtype, long long *dims, in
144150
.manager_ctx = NULL,
145151
.deleter = NULL};
146152

147-
ret->refCount = 1;
148153
return ret;
149154
}
150155

@@ -195,7 +200,7 @@ RAI_Tensor *_TensorCreateWithDLDataTypeAndRString(DLDataType dtype, size_t dtype
195200
memcpy(data, blob, nbytes);
196201
RAI_HoldString(NULL, rstr);
197202

198-
RAI_Tensor *ret = RedisModule_Alloc(sizeof(*ret));
203+
RAI_Tensor *ret = RAI_TensorNew();
199204
ret->tensor = (DLManagedTensor){.dl_tensor = (DLTensor){.ctx = ctx,
200205
.data = data,
201206
.ndim = ndims,
@@ -206,7 +211,6 @@ RAI_Tensor *_TensorCreateWithDLDataTypeAndRString(DLDataType dtype, size_t dtype
206211
.manager_ctx = rstr,
207212
.deleter = RAI_RStringDataTensorDeleter};
208213

209-
ret->refCount = 1;
210214
return ret;
211215
}
212216

@@ -335,7 +339,7 @@ int RAI_TensorDeepCopy(RAI_Tensor *t, RAI_Tensor **dest) {
335339
// Beware: this will take ownership of dltensor
336340
RAI_Tensor *RAI_TensorCreateFromDLTensor(DLManagedTensor *dl_tensor) {
337341

338-
RAI_Tensor *ret = RedisModule_Calloc(1, sizeof(*ret));
342+
RAI_Tensor *ret = RAI_TensorNew();
339343

340344
ret->tensor =
341345
(DLManagedTensor){.dl_tensor = (DLTensor){.ctx = dl_tensor->dl_tensor.ctx,
@@ -348,7 +352,6 @@ RAI_Tensor *RAI_TensorCreateFromDLTensor(DLManagedTensor *dl_tensor) {
348352
.manager_ctx = dl_tensor->manager_ctx,
349353
.deleter = dl_tensor->deleter};
350354

351-
ret->refCount = 1;
352355
return ret;
353356
}
354357

@@ -361,12 +364,15 @@ int RAI_TensorIsDataTypeEqual(RAI_Tensor *t1, RAI_Tensor *t2) {
361364
}
362365

363366
size_t RAI_TensorLength(RAI_Tensor *t) {
364-
int64_t *shape = t->tensor.dl_tensor.shape;
365-
size_t len = 1;
366-
for (size_t i = 0; i < t->tensor.dl_tensor.ndim; ++i) {
367-
len *= shape[i];
367+
if (t->len == LEN_UNKOWN) {
368+
int64_t *shape = t->tensor.dl_tensor.shape;
369+
size_t len = 1;
370+
for (size_t i = 0; i < t->tensor.dl_tensor.ndim; ++i) {
371+
len *= shape[i];
372+
}
373+
t->len = len;
368374
}
369-
return len;
375+
return t->len;
370376
}
371377

372378
size_t RAI_TensorDataSize(RAI_Tensor *t) { return Tensor_DataTypeSize(RAI_TensorDataType(t)); }

src/tensor.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ extern RedisModuleType *RedisAI_TensorType;
4949
*/
5050
int RAI_TensorInit(RedisModuleCtx *ctx);
5151

52+
/**
53+
* @brief Allocate an empty tensor with no data.
54+
* @note The new tensor ref coutn is 1.
55+
*
56+
* @return RAI_Tensor* - a pointer to the new tensor.
57+
*/
58+
RAI_Tensor *RAI_TensorNew(void);
59+
5260
/**
5361
* Allocate the memory and initialise the RAI_Tensor. Creates a tensor based on
5462
* the passed 'dataType` string and with the specified number of dimensions

src/tensor_struct.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
#ifndef SRC_TENSOR_STRUCT_H_
2-
#define SRC_TENSOR_STRUCT_H_
1+
#pragma once
32

43
#include "config.h"
54
#include "dlpack/dlpack.h"
5+
#include "limits.h"
66

7+
#define LEN_UNKOWN ULONG_MAX
78
typedef struct RAI_Tensor {
89
DLManagedTensor tensor;
10+
size_t len;
911
long long refCount;
1012
} RAI_Tensor;
11-
12-
#endif /* SRC_TENSOR_STRUCT_H_ */

0 commit comments

Comments
 (0)