Skip to content

Commit b71f03c

Browse files
authored
[ET-VK][ez] Enable Vulkan tests to build for Android in OSS + misc fixes (#10368)
Summary: ## Changes Modified the `CMakeLists.txt` of test targets to be able to build for Android. Apply SPIR-V optimization when building Vulkan compute shaders. Test Plan: ## Test Plan Built and ran test binaries on local Android device. After installing main ET C++ libs for Android... Build compute_api_test binary. ``` pp cmake backends/vulkan/test \ -DCMAKE_INSTALL_PREFIX=cmake-android-out \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-28 \ -DPYTHON_EXECUTABLE=python \ -DCMAKE_BUILD_TYPE=Release \ -Bcmake-android-out/backends/vulkan/test && \ cmake --build cmake-android-out/backends/vulkan/test -j16 --config Release ``` Push and run on device: ``` adb -s $IP push cmake-android-out/backends/vulkan/test/vulkan_compute_api_test /data/local/tmp/test_bin && \ adb -s $IP shell /data/local/tmp/test_bin \ --gtest_filter="*add*" ``` Build the operator test binaries: ``` rm -rf cmake-out/backends/vulkan/test/op_tests && \ pp cmake backends/vulkan/test/op_tests \ -DCMAKE_INSTALL_PREFIX=cmake-android-out \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-28 \ -DPYTHON_EXECUTABLE=python \ -DCMAKE_BUILD_TYPE=Release \ -DTORCH_OPS_YAML_PATH=/home/ssjia/Github/pytorch/aten/src/ATen/native \ -DTORCH_INSTALL_PREFIX=/home/ssjia/Github/pytorch/build_android \ -Bcmake-android-out/backends/vulkan/test/op_tests && \ cmake --build cmake-android-out/backends/vulkan/test/op_tests -j16 --config Release ``` Push and run on device. Note that these binaries require `libtorch` so files to be pushed to the device as well. ``` # Push torch libs adb -s $IP push /home/ssjia/Github/pytorch/build_android/lib/libtorch.so /data/local/tmp/ && \ adb -s $IP push /home/ssjia/Github/pytorch/build_android/lib/libtorch_cpu.so /data/local/tmp/ && \ adb -s $IP push /home/ssjia/Github/pytorch/build_android/lib/libc10.so /data/local/tmp/ && \ adb push $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64/libomp.so /data/local/tmp/libomp.so adb -s $IP push cmake-android-out/backends/vulkan/test/op_tests/vulkan_linear_weight_int4_test /data/local/tmp/test_bin && \ adb -s $IP shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test_bin ```
1 parent cfd1be3 commit b71f03c

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

backends/vulkan/cmake/ShaderLibrary.cmake

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ if(ANDROID)
2929
message(FATAL_ERROR "ANDROID_NDK not set")
3030
endif()
3131

32-
set(GLSLC_PATH
33-
"${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc"
34-
)
32+
if(NOT GLSLC_PATH)
33+
set(GLSLC_PATH
34+
"${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc"
35+
)
36+
endif()
3537
else()
3638
find_program(GLSLC_PATH glslc PATHS $ENV{PATH})
3739

@@ -56,7 +58,7 @@ function(gen_vulkan_shader_lib_cpp shaders_path)
5658
${shaders_path} --output-path ${VULKAN_SHADERGEN_OUT_PATH}
5759
--glslc-path=${GLSLC_PATH}
5860
--tmp-dir-path=${VULKAN_SHADERGEN_OUT_PATH}/shader_cache/ --env
59-
${VULKAN_GEN_ARG_ENV}
61+
${VULKAN_GEN_ARG_ENV} --optimize
6062
DEPENDS ${shaders_path}/*
6163
${EXECUTORCH_ROOT}/backends/vulkan/runtime/gen_vulkan_spv.py
6264
)

backends/vulkan/test/CMakeLists.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
cmake_minimum_required(VERSION 3.19)
1818
project(executorch)
1919

20+
if(ANDROID)
21+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
22+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
23+
endif()
24+
2025
find_package(executorch CONFIG REQUIRED COMPONENTS vulkan_backend)
2126
find_package(GTest CONFIG REQUIRED)
2227

2328
# Only build tests if Vulkan was compiled
24-
find_library(LIB_VULKAN_BACKEND vulkan_backend)
25-
26-
if(LIB_VULKAN_BACKEND)
27-
29+
if(TARGET vulkan_backend)
2830
if(NOT EXECUTORCH_ROOT)
2931
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
3032
endif()

backends/vulkan/test/op_tests/CMakeLists.txt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
cmake_minimum_required(VERSION 3.19)
1818
project(executorch)
1919

20+
if(ANDROID)
21+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
22+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
23+
endif()
24+
2025
find_package(executorch CONFIG REQUIRED COMPONENTS vulkan_backend)
2126
find_package(GTest CONFIG REQUIRED)
2227

@@ -31,16 +36,14 @@ endif()
3136
include(${EXECUTORCH_ROOT}/tools/cmake/Utils.cmake)
3237

3338
get_torch_base_path(TORCH_BASE_PATH)
34-
message(STATUS "torch base path: ${TORCH_BASE_PATH}")
35-
36-
# Only build tests if Vulkan was compiled
37-
find_library(LIB_VULKAN_BACKEND vulkan_backend)
38-
find_library(LIB_TORCH torch ${TORCH_BASE_PATH}/lib)
39-
find_library(LIB_TORCH_CPU torch_cpu ${TORCH_BASE_PATH}/lib)
40-
find_library(LIB_C10 c10 ${TORCH_BASE_PATH}/lib)
39+
if(NOT TORCH_INSTALL_PREFIX)
40+
set(TORCH_INSTALL_PREFIX ${TORCH_BASE_PATH})
41+
endif()
4142

42-
message(STATUS "Vulkan backend lib ${LIB_VULKAN_BACKEND}")
43-
message(STATUS "Torch ${LIB_TORCH}")
43+
# libtorch is needed for Vulkan correctness tests
44+
find_library(LIB_TORCH torch HINTS ${TORCH_INSTALL_PREFIX}/lib)
45+
find_library(LIB_TORCH_CPU torch_cpu HINTS ${TORCH_INSTALL_PREFIX}/lib)
46+
find_library(LIB_C10 c10 HINTS ${TORCH_INSTALL_PREFIX}/lib)
4447

4548
if(NOT PYTHON_EXECUTABLE)
4649
set(PYTHON_EXECUTABLE python3)
@@ -88,7 +91,7 @@ function(vulkan_op_test test_name test_src)
8891
add_test(${test_name} ${test_name})
8992
endfunction()
9093

91-
if(LIB_VULKAN_BACKEND AND LIB_TORCH)
94+
if(TARGET vulkan_backend AND LIB_TORCH)
9295
find_library(
9396
CUSTOM_OPS_LIB custom_ops_aot_lib
9497
HINTS ${CMAKE_INSTALL_PREFIX}/executorch/extension/llm/custom_ops

0 commit comments

Comments
 (0)