Introduce 'ARMCompute' package (#1400)
author박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 30 May 2018 02:20:56 +0000 (11:20 +0900)
committer오형석/동작제어Lab(SR)/Senior Engineer/삼성전자 <hseok82.oh@samsung.com>
Wed, 30 May 2018 02:20:56 +0000 (11:20 +0900)
This commit introduces 'ARMCompute' package which provides uniform
interface over imported/built ARMCompute libraries.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
14 files changed:
CMakeLists.txt
benchmark/acl/CMakeLists.txt
cmake/config/config_aarch64-linux.cmake
cmake/config/config_aarch64-tizen.cmake
cmake/config/config_armv7l-linux.cmake
cmake/config/config_armv7l-tizen.cmake
cmake/packages/ARMCompute/CMakeLists.txt [moved from externals/acl.cmake with 99% similarity]
cmake/packages/ARMComputeConfig.cmake [new file with mode: 0644]
contrib/bindacl/CMakeLists.txt
contrib/convacl/CMakeLists.txt
contrib/kerneltesting/CMakeLists.txt
externals/CMakeLists.txt
libs/kernel/acl/CMakeLists.txt
runtimes/pure_arm_compute/CMakeLists.txt

index 59099fa..c4d7ec6 100644 (file)
@@ -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
index 700f258..3bebc27 100644 (file)
@@ -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
index b13a8b0..8a4e3b3 100644 (file)
@@ -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)
index e76ad21..4221747 100644 (file)
@@ -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})
 
index 01d3df9..8e514d4 100644 (file)
@@ -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)
index 3d49492..7971d91 100644 (file)
@@ -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)
 
 
 
similarity index 99%
rename from externals/acl.cmake
rename to cmake/packages/ARMCompute/CMakeLists.txt
index f091e63..19e5a22 100644 (file)
@@ -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 (file)
index 0000000..2aa4cc1
--- /dev/null
@@ -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)
index 7fc6375..75e77a5 100644 (file)
@@ -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)
index 62ce3e0..ca64112 100644 (file)
@@ -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)
index d927409..ba0d808 100644 (file)
@@ -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()
 
index 2631aea..5d038bf 100644 (file)
@@ -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)
index 0f20483..063bb79 100644 (file)
@@ -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)
index d35c175..a6d03b2 100644 (file)
@@ -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)