mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-14 20:48:00 +00:00
add 2 CMake build options of Dawn (#23096)
### Description This change adds the following CMake build options for Dawn: - onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY - OFF by default - when enabled, builds Dawn as a monolithic library (webgpu_dawn.dll) - onnxruntime_ENABLE_DAWN_BACKEND_VULKAN - OFF by default - when enabled, build with Vulkan backend for Dawn on Windows - onnxruntime_ENABLE_DAWN_BACKEND_D3D12 - ON by default - when enabled, build with DirectX 12 backend for Dawn on Windows ### File Size Comparison (Windows) | Build | cmdline | File Size | |---|---|---| | Baseline | --config Release<br/> --build_shared_lib | `12,755,456 onnxruntime.dll` | | WebGPU D3D12 (default) | --use_webgpu<br/> --config Release<br/> --build_shared_lib | `17,082,368 dxcompiler.dll`<br/>` 1,508,472 dxil.dll`<br/>`18,708,480 onnxruntime.dll` | | WebGPU D3D12+Vulkan | --use_webgpu<br/> --config Release<br/> --build_shared_lib<br/> --cmake_extra_defines<br/> onnxruntime_ENABLE_DAWN_BACKEND_D3D12=1<br/> onnxruntime_ENABLE_DAWN_BACKEND_VULKAN=1 | `17,081,344 dxcompiler.dll`<br/>` 1,508,472 dxil.dll`<br/>`19,388,416 onnxruntime.dll` | | WebGPU Vulkan | --use_webgpu<br/> --config Release<br/> --build_shared_lib<br/> --cmake_extra_defines<br/> onnxruntime_ENABLE_DAWN_BACKEND_D3D12=0<br/> onnxruntime_ENABLE_DAWN_BACKEND_VULKAN=1 | `17,615,872 onnxruntime.dll` | | Monolithic | --use_webgpu<br/> --config Release<br/> --build_shared_lib<br/> --cmake_extra_defines<br/> onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY=1 | `17,082,368 dxcompiler.dll`<br/>` 1,508,472 dxil.dll`<br/>`13,277,696 onnxruntime.dll`<br/>` 5,616,640 webgpu_dawn.dll` | | External Dawn | --use_webgpu<br/> --config Release<br/> --build_shared_lib<br/> --cmake_extra_defines<br/> onnxruntime_USE_EXTERNAL_DAWN=1<br/> --skip_tests | `17,081,344 dxcompiler.dll`<br/>` 1,508,472 dxil.dll`<br/>`13,277,184 onnxruntime.dll`
This commit is contained in:
parent
62e7e24f17
commit
3a0b958586
7 changed files with 97 additions and 14 deletions
|
|
@ -149,6 +149,10 @@ option(onnxruntime_USE_WEBNN "Build with WebNN support. Enable hardware accelera
|
|||
option(onnxruntime_USE_WEBGPU "Build with WebGPU support. Enable WebGPU via C/C++ interface." OFF)
|
||||
option(onnxruntime_USE_EXTERNAL_DAWN "Build with treating Dawn as external dependency. Will not link Dawn at build time." OFF)
|
||||
option(onnxruntime_CUSTOM_DAWN_SRC_PATH "Path to custom Dawn src dir.")
|
||||
option(onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY "Build Dawn as a monolithic library" OFF)
|
||||
# The following 2 options are only for Windows
|
||||
option(onnxruntime_ENABLE_DAWN_BACKEND_VULKAN "Enable Vulkan backend for Dawn (on Windows)" OFF)
|
||||
option(onnxruntime_ENABLE_DAWN_BACKEND_D3D12 "Enable D3D12 backend for Dawn (on Windows)" ON)
|
||||
|
||||
# Options related to reducing the binary size produced by the build
|
||||
# XNNPACK EP requires the internal NHWC contrib ops to be available, so this option must be OFF when onnxruntime_USE_XNNPACK is ON
|
||||
|
|
@ -955,9 +959,18 @@ if (onnxruntime_USE_WEBGPU)
|
|||
list(APPEND ORT_PROVIDER_FLAGS -DUSE_WEBGPU=1)
|
||||
list(APPEND ORT_PROVIDER_CMAKE_FLAGS -Donnxruntime_USE_WEBGPU=1)
|
||||
list(APPEND ONNXRUNTIME_PROVIDER_NAMES webgpu)
|
||||
if (onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY)
|
||||
list(APPEND ORT_PROVIDER_FLAGS -DBUILD_DAWN_MONOLITHIC_LIBRARY=1)
|
||||
endif()
|
||||
if (onnxruntime_USE_EXTERNAL_DAWN)
|
||||
list(APPEND ORT_PROVIDER_FLAGS -DUSE_EXTERNAL_DAWN=1)
|
||||
endif()
|
||||
if (onnxruntime_ENABLE_DAWN_BACKEND_VULKAN)
|
||||
list(APPEND ORT_PROVIDER_FLAGS -DDAWN_ENABLE_VULKAN=1)
|
||||
endif()
|
||||
if (onnxruntime_ENABLE_DAWN_BACKEND_D3D12)
|
||||
list(APPEND ORT_PROVIDER_FLAGS -DDAWN_ENABLE_D3D12=1)
|
||||
endif()
|
||||
endif()
|
||||
if (onnxruntime_USE_CANN)
|
||||
list(APPEND ORT_PROVIDER_FLAGS -DUSE_CANN=1)
|
||||
|
|
|
|||
41
cmake/external/onnxruntime_external_deps.cmake
vendored
41
cmake/external/onnxruntime_external_deps.cmake
vendored
|
|
@ -635,10 +635,19 @@ if (onnxruntime_USE_WEBGPU)
|
|||
)
|
||||
endif()
|
||||
|
||||
# use dawn::dawn_native and dawn::dawn_proc instead of the monolithic dawn::webgpu_dawn to minimize binary size
|
||||
set(DAWN_BUILD_MONOLITHIC_LIBRARY OFF CACHE BOOL "" FORCE)
|
||||
if (onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY)
|
||||
set(DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE BOOL "" FORCE)
|
||||
set(DAWN_ENABLE_INSTALL ON CACHE BOOL "" FORCE)
|
||||
|
||||
if (onnxruntime_USE_EXTERNAL_DAWN)
|
||||
message(FATAL_ERROR "onnxruntime_USE_EXTERNAL_DAWN and onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY cannot be enabled at the same time.")
|
||||
endif()
|
||||
else()
|
||||
# use dawn::dawn_native and dawn::dawn_proc instead of the monolithic dawn::webgpu_dawn to minimize binary size
|
||||
set(DAWN_BUILD_MONOLITHIC_LIBRARY OFF CACHE BOOL "" FORCE)
|
||||
set(DAWN_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
set(DAWN_BUILD_SAMPLES OFF CACHE BOOL "" FORCE)
|
||||
set(DAWN_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
|
||||
set(DAWN_ENABLE_NULL OFF CACHE BOOL "" FORCE)
|
||||
set(DAWN_FETCH_DEPENDENCIES ON CACHE BOOL "" FORCE)
|
||||
|
||||
|
|
@ -667,18 +676,34 @@ if (onnxruntime_USE_WEBGPU)
|
|||
set(DAWN_USE_BUILT_DXC ON CACHE BOOL "" FORCE)
|
||||
set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "" FORCE)
|
||||
|
||||
# Vulkan may optionally be included in a Windows build. Exclude until we have an explicit use case that requires it.
|
||||
set(DAWN_ENABLE_VULKAN OFF CACHE BOOL "" FORCE)
|
||||
if ((NOT onnxruntime_ENABLE_DAWN_BACKEND_VULKAN) AND (NOT onnxruntime_ENABLE_DAWN_BACKEND_D3D12))
|
||||
message(FATAL_ERROR "At least one of onnxruntime_ENABLE_DAWN_BACKEND_VULKAN or onnxruntime_ENABLE_DAWN_BACKEND_D3D12 must be enabled when using Dawn on Windows.")
|
||||
endif()
|
||||
if (onnxruntime_ENABLE_DAWN_BACKEND_VULKAN)
|
||||
set(DAWN_ENABLE_VULKAN ON CACHE BOOL "" FORCE)
|
||||
set(TINT_BUILD_SPV_WRITER ON CACHE BOOL "" FORCE)
|
||||
else()
|
||||
set(DAWN_ENABLE_VULKAN OFF CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
if (onnxruntime_ENABLE_DAWN_BACKEND_D3D12)
|
||||
set(DAWN_ENABLE_D3D12 ON CACHE BOOL "" FORCE)
|
||||
else()
|
||||
set(DAWN_ENABLE_D3D12 OFF CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
# We are currently always using the D3D12 backend.
|
||||
set(DAWN_ENABLE_D3D11 OFF CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
|
||||
onnxruntime_fetchcontent_makeavailable(dawn)
|
||||
|
||||
if (NOT onnxruntime_USE_EXTERNAL_DAWN)
|
||||
list(APPEND onnxruntime_EXTERNAL_LIBRARIES dawn::dawn_native)
|
||||
if (onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY)
|
||||
list(APPEND onnxruntime_EXTERNAL_LIBRARIES dawn::webgpu_dawn)
|
||||
else()
|
||||
if (NOT onnxruntime_USE_EXTERNAL_DAWN)
|
||||
list(APPEND onnxruntime_EXTERNAL_LIBRARIES dawn::dawn_native)
|
||||
endif()
|
||||
list(APPEND onnxruntime_EXTERNAL_LIBRARIES dawn::dawn_proc)
|
||||
endif()
|
||||
list(APPEND onnxruntime_EXTERNAL_LIBRARIES dawn::dawn_proc)
|
||||
endif()
|
||||
|
||||
set(onnxruntime_LINK_DIRS)
|
||||
|
|
|
|||
|
|
@ -22,9 +22,25 @@
|
|||
onnxruntime_add_static_library(onnxruntime_providers_webgpu ${onnxruntime_providers_webgpu_cc_srcs})
|
||||
onnxruntime_add_include_to_target(onnxruntime_providers_webgpu
|
||||
onnxruntime_common dawn::dawncpp_headers dawn::dawn_headers onnx onnx_proto flatbuffers::flatbuffers Boost::mp11 safeint_interface)
|
||||
if (NOT onnxruntime_USE_EXTERNAL_DAWN)
|
||||
target_link_libraries(onnxruntime_providers_webgpu dawn::dawn_native)
|
||||
|
||||
if (onnxruntime_BUILD_DAWN_MONOLITHIC_LIBRARY)
|
||||
target_link_libraries(onnxruntime_providers_webgpu dawn::webgpu_dawn)
|
||||
|
||||
if (onnxruntime_ENABLE_DELAY_LOADING_WIN_DLLS)
|
||||
list(APPEND onnxruntime_DELAYLOAD_FLAGS "/DELAYLOAD:webgpu_dawn.dll")
|
||||
endif()
|
||||
|
||||
# Copy webgpu_dawn.dll to the output directory
|
||||
add_custom_command(
|
||||
TARGET onnxruntime_providers_webgpu
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:dawn::webgpu_dawn>" "$<TARGET_FILE_DIR:onnxruntime_providers_webgpu>"
|
||||
VERBATIM )
|
||||
else()
|
||||
if (NOT onnxruntime_USE_EXTERNAL_DAWN)
|
||||
target_link_libraries(onnxruntime_providers_webgpu dawn::dawn_native)
|
||||
endif()
|
||||
target_link_libraries(onnxruntime_providers_webgpu dawn::dawn_proc)
|
||||
endif()
|
||||
target_link_libraries(onnxruntime_providers_webgpu dawn::dawn_proc)
|
||||
|
||||
set_target_properties(onnxruntime_providers_webgpu PROPERTIES FOLDER "ONNXRuntime")
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@ void WebGpuContext::Initialize(const WebGpuExecutionProviderInfo& webgpu_ep_info
|
|||
// Initialization.Step.1 - Create wgpu::Instance
|
||||
if (instance_ == nullptr) {
|
||||
const DawnProcTable* dawn_procs = reinterpret_cast<const DawnProcTable*>(dawn_proc_table);
|
||||
#if defined(BUILD_DAWN_MONOLITHIC_LIBRARY)
|
||||
ORT_ENFORCE(dawn_procs == nullptr, "setting DawnProcTable is not allowed when dynamically linked to webgpu_dawn.");
|
||||
#else
|
||||
#if !defined(USE_EXTERNAL_DAWN)
|
||||
if (dawn_procs == nullptr) {
|
||||
dawn_procs = &dawn::native::GetProcs();
|
||||
|
|
@ -36,6 +39,7 @@ void WebGpuContext::Initialize(const WebGpuExecutionProviderInfo& webgpu_ep_info
|
|||
ORT_ENFORCE(dawn_procs != nullptr, "DawnProcTable must be provided.");
|
||||
#endif
|
||||
dawnProcSetProcs(dawn_procs);
|
||||
#endif
|
||||
|
||||
wgpu::InstanceDescriptor instance_desc{};
|
||||
instance_desc.features.timedWaitAnyEnable = true;
|
||||
|
|
@ -49,9 +53,7 @@ void WebGpuContext::Initialize(const WebGpuExecutionProviderInfo& webgpu_ep_info
|
|||
wgpu::RequestAdapterOptions req_adapter_options = {};
|
||||
wgpu::DawnTogglesDescriptor adapter_toggles_desc = {};
|
||||
req_adapter_options.nextInChain = &adapter_toggles_desc;
|
||||
#ifdef _WIN32
|
||||
req_adapter_options.backendType = wgpu::BackendType::D3D12;
|
||||
#endif
|
||||
req_adapter_options.backendType = static_cast<wgpu::BackendType>(webgpu_ep_info.backend_type);
|
||||
req_adapter_options.powerPreference = wgpu::PowerPreference::HighPerformance;
|
||||
|
||||
auto enabled_adapter_toggles = GetEnabledAdapterToggles();
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ struct WebGpuExecutionProviderInfo {
|
|||
WebGpuExecutionProviderInfo(DataLayout data_layout, bool enable_graph_capture)
|
||||
: data_layout{data_layout},
|
||||
enable_graph_capture{enable_graph_capture},
|
||||
backend_type{},
|
||||
storage_buffer_cache_mode{},
|
||||
uniform_buffer_cache_mode{},
|
||||
query_resolve_buffer_cache_mode{},
|
||||
|
|
@ -36,6 +37,7 @@ struct WebGpuExecutionProviderInfo {
|
|||
|
||||
DataLayout data_layout;
|
||||
bool enable_graph_capture;
|
||||
int backend_type;
|
||||
webgpu::BufferCacheMode storage_buffer_cache_mode;
|
||||
webgpu::BufferCacheMode uniform_buffer_cache_mode;
|
||||
webgpu::BufferCacheMode query_resolve_buffer_cache_mode;
|
||||
|
|
|
|||
|
|
@ -67,6 +67,26 @@ std::shared_ptr<IExecutionProviderFactory> WebGpuProviderFactoryCreator::Create(
|
|||
}
|
||||
LOGS_DEFAULT(VERBOSE) << "WebGPU EP graph capture enable: " << webgpu_ep_info.enable_graph_capture;
|
||||
|
||||
std::string backend_type_str;
|
||||
if (config_options.TryGetConfigEntry(kDawnBackendType, backend_type_str)) {
|
||||
#ifdef _WIN32
|
||||
// Setup Windows default backend type based on the build configuration
|
||||
#if defined(onnxruntime_ENABLE_DAWN_BACKEND_D3D12)
|
||||
webgpu_ep_info.backend_type = static_cast<int>(WGPUBackendType_D3D12);
|
||||
#elif defined(onnxruntime_ENABLE_DAWN_BACKEND_VULKAN)
|
||||
webgpu_ep_info.backend_type = static_cast<int>(WGPUBackendType_Vulkan);
|
||||
#endif
|
||||
#endif
|
||||
if (backend_type_str == kDawnBackendType_D3D12) {
|
||||
webgpu_ep_info.backend_type = static_cast<int>(WGPUBackendType_D3D12);
|
||||
} else if (backend_type_str == kDawnBackendType_Vulkan) {
|
||||
webgpu_ep_info.backend_type = static_cast<int>(WGPUBackendType_Vulkan);
|
||||
} else {
|
||||
ORT_THROW("Invalid Dawn backend type: ", backend_type_str);
|
||||
}
|
||||
}
|
||||
LOGS_DEFAULT(VERBOSE) << "WebGPU EP Dawn backend type: " << webgpu_ep_info.backend_type;
|
||||
|
||||
auto parse_buffer_cache_mode = [&config_options](const std::string& config_entry_str,
|
||||
webgpu::BufferCacheMode default_value) -> webgpu::BufferCacheMode {
|
||||
std::string buffer_cache_mode_str;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ constexpr const char* kEnableGraphCapture = "WebGPU:enableGraphCapture";
|
|||
|
||||
constexpr const char* kDawnProcTable = "WebGPU:dawnProcTable";
|
||||
|
||||
constexpr const char* kDawnBackendType = "WebGPU:dawnBackendType";
|
||||
|
||||
constexpr const char* kDeviceId = "WebGPU:deviceId";
|
||||
constexpr const char* kWebGpuInstance = "WebGPU:webgpuInstance";
|
||||
constexpr const char* kWebGpuAdapter = "WebGPU:webgpuAdapter";
|
||||
|
|
@ -30,6 +32,9 @@ constexpr const char* kForceCpuNodeNames = "WebGPU:forceCpuNodeNames";
|
|||
|
||||
// The following are the possible values for the provider options.
|
||||
|
||||
constexpr const char* kDawnBackendType_D3D12 = "D3D12";
|
||||
constexpr const char* kDawnBackendType_Vulkan = "Vulkan";
|
||||
|
||||
constexpr const char* kPreferredLayout_NCHW = "NCHW";
|
||||
constexpr const char* kPreferredLayout_NHWC = "NHWC";
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue