Skip to content

Commit

Permalink
Enable Vulkan tests in CI (pytorch#3737)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: pytorch#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
  • Loading branch information
SS-JIA authored and facebook-github-bot committed May 30, 2024
1 parent 62cdfb9 commit ff4e9ed
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 58 deletions.
48 changes: 48 additions & 0 deletions .ci/scripts/setup-vulkan-linux-deps.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@

#!/bin/bash
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.

set -ex

install_swiftshader() {
_https_amazon_aws=https://ossci-android.s3.amazonaws.com
_swiftshader_archive=swiftshader-abe07b943-prebuilt.tar.gz
_swiftshader_dir=/tmp/swiftshader
mkdir -p $_swiftshader_dir

_tmp_archive="/tmp/${_swiftshader_archive}"

curl --silent --show-error --location --fail --retry 3 \
--output "${_tmp_archive}" "$_https_amazon_aws/${_swiftshader_archive}"

tar -C "${_swiftshader_dir}" -xzf "${_tmp_archive}"

export VK_ICD_FILENAMES="${_swiftshader_dir}/swiftshader/build/Linux/vk_swiftshader_icd.json"
export LD_LIBRARY_PATH="${_swiftshader_dir}/swiftshader/build/Linux/"
}

install_vulkan_sdk() {
VULKAN_SDK_VERSION=$1
_vulkan_sdk_url="https://sdk.lunarg.com/sdk/download/${VULKAN_SDK_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_SDK_VERSION}.tar.gz"

_vulkan_sdk_dir=/tmp/vulkansdk
mkdir -p $_vulkan_sdk_dir

_tmp_archive="/tmp/vulkansdk.tar.gz"

curl --silent --show-error --location --fail --retry 3 \
--output "${_tmp_archive}" "${_vulkan_sdk_url}"

tar -C "${_vulkan_sdk_dir}" -xzf "${_tmp_archive}"

export PATH="${PATH}:${_vulkan_sdk_dir}/${VULKAN_SDK_VERSION}/x86_64/bin/"
}

VULKAN_SDK_VERSION="1.2.198.1"

install_swiftshader
install_vulkan_sdk "${VULKAN_SDK_VERSION}"
3 changes: 3 additions & 0 deletions .github/workflows/_unittest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ jobs:
CONDA_ENV=$(conda env list --json | jq -r ".envs | .[-1]")
conda activate "${CONDA_ENV}"
# Setup swiftshader and Vulkan SDK which are required to build the Vulkan delegate
source .ci/scripts/setup-vulkan-linux-deps.sh
# Setup MacOS dependencies as there is no Docker support on MacOS atm
PYTHON_EXECUTABLE=python \
EXECUTORCH_BUILD_PYBIND=ON \
Expand Down
10 changes: 6 additions & 4 deletions backends/vulkan/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,17 @@ include(cmake/ShaderLibrary.cmake)

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

set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers)
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)

set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
${VMA_PATH}
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH}/include
${VOLK_PATH} ${VMA_PATH}
)

# Compile settings

set(VULKAN_CXX_FLAGS "")
set(VULKAN_CXX_FLAGS "-fexceptions")
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_WRAPPER")
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_VOLK")

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

set_property(TARGET vulkan_backend PROPERTY CXX_STANDARD 17)

# Executor Runner

if(NOT CMAKE_TOOLCHAIN_FILE MATCHES ".*(iOS|ios\.toolchain)\.cmake$")
Expand Down
6 changes: 1 addition & 5 deletions backends/vulkan/cmake/ShaderLibrary.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,7 @@ if(ANDROID)
"${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc"
)
else()
find_program(
GLSLC_PATH glslc
PATHS ENV VULKAN_SDK "$ENV{VULKAN_SDK}/${CMAKE_HOST_SYSTEM_PROCESSOR}/bin"
"$ENV{VULKAN_SDK}/bin"
)
find_program(GLSLC_PATH glslc PATHS $ENV{PATH})

if(NOT GLSLC_PATH)
message(FATAL_ERROR "USE_VULKAN glslc not found")
Expand Down
13 changes: 9 additions & 4 deletions backends/vulkan/runtime/api/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
#pragma once

#include <cmath>
#include <limits>
#include <numeric>
#include <type_traits>

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

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

