diff --git a/lite/example/CMakeLists.txt b/lite/example/CMakeLists.txt index 9012fded9a2d8bef2b43b0feb07c8d5203628708..229d2d79714d7bcf999a16fefb042d05d9187b33 100644 --- a/lite/example/CMakeLists.txt +++ b/lite/example/CMakeLists.txt @@ -1,47 +1,2 @@ -file (GLOB_RECURSE SOURCES ./*.cpp) -add_executable(lite_examples ${SOURCES}) - -if(LITE_BUILD_WITH_RKNPU) - #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check - target_link_options(lite_examples PRIVATE "-fuse-ld=gold") -endif() - -target_link_libraries(lite_examples lite_static) -if(LITE_BUILD_WITH_MGE AND MGE_WITH_ROCM) - # FIXME: hip obj can not find cpp obj only through lite_static - target_link_libraries(lite_examples megdnn) -endif() - -if(UNIX) - if(APPLE OR ANDROID) - target_link_libraries(lite_examples dl) - else() - target_link_libraries(lite_examples dl rt) - endif() -endif() - -install (TARGETS lite_examples - EXPORT ${LITE_EXPORT_TARGETS} - RUNTIME DESTINATION lite/bin) - -# add lite_examples_depends_shared for CI check symbol export valid -add_executable(lite_examples_depends_shared ${SOURCES}) - -if(LITE_BUILD_WITH_RKNPU) - #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check - target_link_options(lite_examples_depends_shared PRIVATE "-fuse-ld=gold") -endif() - -target_link_libraries(lite_examples_depends_shared lite_shared) - -if(UNIX) - if(APPLE OR ANDROID) - target_link_libraries(lite_examples_depends_shared dl) - else() - target_link_libraries(lite_examples_depends_shared dl rt) - endif() -endif() - -install (TARGETS lite_examples_depends_shared - EXPORT ${LITE_EXPORT_TARGETS} - RUNTIME DESTINATION lite/bin) +add_subdirectory(cpp_example) +add_subdirectory(c_example) diff --git a/lite/example/c_example/CMakeLists.txt b/lite/example/c_example/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..141725e584026b76ada76bbbf24f27f3c4438afb --- /dev/null +++ b/lite/example/c_example/CMakeLists.txt @@ -0,0 +1,44 @@ +add_executable(lite_c_examples ./main.c) +if(LITE_BUILD_WITH_RKNPU) + #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check + target_link_options(lite_c_examples PRIVATE "-fuse-ld=gold") +endif() +target_link_libraries(lite_c_examples lite_static) +if(LITE_BUILD_WITH_MGE AND MGE_WITH_ROCM) + # FIXME: hip obj can not find cpp obj only through lite_static + target_link_libraries(lite_c_examples megdnn) +endif() + +if(UNIX) + if(APPLE OR ANDROID) + target_link_libraries(lite_c_examples dl) + else() + target_link_libraries(lite_c_examples dl rt) + endif() +endif() + +install (TARGETS lite_c_examples + EXPORT ${LITE_EXPORT_TARGETS} + RUNTIME DESTINATION lite/bin) + +# add lite_examples_depends_shared for CI check symbol export valid +add_executable(lite_c_examples_depends_shared ./main.c) + +if(LITE_BUILD_WITH_RKNPU) + #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check + target_link_options(lite_c_examples_depends_shared PRIVATE "-fuse-ld=gold") +endif() + +target_link_libraries(lite_c_examples_depends_shared lite_shared) + +if(UNIX) + if(APPLE OR ANDROID) + target_link_libraries(lite_c_examples_depends_shared dl) + else() + target_link_libraries(lite_c_examples_depends_shared dl rt) + endif() +endif() + +install (TARGETS lite_c_examples_depends_shared + EXPORT ${LITE_EXPORT_TARGETS} + RUNTIME DESTINATION lite/bin) diff --git a/lite/example/c_example/main.c b/lite/example/c_example/main.c new file mode 100644 index 0000000000000000000000000000000000000000..c8a91c7bd22d97ba13e107d238735eb6fccf4048 --- /dev/null +++ b/lite/example/c_example/main.c @@ -0,0 +1,89 @@ +/** + * \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 + +#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 + 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; + for (size_t i = 0; i < out_length; i++) { + float data = ((float*)(output_ptr))[i]; + sum += data; + if (max < data) + max = data; + } + printf("max=%e, sum=%e\n", max, sum); + return 0; +} + +int main(int argc, char** argv) { + if (argc < 2) { + printf("usage: lite_c_examples , just test C interface " + "build.\n"); + return -1; + } + return basic_c_interface(argv[1]); +} + +// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/lite/example/cpp_example/CMakeLists.txt b/lite/example/cpp_example/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..9012fded9a2d8bef2b43b0feb07c8d5203628708 --- /dev/null +++ b/lite/example/cpp_example/CMakeLists.txt @@ -0,0 +1,47 @@ +file (GLOB_RECURSE SOURCES ./*.cpp) +add_executable(lite_examples ${SOURCES}) + +if(LITE_BUILD_WITH_RKNPU) + #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check + target_link_options(lite_examples PRIVATE "-fuse-ld=gold") +endif() + +target_link_libraries(lite_examples lite_static) +if(LITE_BUILD_WITH_MGE AND MGE_WITH_ROCM) + # FIXME: hip obj can not find cpp obj only through lite_static + target_link_libraries(lite_examples megdnn) +endif() + +if(UNIX) + if(APPLE OR ANDROID) + target_link_libraries(lite_examples dl) + else() + target_link_libraries(lite_examples dl rt) + endif() +endif() + +install (TARGETS lite_examples + EXPORT ${LITE_EXPORT_TARGETS} + RUNTIME DESTINATION lite/bin) + +# add lite_examples_depends_shared for CI check symbol export valid +add_executable(lite_examples_depends_shared ${SOURCES}) + +if(LITE_BUILD_WITH_RKNPU) + #rknn sdk1.0.0 depend on libc++_shared, use gold to remove NEEDED so symbol check + target_link_options(lite_examples_depends_shared PRIVATE "-fuse-ld=gold") +endif() + +target_link_libraries(lite_examples_depends_shared lite_shared) + +if(UNIX) + if(APPLE OR ANDROID) + target_link_libraries(lite_examples_depends_shared dl) + else() + target_link_libraries(lite_examples_depends_shared dl rt) + endif() +endif() + +install (TARGETS lite_examples_depends_shared + EXPORT ${LITE_EXPORT_TARGETS} + RUNTIME DESTINATION lite/bin) diff --git a/lite/example/example.h b/lite/example/cpp_example/example.h similarity index 98% rename from lite/example/example.h rename to lite/example/cpp_example/example.h index eaec211de50756ed5c0e377cd14a086aafc1840b..37c12b9e3d062d59350363368df29a6abeabef9f 100644 --- a/lite/example/example.h +++ b/lite/example/cpp_example/example.h @@ -1,5 +1,5 @@ /** - * \file example/example.cpp + * \file example/cpp_example/example.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/main.cpp b/lite/example/cpp_example/main.cpp similarity index 97% rename from lite/example/main.cpp rename to lite/example/cpp_example/main.cpp index ca03caf41d2abd53bec236c7710eeac3511c28ce..2f93e8faf603c2e1776ceea5ab13d7d0cadd6921 100644 --- a/lite/example/main.cpp +++ b/lite/example/cpp_example/main.cpp @@ -1,5 +1,5 @@ /** - * \file example/example.cpp + * \file example/cpp_example/cpp_example/example.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. @@ -133,7 +133,11 @@ int main(int argc, char** argv) { auto example = (*map)[args.example_name]; if (example) { printf("Begin to run %s example.\n", args.example_name.c_str()); - return example(args); + if (example(args)) { + return 0; + } else { + return -1; + } } else { printf("The example of %s is not registed.", args.example_name.c_str()); return -1; diff --git a/lite/example/mge/README.md b/lite/example/cpp_example/mge/README.md similarity index 100% rename from lite/example/mge/README.md rename to lite/example/cpp_example/mge/README.md diff --git a/lite/example/mge/basic.cpp b/lite/example/cpp_example/mge/basic.cpp similarity index 99% rename from lite/example/mge/basic.cpp rename to lite/example/cpp_example/mge/basic.cpp index 7300e09a857d2c122df337777b8559cff601c29f..bcde2f51e5708f04ed51e4ca737cea22f2c5fbf8 100644 --- a/lite/example/mge/basic.cpp +++ b/lite/example/cpp_example/mge/basic.cpp @@ -1,5 +1,5 @@ /** - * \file example/basic.cpp + * \file example/cpp_example/basic.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/cpu_affinity.cpp b/lite/example/cpp_example/mge/cpu_affinity.cpp similarity index 98% rename from lite/example/mge/cpu_affinity.cpp rename to lite/example/cpp_example/mge/cpu_affinity.cpp index 508910d4eb24288492ec492db3fc90f65df7b2c2..a112100470af398ca8fdd2f14431f74bfed44f4c 100644 --- a/lite/example/mge/cpu_affinity.cpp +++ b/lite/example/cpp_example/mge/cpu_affinity.cpp @@ -1,5 +1,5 @@ /** - * \file example/cpu_affinity.cpp + * \file example/cpp_example/cpu_affinity.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/device_io.cpp b/lite/example/cpp_example/mge/device_io.cpp similarity index 99% rename from lite/example/mge/device_io.cpp rename to lite/example/cpp_example/mge/device_io.cpp index 3aee29490e2c4e2ad004f62813d6c6f19f370bb9..fa5c568373b3afd14f40c813b2616658dafcf98e 100644 --- a/lite/example/mge/device_io.cpp +++ b/lite/example/cpp_example/mge/device_io.cpp @@ -1,5 +1,5 @@ /** - * \file example/device_io.cpp + * \file example/cpp_example/device_io.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/lite_c_interface.cpp b/lite/example/cpp_example/mge/lite_c_interface.cpp similarity index 99% rename from lite/example/mge/lite_c_interface.cpp rename to lite/example/cpp_example/mge/lite_c_interface.cpp index c967948025de88bcb4e314a73f40ccb83118d63a..2696a1caafe75c4cdb96a4871d9ad03d2dfc5a63 100644 --- a/lite/example/mge/lite_c_interface.cpp +++ b/lite/example/cpp_example/mge/lite_c_interface.cpp @@ -1,5 +1,5 @@ /** - * \file example/basic_c_interface.cpp + * \file example/cpp_example/basic_c_interface.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/network_share_weights.cpp b/lite/example/cpp_example/mge/network_share_weights.cpp similarity index 98% rename from lite/example/mge/network_share_weights.cpp rename to lite/example/cpp_example/mge/network_share_weights.cpp index 818f09d8aba741128d2d21c394e6c556431b9bb6..61b9cb36426c3fb89c96e2d60e9e6f131fdf45ae 100644 --- a/lite/example/mge/network_share_weights.cpp +++ b/lite/example/cpp_example/mge/network_share_weights.cpp @@ -1,5 +1,5 @@ /** - * \file example/network_share_weights.cpp + * \file example/cpp_example/network_share_weights.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/reset_io.cpp b/lite/example/cpp_example/mge/reset_io.cpp similarity index 98% rename from lite/example/mge/reset_io.cpp rename to lite/example/cpp_example/mge/reset_io.cpp index 1a8143b30780a61efb0dd8c7710400bfcbc2c72e..5d21526b02aded2e7ac2fcec472c20eafec023e6 100644 --- a/lite/example/mge/reset_io.cpp +++ b/lite/example/cpp_example/mge/reset_io.cpp @@ -1,5 +1,5 @@ /** - * \file example/reset_io.cpp + * \file example/cpp_example/reset_io.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/user_allocator.cpp b/lite/example/cpp_example/mge/user_allocator.cpp similarity index 98% rename from lite/example/mge/user_allocator.cpp rename to lite/example/cpp_example/mge/user_allocator.cpp index a0f78f259cbf1e7a80346454a04a711959eb424b..73b9b41df1756bf640d9cd1b94925009fa162aec 100644 --- a/lite/example/mge/user_allocator.cpp +++ b/lite/example/cpp_example/mge/user_allocator.cpp @@ -1,5 +1,5 @@ /** - * \file example/user_allocator.cpp + * \file example/cpp_example/user_allocator.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/mge/user_cryption.cpp b/lite/example/cpp_example/mge/user_cryption.cpp similarity index 98% rename from lite/example/mge/user_cryption.cpp rename to lite/example/cpp_example/mge/user_cryption.cpp index 88496090d1b1356eedfba2c596cfec721b77cbe3..ef7e8c6de66f72f52327aebdc6582db7cd5b3bce 100644 --- a/lite/example/mge/user_cryption.cpp +++ b/lite/example/cpp_example/mge/user_cryption.cpp @@ -1,5 +1,5 @@ /** - * \file example/user_cryption.cpp + * \file example/cpp_example/user_cryption.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. diff --git a/lite/example/npy.h b/lite/example/cpp_example/npy.h similarity index 100% rename from lite/example/npy.h rename to lite/example/cpp_example/npy.h diff --git a/lite/include/lite/common_enum_c.h b/lite/include/lite/common_enum_c.h index 361b52d2b250a410f2868a78aec401a17d93247b..f9b7a3a73e65ff6315d19b34aca11ac900ce772f 100644 --- a/lite/include/lite/common_enum_c.h +++ b/lite/include/lite/common_enum_c.h @@ -15,18 +15,18 @@ /*! * \brief The log level. */ -typedef enum LiteLogLevel { +typedef enum { DEBUG = 0, /*!< The lowest level and most verbose */ INFO = 1, /*!< The lowest level and most verbose */ WARN = 2, /*!< Print only warning and errors */ ERROR = 3, /*!< Print only errors */ } LiteLogLevel; -typedef enum LiteBackend { +typedef enum { LITE_DEFAULT = 0, //! default backend is mge } LiteBackend; -typedef enum LiteDeviceType { +typedef enum { LITE_CPU = 0, LITE_CUDA = 1, LITE_ATLAS = 3, @@ -36,7 +36,7 @@ typedef enum LiteDeviceType { LITE_DEVICE_DEFAULT = 5, } LiteDeviceType; -typedef enum LiteDataType { +typedef enum { LITE_FLOAT = 0, LITE_HALF = 1, LITE_INT = 2, @@ -46,9 +46,9 @@ typedef enum LiteDataType { LITE_UINT = 6, LITE_UINT16 = 7, LITE_INT64 = 8, -} LiteCDataType; +} LiteDataType; -typedef enum LiteTensorPhase { +typedef enum { //! Tensor maybe input or output LITE_IO = 0, //! Tensor is input @@ -61,7 +61,7 @@ typedef enum LiteTensorPhase { * \brief the input and output type, include SHAPE and VALUE * sometimes user only need the shape of the output tensor */ -typedef enum LiteIOType { +typedef enum { LITE_IO_VALUE = 0, LITE_IO_SHAPE = 1, } LiteIOType; @@ -88,7 +88,7 @@ typedef enum LiteIOType { * 5. LITE_ALGO_PROFILE | LITE_ALGO_OPTIMIZED | LITE_ALGO_REPRODUCIBLE means: * profile the best algorithm form the optimzed and reproducible algorithms */ -typedef enum LiteAlgoSelectStrategy { +typedef enum { LITE_ALGO_HEURISTIC = 1 << 0, LITE_ALGO_PROFILE = 1 << 1, LITE_ALGO_REPRODUCIBLE = 1 << 2,