Skip to content

Commit beec24a

Browse files
authored
Refactor out c_tensor_* functions (NimbleEdge#183)
* Refactor out c_tensor.{h,cpp} * Fix symbol visibility --------- Signed-off-by: Puneet Jindal <puneet.jindal@nimbleedgehq.ai>
1 parent 5deb31c commit beec24a

9 files changed

Lines changed: 236 additions & 138 deletions

File tree

coreruntime/nimblenet/data_variable/src/data_variable.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -486,17 +486,17 @@ OpReturnType DataVariable::create_tensor(const CTensor& c, CreateTensorType type
486486
OpReturnType DataVariable::create_single_variable(const CTensor& c) {
487487
switch (c.dataType) {
488488
case DATATYPE::FLOAT:
489-
return OpReturnType(new SingleVariable<float>(c.data));
489+
return OpReturnType(new SingleVariable<float>(c_tensor_get_float_data(c.data)));
490490
case DATATYPE::DOUBLE:
491-
return OpReturnType(new SingleVariable<double>(c.data));
491+
return OpReturnType(new SingleVariable<double>(c_tensor_get_double_data(c.data)));
492492
case DATATYPE::INT32:
493-
return OpReturnType(new SingleVariable<int32_t>(c.data));
493+
return OpReturnType(new SingleVariable<int32_t>(c_tensor_get_int32_data(c.data)));
494494
case DATATYPE::INT64:
495-
return OpReturnType(new SingleVariable<int64_t>(c.data));
495+
return OpReturnType(new SingleVariable<int64_t>(c_tensor_get_int64_data(c.data)));
496496
case DATATYPE::BOOLEAN:
497-
return OpReturnType(new SingleVariable<bool>(c.data));
497+
return OpReturnType(new SingleVariable<bool>(c_tensor_get_boolean_data(c.data)));
498498
case DATATYPE::STRING:
499-
return OpReturnType(new SingleVariable<std::string>(((char**)c.data)[0]));
499+
return OpReturnType(new SingleVariable<std::string>(c_tensor_get_string_data(c.data)));
500500
case DATATYPE::JSON:
501501
case DATATYPE::FUNCTION:
502502
return *(static_cast<OpReturnType*>(c.data));

coreruntime/nimblenet/executors/onnx/src/task_onnx_model.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
#include "tensor_data_variable.hpp"
1414

1515
#ifdef ORT_EXTENSIONS
16-
EXTERN_C_BEGIN
16+
DELITEAI_EXTERN_C_BEGIN
1717

1818
OrtStatus* ORT_API_CALL RegisterCustomOps(OrtSessionOptions* options, const OrtApiBase* api);
1919

2020
int ORT_API_CALL GetActiveOrtAPIVersion();
2121

22-
EXTERN_C_END
22+
DELITEAI_EXTERN_C_END
2323
#endif // ORT_EXTENSIONS
2424

2525
// =================================================================================================

coreruntime/nimblenet/nimble_net/include/nimble_net/c_tensor.h

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
#include "executor_structs.h"
1212
#include "nimble_net/config.h"
1313

14-
EXTERN_C_BEGIN
14+
DELITEAI_EXPORT_BEGIN
15+
16+
DELITEAI_EXTERN_C_BEGIN
1517

1618
/**
1719
* @brief Represents a single tensor with its metadata.
@@ -40,6 +42,37 @@ typedef struct CTensors {
4042
// =================================================================================================
4143

4244
void c_tensor_init(CTensor* tensor);
45+
// void c_tensor_deinit(CTensor* tensor);
46+
47+
// =================================================================================================
48+
49+
bool* c_tensor_create_boolean_data(bool value);
50+
bool c_tensor_get_boolean_data(void* data);
51+
52+
// =================================================================================================
53+
54+
int32_t* c_tensor_create_int32_data(int32_t value);
55+
int32_t c_tensor_get_int32_data(void* data);
56+
57+
// =================================================================================================
58+
59+
int64_t* c_tensor_create_int64_data(int64_t value);
60+
int64_t c_tensor_get_int64_data(void* data);
61+
62+
// =================================================================================================
63+
64+
float* c_tensor_create_float_data(float value);
65+
float c_tensor_get_float_data(void* data);
66+
67+
// =================================================================================================
68+
69+
double* c_tensor_create_double_data(double value);
70+
double c_tensor_get_double_data(void* data);
71+
72+
// =================================================================================================
73+
74+
char** c_tensor_create_string_data(const char* str);
75+
char* c_tensor_get_string_data(void* data);
4376

4477
// =================================================================================================
4578

@@ -55,4 +88,10 @@ void c_tensor_init(CTensor* tensor);
5588
typedef NimbleNetStatus* (*FrontendFunctionPtr)(void* context, const CTensors input,
5689
CTensors* output);
5790

58-
EXTERN_C_END
91+
// =================================================================================================
92+
93+
bool c_tensor_delete_data(CTensor* tensor);
94+
95+
DELITEAI_EXTERN_C_END
96+
97+
DELITEAI_EXPORT_END

coreruntime/nimblenet/nimble_net/include/nimble_net/config.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,22 @@
5555

5656
// =================================================================================================
5757

58+
#define DELITEAI_EXPORT __attribute__((visibility("default")))
59+
60+
// #pragma GCC visibility push(default)
61+
#define DELITEAI_EXPORT_BEGIN _Pragma("GCC visibility push(default)")
62+
63+
// #pragma GCC visibility pop
64+
#define DELITEAI_EXPORT_END _Pragma("GCC visibility pop")
65+
66+
// =================================================================================================
67+
5868
#ifdef __cplusplus
59-
#define EXTERN_C extern "C"
60-
#define EXTERN_C_BEGIN extern "C" {
61-
#define EXTERN_C_END } // extern "C"
69+
#define DELITEAI_EXTERN_C extern "C"
70+
#define DELITEAI_EXTERN_C_BEGIN extern "C" {
71+
#define DELITEAI_EXTERN_C_END } // extern "C"
6272
#else
63-
#define EXTERN_C
64-
#define EXTERN_C_BEGIN
65-
#define EXTERN_C_END
73+
#define DELITEAI_EXTERN_C
74+
#define DELITEAI_EXTERN_C_BEGIN
75+
#define DELITEAI_EXTERN_C_END
6676
#endif // __cplusplus

coreruntime/nimblenet/nimble_net/src/c_tensor.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,144 @@
66

77
#include "nimble_net/c_tensor.h"
88

9+
#include <cstdlib>
10+
#include <cstring>
11+
912
#include "nimble_net_util.hpp"
1013

14+
namespace {
15+
16+
template <typename T>
17+
T* c_tensor_create_singular_numeric_data(T value) {
18+
T* data = static_cast<T*>(malloc(sizeof(T)));
19+
if (data) {
20+
*data = value;
21+
}
22+
return data;
23+
}
24+
25+
template <typename T>
26+
T c_tensor_get_singular_numeric_data(void* data) {
27+
return *static_cast<T*>(data);
28+
}
29+
30+
void c_tensor_delete_singular_numeric_data(void* data) { free(data); }
31+
32+
// =================================================================================================
33+
34+
void c_tensor_delete_string_data(CTensor* tensor) {
35+
char** str_arr = static_cast<char**>(tensor->data);
36+
37+
int str_arr_len = 1;
38+
for (int i = 0; i < tensor->shapeLength; ++i) {
39+
str_arr_len *= tensor->shape[i];
40+
}
41+
42+
for (int i = 0; i < str_arr_len; ++i) {
43+
free(str_arr[i]);
44+
}
45+
free(str_arr);
46+
}
47+
48+
} // namespace
49+
50+
// =================================================================================================
51+
1152
void c_tensor_init(CTensor* tensor) {
1253
tensor->name = nullptr;
1354
tensor->data = nullptr;
1455
tensor->dataType = DATATYPE::UNKNOWN;
1556
tensor->shape = nullptr;
1657
tensor->shapeLength = 0;
1758
}
59+
60+
// =================================================================================================
61+
62+
bool* c_tensor_create_boolean_data(bool value) {
63+
return c_tensor_create_singular_numeric_data<bool>(value);
64+
}
65+
66+
bool c_tensor_get_boolean_data(void* data) {
67+
return c_tensor_get_singular_numeric_data<bool>(data);
68+
}
69+
70+
// =================================================================================================
71+
72+
int32_t* c_tensor_create_int32_data(int32_t value) {
73+
return c_tensor_create_singular_numeric_data<int32_t>(value);
74+
}
75+
76+
int32_t c_tensor_get_int32_data(void* data) {
77+
return c_tensor_get_singular_numeric_data<int32_t>(data);
78+
}
79+
80+
// =================================================================================================
81+
82+
int64_t* c_tensor_create_int64_data(int64_t value) {
83+
return c_tensor_create_singular_numeric_data<int64_t>(value);
84+
}
85+
86+
int64_t c_tensor_get_int64_data(void* data) {
87+
return c_tensor_get_singular_numeric_data<int64_t>(data);
88+
}
89+
90+
// =================================================================================================
91+
92+
float* c_tensor_create_float_data(float value) {
93+
return c_tensor_create_singular_numeric_data<float>(value);
94+
}
95+
96+
float c_tensor_get_float_data(void* data) {
97+
return c_tensor_get_singular_numeric_data<float>(data);
98+
}
99+
100+
// =================================================================================================
101+
102+
double* c_tensor_create_double_data(double value) {
103+
return c_tensor_create_singular_numeric_data<double>(value);
104+
}
105+
106+
double c_tensor_get_double_data(void* data) {
107+
return c_tensor_get_singular_numeric_data<double>(data);
108+
}
109+
110+
// =================================================================================================
111+
112+
char** c_tensor_create_string_data(const char* str) {
113+
char** data = static_cast<char**>(malloc(sizeof(char*)));
114+
if (data) {
115+
data[0] = strdup(str);
116+
}
117+
return data;
118+
}
119+
120+
char* c_tensor_get_string_data(void* data) { return static_cast<char**>(data)[0]; }
121+
122+
// =================================================================================================
123+
124+
bool c_tensor_delete_data(CTensor* tensor) {
125+
if (!tensor->data) {
126+
return true;
127+
}
128+
129+
switch (tensor->dataType) {
130+
case DATATYPE::BOOLEAN:
131+
case DATATYPE::INT32:
132+
case DATATYPE::INT64:
133+
case DATATYPE::FLOAT:
134+
case DATATYPE::DOUBLE: {
135+
c_tensor_delete_singular_numeric_data(tensor->data);
136+
return true;
137+
}
138+
139+
case DATATYPE::STRING: {
140+
c_tensor_delete_string_data(tensor);
141+
return true;
142+
}
143+
144+
default:
145+
break;
146+
}
147+
148+
return false;
149+
}

nimblenet_py/simulator_binder/binder.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,12 @@ bool deallocFrontendTensors(CTensors cTensors) {
213213
case DATATYPE::FUNCTION:
214214
TaskInputData::deallocate_OpReturnType(tensor.data);
215215
break;
216-
case DATATYPE::STRING: {
217-
char** data = static_cast<char**>(tensor.data);
218-
free(*data);
219-
free(data);
220-
break;
216+
default: {
217+
const bool freed = c_tensor_delete_data(&tensor);
218+
if (!freed) {
219+
free(tensor.data);
220+
}
221221
}
222-
default:
223-
free(tensor.data);
224222
}
225223
}
226224
delete[] cTensors.tensors;

nimblenet_py/simulator_binder/binder_v2.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -131,22 +131,22 @@ std::map<std::string, py::object> convert_CTensors_to_pymap(const CTensors& ret)
131131
if (shape_length == 0) {
132132
switch (type) {
133133
case DATATYPE::INT64:
134-
py_outputs[name] = py::int_(*(int64_t*)data);
134+
py_outputs[name] = py::int_(c_tensor_get_int64_data(data));
135135
break;
136136
case DATATYPE::FLOAT:
137-
py_outputs[name] = py::float_(*(float*)data);
137+
py_outputs[name] = py::float_(c_tensor_get_float_data(data));
138138
break;
139139
case DATATYPE::BOOLEAN:
140-
py_outputs[name] = py::bool_(*(bool*)data);
140+
py_outputs[name] = py::bool_(c_tensor_get_boolean_data(data));
141141
break;
142142
case DATATYPE::INT32:
143-
py_outputs[name] = py::int_(*(int32_t*)data);
143+
py_outputs[name] = py::int_(c_tensor_get_int32_data(data));
144144
break;
145145
case DATATYPE::DOUBLE:
146-
py_outputs[name] = py::float_(*(double*)data);
146+
py_outputs[name] = py::float_(c_tensor_get_double_data(data));
147147
break;
148148
case DATATYPE::STRING: {
149-
py_outputs[name] = py::str(((char**)data)[0]);
149+
py_outputs[name] = py::str(c_tensor_get_string_data(data));
150150
break;
151151
}
152152
case DATATYPE::JSON: {
@@ -250,27 +250,19 @@ CTensor construct_singleVariable_input(const std::string& name, py::object item)
250250
cTensor.shape = nullptr;
251251
if (py::isinstance<py::bool_>(item)) {
252252
cTensor.dataType = DATATYPE::BOOLEAN;
253-
bool* ptr = static_cast<bool*>(malloc(sizeof(bool)));
254-
*ptr = py::cast<bool>(item);
255-
cTensor.data = (void*)ptr;
253+
cTensor.data = c_tensor_create_boolean_data(py::cast<bool>(item));
256254
} else if (py::isinstance<py::int_>(item)) {
257255
// pybind does not differentiate between int32 and int64, both are represented by py::int_,
258256
// hence creating int64_t
259257
cTensor.dataType = DATATYPE::INT64;
260-
int64_t* val = static_cast<int64_t*>(malloc(sizeof(int64_t)));
261-
*val = py::cast<int64_t>(item);
262-
cTensor.data = (void*)val;
258+
cTensor.data = c_tensor_create_int64_data(py::cast<int64_t>(item));
263259
} else if (py::isinstance<py::float_>(item)) {
264260
cTensor.dataType = DATATYPE::FLOAT;
265-
float* val = static_cast<float*>(malloc(sizeof(float)));
266-
*val = py::cast<float>(item);
267-
cTensor.data = (void*)val;
261+
cTensor.data = c_tensor_create_float_data(py::cast<float>(item));
268262
} else if (py::isinstance<py::str>(item)) {
269263
cTensor.dataType = DATATYPE::STRING;
270-
std::string val = py::cast<std::string>(item);
271-
char** input = static_cast<char**>(malloc(sizeof(char*)));
272-
*input = strdup(val.c_str());
273-
cTensor.data = (void*)input;
264+
const std::string val = py::cast<std::string>(item);
265+
cTensor.data = c_tensor_create_string_data(val.c_str());
274266
} else if (py::isinstance<py::dict>(item)) {
275267
cTensor.dataType = DATATYPE::JSON;
276268
nlohmann::json json = convert_py_dict_to_json(py::cast<py::dict>(item));

0 commit comments

Comments
 (0)