From: 박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 Date: Wed, 30 May 2018 02:20:56 +0000 (+0900) Subject: Introduce 'ARMCompute' package (#1400) X-Git-Tag: 0.2~795 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1eab7d7d13d4dec302464aec6750cae37d3309bc;p=platform%2Fcore%2Fml%2Fnnfw.git Introduce 'ARMCompute' package (#1400) This commit introduces 'ARMCompute' package which provides uniform interface over imported/built ARMCompute libraries. Signed-off-by: Jonghyun Park --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 59099fa..c4d7ec6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,7 +116,6 @@ else() set(NNFW_ACL_FOLDER "") set(NNFW_ACL_INCLUDES "") endif() -set(NNFW_ACL_LIBS arm_compute_graph arm_compute arm_compute_core dl pthread) set(NNFW_NN_RUNTIME_ROOT ${CMAKE_SOURCE_DIR}/runtimes/nn) # NOTE '${CMAKE_INSTALL_PREFIX}/lib' should be added as a link directory as diff --git a/benchmark/acl/CMakeLists.txt b/benchmark/acl/CMakeLists.txt index 700f258..3bebc27 100644 --- a/benchmark/acl/CMakeLists.txt +++ b/benchmark/acl/CMakeLists.txt @@ -1,7 +1,8 @@ +nnfw_find_package(ARMCompute REQUIRED) + add_library(arm_compute_benchmark SHARED "Benchmark.cpp") target_include_directories(arm_compute_benchmark PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(arm_compute_benchmark PUBLIC ${NNFW_ACL_INCLUDES}) -target_link_libraries(arm_compute_benchmark ${NNFW_ACL_LIBS}) +target_link_libraries(arm_compute_benchmark arm_compute_graph) install(TARGETS arm_compute_benchmark DESTINATION lib) # GoogLeNet benchmark diff --git a/cmake/config/config_aarch64-linux.cmake b/cmake/config/config_aarch64-linux.cmake index b13a8b0..8a4e3b3 100644 --- a/cmake/config/config_aarch64-linux.cmake +++ b/cmake/config/config_aarch64-linux.cmake @@ -30,4 +30,3 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/cmake/config/config_aarch64-tizen.cmake b/cmake/config/config_aarch64-tizen.cmake index e76ad21..4221747 100644 --- a/cmake/config/config_aarch64-tizen.cmake +++ b/cmake/config/config_aarch64-tizen.cmake @@ -32,7 +32,6 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) add_compile_options(--sysroot=${ROOTFS_ARM64}) diff --git a/cmake/config/config_armv7l-linux.cmake b/cmake/config/config_armv7l-linux.cmake index 01d3df9..8e514d4 100644 --- a/cmake/config/config_armv7l-linux.cmake +++ b/cmake/config/config_armv7l-linux.cmake @@ -30,4 +30,3 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/cmake/config/config_armv7l-tizen.cmake b/cmake/config/config_armv7l-tizen.cmake index 3d49492..7971d91 100644 --- a/cmake/config/config_armv7l-tizen.cmake +++ b/cmake/config/config_armv7l-tizen.cmake @@ -32,7 +32,6 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/externals/acl.cmake b/cmake/packages/ARMCompute/CMakeLists.txt similarity index 99% rename from externals/acl.cmake rename to cmake/packages/ARMCompute/CMakeLists.txt index f091e63..19e5a22 100644 --- a/externals/acl.cmake +++ b/cmake/packages/ARMCompute/CMakeLists.txt @@ -1,7 +1,7 @@ ### ### ARM Compute Library ### -set(ACL_BASE ${CMAKE_CURRENT_SOURCE_DIR}/acl) +set(ACL_BASE ${CMAKE_SOURCE_DIR}/externals/acl) set(ACL_GENERATED ${CMAKE_CURRENT_BINARY_DIR}/acl_generated) set(ACL_VERSION_TAG "${ACL_GENERATED}/arm_compute_version.embed") diff --git a/cmake/packages/ARMComputeConfig.cmake b/cmake/packages/ARMComputeConfig.cmake new file mode 100644 index 0000000..2aa4cc1 --- /dev/null +++ b/cmake/packages/ARMComputeConfig.cmake @@ -0,0 +1,87 @@ +function(_ARMCompute_Build) + if(TARGET arm_compute_core) + set(ARMCompute_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET arm_compute_core) + + add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ARMCompute" "${CMAKE_BINARY_DIR}/externals/ARMCompute") + set(ARMCompute_FOUND TRUE PARENT_SCOPE) +endfunction(_ARMCompute_Build) + +function(_ARMCompute_Import) + include(FindPackageHandleStandardArgs) + + list(APPEND ARMCompute_INCLUDE_SEARCH_PATHS /usr/include) + + list(APPEND ARMCompute_LIB_SEARCH_PATHS /usr/lib) + + find_path(INCLUDE_DIR NAMES arm_compute/core/ITensor.h PATHS ${ARMCompute_INCLUDE_SEARCH_PATHS}) + + find_library(CORE_LIBRARY NAMES arm_compute_core PATHS ${ARMCompute_LIB_SEARCH_PATHS}) + find_library(RUNTIME_LIBRARY NAMES arm_compute PATHS ${ARMCompute_LIB_SEARCH_PATHS}) + find_library(GRAPH_LIBRARY NAMES arm_compute_graph PATHS ${ARMCompute_LIB_SEARCH_PATHS}) + + if(NOT INCLUDE_DIR) + set(INCLUDE_DIR ${CMAKE_SOURCE_DIR}/externals/acl ${CMAKE_SOURCE_DIR}/externals/acl/include) + endif(NOT INCLUDE_DIR) + + # NOTE '${CMAKE_INSTALL_PREFIX}/lib' should be searched as CI server places + # pre-built ARM compute libraries on this directory + if(NOT CORE_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_core.so) + set(CORE_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_core.so) + endif() + + if(NOT CORE_LIBRARY) + return() + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + endif() + + if(NOT RUNTIME_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute.so) + set(RUNTIME_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute.so) + endif() + + if(NOT RUNTIME_LIBRARY) + return() + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + endif() + + if(NOT GRAPH_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_graph.so) + set(GRAPH_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_graph.so) + endif() + + if(NOT GRAPH_LIBRARY) + return() + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + endif() + + if(NOT TARGET arm_compute_core) + add_library(arm_compute_core INTERFACE) + target_include_directories(arm_compute_core INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute_core INTERFACE ${CORE_LIBRARY}) + if (${TARGET_OS} STREQUAL "tizen") + target_link_libraries(arm_compute_core INTERFACE OpenCL) + endif() + endif(NOT TARGET arm_compute_core) + + if(NOT TARGET arm_compute) + add_library(arm_compute INTERFACE) + target_include_directories(arm_compute INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute INTERFACE ${RUNTIME_LIBRARY}) + target_link_libraries(arm_compute INTERFACE arm_compute_core) + endif(NOT TARGET arm_compute) + + if(NOT TARGET arm_compute_graph) + add_library(arm_compute_graph INTERFACE) + target_include_directories(arm_compute_graph INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute_graph INTERFACE ${GRAPH_LIBRARY}) + target_link_libraries(arm_compute_graph INTERFACE arm_compute) + endif(NOT TARGET arm_compute_graph) + + set(ARMCompute_FOUND TRUE PARENT_SCOPE) +endfunction(_ARMCompute_Import) + +if(BUILD_ACL) + _ARMCompute_Build() +else(BUILD_ACL) + _ARMCompute_Import() +endif(BUILD_ACL) diff --git a/contrib/bindacl/CMakeLists.txt b/contrib/bindacl/CMakeLists.txt index 7fc6375..75e77a5 100644 --- a/contrib/bindacl/CMakeLists.txt +++ b/contrib/bindacl/CMakeLists.txt @@ -6,14 +6,15 @@ if(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") return() endif(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") +nnfw_find_package(ARMCompute REQUIRED) + file(GLOB_RECURSE NNAPI_BINDACL_SRCS "src/*.cc") link_directories(${CMAKE_INSTALL_PREFIX}/lib) add_library(exp_bindacl SHARED ${NNAPI_BINDACL_SRCS}) -target_include_directories(exp_bindacl PUBLIC ${NNFW_INCLUDE_DIR} - ${NNFW_ACL_INCLUDES}) -target_link_libraries(exp_bindacl nnfw_util ${NNFW_ACL_LIBS}) +target_include_directories(exp_bindacl PUBLIC ${NNFW_INCLUDE_DIR}) +target_link_libraries(exp_bindacl nnfw_util arm_compute_graph) # we need the library name to be 'neuralnetworks' and this will do the trick set_target_properties(exp_bindacl PROPERTIES OUTPUT_NAME neuralnetworks) diff --git a/contrib/convacl/CMakeLists.txt b/contrib/convacl/CMakeLists.txt index 62ce3e0..ca64112 100644 --- a/contrib/convacl/CMakeLists.txt +++ b/contrib/convacl/CMakeLists.txt @@ -6,14 +6,15 @@ if(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") return() endif(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") +nnfw_find_package(ARMCompute REQUIRED) + file(GLOB_RECURSE NNAPI_CONVACL_SRCS "src/*.cc") link_directories(${CMAKE_INSTALL_PREFIX}/lib) add_library(exp_convacl SHARED ${NNAPI_CONVACL_SRCS}) -target_include_directories(exp_convacl PUBLIC ${NNFW_INCLUDE_DIR} - ${NNFW_ACL_INCLUDES}) -target_link_libraries(exp_convacl nnfw_util ${NNFW_ACL_LIBS}) +target_include_directories(exp_convacl PUBLIC ${NNFW_INCLUDE_DIR}) +target_link_libraries(exp_convacl nnfw_util arm_compute_graph) # we need the library name to be 'neuralnetworks' and this will do the trick set_target_properties(exp_convacl PROPERTIES OUTPUT_NAME neuralnetworks) diff --git a/contrib/kerneltesting/CMakeLists.txt b/contrib/kerneltesting/CMakeLists.txt index d927409..ba0d808 100644 --- a/contrib/kerneltesting/CMakeLists.txt +++ b/contrib/kerneltesting/CMakeLists.txt @@ -6,17 +6,14 @@ if(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") return() endif(NOT ${TARGET_ARCH_BASE} STREQUAL "arm") +nnfw_find_package(ARMCompute REQUIRED) + function(add_kerneltesting TESTNAME SRC_FILES) link_directories(${CMAKE_INSTALL_PREFIX}/lib) add_executable(${TESTNAME} ${SRC_FILES}) target_include_directories(${TESTNAME} PUBLIC - ${NNFW_INCLUDE_DIR} - ${NNFW_ACL_INCLUDES}) - if (${TARGET_OS} STREQUAL "tizen") - target_link_libraries(${TESTNAME} nnfw_util OpenCL ${NNFW_ACL_LIBS}) - else() - target_link_libraries(${TESTNAME} nnfw_util ${NNFW_ACL_LIBS}) - endif() + ${NNFW_INCLUDE_DIR}) + target_link_libraries(${TESTNAME} nnfw_util arm_compute_graph) install(TARGETS ${TESTNAME} DESTINATION bin) endfunction() diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 2631aea..5d038bf 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -50,7 +50,3 @@ add_library(tensorflow-lite ${TFLITE_SRCS}) target_include_directories(tensorflow-lite PUBLIC ${TFLITE_INCLUDES}) target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") target_link_libraries(tensorflow-lite eigen3 ${LIB_PTHREAD} dl) - -if(BUILD_ACL) - include(acl.cmake) -endif(BUILD_ACL) diff --git a/libs/kernel/acl/CMakeLists.txt b/libs/kernel/acl/CMakeLists.txt index 0f20483..063bb79 100644 --- a/libs/kernel/acl/CMakeLists.txt +++ b/libs/kernel/acl/CMakeLists.txt @@ -1,3 +1,5 @@ +nnfw_find_package(ARMCompute REQUIRED) + set(LIB_KERNELACL kernelacl) set(LIB_KERNELACL_TEST kernelacl_test) @@ -46,15 +48,10 @@ set_target_properties(${LIB_KERNELACL} PROPERTIES CXX_STANDARD 14) target_include_directories(${LIB_KERNELACL} PUBLIC ${NNFW_INCLUDE_DIR} ${RUNTIME_INCLUDES} - ${NNFW_ACL_INCLUDES} ${CMAKE_SOURCE_DIR}/include ) target_link_libraries(${LIB_KERNELACL} nnfw_support_nnapi) -if (${TARGET_OS} STREQUAL "tizen") - target_link_libraries(${LIB_KERNELACL} nnfw_util ${NNFW_ACL_LIBS} OpenCL) -else() - target_link_libraries(${LIB_KERNELACL} nnfw_util ${NNFW_ACL_LIBS}) -endif() +target_link_libraries(${LIB_KERNELACL} nnfw_util arm_compute) install(TARGETS ${LIB_KERNELACL} DESTINATION lib) # kernel test executable @@ -86,14 +83,13 @@ set_target_properties(${LIB_KERNELACL_TEST} PROPERTIES CXX_STANDARD 14) target_include_directories(${LIB_KERNELACL_TEST} PUBLIC ${NNFW_INCLUDE_DIR} ${RUNTIME_INCLUDES} - ${NNFW_ACL_INCLUDES} ) if (NOT ${TARGET_OS} STREQUAL "tizen") add_dependencies(${LIB_KERNELACL_TEST} googletest) endif() target_link_libraries(${LIB_KERNELACL_TEST} ${LIB_KERNELACL} - nnfw_util ${NNFW_ACL_LIBS} + nnfw_util arm_compute ${NNFW_GTEST_LIBS} ) install(TARGETS ${LIB_KERNELACL_TEST} DESTINATION unittest) diff --git a/runtimes/pure_arm_compute/CMakeLists.txt b/runtimes/pure_arm_compute/CMakeLists.txt index d35c175..a6d03b2 100644 --- a/runtimes/pure_arm_compute/CMakeLists.txt +++ b/runtimes/pure_arm_compute/CMakeLists.txt @@ -1,4 +1,11 @@ -if(BUILD_PURE_ARM_COMPUTE) +if(NOT BUILD_PURE_ARM_COMPUTE) + return() +endif(NOT BUILD_PURE_ARM_COMPUTE) + +nnfw_find_package(ARMCompute REQUIRED) + +# NOTE This strange indentation is introduced to minimize code diffs +# TODO Revise indentation file(GLOB_RECURSE SOURCES "src/*.cc") add_library(nnapi_pure_arm_compute SHARED ${SOURCES}) @@ -12,4 +19,3 @@ if(BUILD_PURE_ARM_COMPUTE) # To prevent undefined references add_executable(pure_arm_compute_symbolcheck symbolcheck.cpp) target_link_libraries(pure_arm_compute_symbolcheck nnapi_pure_arm_compute) -endif(BUILD_PURE_ARM_COMPUTE)