Skip to content

Commit ff4e9ed

Browse files
SS-JIAfacebook-github-bot
authored andcommitted
Enable Vulkan tests in CI (#3737)
Summary: Pull Request resolved: #3737 ## Context As title; enables Vulkan delegate to build and test during the unit test workflow. imported-using-ghimport Test Plan: Imported from OSS Reviewed By: kirklandsign Differential Revision: D57968974 Pulled By: SS-JIA fbshipit-source-id: e63eb8b358bc11ae34de98b85ae83cec3a637705
1 parent 62cdfb9 commit ff4e9ed

File tree

7 files changed

+119
-58
lines changed

7 files changed

+119
-58
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
#!/bin/bash
3+
# Copyright (c) Meta Platforms, Inc. and affiliates.
4+
# All rights reserved.
5+
#
6+
# This source code is licensed under the BSD-style license found in the
7+
# LICENSE file in the root directory of this source tree.
8+
9+
set -ex
10+
11+
install_swiftshader() {
12+
_https_amazon_aws=https://ossci-android.s3.amazonaws.com
13+
_swiftshader_archive=swiftshader-abe07b943-prebuilt.tar.gz
14+
_swiftshader_dir=/tmp/swiftshader
15+
mkdir -p $_swiftshader_dir
16+
17+
_tmp_archive="/tmp/${_swiftshader_archive}"
18+
19+
curl --silent --show-error --location --fail --retry 3 \
20+
--output "${_tmp_archive}" "$_https_amazon_aws/${_swiftshader_archive}"
21+
22+
tar -C "${_swiftshader_dir}" -xzf "${_tmp_archive}"
23+
24+
export VK_ICD_FILENAMES="${_swiftshader_dir}/swiftshader/build/Linux/vk_swiftshader_icd.json"
25+
export LD_LIBRARY_PATH="${_swiftshader_dir}/swiftshader/build/Linux/"
26+
}
27+
28+
install_vulkan_sdk() {
29+
VULKAN_SDK_VERSION=$1
30+
_vulkan_sdk_url="https://sdk.lunarg.com/sdk/download/${VULKAN_SDK_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_SDK_VERSION}.tar.gz"
31+
32+
_vulkan_sdk_dir=/tmp/vulkansdk
33+
mkdir -p $_vulkan_sdk_dir
34+
35+
_tmp_archive="/tmp/vulkansdk.tar.gz"
36+
37+
curl --silent --show-error --location --fail --retry 3 \
38+
--output "${_tmp_archive}" "${_vulkan_sdk_url}"
39+
40+
tar -C "${_vulkan_sdk_dir}" -xzf "${_tmp_archive}"
41+
42+
export PATH="${PATH}:${_vulkan_sdk_dir}/${VULKAN_SDK_VERSION}/x86_64/bin/"
43+
}
44+
45+
VULKAN_SDK_VERSION="1.2.198.1"
46+
47+
install_swiftshader
48+
install_vulkan_sdk "${VULKAN_SDK_VERSION}"

.github/workflows/_unittest.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ jobs:
2828
CONDA_ENV=$(conda env list --json | jq -r ".envs | .[-1]")
2929
conda activate "${CONDA_ENV}"
3030
31+
# Setup swiftshader and Vulkan SDK which are required to build the Vulkan delegate
32+
source .ci/scripts/setup-vulkan-linux-deps.sh
33+
3134
# Setup MacOS dependencies as there is no Docker support on MacOS atm
3235
PYTHON_EXECUTABLE=python \
3336
EXECUTORCH_BUILD_PYBIND=ON \

backends/vulkan/CMakeLists.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,17 @@ include(cmake/ShaderLibrary.cmake)
4444

4545
set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/third-party)
4646

47-
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
47+
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers)
4848
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
4949
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)
5050

51-
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
52-
${VMA_PATH}
51+
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH}/include
52+
${VOLK_PATH} ${VMA_PATH}
5353
)
5454

5555
# Compile settings
5656

57-
set(VULKAN_CXX_FLAGS "")
57+
set(VULKAN_CXX_FLAGS "-fexceptions")
5858
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_WRAPPER")
5959
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_VOLK")
6060

@@ -119,6 +119,8 @@ target_compile_options(vulkan_backend PRIVATE ${VULKAN_CXX_FLAGS})
119119
# Link this library with --whole-archive due to dynamic backend registration
120120
target_link_options_shared_lib(vulkan_backend)
121121

122+
set_property(TARGET vulkan_backend PROPERTY CXX_STANDARD 17)
123+
122124
# Executor Runner
123125

