Skip to content

Commit 83b1705

Browse files
committed
Implement Android Vulkan support
1 parent 7d58f6a commit 83b1705

7 files changed

Lines changed: 91 additions & 7 deletions

File tree

.github/scripts/build_openssl.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ get_android_toolchain() {
5151
local api_level=$2
5252

5353
case $arch in
54-
android-arm64)
54+
android-arm64|android-arm64-vulkan)
5555
export ANDROID_ARCH="aarch64"
5656
export ANDROID_EABI="aarch64-linux-android"
5757
export OPENSSL_ARCH="android-arm64"
@@ -157,7 +157,7 @@ main() {
157157
mkdir -p $WORK_DIR $INSTALL_DIR/$arch
158158

159159
case $arch in
160-
android-arm64)
160+
android-arm64|android-arm64-vulkan)
161161
build_openssl_android $arch
162162
;;
163163
android-x64)

.github/workflows/build_library.yaml

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ jobs:
5353
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
5454
sudo apt-get update -y
5555
sudo apt-get install -y build-essential vulkan-sdk
56+
57+
- id: copy_vulkan_linux
58+
if: contains(matrix.arch, 'vulkan')
59+
name: Copy Vulcan
60+
run: |
5661
cp /lib/x86_64-linux-gnu/libvulkan.so.1 build/libs/
5762
5863
- id: setup_cuda_linux
@@ -540,6 +545,8 @@ jobs:
540545
ABI: arm64-v8a
541546
- arch: android-x64
542547
ABI: x86_64
548+
- arch: android-arm64-vulkan
549+
ABI: arm64-v8a
543550

544551
steps:
545552
- id: setup_libs_linux
@@ -561,6 +568,23 @@ jobs:
561568
echo "CMAKE_VARS=-DARCHITECTURE=${{ matrix.arch }} -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${{ github.workspace }}/build/libs -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${{ github.workspace }}/build/libs -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${{ github.workspace }}/build/libs ${{ matrix.cmake_vars }}" >> $GITHUB_ENV
562569
shell: bash
563570

571+
- id: setup_vulkan_linux
572+
if: contains(matrix.arch, 'vulkan')
573+
name: Dependencies Vulcan
574+
run: |
575+
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
576+
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
577+
sudo apt-get update -y
578+
sudo apt-get install -y build-essential vulkan-sdk
579+
580+
- id: setup_vulcan_android
581+
if: contains(matrix.arch, 'vulkan')
582+
name: Install Vulkan headers
583+
run: |
584+
git submodule add https://github.com/KhronosGroup/Vulkan-Headers.git third_party/Vulkan-Headers
585+
cd third_party/Vulkan-Headers
586+
git checkout v1.3.275
587+
564588
565589
- id: cpu-cores
566590
name: Get number of CPU cores
@@ -577,7 +601,7 @@ jobs:
577601
export LD_LIBRARY_PATH=""
578602
export NDK=`ls -d /usr/local/lib/android/sdk/ndk/27.*`
579603
cd build
580-
cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-23 -DANDROID_ABI=${{ matrix.ABI }} ${{ env.CMAKE_VARS }}
604+
cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-29 -DANDROID_ABI=${{ matrix.ABI }} ${{ env.CMAKE_VARS }}
581605
cmake --build . --config Release -j ${{ steps.cpu-cores.outputs.count }}
582606
583607

.github/workflows_template/build_library_steps.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ jobs:
123123
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
124124
sudo apt-get update -y
125125
sudo apt-get install -y build-essential vulkan-sdk
126+
127+
- name: Copy Vulcan
128+
id: copy_vulkan_linux
129+
if: contains(matrix.arch, 'vulkan')
130+
run: |
126131
cp /lib/x86_64-linux-gnu/libvulkan.so.1 build/libs/
127132
128133
- uses: Jimver/cuda-toolkit@v0.2.15
@@ -242,13 +247,21 @@ jobs:
242247
243248
################################ Android ################################
244249

250+
- name: Install Vulkan headers
251+
id: setup_vulcan_android
252+
if: contains(matrix.arch, 'vulkan')
253+
run: |
254+
git submodule add https://github.com/KhronosGroup/Vulkan-Headers.git third_party/Vulkan-Headers
255+
cd third_party/Vulkan-Headers
256+
git checkout v1.3.275
257+
245258
- name: Build
246259
id: cmake_build_android
247260
run: |
248261
export LD_LIBRARY_PATH=""
249262
export NDK=`ls -d /usr/local/lib/android/sdk/ndk/27.*`
250263
cd build
251-
cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-23 -DANDROID_ABI=${{ matrix.ABI }} ${{ env.CMAKE_VARS }}
264+
cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-29 -DANDROID_ABI=${{ matrix.ABI }} ${{ env.CMAKE_VARS }}
252265
cmake --build . --config Release -j ${{ steps.cpu-cores.outputs.count }}
253266
254267
################################ iOS ################################

.github/workflows_template/build_library_template.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ jobs:
3030
@@checkout@@
3131
@@preparation@@
3232
@@setup_vulkan_linux@@
33+
@@copy_vulkan_linux@@
3334
@@setup_cuda_linux@@
3435
@@link_cuda_linux@@
3536

@@ -146,11 +147,15 @@ jobs:
146147
ABI: arm64-v8a
147148
- arch: android-x64
148149
ABI: x86_64
150+
- arch: android-arm64-vulkan
151+
ABI: arm64-v8a
149152

150153
steps:
151154
@@setup_libs_linux@@
152155
@@checkout@@
153156
@@preparation@@
157+
@@setup_vulkan_linux@@
158+
@@setup_vulcan_android@@
154159

