|  | # Copyright 2022 The IREE Authors | 
|  | # | 
|  | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | if(NOT EMSCRIPTEN) | 
|  | return() | 
|  | endif() | 
|  |  | 
|  | if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/mnist_static.h") | 
|  | message(WARNING "Missing mnist_static.h, run ${CMAKE_CURRENT_SOURCE_DIR}/build_sample.sh to generate it") | 
|  | return() | 
|  | endif() | 
|  |  | 
|  | set(_MNIST_OBJECT_NAME "iree_experimental_web_sample_static_mnist") | 
|  | add_library(${_MNIST_OBJECT_NAME} STATIC ${CMAKE_CURRENT_BINARY_DIR}/mnist_static.o) | 
|  | SET_TARGET_PROPERTIES(${_MNIST_OBJECT_NAME} PROPERTIES LINKER_LANGUAGE C) | 
|  |  | 
|  | #------------------------------------------------------------------------------- | 
|  | # Sync | 
|  | #------------------------------------------------------------------------------- | 
|  |  | 
|  | set(_NAME "iree_experimental_web_sample_static_sync") | 
|  | add_executable(${_NAME} "") | 
|  | target_include_directories(${_NAME} PUBLIC | 
|  | $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> | 
|  | ) | 
|  | target_sources(${_NAME} | 
|  | PRIVATE | 
|  | main.c | 
|  | device_sync.c | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_static.h | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_bytecode.h | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_bytecode.c | 
|  | ) | 
|  | set_target_properties(${_NAME} PROPERTIES OUTPUT_NAME "web-sample-static-sync") | 
|  |  | 
|  | target_compile_options(${_NAME} PRIVATE ${IREE_DEFAULT_COPTS}) | 
|  |  | 
|  | # Note: we have to be very careful about dependencies here. | 
|  | # | 
|  | # The general purpose libraries link in multiple executable loaders and HAL | 
|  | # drivers/devices, which include code not compatible with Emscripten. | 
|  | target_link_libraries(${_NAME} | 
|  | ${_MNIST_OBJECT_NAME} | 
|  | iree_runtime_runtime | 
|  | iree_hal_local_loaders_static_library_loader | 
|  | iree_hal_drivers_local_sync_sync_driver | 
|  | ) | 
|  |  | 
|  | target_link_options(${_NAME} PRIVATE | 
|  | # https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-ccall-cwrap | 
|  | "-sEXPORTED_FUNCTIONS=['_setup_sample', '_cleanup_sample', '_run_sample', '_malloc']" | 
|  | "-sEXPORTED_RUNTIME_METHODS=['ccall','cwrap']" | 
|  | # | 
|  | "-sASSERTIONS=1" | 
|  | # | 
|  | # https://developer.chrome.com/blog/wasm-debugging-2020/ | 
|  | "-g" | 
|  | "-gseparate-dwarf" | 
|  | ) | 
|  |  | 
|  | #------------------------------------------------------------------------------- | 
|  | # Multithreaded | 
|  | #------------------------------------------------------------------------------- | 
|  |  | 
|  | set(_NAME "iree_experimental_web_sample_static_multithreaded") | 
|  | add_executable(${_NAME} "") | 
|  | target_include_directories(${_NAME} PUBLIC | 
|  | $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> | 
|  | ) | 
|  | target_sources(${_NAME} | 
|  | PRIVATE | 
|  | main.c | 
|  | device_multithreaded.c | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_static.h | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_bytecode.h | 
|  | ${CMAKE_CURRENT_BINARY_DIR}/mnist_bytecode.c | 
|  | ) | 
|  | set_target_properties(${_NAME} PROPERTIES OUTPUT_NAME "web-sample-static-multithreaded") | 
|  |  | 
|  | target_compile_options(${_NAME} PRIVATE ${IREE_DEFAULT_COPTS}) | 
|  |  | 
|  | # Note: we have to be very careful about dependencies here. | 
|  | # | 
|  | # The general purpose libraries link in multiple executable loaders and HAL | 
|  | # drivers/devices, which include code not compatible with Emscripten. | 
|  | target_link_libraries(${_NAME} | 
|  | ${_MNIST_OBJECT_NAME} | 
|  | iree_runtime_runtime | 
|  | iree_hal_local_loaders_static_library_loader | 
|  | iree_hal_drivers_local_task_task_driver | 
|  | iree_task_api | 
|  | ) | 
|  |  | 
|  | target_link_options(${_NAME} PRIVATE | 
|  | # https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-ccall-cwrap | 
|  | "-sEXPORTED_FUNCTIONS=['_setup_sample', '_cleanup_sample', '_run_sample', '_malloc']" | 
|  | "-sEXPORTED_RUNTIME_METHODS=['ccall','cwrap']" | 
|  | # | 
|  | "-sASSERTIONS=1" | 
|  | # | 
|  | # https://developer.chrome.com/blog/wasm-debugging-2020/ | 
|  | "-g" | 
|  | "-gseparate-dwarf" | 
|  | # | 
|  | # ------------------------------------------------------------------------- # | 
|  | # Multithreading with pthreads, built on Web Workers and SharedArrayBuffer. | 
|  | # Docs: https://emscripten.org/docs/porting/pthreads.html | 
|  | # IREE's use of threading is pretty restricted so we could eventually drop | 
|  | # Emscripten's pthreads implementation in favor of our own. | 
|  | # | 
|  | # Note: this -pthread flag also needs to be set in compile options. | 
|  | "-pthread" | 
|  | # | 
|  | # IREE creates long lived worker threads during device creation around system | 
|  | # startup time. No fixed size thread pool is necessary, so disable thread | 
|  | # pool size checks and do not specify the pool size. | 
|  | # By starting IREE from a Web Worker, we can avoid needing `PROXY_TO_PTHREAD` | 
|  | # and can block when interacting with threads. | 
|  | # Web Worker creation requires yielding back to the main browser event loop, | 
|  | # so splitting program execution across multiple JavaScript function calls | 
|  | # (e.g. `createDevice(); runInference();`) also helps avoid deadlocks. | 
|  | "-sPTHREAD_POOL_SIZE_STRICT=0" | 
|  | # "-sPTHREAD_POOL_SIZE=N" | 
|  | # "-sPROXY_TO_PTHREAD" | 
|  | # | 
|  | # Threads use memory, so using a larger pool of memory or allowing memory | 
|  | # growth may be necessary when using `emscripten_num_logical_cores()` | 
|  | # or `navigator.hardwareConcurrency` to pick the worker thread count. | 
|  | # IREE is pretty good about not allocating outside of startup, so concerns | 
|  | # about this causing slow access to memory *may* not affect IREE too much. | 
|  | # "-sALLOW_MEMORY_GROWTH=1" | 
|  | # TODO(scotttodd): tune this (figure out where memory is going and trim) | 
|  | # "-sINITIAL_MEMORY=33554432" | 
|  | # ------------------------------------------------------------------------- # | 
|  | ) |