Skip to content

Commit 897501a

Browse files
committed
Refactor CMake configuration for Hexagon NPU: consolidate device target setup and improve build structure
1 parent 2884bbc commit 897501a

2 files changed

Lines changed: 217 additions & 213 deletions

File tree

‎ggml/src/ggml-qnn/npu/CMakeLists.txt‎

Lines changed: 82 additions & 213 deletions
Original file line numberDiff line numberDiff line change
@@ -37,229 +37,98 @@ set(common_incs
3737

3838
include_directories(${common_incs})
3939

40-
function(add_device_target target_name DSP_ARCH IS_SIMULATOR BUILD_CPU_COUNT)
41-
if(${CMAKE_BUILD_TYPE} MATCHES "Debug|Dbg")
42-
set(HEXAGON_BUILD_CONFIG "Debug")
43-
set(EXTRA_BUILD_FLAGS
44-
VERBOSE=1
45-
TREE=1
46-
)
47-
else()
48-
set(HEXAGON_BUILD_CONFIG "Release")
49-
set(EXTRA_BUILD_FLAGS)
50-
endif()
51-
52-
if(${GGML_SANITIZE_ADDRESS} OR ${LLAMA_SANITIZE_ADDRESS})
53-
set(GGML_HEXAGON_NPU_SANITIZE_ADDRESS ON)
54-
else()
55-
set(GGML_HEXAGON_NPU_SANITIZE_ADDRESS OFF)
56-
endif()
57-
58-
set(EXTRA_BUILD_FLAGS ${EXTRA_BUILD_FLAGS} GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS=${GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS})
59-
set(EXTRA_BUILD_FLAGS ${EXTRA_BUILD_FLAGS} GGML_HEXAGON_NPU_SANITIZE_ADDRESS=${GGML_HEXAGON_NPU_SANITIZE_ADDRESS})
60-
set(EXTRA_BUILD_FLAGS ${EXTRA_BUILD_FLAGS} GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING=${GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING})
61-
62-
set(HEXAGON_TOOLS_VARIANT $ENV{DEFAULT_TOOLS_VARIANT})
63-
set(BUILD_DIR ${CMAKE_CURRENT_LIST_DIR}/hexagon_${HEXAGON_BUILD_CONFIG}_${HEXAGON_TOOLS_VARIANT}_${DSP_ARCH})
64-
set(BUILD_BINARY_NAME ${BUILD_DIR}/libhexagon_npu_skel_${DSP_ARCH}.so)
65-
66-
if(${IS_SIMULATOR})
67-
set(HEXAGON_TOOLCHAIN_TYPE "hexagonsim")
68-
set(OUTPUT_BINARY_NAME libhexagon_npu_skel_${DSP_ARCH}_sim.so)
69-
else()
70-
set(HEXAGON_TOOLCHAIN_TYPE "hexagon")
71-
set(OUTPUT_BINARY_NAME libhexagon_npu_skel_${DSP_ARCH}.so)
72-
endif()
73-
74-
add_custom_target(${target_name} ALL
75-
COMMAND ${CMAKE_COMMAND} -E remove_directory ${BUILD_DIR}
76-
COMMAND build_cmake ${HEXAGON_TOOLCHAIN_TYPE} DSP_ARCH=${DSP_ARCH} BUILD=${HEXAGON_BUILD_CONFIG} ${EXTRA_BUILD_FLAGS} -j${BUILD_CPU_COUNT}
77-
COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_BINARY_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${OUTPUT_BINARY_NAME}
78-
BYPRODUCTS ${BUILD_BINARY_NAME}
79-
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
80-
)
81-
endfunction()
82-
83-
function(add_dsp_targets_for_host host_target DSP_ARCH BUILD_CPU_COUNT)
84-
add_device_target(hexagon-npu-device-${DSP_ARCH} ${DSP_ARCH} FALSE ${BUILD_CPU_COUNT})
85-
add_device_target(hexagon-npu-device-${DSP_ARCH}-sim ${DSP_ARCH} TRUE ${BUILD_CPU_COUNT})
86-
add_dependencies(hexagon-npu-device-${DSP_ARCH}-sim hexagon-npu-device-${DSP_ARCH})
87-
add_dependencies(${host_target} hexagon-npu-device-${DSP_ARCH}-sim)
88-
endfunction()
40+
# host build
41+
file(GLOB common_srcs "${CMAKE_CURRENT_LIST_DIR}/common/*.cpp")
42+
file(GLOB host_srcs "${CMAKE_CURRENT_LIST_DIR}/host/*.cpp")
43+
set(stub_srcs "${CMAKE_CURRENT_BINARY_DIR}/npu_device_stub.c")
44+
add_library(hexagon-npu-host STATIC
45+
${common_srcs}
46+
${host_srcs}
47+
${stub_srcs}
48+
)
8949

90-
if(${CMAKE_SYSTEM_NAME} MATCHES "Android|Linux|Windows")
91-
# host build
92-
file(GLOB common_srcs "${CMAKE_CURRENT_LIST_DIR}/common/*.cpp")
93-
file(GLOB host_srcs "${CMAKE_CURRENT_LIST_DIR}/host/*.cpp")
94-
set(stub_srcs "${CMAKE_CURRENT_BINARY_DIR}/npu_device_stub.c")
95-
add_library(hexagon-npu-host STATIC
96-
${common_srcs}
97-
${host_srcs}
98-
${stub_srcs}
99-
)
50+
# disable warnings for the stub
51+
set_source_files_properties(
52+
${stub_srcs}
53+
PROPERTIES
54+
COMPILE_FLAGS "-w"
55+
)
10056

101-
# disable warnings for the stub
102-
set_source_files_properties(
103-
${stub_srcs}
104-
PROPERTIES
105-
COMPILE_FLAGS "-w"
106-
)
57+
build_idl(idl/hexagon_npu.idl hexagon-npu-host)
10758

108-
build_idl(idl/hexagon_npu.idl hexagon-npu-host)
59+
# Add compile definitions to the target
60+
target_compile_definitions(hexagon-npu-host PUBLIC
61+
VERIFY_PRINT_ERROR
62+
GGML_QNN_ENABLE_HEXAGON_BACKEND
63+
)
10964

110-
# Add compile definitions to the target
65+
if(GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS)
11166
target_compile_definitions(hexagon-npu-host PUBLIC
112-
VERIFY_PRINT_ERROR
113-
GGML_QNN_ENABLE_HEXAGON_BACKEND
67+
GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS
11468
)
69+
endif()
11570

116-
if(GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS)
117-
target_compile_definitions(hexagon-npu-host PUBLIC
118-
GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS
119-
)
120-
endif()
121-
122-
target_include_directories(hexagon-npu-host PRIVATE
123-
${HEXAGON_SDK_ROOT}/ipc/fastrpc/rpcmem/inc/
124-
${QNN_SDK_ROOT}/include/QNN/
125-
${CMAKE_CURRENT_LIST_DIR}/host/
126-
${CMAKE_CURRENT_LIST_DIR}/
127-
)
128-
129-
target_include_directories(hexagon-npu-host PUBLIC
130-
${HEXAGON_SDK_ROOT}/incs/ # TODO: this is for rpc-mem
131-
)
132-
133-
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
134-
set_target_properties(hexagon-npu-host PROPERTIES OUTPUT_NAME "hexagon_npu")
135-
endif()
136-
137-
if(${CMAKE_SYSTEM_NAME} MATCHES "Android|Linux")
138-
target_link_options(hexagon-npu-host PUBLIC -pie)
139-
endif()
140-
141-
if(GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING)
142-
message("GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING is enabled")
143-
target_compile_definitions(hexagon-npu-host PUBLIC GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING)
144-
else()
145-
message("GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING is disabled")
146-
endif()
147-
148-
link_options(hexagon-npu-host)
71+
target_include_directories(hexagon-npu-host PRIVATE
72+
${HEXAGON_SDK_ROOT}/ipc/fastrpc/rpcmem/inc/
73+
${QNN_SDK_ROOT}/include/QNN/
74+
${CMAKE_CURRENT_LIST_DIR}/host/
75+
${CMAKE_CURRENT_LIST_DIR}/
76+
)
14977

150-
choose_dsprpc("3" dsprpc) # cdsprpc
151-
link_custom_library(hexagon-npu-host ${dsprpc})
78+
target_include_directories(hexagon-npu-host PUBLIC
79+
${HEXAGON_SDK_ROOT}/incs/ # TODO: this is for rpc-mem
80+
)
15281

153-
cmake_host_system_information(RESULT BUILD_CPU_COUNT QUERY NUMBER_OF_PHYSICAL_CORES)
154-
add_dsp_targets_for_host(hexagon-npu-host "v73" ${BUILD_CPU_COUNT})
155-
add_dsp_targets_for_host(hexagon-npu-host "v75" ${BUILD_CPU_COUNT})
156-
add_dsp_targets_for_host(hexagon-npu-host "v79" ${BUILD_CPU_COUNT})
82+
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
83+
set_target_properties(hexagon-npu-host PROPERTIES OUTPUT_NAME "hexagon_npu")
84+
endif()
15785

158-
list(APPEND NPU_RUNTIME_LIBS "${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonApp")
159-
list(APPEND NPU_RUNTIME_LIBS "${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonAppLE")
86+
if(${CMAKE_SYSTEM_NAME} MATCHES "Android|Linux")
87+
target_link_options(hexagon-npu-host PUBLIC -pie)
88+
endif()
16089

161-
foreach(RUNTIME_LIB ${NPU_RUNTIME_LIBS})
162-
message("Copy: ${RUNTIME_LIB} -> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
163-
add_custom_command(
164-
TARGET hexagon-npu-host POST_BUILD
165-
COMMAND ${CMAKE_COMMAND} -E copy
166-
${RUNTIME_LIB}
167-
${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
168-
endforeach()
90+
if(GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING)
91+
message("GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING is enabled")
92+
target_compile_definitions(hexagon-npu-host PUBLIC GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING)
16993
else()
170-
# hexagon npu build, this section will run inside the `build_cmake` script
171-
cmake_minimum_required(VERSION 3.14.3)
172-
project(hexagon_npu C CXX ASM)
173-
174-
# check if QNN_SDK_ROOT is set
175-
if(NOT DEFINED ENV{QNN_SDK_ROOT})
176-
message(FATAL_ERROR "QNN_SDK_ROOT not defined")
177-
endif()
178-
179-
set(QNN_SDK_ROOT $ENV{QNN_SDK_ROOT})
180-
message("QNN_SDK_ROOT: ${QNN_SDK_ROOT}")
181-
message("GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS: ${GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS}")
182-
183-
include_directories(
184-
${QNN_SDK_ROOT}/include/QNN/
185-
)
186-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
187-
188-
file(GLOB common_srcs "${CMAKE_CURRENT_LIST_DIR}/common/*.cpp")
189-
file(GLOB device_srcs "${CMAKE_CURRENT_LIST_DIR}/device/*.cpp")
190-
file(GLOB device_op_srcs "${CMAKE_CURRENT_LIST_DIR}/device/op/*.cpp")
191-
set(skel_srcs "${CMAKE_CURRENT_BINARY_DIR}/npu_device_skel.c")
192-
add_library(hexagon_npu_skel_OBJS OBJECT
193-
${common_srcs}
194-
${device_srcs}
195-
${device_op_srcs}
196-
${skel_srcs}
197-
)
198-
199-
if(CMAKE_BUILD_TYPE MATCHES "Debug|Dbg")
200-
message("Debug build, enable all logging")
201-
target_compile_definitions(hexagon_npu_skel_OBJS PUBLIC
202-
_DEBUG
203-
DEBUG_LOGGING
204-
)
205-
else()
206-
message("Release build, disable debug logging")
207-
target_compile_definitions(hexagon_npu_skel_OBJS PUBLIC
208-
NDEBUG
209-
RELEASE_LOGGING
210-
)
211-
endif()
212-
213-
if(GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS)
214-
message("GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS is enabled")
215-
target_compile_definitions(hexagon_npu_skel_OBJS PUBLIC
216-
GGML_HEXAGON_ENABLE_QUANTIZED_TENSORS
217-
)
218-
endif()
219-
220-
if(GGML_HEXAGON_NPU_SANITIZE_ADDRESS)
221-
message("GGML_HEXAGON_NPU_SANITIZE_ADDRESS is enabled")
222-
target_compile_options(hexagon_npu_skel_OBJS PUBLIC
223-
-fsanitize=address -fno-omit-frame-pointer
224-
)
225-
target_link_options(hexagon_npu_skel_OBJS PUBLIC
226-
-fsanitize=address
227-
)
228-
endif()
229-
230-
if(GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING)
231-
message("GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING is enabled")
232-
target_compile_definitions(hexagon_npu_skel_OBJS PUBLIC
233-
GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING
234-
)
235-
endif()
236-
237-
build_idl(idl/hexagon_npu.idl hexagon_npu_skel_OBJS)
238-
239-
add_subdirectory(${HEXAGON_SDK_ROOT}/libs/qprintf qprintf_dir)
240-
target_include_directories(hexagon_npu_skel_OBJS PUBLIC
241-
${HEXAGON_SDK_ROOT}/libs/qprintf/inc/
242-
243-
# TODO: find a better way to include these
244-
${CMAKE_CURRENT_LIST_DIR}/device/
245-
${CMAKE_CURRENT_LIST_DIR}/device/op/
246-
)
247-
248-
# disable warnings for the skel
249-
set_source_files_properties(
250-
${skel_srcs}
251-
PROPERTIES
252-
COMPILE_FLAGS "-w"
253-
)
254-
255-
add_library(hexagon_npu_skel SHARED $<TARGET_OBJECTS:hexagon_npu_skel_OBJS>)
256-
target_link_libraries(hexagon_npu_skel
257-
${HEXAGON_LIB_DIR}/${HEXAGON_ARCH}/G0/pic/libc++abi.so.1
258-
${HEXAGON_LIB_DIR}/${HEXAGON_ARCH}/G0/pic/libc++.so.1
259-
${HEXAGON_LIB_DIR}/${HEXAGON_ARCH}/G0/pic/libc.so
260-
)
261-
set_target_properties(hexagon_npu_skel PROPERTIES OUTPUT_NAME "hexagon_npu_skel_${HEXAGON_ARCH}")
262-
target_link_libraries(hexagon_npu_skel qprintf_static)
263-
264-
copy_binaries(hexagon_npu_skel)
94+
message("GGML_HEXAGON_ENABLE_PERFORMANCE_TRACKING is disabled")
26595
endif()
96+
97+
link_options(hexagon-npu-host)
98+
99+
choose_dsprpc("3" dsprpc) # cdsprpc
100+
link_custom_library(hexagon-npu-host ${dsprpc})
101+
102+
cmake_host_system_information(RESULT BUILD_CPU_COUNT QUERY NUMBER_OF_PHYSICAL_CORES)
103+
104+
# Build HTP bits
105+
set(HTP_CMAKE_ARGS
106+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/../../ggml-hexagon/htp/cmake-toolchain.cmake
107+
-DCMAKE_BUILD_TYPE=Release
108+
-DCMAKE_INSTALL_LIBDIR=${CMAKE_CURRENT_BINARY_DIR}
109+
-DHEXAGON_SDK_ROOT=$ENV{HEXAGON_SDK_ROOT}
110+
-DHEXAGON_TOOLS_ROOT=$ENV{HEXAGON_TOOLS_ROOT}
111+
-DHEXAGON_HTP_DEBUG=${GGML_HEXAGON_HTP_DEBUG}
112+
-DGGML_HEXAGON_FP32_QUANTIZE_GROUP_SIZE=${GGML_HEXAGON_FP32_QUANTIZE_GROUP_SIZE})
113+
114+
ExternalProject_Add(hexagon_npu_skel_v73
115+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/device BUILD_ALWAYS ON
116+
CMAKE_ARGS ${HTP_CMAKE_ARGS} -DDSP_VERSION=v73 -DPREBUILT_LIB_DIR="toolv19_v73")
117+
ExternalProject_Add(hexagon_npu_skel_v75
118+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/device BUILD_ALWAYS ON
119+
CMAKE_ARGS ${HTP_CMAKE_ARGS} -DDSP_VERSION=v75 -DPREBUILT_LIB_DIR="toolv19_v75")
120+
ExternalProject_Add(hexagon_npu_skel_v79
121+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/device BUILD_ALWAYS ON
122+
CMAKE_ARGS ${HTP_CMAKE_ARGS} -DDSP_VERSION=v79 -DPREBUILT_LIB_DIR="toolv19_v79")
123+
124+
list(APPEND NPU_RUNTIME_LIBS "${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonApp")
125+
list(APPEND NPU_RUNTIME_LIBS "${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonAppLE")
126+
127+
# Install Hexagon skels required at runtime
128+
install(FILES
129+
${CMAKE_CURRENT_BINARY_DIR}/libhexagon_npu_skel_v73.so
130+
${CMAKE_CURRENT_BINARY_DIR}/libhexagon_npu_skel_v75.so
131+
${CMAKE_CURRENT_BINARY_DIR}/libhexagon_npu_skel_v79.so
132+
${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonApp
133+
${HEXAGON_SDK_ROOT}/tools/utils/sysmon/sysMonAppLE
134+
TYPE LIB)

0 commit comments

Comments
 (0)