template <typename To, typename From>
std::enable_if_t<std::is_integral_v<From> && !std::is_same_v<From, bool>, bool>
std::enable_if_t<
std::is_integral<From>::value && !std::is_same<From, bool>::value,
bool>
overflows(From f) {
using limit = std::numeric_limits<To>;
// Casting from signed to unsigned; allow for negative numbers to wrap using
Expand All @@ -196,7 +200,7 @@ overflows(From f) {
}

template <typename To, typename From>
std::enable_if_t<std::is_floating_point_v<From>, bool> overflows(From f) {
std::enable_if_t<std::is_floating_point<From>::value, bool> overflows(From f) {
using limit = std::numeric_limits<To>;
if (limit::has_infinity && std::isinf(static_cast<double>(f))) {
return false;
Expand Down Expand Up @@ -429,7 +433,7 @@ inline ivec4 make_whcn_ivec4(const std::vector<int64_t>& arr) {
*/
template <
typename C,
std::enable_if_t<std::is_integral_v<typename C::value_type>, int> = 0>
std::enable_if_t<std::is_integral<typename C::value_type>::value, int> = 0>
inline int64_t multiply_integers(const C& container) {
return std::accumulate(
container.begin(),
Expand All @@ -445,7 +449,8 @@ inline int64_t multiply_integers(const C& container) {
template <
typename Iter,
std::enable_if_t<
std::is_integral_v<typename std::iterator_traits<Iter>::value_type>,
std::is_integral<
typename std::iterator_traits<Iter>::value_type>::value,
int> = 0>
inline int64_t multiply_integers(Iter begin, Iter end) {
// std::accumulate infers return type from `init` type, so if the `init` type
Expand Down
92 changes: 47 additions & 45 deletions backends/vulkan/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,65 +25,67 @@ find_library(LIB_VULKAN_BACKEND vulkan_backend)

if(LIB_VULKAN_BACKEND)

if(NOT EXECUTORCH_ROOT)
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
endif()
if(NOT EXECUTORCH_ROOT)
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
endif()

if(NOT PYTHON_EXECUTABLE)
set(PYTHON_EXECUTABLE python3)
endif()
if(NOT PYTHON_EXECUTABLE)
set(PYTHON_EXECUTABLE python3)
endif()

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

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

include(../cmake/ShaderLibrary.cmake)
# Third party include paths

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

set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../third-party)
set(GTEST_INCLUDE_PATH
${EXECUTORCH_ROOT}/third-party/googletest/googletest/include set
(PYTORCH_PATH ${EXECUTORCH_ROOT}/third-party/pytorch)
)
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)

set(GTEST_INCLUDE_PATH
${EXECUTORCH_ROOT}/third-party/googletest/googletest/include set
(PYTORCH_PATH ${EXECUTORCH_ROOT}/third-party/pytorch)
)
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers/include)
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
${VMA_PATH} ${GTEST_INCLUDE_PATH} ${PYTORCH_PATH}
)

set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH} ${VOLK_PATH}
${VMA_PATH} ${GTEST_INCLUDE_PATH} ${PYTORCH_PATH}
)
# Test Utility files

# Test Utility files
set(TEST_UTILS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/utils)
file(GLOB TEST_UTILS_CPP ${CMAKE_CURRENT_SOURCE_DIR}/utils/*.cpp)

set(TEST_UTILS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/utils)
file(GLOB TEST_UTILS_CPP ${CMAKE_CURRENT_SOURCE_DIR}/utils/*.cpp)
# Test shaders

# Test shaders
set(TEST_SHADERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/glsl)
gen_vulkan_shader_lib_cpp(${TEST_SHADERS_PATH})
vulkan_shader_lib(test_shaderlib ${generated_spv_cpp})

set(TEST_SHADERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/glsl)
gen_vulkan_shader_lib_cpp(${TEST_SHADERS_PATH})
vulkan_shader_lib(test_shaderlib ${generated_spv_cpp})
# API Test binary

# API Test binary
set(COMPUTE_API_TEST_CPP
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_compute_api_test.cpp
)

set(COMPUTE_API_TEST_CPP
${CMAKE_CURRENT_SOURCE_DIR}/vulkan_compute_api_test.cpp
)
target_link_options_shared_lib(vulkan_backend)

target_link_options_shared_lib(vulkan_backend)
add_executable(
vulkan_compute_api_test ${COMPUTE_API_TEST_CPP} ${TEST_UTILS_CPP}
)
target_include_directories(vulkan_compute_api_test PRIVATE ${COMMON_INCLUDES})
target_link_libraries(
vulkan_compute_api_test PRIVATE GTest::gtest_main vulkan_backend executorch
test_shaderlib
)
target_compile_options(vulkan_compute_api_test PRIVATE ${VULKAN_CXX_FLAGS})

add_executable(
vulkan_compute_api_test ${COMPUTE_API_TEST_CPP} ${TEST_UTILS_CPP}
)
target_include_directories(vulkan_compute_api_test PRIVATE ${COMMON_INCLUDES})
target_link_libraries(
vulkan_compute_api_test PRIVATE GTest::gtest_main vulkan_backend executorch
test_shaderlib
)
target_compile_options(vulkan_compute_api_test PRIVATE ${VULKAN_CXX_FLAGS})
set_property(TARGET vulkan_compute_api_test PROPERTY CXX_STANDARD 17)

endif()
5 changes: 5 additions & 0 deletions test/run_oss_cpp_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,16 @@ elif [[ $(uname) == "Linux" ]]; then
fi

build_executorch() {
BUILD_VULKAN="OFF"
if [ -x "$(command -v glslc)" ]; then
BUILD_VULKAN="ON"
fi
cmake . \
-DCMAKE_INSTALL_PREFIX=cmake-out \
-DEXECUTORCH_USE_CPP_CODE_COVERAGE=ON \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
-DEXECUTORCH_BUILD_VULKAN=$BUILD_VULKAN \
-Bcmake-out
cmake --build cmake-out -j9 --target install
}
Expand Down

0 comments on commit ff4e9ed

Please sign in to comment.