Skip to content

Commit 1647cd0

Browse files
SS-JIAfacebook-github-bot
authored andcommitted
Fix OSS build for Vulkan Delegate (#2434)
Summary: Pull Request resolved: #2434 ## Context Recent changes to the Vulkan backend and PyTorch Vulkan API requires that the CMake build for the Vulkan delegate be reworked. This PR updates the CMake rules for the Vulkan delegate and makes sure that the Vulkan delegate can build correctly. imported-using-ghimport Test Plan: Imported from OSS Reviewed By: kirklandsign Differential Revision: D54914149 Pulled By: SS-JIA fbshipit-source-id: d613b40416dc31e638a1020c68ec81de3d3c2d15
1 parent a5faf03 commit 1647cd0

File tree

8 files changed

+135
-76
lines changed

8 files changed

+135
-76
lines changed

backends/vulkan/CMakeLists.txt

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#
99
# This file should be formatted with
1010
# ~~~
11-
# cmake-format --first-comment-is-literal=True CMakeLists.txt
11+
# cmake-format --first-comment-is-literal=True -i CMakeLists.txt
1212
# ~~~
1313
# It should also be cmake-lint clean.
1414
#
@@ -32,7 +32,10 @@ if(NOT FLATC_EXECUTABLE)
3232
set(FLATC_EXECUTABLE flatc)
3333
endif()
3434

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

3841
# ATen Vulkan Libs
@@ -48,12 +51,19 @@ set(COMMON_INCLUDES ${VULKAN_API_HEADERS} ${EXECUTORCH_ROOT}/..)
4851
file(GLOB_RECURSE vulkan_graph_cpp ${RUNTIME_PATH}/graph/*)
4952

5053
add_library(vulkan_graph_lib STATIC ${vulkan_graph_cpp})
51-
5254
target_include_directories(vulkan_graph_lib PRIVATE ${COMMON_INCLUDES})
55+
target_link_libraries(${LIBRARY_NAME} vulkan_api_lib)
56+
target_compile_options(vulkan_graph_lib PRIVATE ${VULKAN_CXX_FLAGS})
57+
# Link this library with --whole-archive due to dynamic operator registrations
58+
target_link_options_shared_lib(vulkan_graph_lib)
5359

54-
target_link_libraries(vulkan_graph_lib vulkan_shader_lib)
60+
# Due to dynamic registrations, these libraries must be explicitly linked
61+
set(VULKAN_STANDARD_OPS_LIBS vulkan_graph_lib vulkan_graph_shaderlib)
5562

56-
target_compile_options(vulkan_graph_lib PRIVATE ${VULKAN_CXX_FLAGS})
63+
# vulkan_graph_shaderlib
64+
65+
set(VULKAN_GRAPH_SHADERS_PATH ${RUNTIME_PATH}/graph/ops/glsl/)
66+
vulkan_shader_library(${VULKAN_GRAPH_SHADERS_PATH} vulkan_graph_shaderlib)
5767

5868
# Generate Files from flatc
5969

@@ -85,48 +95,51 @@ target_include_directories(
8595
file(GLOB vulkan_backend_cpp ${RUNTIME_PATH}/*.cpp)
8696

8797
add_library(vulkan_backend ${vulkan_backend_cpp})
88-
89-
target_include_directories(vulkan_backend PRIVATE ${SCHEMA_INCLUDE_DIR})
90-
target_include_directories(vulkan_backend PRIVATE ${COMMON_INCLUDES})
91-
92-
target_link_libraries(vulkan_backend PRIVATE vulkan_graph_lib)
93-
target_link_libraries(vulkan_backend PRIVATE vulkan_schema)
94-
target_link_libraries(vulkan_backend PRIVATE executorch)
95-
98+
target_include_directories(vulkan_backend PRIVATE ${SCHEMA_INCLUDE_DIR}
99+
${COMMON_INCLUDES})
100+
target_link_libraries(vulkan_backend PRIVATE vulkan_graph_lib vulkan_schema
101+
executorch)
96102
target_compile_options(vulkan_backend PRIVATE ${VULKAN_CXX_FLAGS})
97-
98-
# This is required to ensure that vulkan_backend gets linked with
99-
# --whole-archive since backends are registered via static variables that would
100-
# otherwise be discarded
103+
# Link this library with --whole-archive due to dynamic backend registration
101104
target_link_options_shared_lib(vulkan_backend)
102105

103106
# Executor Runner
104107

105108
if(NOT CMAKE_TOOLCHAIN_FILE MATCHES ".*iOS\.cmake$")
106109
set(VULKAN_RUNNER_SRCS ${_executor_runner__srcs})
107110
list(TRANSFORM VULKAN_RUNNER_SRCS PREPEND "${EXECUTORCH_ROOT}/")
111+
108112
add_executable(vulkan_executor_runner ${VULKAN_RUNNER_SRCS})
109-
target_link_libraries(vulkan_executor_runner ${_executor_runner_libs})
110-
target_link_libraries(vulkan_executor_runner vulkan_schema)
111-
target_link_libraries(vulkan_executor_runner vulkan_backend)
113+
target_link_libraries(
114+
vulkan_executor_runner ${_executor_runner_libs} vulkan_schema
115+
vulkan_backend ${VULKAN_STANDARD_OPS_LIBS})
112116
target_compile_options(vulkan_executor_runner PUBLIC ${VULKAN_CXX_FLAGS})
113117

114118
add_library(vulkan_executor_runner_lib STATIC ${VULKAN_RUNNER_SRCS})
115-
target_link_libraries(vulkan_executor_runner_lib ${_executor_runner_libs})
116-
target_link_libraries(vulkan_executor_runner_lib vulkan_schema)
117-
target_link_libraries(vulkan_executor_runner_lib vulkan_backend)
119+
target_link_libraries(vulkan_executor_runner_lib ${_executor_runner_libs}
120+
vulkan_schema vulkan_backend)
118121
target_compile_options(vulkan_executor_runner_lib PUBLIC ${VULKAN_CXX_FLAGS})
119122
endif()
120123

121124
# Test targets
122125

123126
if(EXECUTORCH_BUILD_GTESTS)
127+
set(TEST_UTILS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/test/utils)
128+
file(GLOB TEST_UTILS_CPP ${CMAKE_CURRENT_SOURCE_DIR}/test/utils/*.cpp)
129+
130+
set(TEST_SHADERS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/test/glsl)
131+
vulkan_shader_library(${TEST_SHADERS_PATH} test_shaderlib)
132+
124133
# vulkan_compute_api_test
125-
set(TEST_CPP ${CMAKE_CURRENT_SOURCE_DIR}/test/vulkan_compute_api_test.cpp)
126-
add_executable(vulkan_compute_api_test ${TEST_CPP})
127-
target_include_directories(vulkan_compute_api_test PRIVATE ${COMMON_INCLUDES})
128-
target_link_libraries(vulkan_compute_api_test vulkan_api_lib)
129-
target_link_libraries(vulkan_compute_api_test vulkan_graph_lib)
130-
target_link_libraries(vulkan_compute_api_test gtest_main)
134+
set(COMPUTE_API_TEST_CPP
135+
${CMAKE_CURRENT_SOURCE_DIR}/test/vulkan_compute_api_test.cpp)
136+
137+
add_executable(vulkan_compute_api_test ${COMPUTE_API_TEST_CPP}
138+
${TEST_UTILS_CPP})
139+
target_include_directories(vulkan_compute_api_test
140+
PRIVATE ${COMMON_INCLUDES} ${TEST_UTILS_HEADERS})
141+
target_link_libraries(
142+
vulkan_compute_api_test PRIVATE gtest_main ${VULKAN_STANDARD_OPS_LIBS}
143+
test_shaderlib)
131144
target_compile_options(vulkan_compute_api_test PRIVATE ${VULKAN_CXX_FLAGS})
132145
endif()

backends/vulkan/cmake/ATenVulkan.cmake

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#
99
# This file should be formatted with
1010
# ~~~
11-
# cmake-format --first-comment-is-literal=True CMakeLists.txt
11+
# cmake-format --first-comment-is-literal=True -i ATenVulkan.cmake
1212
# ~~~
1313
# It should also be cmake-lint clean.
1414
#
@@ -22,20 +22,6 @@ if(NOT VULKAN_THIRD_PARTY_PATH)
2222
set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../third-party)
2323
endif()
2424

25-
# Shader Codegen
26-
27-
# Trigger Shader code generation
28-
set(USE_VULKAN ON)
29-
set(VULKAN_CODEGEN_CMAKE_PATH ${PYTORCH_PATH}/cmake/VulkanCodegen.cmake)
30-
if(NOT EXISTS ${VULKAN_CODEGEN_CMAKE_PATH})
31-
message(
32-
FATAL_ERROR
33-
"Cannot perform SPIR-V codegen because " ${VULKAN_CODEGEN_CMAKE_PATH}
34-
" does not exist. Please make sure that submodules are initialized"
35-
" and updated.")
36-
endif()
37-
include(${PYTORCH_PATH}/cmake/VulkanCodegen.cmake)
38-
3925
# Source paths and compile settings
4026

4127
set(ATEN_PATH ${PYTORCH_PATH}/aten/src)
@@ -65,19 +51,56 @@ list(APPEND VULKAN_API_HEADERS ${VOLK_PATH})
6551
list(APPEND VULKAN_API_HEADERS ${VMA_PATH})
6652

6753
target_include_directories(vulkan_api_lib PRIVATE ${VULKAN_API_HEADERS})
68-
6954
target_compile_options(vulkan_api_lib PRIVATE ${VULKAN_CXX_FLAGS})
7055

71-
# vulkan_shader_lib
56+
# Find GLSL compiler executable
57+
58+
if(ANDROID)
59+
if(NOT ANDROID_NDK)
60+
message(FATAL_ERROR "ANDROID_NDK not set")
61+
endif()
62+
63+
set(GLSLC_PATH
64+
"${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc")
65+
else()
66+
find_program(
67+
GLSLC_PATH glslc
68+
PATHS ENV VULKAN_SDK
69+
PATHS "$ENV{VULKAN_SDK}/${CMAKE_HOST_SYSTEM_PROCESSOR}/bin"
70+
PATHS "$ENV{VULKAN_SDK}/bin")
71+
72+
if(NOT GLSLC_PATH)
73+
message(FATAL_ERROR "USE_VULKAN glslc not found")
74+
endif()
75+
endif()
76+
77+
# Required to enable linking with --whole-archive
78+
include(${EXECUTORCH_ROOT}/build/Utils.cmake)
7279

73-
file(GLOB VULKAN_IMPL_CPP ${ATEN_VULKAN_PATH}/impl/*.cpp)
80+
# Convenience macro to create a shader library
7481

75-
add_library(vulkan_shader_lib STATIC ${VULKAN_IMPL_CPP} ${vulkan_generated_cpp})
82+
macro(vulkan_shader_library SHADERS_PATH LIBRARY_NAME)
83+
set(VULKAN_SHADERGEN_ENV "")
84+
set(VULKAN_SHADERGEN_OUT_PATH ${CMAKE_BINARY_DIR}/${LIBRARY_NAME})
7685

77-
list(APPEND VULKAN_API_HEADERS ${CMAKE_BINARY_DIR}/vulkan)
86+
execute_process(
87+
COMMAND
88+
"${PYTHON_EXECUTABLE}" ${PYTORCH_PATH}/tools/gen_vulkan_spv.py --glsl-path
89+
${SHADERS_PATH} --output-path ${VULKAN_SHADERGEN_OUT_PATH}
90+
--glslc-path=${GLSLC_PATH} --tmp-dir-path=${VULKAN_SHADERGEN_OUT_PATH}
91+
--env ${VULKAN_GEN_ARG_ENV}
92+
RESULT_VARIABLE error_code)
93+
set(ENV{PYTHONPATH} ${PYTHONPATH})
7894

79-
target_include_directories(vulkan_shader_lib PRIVATE ${VULKAN_API_HEADERS})
95+
set(vulkan_generated_cpp ${VULKAN_SHADERGEN_OUT_PATH}/spv.cpp)
8096

81-
target_link_libraries(vulkan_shader_lib vulkan_api_lib)
97+
add_library(${LIBRARY_NAME} STATIC ${vulkan_generated_cpp})
98+
target_include_directories(${LIBRARY_NAME} PRIVATE ${COMMON_INCLUDES})
99+
target_link_libraries(${LIBRARY_NAME} vulkan_api_lib)
100+
target_compile_options(${LIBRARY_NAME} PRIVATE ${VULKAN_CXX_FLAGS})
101+
# Link this library with --whole-archive due to dynamic shader registrations
102+
target_link_options_shared_lib(${LIBRARY_NAME})
82103

83-
target_compile_options(vulkan_shader_lib PRIVATE ${VULKAN_CXX_FLAGS})
104+
unset(VULKAN_SHADERGEN_ENV)
105+
unset(VULKAN_SHADERGEN_OUT_PATH)
106+
endmacro()

backends/vulkan/test/glsl/all_shaders.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
binary_op_nobroadcast__test:
22
parameter_names_with_default_values:
3+
DTYPE: float
34
OPERATOR: X + Y
5+
generate_variant_forall:
6+
DTYPE:
7+
- VALUE: "half"
8+
SUFFIX: "half"
9+
- VALUE: "float"
10+
SUFFIX: "float"
411
shader_variants:
512
- NAME: binary_add_nobroadcast__test
613
OPERATOR: X + Y
@@ -13,6 +20,19 @@ binary_op_nobroadcast__test:
1320
- NAME: binary_pow_nobroadcast__test
1421
OPERATOR: pow(X, Y)
1522

23+
fill_texture__test:
24+
parameter_names_with_default_values:
25+
DTYPE: float
26+
NDIM: 3
27+
generate_variant_forall:
28+
DTYPE:
29+
- VALUE: "half"
30+
SUFFIX: "half"
31+
- VALUE: "float"
32+
SUFFIX: "float"
33+
shader_variants:
34+
- NAME: fill_texture__test
35+
1636
image_to_nchw__test:
1737
parameter_names_with_default_values:
1838
NDIM: 3

backends/vulkan/test/glsl/binary_op_nobroadcast__test.glsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@
99
#version 450 core
1010
// clang-format off
1111
#define PRECISION ${PRECISION}
12-
#define FORMAT ${FORMAT}
1312

1413
#define OP(X, Y) ${OPERATOR}
1514
// clang-format on
1615

1716
layout(std430) buffer;
1817

1918
// clang-format off
20-
layout(set = 0, binding = 0, FORMAT) uniform PRECISION restrict writeonly image3D image_out;
19+
layout(set = 0, binding = 0, ${IMAGE_FORMAT[DTYPE]}) uniform PRECISION restrict writeonly image3D image_out;
2120
// clang-format on
2221
layout(set = 0, binding = 1) uniform PRECISION sampler3D image_in;
2322
layout(set = 0, binding = 2) uniform PRECISION sampler3D image_other;

backends/vulkan/test/glsl/fill_texture__test.glsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88

99
#version 450 core
1010
#define PRECISION ${PRECISION}
11-
#define FORMAT ${FORMAT}
1211

1312
layout(std430) buffer;
1413

1514
/* Qualifiers: layout - storage - precision - memory */
1615

1716
// clang-format off
18-
layout(set = 0, binding = 0, FORMAT) uniform PRECISION restrict writeonly image3D uOutput;
17+
layout(set = 0, binding = 0, ${IMAGE_FORMAT[DTYPE]}) uniform PRECISION restrict writeonly ${IMAGE_T[NDIM][DTYPE]} uOutput;
1918
// clang-format on
2019
layout(set = 0, binding = 1) uniform PRECISION restrict Block {
2120
ivec3 size;

backends/vulkan/test/utils/test_utils.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,19 @@ void record_image_to_nchw_op(
115115
v_src.cpu_sizes_ubo()->buffer());
116116
}
117117

118-
void record_arithmetic_op(
118+
void record_binary_op(
119119
api::Context* const context,
120-
const api::ShaderInfo& compute_shader,
120+
const std::string& op_name,
121121
vTensor& v_in1,
122122
vTensor& v_in2,
123123
vTensor& v_dst) {
124+
std::stringstream kernel_name;
125+
kernel_name << "binary_" << op_name << "_nobroadcast__test";
126+
apply_dtype_suffix(kernel_name, v_dst);
127+
124128
api::PipelineBarrier pipeline_barrier{};
125129
context->submit_compute_job(
126-
compute_shader,
130+
VK_KERNEL_FROM_STR(kernel_name.str()),
127131
pipeline_barrier,
128132
v_dst.virtual_extents(),
129133
adaptive_work_group_size(v_dst.virtual_extents()),
@@ -144,14 +148,17 @@ void execute_and_check_add(
144148
float a_val,
145149
float b_val) {
146150
// Add shader kernel
147-
api::ShaderInfo kernel = VK_KERNEL(binary_add_nobroadcast__test);
151+
api::ShaderInfo kernel = VK_KERNEL(binary_add_nobroadcast__test_half);
152+
if (c.image().format() == VK_FORMAT_R32G32B32A32_SFLOAT) {
153+
kernel = VK_KERNEL(nchw_to_image3d__test_C_packed_float);
154+
}
148155

149156
// Fill input tensors
150157
fill_vtensor(a, a_val);
151158
fill_vtensor(b, b_val);
152159

153160
// a + b = c
154-
record_arithmetic_op(api::context(), kernel, a, b, c);
161+
record_binary_op(api::context(), "add", a, b, c);
155162

156163
// Extract output tensor
157164
std::vector<float> data_out = extract_vtensor(c);

backends/vulkan/test/utils/test_utils.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include <ATen/native/vulkan/api/api.h>
1414

15+
#include <executorch/backends/vulkan/runtime/graph/ops/utils/ShaderNameUtils.h>
1516
#include <executorch/backends/vulkan/runtime/graph/ops/utils/StagingUtils.h>
1617

1718
using namespace at::native::vulkan;
@@ -70,9 +71,9 @@ void record_image_to_nchw_op(
7071
vTensor& v_src,
7172
api::VulkanBuffer& dst_buffer);
7273

73-
void record_arithmetic_op(
74+
void record_binary_op(
7475
api::Context* const context,
75-
const api::ShaderInfo& compute_shader,
76+
const std::string& op_name,
7677
vTensor& v_in1,
7778
vTensor& v_in2,
7879
vTensor& v_dst);

0 commit comments

Comments
 (0)