155160
@@cpu-cores@@
156161
@@build_openssl@@

CMakeLists.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,42 @@ endif()
4848

4949
set(LLAMA_CPP_ROOT ${CMAKE_SOURCE_DIR}/third_party/llama.cpp)
5050

51+
if(ARCHITECTURE MATCHES "android" AND ARCHITECTURE MATCHES "vulkan")
52+
# Derive triple from ANDROID_ABI
53+
if(ANDROID_ABI STREQUAL "arm64-v8a")
54+
set(ANDROID_ARCH_TRIPLE "aarch64-linux-android")
55+
elseif(ANDROID_ABI STREQUAL "armeabi-v7a")
56+
set(ANDROID_ARCH_TRIPLE "arm-linux-androideabi")
57+
elseif(ANDROID_ABI STREQUAL "x86_64")
58+
set(ANDROID_ARCH_TRIPLE "x86_64-linux-android")
59+
elseif(ANDROID_ABI STREQUAL "x86")
60+
set(ANDROID_ARCH_TRIPLE "i686-linux-android")
61+
else()
62+
message(FATAL_ERROR "Unknown ANDROID_ABI: ${ANDROID_ABI}")
63+
endif()
64+
65+
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
66+
message(STATUS "ANDROID_ARCH_TRIPLE=${ANDROID_ARCH_TRIPLE}")
67+
message(STATUS "CMAKE_SYSROOT=${CMAKE_SYSROOT}")
68+
69+
string(REGEX REPLACE "android-" "" ANDROID_API_LEVEL "${ANDROID_PLATFORM}")
70+
set(Vulkan_LIBRARY "${CMAKE_SYSROOT}/usr/lib/${ANDROID_ARCH_TRIPLE}/${ANDROID_API_LEVEL}/libvulkan.so")
71+
set(Vulkan_FOUND TRUE)
72+
set(Vulkan_VERSION "1.3.275")
73+
set(Vulkan_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/third_party/Vulkan-Headers/include")
74+
75+
if(NOT EXISTS "${Vulkan_LIBRARY}")
76+
message(FATAL_ERROR "Vulkan stub not found at: ${Vulkan_LIBRARY}")
77+
endif()
78+
79+
find_program(Vulkan_GLSLC_EXECUTABLE
80+
NAMES glslc
81+
PATHS "/usr/bin" "/usr/local/bin"
82+
NO_CMAKE_SYSTEM_PATH)
83+
set(Vulkan_GLSLC_EXECUTABLE "${Vulkan_GLSLC_EXECUTABLE}" CACHE FILEPATH "" FORCE)
84+
endif()
85+
86+
5187
function(LLAMALIB_COMPILE_DEFS NAME)
5288
add_compile_definitions(${NAME} PRIVATE UNDREAMAI_EXPORTS)
5389
target_include_directories(${NAME} PRIVATE "${CMAKE_SOURCE_DIR}/include")

src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ add_library(
2424
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
2525
target_link_options(${LLAMALIB_ARCHITECTURE_LIBRARY} PRIVATE -Wl,--no-undefined)
2626
endif()
27+
if(ARCHITECTURE MATCHES "android" AND ARCHITECTURE MATCHES "vulkan")
28+
target_link_libraries(${LLAMALIB_ARCHITECTURE_LIBRARY} PRIVATE "${Vulkan_LIBRARY}")
29+
endif()
2730
LLAMALIB_COMPILE_DEFS(${LLAMALIB_ARCHITECTURE_LIBRARY})
2831
target_include_directories(${LLAMALIB_ARCHITECTURE_LIBRARY} PRIVATE "${LLAMA_CPP_ROOT}/src" "${LLAMA_CPP_ROOT}/ggml/include" "${LLAMA_CPP_ROOT}/tools/server" "${LLAMA_CPP_ROOT}/tools/mtmd" "${LLAMA_CPP_ROOT}/common")
2932
target_link_libraries(${LLAMALIB_ARCHITECTURE_LIBRARY} PRIVATE common mtmd)

third_party/CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ elseif(ARCHITECTURE MATCHES "avx2")
3030
# Nothing to define
3131
elseif(ARCHITECTURE MATCHES "avx")
3232
SET(GGML_AVX2 OFF)
33-
elseif(ARCHITECTURE MATCHES "vulkan")
34-
SET(GGML_VULKAN ON)
3533
elseif(ARCHITECTURE MATCHES "tinyblas")
3634
SET(GGML_CUDA ON)
3735
set(GGML_CUDA_FA OFF)
@@ -63,6 +61,11 @@ elseif(ARCHITECTURE MATCHES "android")
6361
else()
6462
add_compile_options("-march=x86-64")
6563
endif()
64+
if(ARCHITECTURE MATCHES "vulkan")
65+
SET(GGML_VULKAN ON)
66+
endif()
67+
elseif(ARCHITECTURE MATCHES "vulkan")
68+
SET(GGML_VULKAN ON)
6669
elseif(ARCHITECTURE MATCHES "ios" OR ARCHITECTURE MATCHES "visionos")
6770
SET(GGML_METAL_EMBED_LIBRARY ON)
6871
elseif(ARCHITECTURE STREQUAL "")
@@ -167,4 +170,4 @@ if(ARCHITECTURE MATCHES "tinyblas")
167170
target_compile_definitions(${target} PUBLIC GGML_USE_TINYBLAS GGML_CUDA_NO_FA GGML_CUDA_NO_IQUANTS)
168171
endif()
169172
endforeach()
170-
endif()
173+
endif()

0 commit comments

Comments
 (0)