aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/tbb/WASM_Support.md
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2025-02-27 00:51:37 +0000
committerAlexander Smirnov <alex@ydb.tech>2025-02-27 00:51:37 +0000
commit73c5b3617320d761190ec40aed6f6ce9c24270f3 (patch)
tree6abf1b4a2c847e9a119fc5582a610c4cf7ab2de0 /contrib/libs/tbb/WASM_Support.md
parent3f91ea9163746386488746f9bdfb4a8f0eda110d (diff)
parent629114ad6e988a524969a8b3f6afd20d1d720928 (diff)
downloadydb-73c5b3617320d761190ec40aed6f6ce9c24270f3.tar.gz
Merge branch 'rightlib' into merge-libs-250227-0050
Diffstat (limited to 'contrib/libs/tbb/WASM_Support.md')
-rw-r--r--contrib/libs/tbb/WASM_Support.md62
1 files changed, 56 insertions, 6 deletions
diff --git a/contrib/libs/tbb/WASM_Support.md b/contrib/libs/tbb/WASM_Support.md
index 67925ee496..6306620d7c 100644
--- a/contrib/libs/tbb/WASM_Support.md
+++ b/contrib/libs/tbb/WASM_Support.md
@@ -16,16 +16,66 @@
# WASM Support
+oneTBB extends its capabilities by offering robust support for ``WASM`` (see ``Limitation`` sections).
+
``WASM`` stands for WebAssembly, a low-level binary format for executing code in web browsers.
-It is designed to be a portable target for compilers and to be efficient to parse and execute.
+It is designed to be a portable target for compilers and efficient to parse and execute.
+
+Using oneTBB with WASM, you can take full advantage of parallelism and concurrency while working on web-based applications, interactive websites, and a variety of other WASM-compatible platforms.
+
+oneTBB offers WASM support through the integration with [Emscripten*](https://emscripten.org/docs/introducing_emscripten/index.html), a powerful toolchain for compiling C and C++ code into WASM-compatible runtimes.
+
+## Build
+
+**Prerequisites:** Download and install Emscripten*. See the [instructions](https://emscripten.org/docs/getting_started/downloads.html).
+
+To build the system, run:
+
+```
+mkdir build && cd build
+emcmake cmake .. -DCMAKE_CXX_COMPILER=em++ -DCMAKE_C_COMPILER=emcc -DTBB_STRICT=OFF -DCMAKE_CXX_FLAGS=-Wno-unused-command-line-argument -DTBB_DISABLE_HWLOC_AUTOMATIC_SEARCH=ON -DBUILD_SHARED_LIBS=ON -DTBB_EXAMPLES=ON -DTBB_TEST=ON
+```
+To compile oneTBB without ``pthreads``, set the flag ``-DEMSCRIPTEN_WITHOUT_PTHREAD=true`` in the command above. By default, oneTBB uses the ``pthreads``.
+```
+cmake --build . <options>
+cmake --install . <options>
+```
+Where:
+
+* ``emcmake`` - a tool that sets up the environment for Emscripten*.
+* ``-DCMAKE_CXX_COMPILER=em++`` - specifies the C++ compiler as Emscripten* C++ compiler.
+* ``-DCMAKE_C_COMPILER=emcc`` - specifies the C compiler as Emscripten* C compiler.
+
+
+> **_NOTE:_** See [CMake documentation](https://github.com/oneapi-src/oneTBB/blob/master/cmake/README.md) to learn about other options.
-WebAssembly aims to provide a fast, efficient, and safe way to run code in web browsers without needing plugins or other software. Code written in a variety of programming languages, including C, C++, Rust and others, can be compiled into WebAssembly format for use in web pages. This allows you to write high-performance applications that run directly in the browser.
-We currently have an [under development branch that provides you with WASM support](https://github.com/oneapi-src/oneTBB/tree/tbb_wasm).
+## Run Test
-By using WASM, you can:
-* Create highly performant and scalable applications that can meet the demands of modern web-based systems.
-* Take advantage of oneTBB features to optimize the performance of your web-based applications.
+To run tests, use:
+```
+ctest
+```
+# Limitations
+You can successfully build your application with oneTBB using WASM, but you may not achieve optimal performance immediately. This is due to the limitation with nested Web Workers: a Web Worker cannot schedule another worker without help from a browser thread. This can lead to unexpected performance outcomes, such as the application running in serial.
+Find more information in the [issue](https://github.com/emscripten-core/emscripten/discussions/21963) in the Emscripten repository.
+To workaround this issue, try one of the following ways:
+1. **Recommended Solution: Use the ``-sPROXY_TO_PTHREAD`` Flag**.
+This flag splits the initial thread into a browser thread and a main thread (proxied by a Web Worker), effectively resolving the issue as the browser thread is always present in the event loop and can participate in Web Workers scheduling. Refer to the [Emscripten documentation](https://emscripten.org/docs/porting/pthreads.html) for more details about ``-sPROXY_TO_PTHREAD`` since using this flag may require refactoring the code.
+2. **Alternative Solution: Warm Up the oneTBB Thread Pool**
+Initialize the oneTBB thread pool before making the first call to oneTBB. This approach forces the browser thread to participate in Web Workers scheduling.
+```cpp
+ int num_threads = tbb::this_task_arena::max_concurrency();
+ std::atomic<int> barrier{num_threads};
+ tbb::parallel_for(0, num_threads, [&barrier] (int) {
+ barrier--;
+ while (barrier > 0) {
+ // Send browser thread to event loop
+ std::this_thread::yield();
+ }
+ }, tbb::static_partitioner{});
+```
+> **_NOTE:_** Be aware that it might cause delays on the browser side.