blob: 0e448295191c90ac55b60d9eb27072e643497207 [file] [log] [blame]
# 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_hal_utils_buffer_transfer
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"
# ------------------------------------------------------------------------- #
)