Skip to content

Commit 0a6a3ee

Browse files
committed
[ET-VK] Fix OSS build for Vulkan Delegate
ghstack-source-id: ce38c0f Pull Request resolved: #2434
1 parent 9b22596 commit 0a6a3ee

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)