32 #ifndef MXNET_LIB_API_H_ 33 #define MXNET_LIB_API_H_ 40 #include <unordered_map> 48 #include <curand_kernel.h> 52 #define MX_LIBRARY_VERSION 7 59 #if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) 60 #define PRIVATE_SYMBOL 62 #define PRIVATE_SYMBOL __attribute__ ((visibility ("hidden"))) 68 #ifndef DLPACK_VERSION 70 #define DLPACK_EXTERN_C extern "C" 72 #define DLPACK_EXTERN_C 76 #define DLPACK_VERSION 020 81 #define DLPACK_DLL __declspec(dllexport) 83 #define DLPACK_DLL __declspec(dllimport) 206 uint64_t byte_offset;
279 int64_t* indptr =
nullptr;
282 void set(
void *data_ptr,
const int64_t* dims,
int ndims,
void *idx,
283 int64_t num_idx,
void *idx_ptr =
nullptr, int64_t num_idx_ptr = 0) {
289 for (
int i = 1; i < ndims; ++i)
293 indices =
reinterpret_cast<int64_t*
>(idx);
294 indices_len = num_idx;
297 indptr =
reinterpret_cast<int64_t*
>(idx_ptr);
298 indptr_len = num_idx_ptr;
309 dtype(oth.dtype), verID(oth.verID), ctx(oth.ctx), stype(oth.stype) {
314 : data_ptr(data_ptr), shape(shape), dtype(dtype), verID(vID), ctx(mx_ctx), stype(stype) {
321 data_ptr = dptr; dtype = type; verID = vID; ctx = mx_ctx; stype = storage_type;
323 for (
int j = 0; j < ndims; j++) {
324 shape.push_back(dims[j]);
331 dltensor.data = data_ptr;
332 dltensor.ndim = shape.size();
333 dltensor.shape =
const_cast<int64_t*
>(shape.data());
334 dltensor.strides =
nullptr;
335 dltensor.byte_offset = 0;
336 dltensor.dtype.lanes = 1;
337 dltensor.ctx.device_id = ctx.dev_id;
338 if (ctx.dev_type ==
"cpu")
339 dltensor.ctx.device_type =
kDLCPU;
340 else if (ctx.dev_type ==
"gpu")
341 dltensor.ctx.device_type =
kDLGPU;
342 else if (ctx.dev_type ==
"opencl")
344 else if (ctx.dev_type ==
"vulcan")
346 else if (ctx.dev_type ==
"metal")
347 dltensor.ctx.device_type =
kDLMetal;
348 else if (ctx.dev_type ==
"vpi")
349 dltensor.ctx.device_type =
kDLVPI;
350 else if (ctx.dev_type ==
"rocm")
351 dltensor.ctx.device_type =
kDLROCM;
357 dltensor.dtype.bits = 32;
361 dltensor.dtype.bits = 64;
365 dltensor.dtype.bits = 16;
369 dltensor.dtype.bits = 8;
372 dltensor.dtype.code =
kDLInt;
373 dltensor.dtype.bits = 32;
376 dltensor.dtype.code =
kDLInt;
377 dltensor.dtype.bits = 8;
380 dltensor.dtype.code =
kDLInt;
381 dltensor.dtype.bits = 64;
384 dltensor.dtype.code = 0;
385 dltensor.dtype.bits = 0;
386 throw std::runtime_error(
"Error! Invalid dtype flag: " 387 + std::to_string(static_cast<int>(dtype))
388 +
" when constructing MXTensor");
393 template<
typename data_type>
395 return reinterpret_cast<data_type*
>(data_ptr);
401 for (
unsigned int i = 0; i < shape.size(); i++) {
410 dtype == oth.
dtype &&
411 verID == oth.
verID &&
414 shape == oth.
shape &&
443 typedef void* (*xpu_malloc_t)(
void*, int);
447 typedef void (*
nd_malloc_t)(
const void* _ndarray_alloc,
const int64_t* shapes,
int num_shapes,
448 const char* dev_str,
int dev_id,
int dtype,
const char* name,
449 int isArg,
void** data);
451 #if defined(__NVCC__) 462 #define MX_NUM_CPU_RANDOM_STATES 1024 463 #define MX_NUM_GPU_RANDOM_STATES 32768 468 std::unordered_map<std::string, MXTensor>* new_aux,
470 : new_args_(new_args), new_aux_(new_aux), nd_malloc_(nd_malloc), nd_alloc_(nd_alloc) {}
474 nd_malloc_(nd_alloc_, shapes.data(), shapes.size(), ctx.
dev_type.c_str(), ctx.
dev_id,
475 dtype, name.c_str(), 1, &data);
477 (*new_args_)[name] = tensor;
478 return &(new_args_->at(name));
483 nd_malloc_(nd_alloc_, shapes.data(), shapes.size(), ctx.
dev_type.c_str(), ctx.
dev_id,
484 dtype, name.c_str(), 0, &data);
486 (*new_aux_)[name] = tensor;
487 return &(new_aux_->at(name));
491 std::unordered_map<std::string, MXTensor>* new_args_;
492 std::unordered_map<std::string, MXTensor>* new_aux_;
494 const void* nd_alloc_;
503 xpu_malloc_t gpu_malloc_fp,
void* gpu_alloc_fp,
void* stream,
505 void* rng_cpu_states,
void* rng_gpu_states)
506 : cpu_malloc(cpu_malloc_fp), gpu_malloc(gpu_malloc_fp),
507 cpu_alloc(cpu_alloc_fp), gpu_alloc(gpu_alloc_fp), cuda_stream(stream),
508 sparse_malloc(sparse_malloc_fp), sparse_alloc(sparse_alloc_fp),
509 rand_cpu_states(rng_cpu_states), rand_gpu_states(rng_gpu_states) {}
513 return cpu_malloc(cpu_alloc, size);
518 return gpu_malloc(gpu_alloc, size);
528 sparse_malloc(sparse_alloc, index, indices_len, indptr_len,
549 void *cpu_alloc, *gpu_alloc;
557 void *rand_cpu_states, *rand_gpu_states;
561 #define MX_STR_SUBGRAPH_SYM_JSON "subgraph_sym_json" 562 #define MX_STR_DTYPE "__ext_dtype__" 563 #define MX_STR_SHAPE "__ext_shape__" 572 std::string
getShapeAt(
const std::string& shape,
unsigned index) {
575 for (
unsigned x=0; x < index; x++)
576 idx = shape.find(
"[", idx+1);
577 int stop = shape.find(
"]", idx);
579 return shape.substr(idx, stop-idx+1);
589 std::string
getDtypeAt(
const std::string& dtype,
unsigned index) {
592 for (
unsigned x=0; x < index; x++)
593 idx = dtype.find(
",", idx+1);
594 int stop = dtype.find(
",", idx+1);
595 if (stop == -1) stop = dtype.find(
"]", idx+1);
596 return dtype.substr(idx+1, stop-idx-1);
611 explicit JsonVal(std::string s) : type(
STR), num(-1), str(s) {}
618 if (type ==
STR)
return type == o.
type && str < o.
str;
620 if (type ==
NUM)
return type == o.
type && num < o.
num;
623 if (list.size() != o.
list.size())
return false;
624 for (
unsigned int i=0; i< list.size(); i++)
625 if (list[i] < o.
list[i])
631 if (map.size() != o.
map.size())
return false;
632 for (
auto &item : map) {
634 if (o.
map.find(item.first) == o.
map.end())
return false;
635 if (item.second < o.
map.at(item.first))
return false;
639 return type < o.
type;
645 std::map<JsonVal, JsonVal>
map;
651 unsigned int idx = 0;
652 return parse(json, &idx);
655 std::cout << json_val_string(val) << std::endl;
665 ret =
"json(STR:" + val.
str +
")";
668 ret =
"json(INT:" + val.
str +
")";
672 for (
auto &item : val.
list)
673 ret += json_val_string(item) +
",";
678 for (
auto &item : val.
map)
679 ret += json_val_string(item.first) +
" : " + json_val_string(item.second) +
",";
688 while (*idx < json.size()) {
689 if (json[*idx] ==
'"') {
693 ret.
str += json[*idx];
697 std::cout <<
"Error! Unable to parse string" << std::endl;
703 while (*idx < json.size()) {
704 if (json[*idx] >=
'0' && json[*idx] <=
'9') {
705 ret.
str += json[*idx];
711 ret.
num = std::stoi(ret.
str);
717 while (*idx < json.size()) {
718 if (json[*idx] ==
']') {
722 JsonVal item = parse(json, idx);
724 ret.
list.push_back(item);
727 std::cout <<
"Error! Unable to parse list" << std::endl;
733 while (*idx < json.size()) {
734 if (json[*idx] ==
'}') {
738 JsonVal item = parse(json, idx);
747 std::cout <<
"Error! Unable to parse map" << std::endl;
753 while (*idx < json.size()) {
754 if (json[*idx] ==
'"') {
756 ret = parse_string(json, idx);
757 }
else if (json[*idx] >=
'0' && json[*idx] <=
'9') {
758 ret = parse_num(json, idx);
759 }
else if (json[*idx] ==
'[') {
761 ret = parse_list(json, idx);
762 }
else if (json[*idx] ==
'{') {
764 ret = parse_map(json, idx);
765 }
else if (json[*idx] ==
']' || json[*idx] ==
'}') {
return ret;}
766 if (ret.
type !=
ERR)
return ret;
779 ret =
"\"" + val.
str +
"\"";
786 for (
unsigned i=0; i < val.
list.size(); i++) {
787 auto &item = val.
list[i];
789 if (i < val.
list.size()-1)
797 for (
auto &item : val.
map) {
798 ret += dump(item.first) +
" : " + dump(item.second);
799 if (cnt++ < val.
map.size()-1)
817 virtual bool Select(
int nodeID) = 0;
823 virtual bool SelectInput(
int nodeID,
int input_nodeID) = 0;
829 virtual bool SelectOutput(
int nodeID,
int output_nodeID) = 0;
835 virtual void Filter(
const std::vector<int>& candidates,
836 std::vector<int>* keep) {
837 keep->insert(keep->end(), candidates.begin(), candidates.end());
853 std::vector<MXTensor>* outputs,
856 std::vector<MXTensor>* outputs,
858 std::cout <<
"Error! Operator does not support backward" << std::endl;
874 std::string>& attributes,
875 std::vector<MXTensor>* inputs,
876 std::vector<MXTensor>* outputs,
879 std::string>& attributes,
880 int* num_inputs,
int* num_outputs);
882 std::string>& attributes,
883 std::vector<int>* in_types,
884 std::vector<int>* out_types);
886 std::string>& attributes,
887 std::vector<int>* in_storage_types,
888 std::vector<int>* out_storage_types);
890 std::string>& attributes,
891 std::vector<std::vector<unsigned int> >* in_shapes,
892 std::vector<std::vector<unsigned int> >* out_shapes);
894 std::string>& attributes,
895 std::vector<int>* input_indices);
897 std::string>& attributes,
905 explicit CustomOp(
const char* op_name) : name(op_name),
906 parse_attrs(NULL), infer_type(NULL), infer_storage_type(NULL), infer_shape(NULL),
907 mutate_inputs(NULL), isSGop(false) {}
909 if (forward_ctx_map.count(ctx) > 0)
910 raiseDuplicateContextError();
911 forward_ctx_map[ctx] = fcomp;
915 if (backward_ctx_map.count(ctx) > 0)
916 raiseDuplicateContextError();
917 backward_ctx_map[ctx] = fgrad;
929 infer_storage_type = func;
937 mutate_inputs = func;
941 if (create_op_ctx_map.count(ctx) > 0)
942 raiseDuplicateContextError();
943 create_op_ctx_map[ctx] = func;
951 for (
auto kv : forward_ctx_map) {
952 forward_ctx_cstr.push_back(kv.first);
953 forward_fp.push_back(kv.second);
955 for (
auto kv : backward_ctx_map) {
956 backward_ctx_cstr.push_back(kv.first);
957 backward_fp.push_back(kv.second);
959 for (
auto kv : create_op_ctx_map) {
960 create_op_ctx_cstr.push_back(kv.first);
961 create_op_fp.push_back(kv.second);
983 void raiseDuplicateContextError() {
984 std::string op_name_str(name);
985 throw std::runtime_error(
986 "Error! Error! Cannot register multiple functions under same context for operator '" 987 + op_name_str +
"'");
991 std::unordered_map<const char*, fcomp_t> forward_ctx_map, backward_ctx_map;
992 std::unordered_map<const char*, createOpState_t> create_op_ctx_map;
997 const std::unordered_map<std::string, std::string>& options,
998 const std::unordered_map<std::string, MXTensor>& args,
999 const std::unordered_map<std::string, MXTensor>& aux,
1009 : name(pass_name) {}
1023 const std::unordered_map<std::string,
1024 std::string>& options);
1026 const std::unordered_map<std::string,
1027 std::string>& options);
1029 const std::unordered_map<std::string,
1030 std::string>& options,
1031 std::unordered_map<std::string, std::string>* attrs,
1032 const std::unordered_map<std::string, MXTensor>& args,
1033 const std::unordered_map<std::string, MXTensor>& aux);
1042 name(backend_name) {}
1044 const char* sg_name) {
1045 strategies.push_back(prop_name);
1046 op_names.push_back(sg_name);
1050 supported_map[std::string(prop_name)] = fn;
1054 selector_map[std::string(prop_name)] = fn;
1058 review_map[std::string(prop_name)] = fn;
1062 std::string prop(strategies[stg_id]);
1063 if (supported_map.count(prop) > 0)
1064 return supported_map[prop];
1069 std::string prop(strategies[stg_id]);
1070 if (selector_map.count(prop) > 0)
1071 return selector_map[prop];
1076 std::string prop(strategies[stg_id]);
1077 if (review_map.count(prop) > 0)
1078 return review_map[prop];
1114 T *entry =
new T(name);
1115 entries.push_back(entry);
1119 return entries.size();
1122 return *(entries.at(idx));
1131 std::vector<T*> entries;
1139 #define MX_STR_CONCAT_(__a, __b) __a ## __b 1140 #define MX_STR_CONCAT(__a, __b) MX_STR_CONCAT_(__a, __b) 1143 #define MX_STRINGIFY(x) #x 1144 #define MX_TOSTRING(x) MX_STRINGIFY(x) 1147 #define MX_REGISTER_NAME_(Name) MXNet ## _CustomOp ## _ 1148 #define MX_REGISTER_DEF_(Name) CustomOp MX_REGISTER_NAME_(Name) 1150 #define MX_REGISTER_PROP_NAME_(Name) MXNet ## _CustomSubProp ## _ 1151 #define MX_REGISTER_PROP_DEF_(Name) CustomPartitioner MX_REGISTER_PROP_NAME_(Name) 1153 #define MX_REGISTER_PASS_NAME_(Name) MXNet ## _CustomPass ## _ 1154 #define MX_REGISTER_PASS_DEF_(Name) CustomPass MX_REGISTER_PASS_NAME_(Name) 1157 #define REGISTER_OP(Name) MX_STR_CONCAT(MX_REGISTER_DEF_(Name), __COUNTER__) = \ 1158 Registry<CustomOp>::get()->add(MX_TOSTRING(Name)) 1160 #define REGISTER_PARTITIONER(Name) \ 1161 MX_STR_CONCAT(MX_REGISTER_PROP_DEF_(Name), __COUNTER__) = \ 1162 Registry<CustomPartitioner>::get()->add(MX_TOSTRING(Name)) 1164 #define REGISTER_PASS(Name) \ 1165 MX_STR_CONCAT(MX_REGISTER_PASS_DEF_(Name), __COUNTER__) = \ 1166 Registry<CustomPass>::get()->add(MX_TOSTRING(Name)) 1175 #define MXLIB_OPREGSIZE_STR "_opRegSize" 1178 #define MXLIB_OPREGGET_STR "_opRegGet" 1179 typedef int (*
opRegGet_t)(
int idx,
const char** name,
int *isSGop,
1180 const char*** forward_ctx,
fcomp_t** forward_fp,
int* forward_count,
1181 const char*** backward_ctx,
fcomp_t** backward_fp,
int* backward_count,
1183 int* create_op_count,
1187 #define MXLIB_OPCALLFREE_STR "_opCallFree" 1190 #define MXLIB_OPCALLPARSEATTRS_STR "_opCallParseAttrs" 1192 const char*
const* vals,
int num,
1193 int* num_in,
int* num_out);
1195 #define MXLIB_OPCALLINFERSHAPE_STR "_opCallInferShape" 1197 const char*
const* vals,
int num,
1198 unsigned int** inshapes,
int* indims,
int num_in,
1199 unsigned int*** mod_inshapes,
int** mod_indims,
1200 unsigned int*** outshapes,
int** outdims,
int num_out);
1202 #define MXLIB_OPCALLINFERTYPE_STR "_opCallInferType" 1204 const char*
const* vals,
int num,
1205 int* intypes,
int num_in,
int* outtypes,
int num_out);
1207 #define MXLIB_OPCALLINFERSTYPE_STR "_opCallInferSType" 1209 const char*
const* vals,
int num,
1210 int* intypes,
int num_in,
int* outtypes,
int num_out);
1212 #define MXLIB_OPCALLFCOMP_STR "_opCallFCompute" 1214 const char*
const* vals,
int num,
1215 const int64_t** inshapes,
int* indims,
1216 void** indata,
int* intypes,
1217 size_t* inIDs,
const char** indev_type,
1218 int* indev_id,
int num_in,
1219 const int64_t** outshapes,
int* outdims,
1220 void** outdata,
int* outtypes,
1221 size_t* outIDs,
const char** outdev_type,
1222 int* outdev_id,
int num_out,
1224 xpu_malloc_t gpu_malloc,
void* gpu_alloc,
void* cuda_stream,
1226 int* instypes,
int* outstypes,
1227 void** in_indices,
void** out_indices,
1228 void** in_indptr,
void** out_indptr,
1229 int64_t* in_indices_shapes, int64_t* out_indices_shapes,
1230 int64_t* in_indptr_shapes, int64_t* out_indptr_shapes,
1231 void* rng_cpu_states,
void* rng_gpu_states);
1233 #define MXLIB_OPCALLMUTATEINPUTS_STR "_opCallMutateInputs" 1235 const char*
const* vals,
int num,
1236 int** mutate_indices,
int* indices_size);
1238 #define MXLIB_OPCALLCREATEOPSTATE_STR "_opCallCreateOpState" 1240 const char*
const* vals,
int num,
1243 #define MXLIB_OPCALLFSTATEFULCOMP_STR "_opCallFStatefulCompute" 1245 const int64_t** inshapes,
int* indims,
1246 void** indata,
int* intypes,
1247 size_t* inIDs,
const char** indev_type,
1248 int* indev_id,
int num_in,
1249 const int64_t** outshapes,
int* outdims,
1250 void** outdata,
int* outtypes,
1251 size_t* outIDs,
const char** outdev_type,
1252 int* outdev_id,
int num_out,
1254 xpu_malloc_t gpu_malloc,
void* gpu_alloc,
void* stream,
1256 int* instypes,
int* outstypes,
1257 void** in_indices,
void** out_indices,
1258 void** in_indptr,
void** out_indptr,
1259 int64_t* in_indices_shapes, int64_t* out_indices_shapes,
1260 int64_t* in_indptr_shapes, int64_t* out_indptr_shapes,
1261 void* rng_cpu_states,
void* rng_gpu_states);
1263 #define MXLIB_PARTREGSIZE_STR "_partRegSize" 1266 #define MXLIB_PARTREGGETCOUNT_STR "_partRegGetCount" 1269 #define MXLIB_PARTREGGET_STR "_partRegGet" 1270 typedef void (*
partRegGet_t)(
int part_idx,
int stg_idx,
const char** strategy,
1274 #define MXLIB_PARTCALLSUPPORTEDOPS_STR "_partCallSupportedOps" 1276 int num_ids,
int *ids,
const char*
const* opt_keys,
1277 const char*
const* opt_vals,
int num_opts);
1279 #define MXLIB_PARTCALLCREATESELECTOR_STR "_partCallCreateSelector" 1281 void** selector,
const char*
const* opt_keys,
1282 const char*
const* opt_vals,
int num_opts);
1284 #define MXLIB_PARTCALLSELECT_STR "_partCallSelect" 1287 #define MXLIB_PARTCALLSELECTINPUT_STR "_partCallSelectInput" 1291 #define MXLIB_PARTCALLSELECTOUTPUT_STR "_partCallSelectOutput" 1295 #define MXLIB_PARTCALLFILTER_STR "_partCallFilter" 1297 int** keep,
int* num_keep);
1299 #define MXLIB_PARTCALLRESET_STR "_partCallReset" 1302 #define MXLIB_PARTCALLREVIEWSUBGRAPH_STR "_partCallReviewSubgraph" 1304 int subgraph_id,
int *accept,
const char*
const* opt_keys,
1305 const char*
const* opt_vals,
int num_opts,
1306 char*** attr_keys,
char*** attr_vals,
int *num_attrs,
1307 const char*
const* arg_names,
int num_args,
1308 void*
const* arg_data,
const int64_t*
const* arg_shapes,
1309 const int* arg_dims,
const int* arg_types,
1310 const size_t* arg_IDs,
const char*
const* arg_dev_type,
1311 const int* arg_dev_id,
1312 const char*
const* aux_names,
int num_aux,
1313 void*
const* aux_data,
const int64_t*
const* aux_shapes,
1314 const int* aux_dims,
const int* aux_types,
1315 const size_t* aux_IDs,
const char*
const* aux_dev_type,
1316 const int* aux_dev_id);
1318 #define MXLIB_PASSREGSIZE_STR "_passRegSize" 1321 #define MXLIB_PASSREGGET_STR "_passRegGet" 1324 #define MXLIB_PASSCALLGRAPHPASS_STR "_passCallGraphPass" 1326 char** out_graph,
const char*
const* opt_keys,
1327 const char*
const* opt_vals,
int num_opts,
1328 const char* pass_name,
const char*
const* arg_names,
1329 int num_args,
void*
const* arg_data,
1330 const int64_t*
const* arg_shapes,
const int* arg_dims,
1331 const int* arg_types,
const size_t* arg_IDs,
1332 const char*
const* arg_dev_type,
const int* arg_dev_id,
1333 const char*
const* aux_names,
int num_aux,
1334 void*
const* aux_data,
const int64_t*
const* aux_shapes,
1335 const int* aux_dims,
const int* aux_types,
1336 const size_t* aux_IDs,
const char*
const* aux_dev_type,
1338 const void* nd_alloc);
1340 #define MXLIB_INITIALIZE_STR "initialize" 1343 #define MXLIB_OPVERSION_STR "_opVersion" 1346 #if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) 1347 #define MX_INT_RET __declspec(dllexport) int __cdecl 1348 #define MX_VOID_RET __declspec(dllexport) void __cdecl 1350 #define MX_INT_RET int 1351 #define MX_VOID_RET void 1367 const char*** forward_ctx,
fcomp_t** forward_fp,
1368 int* forward_count,
const char*** backward_ctx,
1369 fcomp_t** backward_fp,
int* backward_count,
1400 const char*
const* vals,
int num,
1401 int* num_in,
int* num_out) {
1403 std::unordered_map<std::string, std::string> attrs;
1404 for (
int i = 0; i < num; i++) {
1405 attrs[std::string(keys[i])] = std::string(vals[i]);
1408 return parseAttrs(attrs, num_in, num_out);
1413 const char*
const* vals,
int num,
1414 unsigned int** inshapes,
int* indims,
int num_in,
1415 unsigned int*** mod_inshapes,
int** mod_indims,
1416 unsigned int*** outshapes,
int** outdims,
int num_out) {
1418 std::unordered_map<std::string, std::string> attrs;
1419 for (
int i = 0; i < num; i++) {
1420 attrs[std::string(keys[i])] = std::string(vals[i]);
1424 std::vector<std::vector<unsigned int> > in_shapes(num_in);
1425 for (
int i = 0; i < num_in; i++) {
1426 for (
int j = 0; j < indims[i]; j++) {
1427 in_shapes[i].push_back(inshapes[i][j]);
1432 std::vector<std::vector<unsigned int> > out_shapes(num_out);
1434 int retval = inferShape(attrs, &in_shapes, &out_shapes);
1435 if (!retval)
return retval;
1438 *mod_indims =
static_cast<int*
>(malloc (num_in *
sizeof(
int)));
1439 *mod_inshapes =
static_cast<unsigned**
>(malloc (num_in *
sizeof(
unsigned*)));
1442 for (
int i = 0; i < num_in; i++) {
1443 (*mod_indims)[i] = in_shapes[i].size();
1444 (*mod_inshapes)[i] =
static_cast<unsigned*
>(malloc ((*mod_indims)[i] *
sizeof(
unsigned)));
1445 for (
int j = 0; j < (*mod_indims)[i]; j++) {
1446 (*mod_inshapes)[i][j] = in_shapes[i][j];
1451 *outdims =
static_cast<int*
>(malloc (num_out *
sizeof(
int)));
1452 *outshapes =
static_cast<unsigned**
>(malloc (num_out *
sizeof(
unsigned*)));
1455 for (
int i = 0; i < num_out; i++) {
1456 (*outdims)[i] = out_shapes[i].size();
1457 (*outshapes)[i] =
static_cast<unsigned*
>(malloc ((*outdims)[i] *
sizeof(
unsigned)));
1458 for (
int j = 0; j < (*outdims)[i]; j++) {
1459 (*outshapes)[i][j] = out_shapes[i][j];
1468 const char*
const* vals,
int num,
1469 int* intypes,
int num_in,
int* outtypes,
int num_out) {
1471 std::unordered_map<std::string, std::string> attrs;
1472 for (
int i = 0; i < num; i++) {
1473 attrs[std::string(keys[i])] = std::string(vals[i]);
1477 std::vector<int> in_types(num_in);
1478 for (
int i = 0; i < num_in; i++) {
1479 in_types[i] = intypes[i];
1483 std::vector<int> out_types(num_out, -1);
1485 int retval = inferType(attrs, &in_types, &out_types);
1490 for (
int i = 0; i < num_in; i++) {
1491 intypes[i] = in_types[i];
1494 for (
int i = 0; i < num_out; i++) {
1495 outtypes[i] = out_types[i];
1503 const char*
const* vals,
int num,
1504 int* instypes,
int num_in,
int* outstypes,
int num_out) {
1506 std::unordered_map<std::string, std::string> attrs;
1507 for (
int i = 0; i < num; i++) {
1508 attrs[std::string(keys[i])] = std::string(vals[i]);
1512 std::vector<int> in_stypes(num_in);
1513 for (
int i = 0; i < num_in; i++) {
1514 in_stypes[i] = instypes[i];
1518 std::vector<int> out_stypes(num_out, -1);
1520 int retval = inferSType(attrs, &in_stypes, &out_stypes);
1526 for (
int i = 0; i < num_in; i++) {
1527 instypes[i] = in_stypes[i];
1530 for (
int i = 0; i < num_out; i++) {
1531 outstypes[i] = out_stypes[i];
1539 int num,
const int64_t** inshapes,
int* indims,
void** indata,
1540 int* intypes,
size_t* inIDs,
const char** indev_type,
int* indev_id,
1541 int num_in,
const int64_t** outshapes,
int* outdims,
void** outdata,
1542 int* outtypes,
size_t* outIDs,
const char** outdev_type,
1543 int* outdev_id,
int num_out,
xpu_malloc_t cpu_malloc,
void* cpu_alloc,
1544 xpu_malloc_t gpu_malloc,
void* gpu_alloc,
void* cuda_stream,
1546 int* instypes,
int* outstypes,
void** in_indices,
void** out_indices,
1547 void** in_indptr,
void** out_indptr,
1548 int64_t* in_indices_shapes, int64_t* out_indices_shapes,
1549 int64_t* in_indptr_shapes, int64_t* out_indptr_shapes,
1550 void* rng_cpu_states,
void* rng_gpu_states) {
1552 std::unordered_map<std::string, std::string> attrs;
1553 for (
int i = 0; i < num; i++) {
1554 attrs[std::string(keys[i])] = std::string(vals[i]);
1558 std::vector<MXTensor> inputs(num_in);
1560 std::vector<MXSparse> in_sparse(num_in);
1562 for (
int i = 0; i < num_in; i++) {
1564 if (instypes[i] == 0) {
1565 inputs[i].setTensor(indata[i], (
MXDType)intypes[i], inshapes[i], indims[i],
1570 if (instypes[i] == 1) {
1572 in_sparse[i].set(indata[i], inshapes[i], indims[i], in_indices[i], in_indices_shapes[i]);
1575 in_sparse[i].set(indata[i], inshapes[i], indims[i], in_indices[i],
1576 in_indices_shapes[i], in_indptr[i], in_indptr_shapes[i]);
1578 inputs[i].setTensor(reinterpret_cast<void*>(&in_sparse[i]), (
MXDType)intypes[i],
1579 inshapes[i], indims[i], inIDs[i],
1580 MXContext(indev_type[i], indev_id[i]), type);
1585 std::vector<MXTensor> outputs(num_out);
1586 std::vector<MXSparse> out_sparse(num_out);
1588 for (
int i = 0; i < num_out; i++) {
1590 if (outstypes[i] == 0) {
1591 outputs[i].setTensor(outdata[i], (
MXDType)outtypes[i], outshapes[i], outdims[i],
1596 if (outstypes[i] == 1) {
1598 out_sparse[i].set(outdata[i], outshapes[i], outdims[i],
1599 out_indices[i], out_indices_shapes[i]);
1602 out_sparse[i].set(outdata[i], outshapes[i], outdims[i], out_indices[i],
1603 out_indices_shapes[i], out_indptr[i], out_indptr_shapes[i]);
1605 outputs[i].setTensor(reinterpret_cast<void*>(&out_sparse[i]), (
MXDType)outtypes[i],
1606 outshapes[i], outdims[i], outIDs[i],
1607 MXContext(outdev_type[i], outdev_id[i]), type);
1611 OpResource res(cpu_malloc, cpu_alloc, gpu_malloc, gpu_alloc,
1612 cuda_stream, sparse_malloc, sparse_alloc, rng_cpu_states, rng_gpu_states);
1613 return fcomp(attrs, &inputs, &outputs, res);
1618 const char*
const* vals,
int num,
1619 int** mutate_indices,
int* indices_size) {
1621 std::unordered_map<std::string, std::string> attrs;
1622 for (
int i = 0; i < num; i++) {
1623 attrs[std::string(keys[i])] = std::string(vals[i]);
1627 std::vector<int> mut_ind;
1629 int retval = mutate(attrs, &mut_ind);
1634 *indices_size = mut_ind.size();
1635 *mutate_indices =
static_cast<int*
>(malloc (*indices_size *
sizeof(
int)));
1636 for (
int i = 0; i < *indices_size; i++) {
1637 (*mutate_indices)[i] = mut_ind[i];
1645 const char*
const* vals,
int num,
1648 std::unordered_map<std::string, std::string> attrs;
1649 for (
int i = 0; i < num; i++) {
1650 attrs[std::string(keys[i])] = std::string(vals[i]);
1656 return create_op(attrs, op_ptr);
1661 int* indims,
void** indata,
int* intypes,
size_t* inIDs,
1662 const char** indev_type,
int* indev_id,
int num_in,
1663 const int64_t** outshapes,
int* outdims,
void** outdata,
1664 int* outtypes,
size_t* outIDs,
const char** outdev_type,
1666 void* cpu_alloc,
xpu_malloc_t gpu_malloc,
void* gpu_alloc,
1668 void* sparse_alloc,
int* instypes,
int* outstypes,
1669 void** in_indices,
void** out_indices,
void** in_indptr,
1670 void** out_indptr, int64_t* in_indices_shapes,
1671 int64_t* out_indices_shapes, int64_t* in_indptr_shapes,
1672 int64_t* out_indptr_shapes,
1673 void* rng_cpu_states,
void* rng_gpu_states) {
1675 std::vector<MXTensor> inputs(num_in);
1677 std::vector<MXSparse> in_sparse(num_in);
1679 for (
int i = 0; i < num_in; i++) {
1680 if (instypes[i] == 0) {
1682 inputs[i].setTensor(indata[i], (
MXDType)intypes[i], inshapes[i], indims[i],
1687 if (instypes[i] == 1) {
1689 in_sparse[i].set(indata[i], inshapes[i], indims[i], in_indices[i], in_indices_shapes[i]);
1692 in_sparse[i].set(indata[i], inshapes[i], indims[i], in_indices[i],
1693 in_indices_shapes[i], in_indptr[i], in_indptr_shapes[i]);
1695 inputs[i].setTensor(reinterpret_cast<void*>(&in_sparse[i]), (
MXDType)intypes[i],
1696 inshapes[i], indims[i], inIDs[i],
1697 MXContext(indev_type[i], indev_id[i]), type);
1702 std::vector<MXTensor> outputs(num_out);
1704 std::vector<MXSparse> out_sparse(num_out);
1706 for (
int i = 0; i < num_out; i++) {
1707 if (outstypes[i] == 0) {
1709 outputs[i].setTensor(outdata[i], (
MXDType)outtypes[i], outshapes[i], outdims[i],
1714 if (outstypes[i] == 1) {
1716 out_sparse[i].set(outdata[i], outshapes[i], outdims[i], out_indices[i],
1717 out_indices_shapes[i]);
1720 out_sparse[i].set(outdata[i], outshapes[i], outdims[i], out_indices[i],
1721 out_indices_shapes[i], out_indptr[i], out_indptr_shapes[i]);
1723 outputs[i].setTensor(reinterpret_cast<void*>(&out_sparse[i]), (
MXDType)outtypes[i],
1724 outshapes[i], outdims[i], outIDs[i],
1725 MXContext(outdev_type[i], outdev_id[i]), type);
1729 OpResource res(cpu_malloc, cpu_alloc, gpu_malloc, gpu_alloc,
1730 stream, sparse_malloc, sparse_alloc, rng_cpu_states, rng_gpu_states);
1734 return op_ptr->
Forward(&inputs, &outputs, res);
1736 return op_ptr->
Backward(&inputs, &outputs, res);
1766 int num_ids,
int *ids,
const char*
const* opt_keys,
1767 const char*
const* opt_vals,
int num_opts) {
1768 std::string subgraph_json(json);
1770 std::unordered_map<std::string, std::string> opts;
1771 for (
int i = 0; i < num_opts; i++)
1772 opts[std::string(opt_keys[i])] = std::string(opt_vals[i]);
1775 std::vector<int> _ids(num_ids, -2);
1777 MXReturnValue retval = supportedOps(subgraph_json, &_ids, opts);
1778 if (!retval)
return retval;
1781 for (
int i = 0; i < num_ids; i++)
1789 void** selector,
const char*
const* opt_keys,
1790 const char*
const* opt_vals,
int num_opts) {
1791 std::string symbol_json(json);
1793 std::unordered_map<std::string, std::string> opts;
1794 for (
int i = 0; i < num_opts; i++)
1795 opts[std::string(opt_keys[i])] = std::string(opt_vals[i]);
1802 return createSelector(symbol_json, sel_ptr, opts);
1808 *selected = sel_ptr->
Select(nodeID);
1813 int input_nodeID,
int* selected) {
1815 *selected = sel_ptr->
SelectInput(nodeID, input_nodeID);
1820 int output_nodeID,
int* selected) {
1822 *selected = sel_ptr->
SelectOutput(nodeID, output_nodeID);
1827 int** keep,
int* num_keep) {
1829 std::vector<int> candidates_(num_candidates);
1830 for (
int i=0; i < num_candidates; i++) {
1831 candidates_[i] = candidates[i];
1833 std::vector<int> keep_;
1835 sel_ptr->
Filter(candidates_, &keep_);
1837 *num_keep = keep_.size();
1838 *keep =
static_cast<int*
>(malloc(keep_.size() *
sizeof(int)));
1839 for (
unsigned i=0; i < keep_.size(); i++)
1840 (*keep)[i] = keep_[i];
1851 int subgraph_id,
int *accept,
const char*
const* opt_keys,
1852 const char*
const* opt_vals,
int num_opts,
1853 char*** attr_keys,
char*** attr_vals,
int *num_attrs,
1854 const char*
const* arg_names,
int num_args,
1855 void*
const* arg_data,
const int64_t*
const* arg_shapes,
1856 const int* arg_dims,
const int* arg_types,
1857 const size_t* arg_IDs,
const char*
const* arg_dev_type,
1858 const int* arg_dev_id,
1859 const char*
const* aux_names,
int num_aux,
1860 void*
const* aux_data,
const int64_t*
const* aux_shapes,
1861 const int* aux_dims,
const int* aux_types,
1862 const size_t* aux_IDs,
const char*
const* aux_dev_type,
1863 const int* aux_dev_id) {
1864 std::string subgraph_json(json);
1865 bool accept_bool =
false;
1867 std::unordered_map<std::string, std::string> opts;
1868 for (
int i = 0; i < num_opts; i++)
1869 opts[std::string(opt_keys[i])] = std::string(opt_vals[i]);
1872 std::unordered_map<std::string, MXTensor> args;
1873 for (
int i = 0; i < num_args; i++) {
1874 std::vector<int64_t> shapes;
1875 for (
int j = 0; j < arg_dims[i]; j++)
1876 shapes.push_back(arg_shapes[i][j]);
1879 arg_IDs[i],
MXContext(arg_dev_type[i], arg_dev_id[i]));
1880 args[arg_names[i]] = tensor;
1883 std::unordered_map<std::string, MXTensor> aux;
1884 for (
int i = 0; i < num_aux; i++) {
1885 std::vector<int64_t> shapes;
1886 for (
int j = 0; j < aux_dims[i]; j++)
1887 shapes.push_back(aux_shapes[i][j]);
1890 aux_IDs[i],
MXContext(aux_dev_type[i], aux_dev_id[i]));
1891 aux[aux_names[i]] = tensor;
1895 std::unordered_map<std::string, std::string> attrs;
1897 MXReturnValue retval = reviewSubgraph(subgraph_json, subgraph_id, &accept_bool,
1898 opts, &attrs, args, aux);
1899 if (!retval)
return retval;
1901 *accept = accept_bool;
1903 if (attrs.size() > 0) {
1904 *num_attrs = attrs.size();
1906 *attr_keys =
static_cast<char**
>(malloc (attrs.size() *
sizeof(
char*)));
1907 *attr_vals =
static_cast<char**
>(malloc (attrs.size() *
sizeof(
char*)));
1911 for (
auto kv : attrs) {
1912 (*attr_keys)[i] =
static_cast<char*
>(malloc ((kv.first.size()+1) *
sizeof(
char)));
1913 (*attr_vals)[i] =
static_cast<char*
>(malloc ((kv.second.size()+1) *
sizeof(
char)));
1914 snprintf((*attr_keys)[i], kv.first.size()+1,
"%s", kv.first.c_str());
1915 snprintf((*attr_vals)[i], kv.second.size()+1,
"%s", kv.second.c_str());
1930 const char** pass_name) {
1932 *graphPass = pass.
pass;
1933 *pass_name = pass.
name;
1938 char** graph,
const char*
const* opt_keys,
1939 const char*
const* opt_vals,
int num_opts,
1940 const char* pass_name,
const char*
const* arg_names,
int num_args,
1941 void*
const* arg_data,
const int64_t*
const* arg_shapes,
1942 const int* arg_dims,
const int* arg_types,
1943 const size_t* arg_IDs,
const char*
const* arg_dev_type,
1944 const int* arg_dev_id,
const char*
const* aux_names,
int num_aux,
1945 void*
const* aux_data,
const int64_t*
const* aux_shapes,
1946 const int* aux_dims,
const int* aux_types,
1947 const size_t* aux_IDs,
const char*
const* aux_dev_type,
1949 const void* nd_alloc) {
1950 std::string graph_json(json);
1951 const std::string* out_graph =
nullptr;
1953 std::unordered_map<std::string, std::string> opts;
1954 for (
int i = 0; i < num_opts; i++)
1955 opts[std::string(opt_keys[i])] = std::string(opt_vals[i]);
1958 std::unordered_map<std::string, MXTensor> args;
1959 for (
int i = 0; i < num_args; i++) {
1960 std::vector<int64_t> shapes;
1961 for (
int j = 0; j < arg_dims[i]; j++)
1962 shapes.push_back(arg_shapes[i][j]);
1965 arg_IDs[i],
MXContext(arg_dev_type[i], arg_dev_id[i]));
1966 args[arg_names[i]] = tensor;
1969 std::unordered_map<std::string, MXTensor> aux;
1970 for (
int i = 0; i < num_aux; i++) {
1971 std::vector<int64_t> shapes;
1972 for (
int j = 0; j < aux_dims[i]; j++)
1973 shapes.push_back(aux_shapes[i][j]);
1976 aux_IDs[i],
MXContext(aux_dev_type[i], aux_dev_id[i]));
1977 aux[aux_names[i]] = tensor;
1980 std::unordered_map<std::string, MXTensor> new_args, new_aux;
1981 PassResource res(&new_args, &new_aux, nd_malloc, nd_alloc);
1982 MXReturnValue retval = graphPass(graph_json, &out_graph, opts, args, aux, res);
1983 if (!retval)
return retval;
1985 if (out_graph ==
nullptr) {
1986 std::cout <<
"Error calling graph pass '" << pass_name
1987 <<
"' returned out_graph string is null" << std::endl;
1990 *graph =
static_cast<char*
>(malloc((out_graph->length()+1) *
sizeof(
char)));
1991 out_graph->copy(*graph, out_graph->size()+1);
2003 #if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) 2010 #endif // MXNET_LIB_API_H_ Definition: lib_api.h:234
int(* opRegSize_t)(void)
Definition: lib_api.h:1176
MX_INT_RET _opCallInferShape(inferShape_t inferShape, const char *const *keys, const char *const *vals, int num, unsigned int **inshapes, int *indims, int num_in, unsigned int ***mod_inshapes, int **mod_indims, unsigned int ***outshapes, int **outdims, int num_out)
returns status of calling inferShape function for operator from library
Definition: lib_api.h:1412
virtual bool Select(int nodeID)=0
std::vector< const char * > forward_ctx_cstr
vector repr of ctx map to be easily loaded from c_api
Definition: lib_api.h:978
reviewSubgraph_t getReviewSubgraph(int stg_id)
Definition: lib_api.h:1075
CustomOp & setInferType(inferType_t func)
Definition: lib_api.h:924
CustomOp & setForward(fcomp_t fcomp, const char *ctx)
Definition: lib_api.h:908
bool isSame(const MXTensor &oth) const
helper function to compare two MXTensors
Definition: lib_api.h:408
CustomPass & setBody(graphPass_t fn)
Definition: lib_api.h:1010
std::map< std::string, reviewSubgraph_t > review_map
Definition: lib_api.h:1087
DLDeviceType
The device type in DLContext.
Definition: lib_api.h:98
int(* opCallFree_t)(void *ptr)
Definition: lib_api.h:1188
int(* opCallCreateOpState_t)(createOpState_t create_op, const char *const *keys, const char *const *vals, int num, void **state_op)
Definition: lib_api.h:1239
std::mt19937 mx_cpu_rand_t
Definition: lib_api.h:458
JsonType type
Definition: lib_api.h:641
mx_stream_t get_cuda_stream() const
return the cuda stream object with correct type
Definition: lib_api.h:522
void(* partCallSelect_t)(void *sel_inst, int nodeID, int *selected)
Definition: lib_api.h:1285
CustomOp & setBackward(fcomp_t fgrad, const char *ctx)
Definition: lib_api.h:914
std::vector< fcomp_t > forward_fp
Definition: lib_api.h:979
OpenCL devices.
Definition: lib_api.h:109
Definition: lib_api.h:260
DLDataTypeCode
The type code options DLDataType.
Definition: lib_api.h:139
MX_VOID_RET _partCallSelectOutput(void *sel_inst, int nodeID, int output_nodeID, int *selected)
returns status of calling select output function from library
Definition: lib_api.h:1819
static MXContext CPU(int dev_id)
Definition: lib_api.h:252
MXContext ctx
Definition: lib_api.h:432
PassResource(std::unordered_map< std::string, MXTensor > *new_args, std::unordered_map< std::string, MXTensor > *new_aux, nd_malloc_t nd_malloc, const void *nd_alloc)
Definition: lib_api.h:467
Definition: lib_api.h:265
MX_INT_RET _opRegSize()
returns number of ops registered in this library
Definition: lib_api.h:1361
std::vector< int64_t > shape
Definition: lib_api.h:423
virtual void Filter(const std::vector< int > &candidates, std::vector< int > *keep)
Definition: lib_api.h:835
MXTensor(const MXTensor &oth)
Definition: lib_api.h:308
CustomOp & setIsSubgraphOp()
Definition: lib_api.h:946
Metal for Apple GPU.
Definition: lib_api.h:113
void setDLTensor()
populate DLTensor fields
Definition: lib_api.h:330
Definition: lib_api.h:603
Definition: lib_api.h:142
#define MX_VOID_RET
Definition: lib_api.h:1351
ROCm GPUs for AMD GPUs.
Definition: lib_api.h:117
inferType_t infer_type
Definition: lib_api.h:971
MX_VOID_RET _partRegGet(int part_idx, int stg_idx, const char **strategy, supportedOps_t *supportedOps, createSelector_t *createSelector, reviewSubgraph_t *reviewSubgraph, const char **op_name)
returns partitioner registration at specified index
Definition: lib_api.h:1753
A Device context for Tensor and operator.
Definition: dlpack.h:69
CUDA GPU device.
Definition: lib_api.h:102
An abstract class for graph passes.
Definition: lib_api.h:1005
void * alloc_cpu(int size) const
allocate cpu memory controlled by MXNet
Definition: lib_api.h:512
int(* partRegGetCount_t)(int idx, const char **name)
Definition: lib_api.h:1267
mx_cpu_rand_t * get_cpu_rand_states() const
get pointer to initialized and seeded random number states located on CPU
Definition: lib_api.h:534
Definition: lib_api.h:217
std::vector< const char * > backward_ctx_cstr
Definition: lib_api.h:978
std::vector< fcomp_t > backward_fp
Definition: lib_api.h:979
MXReturnValue(* supportedOps_t)(const std::string &json, std::vector< int > *ids, const std::unordered_map< std::string, std::string > &options)
Custom Subgraph Create function template.
Definition: lib_api.h:1022
JsonVal parse_num(const std::string &json, unsigned int *idx)
Definition: lib_api.h:701
definition of JSON objects
Definition: lib_api.h:606
MXTensor(void *data_ptr, const std::vector< int64_t > &shape, MXDType dtype, size_t vID, MXContext mx_ctx, MXStorageType stype=kDefaultStorage)
Definition: lib_api.h:312
CustomPartitioner & setCreateSelector(const char *prop_name, createSelector_t fn)
Definition: lib_api.h:1053
MXReturnValue(* createSelector_t)(const std::string &json, CustomOpSelector **sel_inst, const std::unordered_map< std::string, std::string > &options)
Definition: lib_api.h:1025
int64_t size() const
helper function to get data size
Definition: lib_api.h:399
Reserved extension device type, used for quickly test extension device The semantics can differ depen...
Definition: lib_api.h:123
Pinned CUDA GPU device by cudaMallocHost.
Definition: lib_api.h:107
MXReturnValue(* fcomp_t)(const std::unordered_map< std::string, std::string > &attributes, std::vector< MXTensor > *inputs, std::vector< MXTensor > *outputs, const OpResource &res)
Custom Operator function templates.
Definition: lib_api.h:873
Definition: optional.h:241
int(* opVersion_t)()
Definition: lib_api.h:1344
#define PRIVATE_SYMBOL
For loading multiple custom op libraries in Linux, exporting same symbol multiple times may lead to u...
Definition: lib_api.h:62
MX_INT_RET _partRegSize()
returns number of partitioners registered in this library
Definition: lib_api.h:1740
void(* partCallReset_t)(void *sel_inst)
Definition: lib_api.h:1300
int(* opCallFComp_t)(fcomp_t fcomp, const char *const *keys, const char *const *vals, int num, const int64_t **inshapes, int *indims, void **indata, int *intypes, size_t *inIDs, const char **indev_type, int *indev_id, int num_in, const int64_t **outshapes, int *outdims, void **outdata, int *outtypes, size_t *outIDs, const char **outdev_type, int *outdev_id, int num_out, xpu_malloc_t cpu_malloc, void *cpu_alloc, xpu_malloc_t gpu_malloc, void *gpu_alloc, void *cuda_stream, sparse_malloc_t sparse_malloc, void *sparse_alloc, int *instypes, int *outstypes, void **in_indices, void **out_indices, void **in_indptr, void **out_indptr, int64_t *in_indices_shapes, int64_t *out_indices_shapes, int64_t *in_indptr_shapes, int64_t *out_indptr_shapes, void *rng_cpu_states, void *rng_gpu_states)
Definition: lib_api.h:1213
MX_VOID_RET _partCallSelect(void *sel_inst, int nodeID, int *selected)
returns status of calling select function from library
Definition: lib_api.h:1806
MXReturnValue(* createOpState_t)(const std::unordered_map< std::string, std::string > &attributes, CustomStatefulOp **)
Definition: lib_api.h:896
MX_INT_RET _opCallInferType(inferType_t inferType, const char *const *keys, const char *const *vals, int num, int *intypes, int num_in, int *outtypes, int num_out)
returns status of calling inferType function for operator from library
Definition: lib_api.h:1467
An abstract class for subgraph property.
Definition: lib_api.h:1038
Definition: lib_api.h:221
inferShape_t infer_shape
Definition: lib_api.h:973
MX_VOID_RET _partCallFilter(void *sel_inst, int *candidates, int num_candidates, int **keep, int *num_keep)
returns status of calling filter function from library
Definition: lib_api.h:1826
MXStorageType stype
Definition: lib_api.h:439
MXReturnValue(* reviewSubgraph_t)(const std::string &json, int subgraph_id, bool *accept, const std::unordered_map< std::string, std::string > &options, std::unordered_map< std::string, std::string > *attrs, const std::unordered_map< std::string, MXTensor > &args, const std::unordered_map< std::string, MXTensor > &aux)
Definition: lib_api.h:1028
void print_json_val(const JsonVal &val)
Definition: lib_api.h:654
T & add(const char *name)
add a new entry
Definition: lib_api.h:1113
graphPass_t pass
pass function
Definition: lib_api.h:1018
void * alloc_gpu(int size) const
allocate gpu memory controlled by MXNet
Definition: lib_api.h:517
JsonVal parse_string(const std::string &json, unsigned int *idx)
Definition: lib_api.h:686
MX_VOID_RET _partCallSelectInput(void *sel_inst, int nodeID, int input_nodeID, int *selected)
returns status of calling select input function from library
Definition: lib_api.h:1812
CustomPartitioner & addStrategy(const char *prop_name, const char *sg_name)
Definition: lib_api.h:1043
int num
Definition: lib_api.h:642
int(* opCallFStatefulComp_t)(int is_forward, void *state_op, const int64_t **inshapes, int *indims, void **indata, int *intypes, size_t *inIDs, const char **indev_type, int *indev_id, int num_in, const int64_t **outshapes, int *outdims, void **outdata, int *outtypes, size_t *outIDs, const char **outdev_type, int *outdev_id, int num_out, xpu_malloc_t cpu_malloc, void *cpu_alloc, xpu_malloc_t gpu_malloc, void *gpu_alloc, void *stream, sparse_malloc_t sparse_malloc, void *sparse_alloc, int *instypes, int *outstypes, void **in_indices, void **out_indices, void **in_indptr, void **out_indptr, int64_t *in_indices_shapes, int64_t *out_indices_shapes, int64_t *in_indptr_shapes, int64_t *out_indptr_shapes, void *rng_cpu_states, void *rng_gpu_states)
Definition: lib_api.h:1244
~CustomOp()
Definition: lib_api.h:964
bool operator<(const JsonVal &o) const
Definition: lib_api.h:616
Definition: lib_api.h:603
MXReturnValue(* inferShape_t)(const std::unordered_map< std::string, std::string > &attributes, std::vector< std::vector< unsigned int > > *in_shapes, std::vector< std::vector< unsigned int > > *out_shapes)
Definition: lib_api.h:889
MXReturnValue(* inferType_t)(const std::unordered_map< std::string, std::string > &attributes, std::vector< int > *in_types, std::vector< int > *out_types)
Definition: lib_api.h:881
virtual MXReturnValue Forward(std::vector< MXTensor > *inputs, std::vector< MXTensor > *outputs, const OpResource &op_res)=0
JsonVal(std::string s)
Definition: lib_api.h:611
void setTensor(void *dptr, MXDType type, const int64_t *dims, int ndims, size_t vID, MXContext mx_ctx, MXStorageType storage_type)
populate internal tensor fields
Definition: lib_api.h:319
MX_INT_RET _passCallGraphPass(graphPass_t graphPass, const char *json, char **graph, const char *const *opt_keys, const char *const *opt_vals, int num_opts, const char *pass_name, const char *const *arg_names, int num_args, void *const *arg_data, const int64_t *const *arg_shapes, const int *arg_dims, const int *arg_types, const size_t *arg_IDs, const char *const *arg_dev_type, const int *arg_dev_id, const char *const *aux_names, int num_aux, void *const *aux_data, const int64_t *const *aux_shapes, const int *aux_dims, const int *aux_types, const size_t *aux_IDs, const char *const *aux_dev_type, const int *aux_dev_id, nd_malloc_t nd_malloc, const void *nd_alloc)
returns status of calling graph pass function from library
Definition: lib_api.h:1937
MX_INT_RET _opCallMutateInputs(mutateInputs_t mutate, const char *const *keys, const char *const *vals, int num, int **mutate_indices, int *indices_size)
returns status of calling mutateInputs function for operator from library
Definition: lib_api.h:1617
int64_t * indptr
Definition: lib_api.h:279
void alloc_sparse(MXSparse *sparse, int index, int indices_len, int indptr_len=0) const
allocate sparse memory controlled by MXNet
Definition: lib_api.h:527
Context info passing from MXNet OpContext dev_type is string repr of supported context, currently only "cpu" and "gpu" dev_id is the device index where the tensor locates.
Definition: lib_api.h:244
MXContext(const char *dev_type_, int dev_id_)
Definition: lib_api.h:248
MXContext(std::string dev_type_, int dev_id_)
Definition: lib_api.h:246
Definition: lib_api.h:232
An abstract class for library authors creating stateful op custom library should override Forward and...
Definition: lib_api.h:850
int(* partCallCreateSelector_t)(createSelector_t createSelector, const char *json, void **selector, const char *const *opt_keys, const char *const *opt_vals, int num_opts)
Definition: lib_api.h:1280
Definition: lib_api.h:236
Tensor data structure used by custom operator.
Definition: lib_api.h:306
data_type * data()
helper function to cast data pointer
Definition: lib_api.h:394
CustomPartitioner()
Definition: lib_api.h:1040
OpResource(xpu_malloc_t cpu_malloc_fp, void *cpu_alloc_fp, xpu_malloc_t gpu_malloc_fp, void *gpu_alloc_fp, void *stream, sparse_malloc_t sparse_malloc_fp, void *sparse_alloc_fp, void *rng_cpu_states, void *rng_gpu_states)
Definition: lib_api.h:502
Definition: lib_api.h:220
JsonType
Json utility to parse serialized subgraph symbol.
Definition: lib_api.h:603
void(* partCallSelectOutput_t)(void *sel_inst, int nodeID, int output_nodeID, int *selected)
Definition: lib_api.h:1292
MX_INT_RET _opCallFCompute(fcomp_t fcomp, const char *const *keys, const char *const *vals, int num, const int64_t **inshapes, int *indims, void **indata, int *intypes, size_t *inIDs, const char **indev_type, int *indev_id, int num_in, const int64_t **outshapes, int *outdims, void **outdata, int *outtypes, size_t *outIDs, const char **outdev_type, int *outdev_id, int num_out, xpu_malloc_t cpu_malloc, void *cpu_alloc, xpu_malloc_t gpu_malloc, void *gpu_alloc, void *cuda_stream, sparse_malloc_t sparse_malloc, void *sparse_alloc, int *instypes, int *outstypes, void **in_indices, void **out_indices, void **in_indptr, void **out_indptr, int64_t *in_indices_shapes, int64_t *out_indices_shapes, int64_t *in_indptr_shapes, int64_t *out_indptr_shapes, void *rng_cpu_states, void *rng_gpu_states)
returns status of calling Forward/Backward function for operator from library
Definition: lib_api.h:1538
MX_INT_RET _partCallSupportedOps(supportedOps_t supportedOps, const char *json, int num_ids, int *ids, const char *const *opt_keys, const char *const *opt_vals, int num_opts)
returns status of calling supported ops function from library
Definition: lib_api.h:1765
Definition: lib_api.h:140
bool isSGop
Definition: lib_api.h:975
CustomPartitioner(const char *backend_name)
Definition: lib_api.h:1041
std::map< JsonVal, JsonVal > map
Definition: lib_api.h:645
std::string json_val_string(const JsonVal &val)
Definition: lib_api.h:658
mx_gpu_rand_t * get_gpu_rand_states() const
get pointer to initialized and seeded random number states located on GPU
Definition: lib_api.h:541
MXTensor()
Definition: lib_api.h:307
int64_t data_len
Definition: lib_api.h:269
CustomOp & setCreateOpState(createOpState_t func, const char *ctx)
Definition: lib_api.h:940
JsonVal parse_list(const std::string &json, unsigned int *idx)
Definition: lib_api.h:715
MXStorageType
Definition: lib_api.h:230
std::map< std::string, supportedOps_t > supported_map
Definition: lib_api.h:1085
int(* partRegSize_t)(void)
Definition: lib_api.h:1264
Vulkan buffer for next generation graphics.
Definition: lib_api.h:111
void * data
Definition: lib_api.h:267
MX_INT_RET _opVersion()
returns MXNet library version
Definition: lib_api.h:1356
static Registry * get() PRIVATE_SYMBOL
get singleton pointer to class
Definition: lib_api.h:1105
static MXContext GPU(int dev_id)
Definition: lib_api.h:253
virtual bool SelectOutput(int nodeID, int output_nodeID)=0
static MXContext CPU()
Definition: lib_api.h:250
void * data_ptr
Definition: lib_api.h:420
createSelector_t getCreateSelector(int stg_id)
Definition: lib_api.h:1068
supportedOps_t getSupportedOps(int stg_id)
Definition: lib_api.h:1061
Class to hold custom operator registration.
Definition: lib_api.h:903
void(* passRegGet_t)(int pass_idx, graphPass_t *graphPass, const char **pass_name)
Definition: lib_api.h:1322
provide resource APIs memory allocation mechanism to Forward/Backward functions
Definition: lib_api.h:500
void * mx_stream_t
GPU stream pointer, is void* when not compiled with CUDA.
Definition: lib_api.h:455
int(* opCallInferSType_t)(inferSType_t inferSType, const char *const *keys, const char *const *vals, int num, int *intypes, int num_in, int *outtypes, int num_out)
Definition: lib_api.h:1208
DLDeviceType
The device type in DLContext.
Definition: dlpack.h:38
MX_INT_RET _partRegGetCount(int idx, const char **name)
Definition: lib_api.h:1746
Verilog simulator buffer.
Definition: lib_api.h:115
JsonVal(JsonType t)
Definition: lib_api.h:609
#define MX_LIBRARY_VERSION
Definition: lib_api.h:52
size_t verID
Definition: lib_api.h:429
MX_VOID_RET _opCallFree(void *ptr)
calls free from the external library for library allocated arrays
Definition: lib_api.h:1394
int64_t indptr_len
Definition: lib_api.h:280
MXDType dtype
Definition: lib_api.h:426
MX_INT_RET _passRegSize()
returns number of graph passes registered in this library
Definition: lib_api.h:1924
Definition: lib_api.h:141
functions used for parsing JSON
Definition: lib_api.h:649
Definition: lib_api.h:603
void(* partCallFilter_t)(void *sel_inst, int *candidates, int num_candidates, int **keep, int *num_keep)
Definition: lib_api.h:1296
JsonVal(JsonType t, int n, std::string s)
Definition: lib_api.h:615
int(* opRegGet_t)(int idx, const char **name, int *isSGop, const char ***forward_ctx, fcomp_t **forward_fp, int *forward_count, const char ***backward_ctx, fcomp_t **backward_fp, int *backward_count, const char ***create_op_ctx, createOpState_t **create_op_fp, int *create_op_count, parseAttrs_t *parse, inferType_t *type, inferSType_t *stype, inferShape_t *shape, mutateInputs_t *mutate)
Definition: lib_api.h:1179
MX_INT_RET _partCallReviewSubgraph(reviewSubgraph_t reviewSubgraph, const char *json, int subgraph_id, int *accept, const char *const *opt_keys, const char *const *opt_vals, int num_opts, char ***attr_keys, char ***attr_vals, int *num_attrs, const char *const *arg_names, int num_args, void *const *arg_data, const int64_t *const *arg_shapes, const int *arg_dims, const int *arg_types, const size_t *arg_IDs, const char *const *arg_dev_type, const int *arg_dev_id, const char *const *aux_names, int num_aux, void *const *aux_data, const int64_t *const *aux_shapes, const int *aux_dims, const int *aux_types, const size_t *aux_IDs, const char *const *aux_dev_type, const int *aux_dev_id)
returns status of calling review subgraph function from library
Definition: lib_api.h:1850
MXReturnValue
Definition: lib_api.h:259
mutateInputs_t mutate_inputs
Definition: lib_api.h:974
CustomPass(const char *pass_name)
Definition: lib_api.h:1008
DLTensor dltensor
Definition: lib_api.h:436
StatefulOp wrapper class to pass to backend OpState.
Definition: lib_api.h:864
Definition: lib_api.h:603
JsonVal(int n)
Definition: lib_api.h:613
int(* passRegSize_t)(void)
Definition: lib_api.h:1319
int(* opCallParseAttrs_t)(parseAttrs_t parseAttrs, const char *const *keys, const char *const *vals, int num, int *num_in, int *num_out)
Definition: lib_api.h:1191
std::string dev_type
Definition: lib_api.h:255
#define MX_INT_RET
Definition: lib_api.h:1350
MXReturnValue(* graphPass_t)(const std::string &in_graph, const std::string **out_graph, const std::unordered_map< std::string, std::string > &options, const std::unordered_map< std::string, MXTensor > &args, const std::unordered_map< std::string, MXTensor > &aux, const PassResource &res)
Custom Pass Create function template.
Definition: lib_api.h:996
MX_INT_RET _opCallFStatefulCompute(int is_forward, void *state_op, const int64_t **inshapes, int *indims, void **indata, int *intypes, size_t *inIDs, const char **indev_type, int *indev_id, int num_in, const int64_t **outshapes, int *outdims, void **outdata, int *outtypes, size_t *outIDs, const char **outdev_type, int *outdev_id, int num_out, xpu_malloc_t cpu_malloc, void *cpu_alloc, xpu_malloc_t gpu_malloc, void *gpu_alloc, void *stream, sparse_malloc_t sparse_malloc, void *sparse_alloc, int *instypes, int *outstypes, void **in_indices, void **out_indices, void **in_indptr, void **out_indptr, int64_t *in_indices_shapes, int64_t *out_indices_shapes, int64_t *in_indptr_shapes, int64_t *out_indptr_shapes, void *rng_cpu_states, void *rng_gpu_states)
returns status of calling Stateful Forward/Backward for operator from library
Definition: lib_api.h:1660
Definition: lib_api.h:218
Definition: lib_api.h:224
MX_VOID_RET _partCallReset(void *sel_inst)
returns status of calling reset selector function from library
Definition: lib_api.h:1844
MXDType
Tensor data type, consistent with mshadow data type.
Definition: lib_api.h:216
const char * name
partitioner name
Definition: lib_api.h:1084
void(* partCallSelectInput_t)(void *sel_inst, int nodeID, int input_nodeID, int *selected)
Definition: lib_api.h:1288
std::vector< const char * > strategies
strategy names
Definition: lib_api.h:1089
int(* opCallMutateInputs_t)(mutateInputs_t mutate, const char *const *keys, const char *const *vals, int num, int **mutate_indices, int *indices_size)
Definition: lib_api.h:1234
static MXContext GPU()
Definition: lib_api.h:251
CustomPartitioner & setReviewSubgraph(const char *prop_name, reviewSubgraph_t fn)
Definition: lib_api.h:1057
std::string str
Definition: lib_api.h:643
std::string dump(const JsonVal &val)
Definition: lib_api.h:772
CPU device.
Definition: lib_api.h:100
Definition: lib_api.h:223
std::vector< const char * > create_op_ctx_cstr
Definition: lib_api.h:978
MX_VOID_RET _passRegGet(int pass_idx, graphPass_t *graphPass, const char **pass_name)
returns pass registration at specified index
Definition: lib_api.h:1929
const char * name
pass name
Definition: lib_api.h:1016
CustomOp(const char *op_name)
Definition: lib_api.h:905
void(* sparse_malloc_t)(void *, int, int, int, void **, int64_t **, int64_t **)
sparse alloc function to allocate memory inside Forward/Backward functions
Definition: lib_api.h:445
JsonVal()
Definition: lib_api.h:607
virtual MXReturnValue Backward(std::vector< MXTensor > *inputs, std::vector< MXTensor > *outputs, const OpResource &op_res)
Definition: lib_api.h:855
std::string getDtypeAt(const std::string &dtype, unsigned index)
Definition: lib_api.h:589
MXReturnValue(* inferSType_t)(const std::unordered_map< std::string, std::string > &attributes, std::vector< int > *in_storage_types, std::vector< int > *out_storage_types)
Definition: lib_api.h:885
std::string getShapeAt(const std::string &shape, unsigned index)
Definition: lib_api.h:572
MXContext()
Definition: lib_api.h:245
void *(* xpu_malloc_t)(void *, int)
resource malloc function to allocate memory inside Forward/Backward functions
Definition: lib_api.h:443
int(* passCallGraphPass_t)(graphPass_t graphPass, const char *in_graph, char **out_graph, const char *const *opt_keys, const char *const *opt_vals, int num_opts, const char *pass_name, const char *const *arg_names, int num_args, void *const *arg_data, const int64_t *const *arg_shapes, const int *arg_dims, const int *arg_types, const size_t *arg_IDs, const char *const *arg_dev_type, const int *arg_dev_id, const char *const *aux_names, int num_aux, void *const *aux_data, const int64_t *const *aux_shapes, const int *aux_dims, const int *aux_types, const size_t *aux_IDs, const char *const *aux_dev_type, const int *aux_dev_id, nd_malloc_t nd_malloc, const void *nd_alloc)
Definition: lib_api.h:1325
CustomPartitioner & setSupportedOps(const char *prop_name, supportedOps_t fn)
Definition: lib_api.h:1049
Definition: lib_api.h:219
virtual bool SelectInput(int nodeID, int input_nodeID)=0
int(* initialize_t)(int version)
Definition: lib_api.h:1341
CustomOp & setMutateInputs(mutateInputs_t func)
Definition: lib_api.h:936
MX_INT_RET _opCallCreateOpState(createOpState_t create_op, const char *const *keys, const char *const *vals, int num, void **state_op)
returns status of calling createStatefulOp function for operator from library
Definition: lib_api.h:1644
std::vector< JsonVal > list
Definition: lib_api.h:644
CustomOp & setParseAttrs(parseAttrs_t func)
Definition: lib_api.h:920
JsonVal parse_map(const std::string &json, unsigned int *idx)
Definition: lib_api.h:731
CustomStatefulOp * get_instance()
Definition: lib_api.h:867
int(* opCallInferShape_t)(inferShape_t inferShape, const char *const *keys, const char *const *vals, int num, unsigned int **inshapes, int *indims, int num_in, unsigned int ***mod_inshapes, int **mod_indims, unsigned int ***outshapes, int **outdims, int num_out)
Definition: lib_api.h:1196
MXTensor * alloc_aux(const std::string &name, const std::vector< int64_t > &shapes, const MXContext &ctx, MXDType dtype) const
Definition: lib_api.h:480
MX_VOID_RET _opRegGet(int idx, const char **name, int *isSGop, const char ***forward_ctx, fcomp_t **forward_fp, int *forward_count, const char ***backward_ctx, fcomp_t **backward_fp, int *backward_count, const char ***create_op_ctx, createOpState_t **create_op_fp, int *create_op_count, parseAttrs_t *parse, inferType_t *type, inferSType_t *stype, inferShape_t *shape, mutateInputs_t *mutate)
returns operator registration at specified index
Definition: lib_api.h:1366
CustomOp & setInferSType(inferSType_t func)
Definition: lib_api.h:928
int(* opCallInferType_t)(inferType_t inferType, const char *const *keys, const char *const *vals, int num, int *intypes, int num_in, int *outtypes, int num_out)
Definition: lib_api.h:1203
MXReturnValue(* parseAttrs_t)(const std::unordered_map< std::string, std::string > &attributes, int *num_inputs, int *num_outputs)
Definition: lib_api.h:878
const char * name
operator name
Definition: lib_api.h:967
CustomStatefulOpWrapper(CustomStatefulOp *inst)
Definition: lib_api.h:866
void * mx_gpu_rand_t
Definition: lib_api.h:456
Definition: lib_api.h:812
JsonVal parse_to_json(const std::string &json)
Definition: lib_api.h:650
inferSType_t infer_storage_type
Definition: lib_api.h:972
Definition: lib_api.h:222
MXTensor * alloc_arg(const std::string &name, const std::vector< int64_t > &shapes, const MXContext &ctx, MXDType dtype) const
Definition: lib_api.h:471
virtual void Reset()
Definition: lib_api.h:842
CustomPass()
Definition: lib_api.h:1007
std::vector< const char * > op_names
subgraph operator name
Definition: lib_api.h:1091
void mapToVector()
Definition: lib_api.h:950
MX_INT_RET _opCallParseAttrs(parseAttrs_t parseAttrs, const char *const *keys, const char *const *vals, int num, int *num_in, int *num_out)
returns status of calling parse attributes function for operator from library
Definition: lib_api.h:1399
parseAttrs_t parse_attrs
operator functions
Definition: lib_api.h:970
int dev_id
Definition: lib_api.h:256
The data type the tensor can hold.
Definition: dlpack.h:94
MX_INT_RET _partCallCreateSelector(createSelector_t createSelector, const char *json, void **selector, const char *const *opt_keys, const char *const *opt_vals, int num_opts)
returns status of calling create selector function from library
Definition: lib_api.h:1788
int(* partCallSupportedOps_t)(supportedOps_t supportedOps, const char *json, int num_ids, int *ids, const char *const *opt_keys, const char *const *opt_vals, int num_opts)
Definition: lib_api.h:1275
Plain C Tensor object, does not manage memory.
Definition: dlpack.h:112
MXReturnValue initialize(int version)
Checks if the MXNet version is supported by the library. If supported, initializes the library...
MX_INT_RET _opCallInferSType(inferSType_t inferSType, const char *const *keys, const char *const *vals, int num, int *instypes, int num_in, int *outstypes, int num_out)
returns status of calling inferSType function for operator from library
Definition: lib_api.h:1502
std::map< std::string, createSelector_t > selector_map
Definition: lib_api.h:1086
void(* partRegGet_t)(int part_idx, int stg_idx, const char **strategy, supportedOps_t *supportedOps, createSelector_t *createSelector, reviewSubgraph_t *reviewSubgraph, const char **op_name)
Definition: lib_api.h:1270
Registry class to registers things (ops, properties) Singleton class.
Definition: lib_api.h:1099
Definition: lib_api.h:603
Definition: lib_api.h:465
MXReturnValue(* mutateInputs_t)(const std::unordered_map< std::string, std::string > &attributes, std::vector< int > *input_indices)
Definition: lib_api.h:893
std::vector< createOpState_t > create_op_fp
Definition: lib_api.h:980
JsonVal parse(const std::string &json, unsigned int *idx)
Definition: lib_api.h:751
int64_t indices_len
Definition: lib_api.h:275
int size()
Definition: lib_api.h:1118
int(* partCallReviewSubgraph_t)(reviewSubgraph_t reviewSubgraph, const char *json, int subgraph_id, int *accept, const char *const *opt_keys, const char *const *opt_vals, int num_opts, char ***attr_keys, char ***attr_vals, int *num_attrs, const char *const *arg_names, int num_args, void *const *arg_data, const int64_t *const *arg_shapes, const int *arg_dims, const int *arg_types, const size_t *arg_IDs, const char *const *arg_dev_type, const int *arg_dev_id, const char *const *aux_names, int num_aux, void *const *aux_data, const int64_t *const *aux_shapes, const int *aux_dims, const int *aux_types, const size_t *aux_IDs, const char *const *aux_dev_type, const int *aux_dev_id)
Definition: lib_api.h:1303
CustomOp & setInferShape(inferShape_t func)
Definition: lib_api.h:932
void(* nd_malloc_t)(const void *_ndarray_alloc, const int64_t *shapes, int num_shapes, const char *dev_str, int dev_id, int dtype, const char *name, int isArg, void **data)
resource malloc function to allocate ndarrays for graph passes
Definition: lib_api.h:447
int64_t * indices
Definition: lib_api.h:274
Definition: lib_api.h:261