diff --git a/lite/CMakeLists.txt b/lite/CMakeLists.txt index 067289124d20bf6e6f16135e044cd3855408edb5..b9221954b4d87b19ec63c9ed4aa3092c6ee63143 100644 --- a/lite/CMakeLists.txt +++ b/lite/CMakeLists.txt @@ -28,11 +28,13 @@ if(MGE_WITH_MINIMUM_SIZE) set(LITE_ENABLE_EXCEPTION OFF) endif() +if(LITE_BUILD_WITH_MGE) + set(LITE_BUILD_WITH_MGE ON) +endif() + # Write out lite_build_config.h It defines macros needed by lite -configure_file(src/lite_build_config.h.in +configure_file(build_config/lite_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h - DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include) # begin config lite if(LITE_BUILD_WITH_MGE @@ -47,7 +49,6 @@ include_directories($) if(LITE_BUILD_WITH_MGE) target_link_libraries(lite_static PRIVATE megbrain megdnn ${MGE_CUDA_LIBS}) - add_compile_definitions(LITE_BUILD_WITH_MGE=1) message(STATUS "build lite with MegEngine.") else() target_link_libraries(lite_static PUBLIC flatbuffers) @@ -154,7 +155,10 @@ if(UNIX AND NOT APPLE) set_target_properties(lite_shared_whl PROPERTIES LINK_DEPENDS ${LITE_VERSION_SCRIPT}) endif() -# config install +# config install, please keep all install file with lite/BUILD:hdrs_public +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/lite_build_config.h + DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/build_config) + install( TARGETS lite_static LIBRARY DESTINATION lite/lib/${MGE_ARCH} @@ -176,9 +180,6 @@ if(NOT WIN32) ARCHIVE DESTINATION lite/lib/${MGE_ARCH}) endif() -install(FILES ${PROJECT_SOURCE_DIR}/lite/include/lite/common_enum_c.h - DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/include/lite-c) - install( DIRECTORY ${PROJECT_SOURCE_DIR}/lite/include DESTINATION ${CMAKE_INSTALL_PREFIX}/lite @@ -187,7 +188,7 @@ install( install( DIRECTORY ${PROJECT_SOURCE_DIR}/lite/lite-c/include - DESTINATION ${CMAKE_INSTALL_PREFIX}/lite + DESTINATION ${CMAKE_INSTALL_PREFIX}/lite/lite-c FILES_MATCHING PATTERN "*.h") diff --git a/lite/build_config/lite_build_config.h b/lite/build_config/lite_build_config.h index 3b65924982e8c863af27aca398846145ab00816f..1d99d5430a46792cb3035df59638f4d4bb58f96d 100644 --- a/lite/build_config/lite_build_config.h +++ b/lite/build_config/lite_build_config.h @@ -1,11 +1,5 @@ -/** - * \file lite/build_config/lite_build_config.h - * - * This file is part of MegEngine, a deep learning framework developed by - * Megvii. - * - * \copyright Copyright (c) 2020-2021 Megvii Inc. All rights reserved. - */ +//! this file always for bazel + #ifndef _HEADER_LITE_BUILD_CONFIG #define _HEADER_LITE_BUILD_CONFIG @@ -28,4 +22,12 @@ #ifndef LITE_ASSERT_LOC #define LITE_ASSERT_LOC 1 #endif + +#ifndef LITE_BUILD_WITH_MGE +#define LITE_BUILD_WITH_MGE 1 +#endif + +#ifndef LITE_BUILD_WITH_RKNPU +#define LITE_BUILD_WITH_RKNPU 0 +#endif #endif // _HEADER_LITE_BUILD_CONFIG diff --git a/lite/src/lite_build_config.h.in b/lite/build_config/lite_build_config.h.in similarity index 82% rename from lite/src/lite_build_config.h.in rename to lite/build_config/lite_build_config.h.in index a4451c14dafa8658ba2e38ca38e26186042740b2..51d2f59dd56921f62a7f1ae215f7eb09e97dbe05 100644 --- a/lite/src/lite_build_config.h.in +++ b/lite/build_config/lite_build_config.h.in @@ -1,8 +1,11 @@ +//! this file always for cmake + #ifndef _HEADER_LITE_BUILD_CONFIG #define _HEADER_LITE_BUILD_CONFIG #cmakedefine01 LITE_ENABLE_LOGGING #cmakedefine01 LITE_ENABLE_EXCEPTION +#cmakedefine01 LITE_BUILD_WITH_MGE #cmakedefine01 LITE_WITH_CUDA #cmakedefine01 LITE_ASSERT_LOC @@ -26,4 +29,8 @@ #ifndef LITE_ASSERT_LOC #define LITE_ASSERT_LOC 0 #endif + +#ifndef LITE_BUILD_WITH_MGE +#define LITE_BUILD_WITH_MGE 0 +#endif #endif // _HEADER_LITE_BUILD_CONFIG diff --git a/lite/example/cpp_example/helper.h b/lite/example/cpp_example/helper.h new file mode 100644 index 0000000000000000000000000000000000000000..456e9209a3cb18e2f00a92f98680dd3ec56782bc --- /dev/null +++ b/lite/example/cpp_example/helper.h @@ -0,0 +1,150 @@ +#pragma once + +//! helper function like define: lite/src/misc.h, but we need example code just +//! depends on install header, not depends any lite src file +#include +#include +#include +#include + +std::string exampe_ssprintf(const char* fmt = 0, ...) + __attribute__((format(printf, 1, 2))); + +#define LITE_EXAMPLE_THROW(msg) \ + do { \ + std::string msg_str(msg); \ + printf("%s\n", msg_str.c_str()); \ + __builtin_trap(); \ + } while (0) + +//! branch prediction hint: likely to take +#define lite_example_likely(v) __builtin_expect(static_cast(v), 1) + +//! branch prediction hint: unlikely to take +#define lite_example_unlikely(v) __builtin_expect(static_cast(v), 0) + +#define LITE_EXAMPLE_ASSERT(expr, msg...) \ + do { \ + if (lite_example_unlikely(!(expr))) { \ + auto info = exampe_ssprintf(msg); \ + LITE_EXAMPLE_THROW(exampe_ssprintf( \ + "Assert \' %s \' failed at file : %s \n" \ + "line %d : %s,\nextra " \ + "message: %s", \ + #expr, __FILE__, __LINE__, __PRETTY_FUNCTION__, info.c_str())); \ + } \ + } while (0) + +#define LITE_EXAMPLE_MARK_USED_VAR(var) ((void)var) + +namespace lite_example_helper { +class ScopedTimer { +public: + typedef std::chrono::system_clock Clock; + typedef std::chrono::nanoseconds Nsec; + + ScopedTimer(std::string name) : m_name(name) { m_start = Clock::now(); } + ~ScopedTimer() { + m_stop = Clock::now(); + std::chrono::duration elapsed = m_stop - m_start; + Nsec u = std::chrono::duration_cast(elapsed); + auto msg = exampe_ssprintf( + "%s used time %fms.", m_name.c_str(), + static_cast(u.count()) / 1000000.f); + printf("%s", msg.c_str()); + } + +private: + std::chrono::time_point m_start, m_stop; + const std::string m_name; +}; + +class Timer { +public: + typedef std::chrono::system_clock Clock; + typedef std::chrono::nanoseconds Nsec; + + Timer(std::string name) : m_name(name) { m_start = Clock::now(); } + double get_used_time() { + m_stop = Clock::now(); + std::chrono::duration elapsed = m_stop - m_start; + Nsec u = std::chrono::duration_cast(elapsed); + return static_cast(u.count()) / 1000000.0; + } + void print_used_time(int iter) { + m_stop = Clock::now(); + std::chrono::duration elapsed = m_stop - m_start; + Nsec u = std::chrono::duration_cast(elapsed); + printf("%s used time %f ms\n", (m_name + std::to_string(iter)).c_str(), + static_cast(u.count()) / 1000000.0); + } + void reset_start() { m_start = Clock::now(); } + +private: + std::chrono::time_point m_start, m_stop; + const std::string m_name; +}; + +inline void mark_used_variable() {} +template +inline void mark_used_variable(T firstArg, Arg... args) { + LITE_EXAMPLE_MARK_USED_VAR(firstArg); + mark_used_variable(args...); +} +} // namespace lite_example_helper + +#if defined(_WIN32) +#include +#include +#undef CONST +#define F_OK 0 +#define RTLD_LAZY 0 +// On the windows platform we use a lib_filename without a full path so +// the win-api "LoadLibrary" would uses a standard search strategy to +// find the lib module. As we cannot access to the lib_filename without a +// full path, we should not use "access(a, b)" to verify it. +#define access(a, b) false +static inline void* dlopen(const char* file, int) { + return static_cast(LoadLibrary(file)); +} + +static inline char* dlerror() { + const char* errmsg = "dlerror not aviable in windows"; + return const_cast(errmsg); +} + +static inline void* dlsym(void* handle, const char* name) { + FARPROC symbol = GetProcAddress((HMODULE)handle, name); + return reinterpret_cast(symbol); +} +#elif __linux__ || __unix__ || __APPLE__ +#include +#include +#endif + +#if __DEPLOY_ON_XP_SP2__ +//! refer to +//! https://docs.microsoft.com/en-us/cpp/build/configuring-programs-for-windows-xp?view=msvc-160 +//! xp sp2 do not support vc runtime fully, casused by KERNEL32.dll do not +//! implement some base apis for c++ std function, for example, +//! std::mutex/std::thread/std::condition_variable as a workround, we will +//! disable some MegEngine feature on xp sp2 env, for exampe, multi-thread etc! +#define LITE_MUTEX size_t +#define LITE_RECURSIVE_MUTEX size_t +#define LITE_LOCK_GUARD(mtx) LITE_EXAMPLE_MARK_USED_VAR(mtx) +#define LITE_LOCK_GUARD_UNIQUE(mtx) LITE_EXAMPLE_MARK_USED_VAR(mtx) +#define LITE_LOCK_GUARD_SHARED(mtx) \ + LITE_EXAMPLE_MARK_USED_VAR(LITE_EXAMPLE_MARK_USED_VAR) +#else +#define LITE_MUTEX std::mutex +#define LITE_RECURSIVE_MUTEX std::recursive_mutex +#define LITE_LOCK_GUARD(mtx) std::lock_guard LITE_LOCK_GUARD_CTOR(mtx) + +#define LITE_LOCK_GUARD_UNIQUE(mtx) \ + std::unique_lock LITE_LOCK_GUARD_CTOR(mtx) + +#define LITE_LOCK_GUARD_SHARED(mtx) \ + std::shared_lock LITE_LOCK_GUARD_CTOR(mtx) +#endif + +// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/lite/example/cpp_example/mge/basic.cpp b/lite/example/cpp_example/mge/basic.cpp index ad7084966fd78dfba214cb329110a74a1a3a2612..29cd4991aebb77791d7bae7fea54fe8cc7fc959f 100644 --- a/lite/example/cpp_example/mge/basic.cpp +++ b/lite/example/cpp_example/mge/basic.cpp @@ -3,7 +3,7 @@ #if LITE_BUILD_WITH_MGE #include -#include "misc.h" +#include "helper.h" using namespace lite; using namespace example; @@ -96,12 +96,12 @@ bool basic_load_from_path(const Args& args) { //! forward { - lite::Timer ltimer("warmup"); + lite_example_helper::Timer ltimer("warmup"); network->forward(); network->wait(); ltimer.print_used_time(0); } - lite::Timer ltimer("forward_iter"); + lite_example_helper::Timer ltimer("forward_iter"); for (int i = 0; i < 10; i++) { network->forward(); network->wait(); @@ -110,7 +110,7 @@ bool basic_load_from_path(const Args& args) { //! forward { - lite::Timer ltimer("warmup"); + lite_example_helper::Timer ltimer("warmup"); network->forward(); network->wait(); ltimer.print_used_time(0); @@ -167,12 +167,12 @@ bool basic_load_from_path_with_loader(const Args& args) { //! forward { - lite::Timer ltimer("warmup"); + lite_example_helper::Timer ltimer("warmup"); network->forward(); network->wait(); ltimer.print_used_time(0); } - lite::Timer ltimer("forward_iter"); + lite_example_helper::Timer ltimer("forward_iter"); for (int i = 0; i < 10; i++) { ltimer.reset_start(); network->forward(); @@ -481,12 +481,12 @@ bool load_from_path_run_cuda(const Args& args) { //! forward { - lite::Timer ltimer("warmup"); + lite_example_helper::Timer ltimer("warmup"); network->forward(); network->wait(); ltimer.print_used_time(0); } - lite::Timer ltimer("forward_iter"); + lite_example_helper::Timer ltimer("forward_iter"); for (int i = 0; i < 10; i++) { ltimer.reset_start(); network->forward(); diff --git a/lite/example/cpp_example/mge/cv/detect_yolox.cpp b/lite/example/cpp_example/mge/cv/detect_yolox.cpp index da05cc27e76fdf75d3a2af7af5ae24f9838b2c5b..68caeffdf19e12c798388c07b872fe009b47ec37 100644 --- a/lite/example/cpp_example/mge/cv/detect_yolox.cpp +++ b/lite/example/cpp_example/mge/cv/detect_yolox.cpp @@ -3,8 +3,6 @@ #if LITE_BUILD_WITH_MGE #include -#include "misc.h" - #define STB_IMAGE_STATIC #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" diff --git a/lite/example/cpp_example/mge/cv/picture_classification.cpp b/lite/example/cpp_example/mge/cv/picture_classification.cpp index 69f6675deafd75158c12502dc76ab216dd1c8103..328b338c05d840bf216098d86047a55234dfafe8 100644 --- a/lite/example/cpp_example/mge/cv/picture_classification.cpp +++ b/lite/example/cpp_example/mge/cv/picture_classification.cpp @@ -3,8 +3,6 @@ #if LITE_BUILD_WITH_MGE #include -#include "misc.h" - #define STB_IMAGE_STATIC #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" diff --git a/lite/example/cpp_example/mge/device_io.cpp b/lite/example/cpp_example/mge/device_io.cpp index 43d5e7d1eb5e3b39244dc6d3020f0e06df31196a..47ed053e14586b989da5890009576455ee4953c9 100644 --- a/lite/example/cpp_example/mge/device_io.cpp +++ b/lite/example/cpp_example/mge/device_io.cpp @@ -1,7 +1,6 @@ #include #include "example.h" #if LITE_BUILD_WITH_MGE -#include "misc.h" using namespace lite; using namespace example; diff --git a/lite/example/cpp_example/mge/lite_c_interface.cpp b/lite/example/cpp_example/mge/lite_c_interface.cpp index 5b7de472965bf3f09aeec91525c95a90233f2413..9d1767732a8a8daf0815621cdf19eba909b2c619 100644 --- a/lite/example/cpp_example/mge/lite_c_interface.cpp +++ b/lite/example/cpp_example/mge/lite_c_interface.cpp @@ -1,5 +1,5 @@ #include "example.h" -#include "misc.h" +#include "helper.h" #if LITE_BUILD_WITH_MGE #include "lite-c/global_c.h" #include "lite-c/network_c.h" @@ -7,12 +7,12 @@ #include -#define LITE_CAPI_CHECK(_expr) \ - do { \ - int _ret = (_expr); \ - if (_ret) { \ - LITE_THROW(LITE_get_last_error()); \ - } \ +#define LITE_CAPI_CHECK(_expr) \ + do { \ + int _ret = (_expr); \ + if (_ret) { \ + LITE_EXAMPLE_THROW(LITE_get_last_error()); \ + } \ } while (0) bool basic_c_interface(const lite::example::Args& args) { @@ -95,7 +95,7 @@ bool device_io_c_interface(const lite::example::Args& args) { LITE_CAPI_CHECK( LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_tensor_in)); if (length_read_in != length_tensor_in) { - LITE_THROW( + LITE_EXAMPLE_THROW( "The input data size is not match the network input tensro " "size,\n"); }