From 4dd724ef1ad5d15a9bc56541e494dbbc03deca4b Mon Sep 17 00:00:00 2001 From: "Gao, Chun" <53756924+chun137@users.noreply.github.com> Date: Sat, 29 May 2021 07:29:58 +0800 Subject: [PATCH] Enable WebAssembly SIMD build (#7839) Add a build switch "--enable_wasm_simd" to enable WebAssembly SIMD build --- cmake/CMakeLists.txt | 4 ++++ cmake/onnxruntime_mlas.cmake | 12 +++++++++--- cmake/onnxruntime_webassembly.cmake | 18 ++++++++++++++---- onnxruntime/core/mlas/inc/mlas.h | 2 +- .../mlas/lib/wasm_simd/SgemvKernelWasmSimd.cpp | 4 +--- tools/ci_build/build.py | 2 ++ 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e473f4b4fa..7e8367ae3d 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1700,6 +1700,10 @@ if (onnxruntime_BUILD_CSHARP) endif() if (onnxruntime_BUILD_WEBASSEMBLY) + if (onnxruntime_ENABLE_WEBASSEMBLY_SIMD) + string(APPEND CMAKE_CXX_FLAGS " -msimd128") + endif() + if (onnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_CATCHING) string(APPEND CMAKE_CXX_FLAGS " -s DISABLE_EXCEPTION_CATCHING=0") endif() diff --git a/cmake/onnxruntime_mlas.cmake b/cmake/onnxruntime_mlas.cmake index 6ee1db9ac0..b15d1b78e5 100644 --- a/cmake/onnxruntime_mlas.cmake +++ b/cmake/onnxruntime_mlas.cmake @@ -25,9 +25,15 @@ set(mlas_common_srcs ) if (onnxruntime_BUILD_WEBASSEMBLY) - file(GLOB_RECURSE mlas_platform_srcs - "${ONNXRUNTIME_ROOT}/core/mlas/lib/wasm/*.cpp" - ) + if (onnxruntime_ENABLE_WEBASSEMBLY_SIMD) + file(GLOB_RECURSE mlas_platform_srcs + "${ONNXRUNTIME_ROOT}/core/mlas/lib/wasm_simd/*.cpp" + ) + else() + file(GLOB_RECURSE mlas_platform_srcs + "${ONNXRUNTIME_ROOT}/core/mlas/lib/wasm/*.cpp" + ) + endif() elseif(MSVC) if(onnxruntime_target_platform STREQUAL "ARM64") set(mlas_platform_preprocess_srcs diff --git a/cmake/onnxruntime_webassembly.cmake b/cmake/onnxruntime_webassembly.cmake index 52d6926274..23e7d758f2 100644 --- a/cmake/onnxruntime_webassembly.cmake +++ b/cmake/onnxruntime_webassembly.cmake @@ -60,9 +60,19 @@ else() endif() if (onnxruntime_ENABLE_WEBASSEMBLY_THREADS) - set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasmThreaded -s USE_PTHREADS=1") - set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm-threaded") + if (onnxruntime_ENABLE_WEBASSEMBLY_SIMD) + set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasmSimdThreaded -s USE_PTHREADS=1") + set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm-simd-threaded") + else() + set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasmThreaded -s USE_PTHREADS=1") + set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm-threaded") + endif() else() - set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasm") - set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm") + if (onnxruntime_ENABLE_WEBASSEMBLY_SIMD) + set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasmSimd") + set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm-simd") + else() + set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWasm") + set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME "ort-wasm") + endif() endif() diff --git a/onnxruntime/core/mlas/inc/mlas.h b/onnxruntime/core/mlas/inc/mlas.h index e9f8e44446..bec4cdf479 100644 --- a/onnxruntime/core/mlas/inc/mlas.h +++ b/onnxruntime/core/mlas/inc/mlas.h @@ -621,7 +621,7 @@ enum MLAS_CONV_ALGORITHM { MlasConvAlgorithmGemmDirect, MlasConvAlgorithmExpandThenGemm, MlasConvAlgorithmExpandThenGemmSegmented, -#if defined(MLAS_TARGET_WASM) +#if defined(MLAS_TARGET_WASM_SCALAR) MlasConvAlgorithmDepthwise, #endif }; diff --git a/onnxruntime/core/mlas/lib/wasm_simd/SgemvKernelWasmSimd.cpp b/onnxruntime/core/mlas/lib/wasm_simd/SgemvKernelWasmSimd.cpp index 2fde6b1e4a..a46efd4093 100644 --- a/onnxruntime/core/mlas/lib/wasm_simd/SgemvKernelWasmSimd.cpp +++ b/onnxruntime/core/mlas/lib/wasm_simd/SgemvKernelWasmSimd.cpp @@ -17,7 +17,7 @@ Abstract: #include "mlasi.h" -size_t +void MLASCALL MlasGemvFloatKernel( const float* A, @@ -155,6 +155,4 @@ Return Value: B += ldb; A++; } - - return 0; } diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py index b36d745583..ec19f79f51 100644 --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -336,6 +336,7 @@ def parse_arguments(): # WebAssembly build parser.add_argument("--build_wasm", action='store_true', help="Build for WebAssembly") + parser.add_argument("--enable_wasm_simd", action='store_true', help="Enable WebAssembly SIMD") parser.add_argument( "--disable_wasm_exception_catching", action='store_true', help="Disable exception catching in WebAssembly.") @@ -740,6 +741,7 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home "-Donnxruntime_ENABLE_MEMORY_PROFILE=" + ("ON" if args.enable_memory_profile else "OFF"), "-Donnxruntime_ENABLE_CUDA_LINE_NUMBER_INFO=" + ("ON" if args.enable_cuda_line_info else "OFF"), "-Donnxruntime_BUILD_WEBASSEMBLY=" + ("ON" if args.build_wasm else "OFF"), + "-Donnxruntime_ENABLE_WEBASSEMBLY_SIMD=" + ("ON" if args.enable_wasm_simd else "OFF"), "-Donnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_CATCHING=" + ("OFF" if args.disable_wasm_exception_catching else "ON"), "-Donnxruntime_ENABLE_WEBASSEMBLY_THREADS=" + ("ON" if args.enable_wasm_threads else "OFF"),