124126
if(NOT CMAKE_TOOLCHAIN_FILE MATCHES ".*(iOS|ios\.toolchain)\.cmake$")

backends/vulkan/cmake/ShaderLibrary.cmake

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,7 @@ if(ANDROID)
3333
"${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc"
3434
)
3535
else()
36-
find_program(
37-
GLSLC_PATH glslc
38-
PATHS ENV VULKAN_SDK "$ENV{VULKAN_SDK}/${CMAKE_HOST_SYSTEM_PROCESSOR}/bin"
39-
"$ENV{VULKAN_SDK}/bin"
40-
)
36+
find_program(GLSLC_PATH glslc PATHS $ENV{PATH})
4137

4238
if(NOT GLSLC_PATH)
4339
message(FATAL_ERROR "USE_VULKAN glslc not found")

backends/vulkan/runtime/api/Utils.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
#pragma once
1010

1111
#include <cmath>
12+
#include <limits>
1213
#include <numeric>
14+
#include <type_traits>
1315

1416
#include <executorch/backends/vulkan/runtime/api/vk_api.h>
1517

@@ -180,7 +182,9 @@ inline constexpr bool greater_than_max(const T& x) {
180182
#endif
181183

182184
template <typename To, typename From>
183-
std::enable_if_t<std::is_integral_v<From> && !std::is_same_v<From, bool>, bool>
185+
std::enable_if_t<
186+
std::is_integral<From>::value && !std::is_same<From, bool>::value,
187+
bool>
184188
overflows(From f) {
185189
using limit = std::numeric_limits<To>;
186190
// Casting from signed to unsigned; allow for negative numbers to wrap using
@@ -196,7 +200,7 @@ overflows(From f) {
196200
}
197201

198202
template <typename To, typename From>
199-
std::enable_if_t<std::is_floating_point_v<From>, bool> overflows(From f) {
203+
std::enable_if_t<std::is_floating_point<From>::value, bool> overflows(From f) {
200204
using limit = std::numeric_limits<To>;
201205
if (limit::has_infinity && std::isinf(static_cast<double>(f))) {
202206
return false;
@@ -429,7 +433,7 @@ inline ivec4 make_whcn_ivec4(const std::vector<int64_t>& arr) {
429433
*/
430434
template <
431435
typename C,
432-
std::enable_if_t<std::is_integral_v<typename C::value_type>, int> = 0>
436+
std::enable_if_t<std::is_integral<typename C::value_type>::value, int> = 0>
433437
inline int64_t multiply_integers(const C& container) {
434438
return std::accumulate(
435439
container.begin(),
@@ -445,7 +449,8 @@ inline int64_t multiply_integers(const C& container) {
445449
template <
446450
typename Iter,
447451
std::enable_if_t<
448-
std::is_integral_v<typename std::iterator_traits<Iter>::value_type>,
452+
std::is_integral<
453+
typename std::iterator_traits<Iter>::value_type>::value,
449454
int> = 0>
450455
inline int64_t multiply_integers(Iter begin, Iter end) {
451456
// std::accumulate infers return type from `init` type, so if the `init` type

backends/vulkan/test/CMakeLists.txt

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,65 +25,67 @@ find_library(LIB_VULKAN_BACKEND vulkan_backend)
2525

2626
if(LIB_VULKAN_BACKEND)
2727

28-
if(NOT EXECUTORCH_ROOT)
29-
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
30-
endif()
28+
if(NOT EXECUTORCH_ROOT)
29+
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
30+
endif()
3131

32-
if(NOT PYTHON_EXECUTABLE)
33-
set(PYTHON_EXECUTABLE python3)
34-
endif()
32+
if(NOT PYTHON_EXECUTABLE)
33+
set(PYTHON_EXECUTABLE python3)
34+
endif()
35+
36+
# Include this file to access target_link_options_shared_lib This is required
37+
# to provide access to target_link_options_shared_lib which allows libraries
38+
# to be linked with the --whole-archive flag. This is required for libraries
39+
# that perform dynamic registration via static initialization.
40+
include(${EXECUTORCH_ROOT}/build/Utils.cmake)
3541

36-
# Include this file to access target_link_options_shared_lib This is required to
37-
# provide access to target_link_options_shared_lib which allows libraries to be
38-
# linked with the --whole-archive flag. This is required for libraries that
39-
# perform dynamic registration via static initialization.
40-
include(${EXECUTORCH_ROOT}/build/Utils.cmake)
42+
include(../cmake/ShaderLibrary.cmake)
4143

42-
include(../cmake/ShaderLibrary.cmake)
44+
# Third party include paths
4345

44-
# Third party include paths
46+
set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../third-party)
4547

46-
set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../third-party)
48+
set(GTEST_INCLUDE_PATH
49+
${EXECUTORCH_ROOT}/third-party/googletest/googletest/include set
50+
(PYTORCH_PATH ${EXECUTORCH_ROOT}/third-party/pytorch)
51+
)
52+
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
53+
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
54+
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)
4755

48-
set(GTEST_INCLUDE_PATH
49-
${EXECUTORCH_ROOT}/third-party/googletest/googletest/include set
50-
(PYTORCH_PATH ${EXECUTORCH_ROOT}/third-party/pytorch)
51-
)
52-
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
53-
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
54-
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)
56+
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
57+
${VMA_PATH} ${GTEST_INCLUDE_PATH} ${PYTORCH_PATH}
58+
)
5559

56-
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
57-
${VMA_PATH} ${GTEST_INCLUDE_PATH} ${PYTORCH_PATH}
58-
)
60+
# Test Utility files
5961

60-
# Test Utility files
62+
set(TEST_UTILS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/utils)
63+
file(GLOB TEST_UTILS_CPP ${CMAKE_CURRENT_SOURCE_DIR}/utils/*.cpp)
6164

62-
set(TEST_UTILS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/utils)
63-
file(GLOB TEST_UTILS_CPP ${CMAKE_CURRENT_SOURCE_DIR}/utils/*.cpp)
65+
# Test shaders
6466

65-
# Test shaders
67+
set(TEST_SHADERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/glsl)
68+
gen_vulkan_shader_lib_cpp(${TEST_SHADERS_PATH})
69+
vulkan_shader_lib(test_shaderlib ${generated_spv_cpp})
6670

67-
set(TEST_SHADERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/glsl)
68-
gen_vulkan_shader_lib_cpp(${TEST_SHADERS_PATH})
69-
vulkan_shader_lib(test_shaderlib ${generated_spv_cpp})
71+
# API Test binary
7072

71-
# API Test binary
73+
set(COMPUTE_API_TEST_CPP
74+
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_compute_api_test.cpp
75+
)
7276

73-
set(COMPUTE_API_TEST_CPP
74-
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_compute_api_test.cpp
75-
)
77+
target_link_options_shared_lib(vulkan_backend)
7678

77-
target_link_options_shared_lib(vulkan_backend)
79+
add_executable(
80+
vulkan_compute_api_test ${COMPUTE_API_TEST_CPP} ${TEST_UTILS_CPP}
81+
)
82+
target_include_directories(vulkan_compute_api_test PRIVATE ${COMMON_INCLUDES})
83+
target_link_libraries(
84+
vulkan_compute_api_test PRIVATE GTest::gtest_main vulkan_backend executorch
85+
test_shaderlib
86+
)
87+
target_compile_options(vulkan_compute_api_test PRIVATE ${VULKAN_CXX_FLAGS})
7888

79-
add_executable(
80-
vulkan_compute_api_test ${COMPUTE_API_TEST_CPP} ${TEST_UTILS_CPP}
81-
)
82-
target_include_directories(vulkan_compute_api_test PRIVATE ${COMMON_INCLUDES})
83-
target_link_libraries(
84-
vulkan_compute_api_test PRIVATE GTest::gtest_main vulkan_backend executorch
85-
test_shaderlib
86-
)
87-
target_compile_options(vulkan_compute_api_test PRIVATE ${VULKAN_CXX_FLAGS})
89+
set_property(TARGET vulkan_compute_api_test PROPERTY CXX_STANDARD 17)
8890

8991
endif()

test/run_oss_cpp_tests.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,16 @@ elif [[ $(uname) == "Linux" ]]; then
2323
fi
2424

2525
build_executorch() {
26+
BUILD_VULKAN="OFF"
27+
if [ -x "$(command -v glslc)" ]; then
28+
BUILD_VULKAN="ON"
29+
fi
2630
cmake . \
2731
-DCMAKE_INSTALL_PREFIX=cmake-out \
2832
-DEXECUTORCH_USE_CPP_CODE_COVERAGE=ON \
2933
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
3034
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
35+
-DEXECUTORCH_BUILD_VULKAN=$BUILD_VULKAN \
3136
-Bcmake-out
3237
cmake --build cmake-out -j9 --target install
3338
}

0 commit comments

Comments
 (0)