/** * \file example/c_example/main.c * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include "lite-c/global_c.h" #include "lite-c/network_c.h" #include "lite-c/tensor_c.h" #include #include #include #define LITE_CAPI_CHECK(_expr) \ do { \ int _ret = (_expr); \ if (_ret) { \ fprintf(stderr, "error msg: %s", LITE_get_last_error()); \ return -1; \ } \ } while (0) int basic_c_interface(const char* mode_path) { //! create and load the network LiteNetwork c_network; LITE_CAPI_CHECK( LITE_make_network(&c_network, *default_config(), *default_network_io())); LITE_CAPI_CHECK(LITE_load_model_from_path(c_network, mode_path)); //! set input data to input tensor LiteTensor c_input_tensor; LITE_CAPI_CHECK(LITE_get_io_tensor(c_network, "data", LITE_IO, &c_input_tensor)); void* dst_ptr; size_t length_in_byte; LITE_CAPI_CHECK( LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_in_byte)); LITE_CAPI_CHECK(LITE_get_tensor_memory(c_input_tensor, &dst_ptr)); //! copy or forward data to network LITE_memset(dst_ptr, 5, length_in_byte); //! forward LITE_CAPI_CHECK(LITE_forward(c_network)); LITE_CAPI_CHECK(LITE_wait(c_network)); //! get the output data or read tensor data const char* output_name; LiteTensor c_output_tensor; //! get the first output tensor name LITE_CAPI_CHECK(LITE_get_output_name(c_network, 0, &output_name)); LITE_CAPI_CHECK( LITE_get_io_tensor(c_network, output_name, LITE_IO, &c_output_tensor)); void* output_ptr; size_t length_output_in_byte; LITE_CAPI_CHECK(LITE_get_tensor_memory(c_output_tensor, &output_ptr)); LITE_CAPI_CHECK(LITE_get_tensor_total_size_in_byte( c_output_tensor, &length_output_in_byte)); size_t out_length = length_output_in_byte / sizeof(float); printf("length=%zu\n", out_length); float max = -1.0f; float sum = 0.0f; int is_enable_ipc_debug = LITE_is_enable_ipc_debug_mode(); float* copy_ptr = NULL; float* final_dst_ptr = (float*)output_ptr; if (is_enable_ipc_debug) { copy_ptr = (float*)(malloc(length_output_in_byte)); LITE_CAPI_CHECK(LITE_copy_server_tensor_memory( output_ptr, copy_ptr, length_output_in_byte)); final_dst_ptr = (float*)copy_ptr; } for (size_t i = 0; i < out_length; i++) { float data = final_dst_ptr[i]; sum += data; if (max < data) max = data; } printf("max=%e, sum=%e\n", max, sum); LITE_destroy_network(c_network); if (is_enable_ipc_debug) { free(copy_ptr); } return 0; } int main(int argc, char** argv) { if (argc < 3) { printf("usage: lite_c_examples is_enable_fork_debug_model , just " "test C interface " "build.\n"); return -1; } if (atoi(argv[1])) { LITE_enable_lite_ipc_debug(); } return basic_c_interface(argv[2]); } // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}