Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Roadmap: Threading Support #5548

Closed
10 of 11 tasks
kateinoigakukun opened this issue Jul 28, 2023 · 7 comments
Closed
10 of 11 tasks

Roadmap: Threading Support #5548

kateinoigakukun opened this issue Jul 28, 2023 · 7 comments

Comments

@kateinoigakukun
Copy link
Member

kateinoigakukun commented Jul 28, 2023

Recently a lot of work on thread support has been done in WASI: https://github.com/WebAssembly/wasi-threads
After our toolchain support threading, it will unlock offloading computationally heavy operations to threads.

Here is a list of tasks to support threads in SwiftWasm:

Feedback and any help are welcome :)

@Kyle-Ye
Copy link

Kyle-Ye commented Feb 24, 2024

One more task IMO:

@kateinoigakukun
Copy link
Member Author

Started building stdlib for wasm32-unknown-wasip1-threads target on main branch: swiftlang#72650

@kkebo
Copy link

kkebo commented Apr 4, 2024

I have a question. Are there still blockers for compiling Swift for the wasm32-unknown-wasip1-threads target triple?

$ which swiftc
/home/kebo/downloads/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a/usr/bin/swiftc
$ swiftc --version
Swift version 6.0-dev (LLVM 3dd3bce1adb5b65, Swift 1f09be97a890c3e)
Target: aarch64-unknown-linux-gnu
$ cat hello.swift
print("hello")
$ swiftc -target wasm32-wasip1-threads -c hello.swift
<unknown>:0: warning: libc not found for 'wasm32-unknown-wasip1-threads'; C stdlib may be unavailable
<unknown>:0: error: could not find module '_Concurrency' for target 'wasm32-unknown-wasip1-threads'; found: wasm32-unknown-wasi, at: /home/kebo/downloads/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a/usr/lib/swift/wasi/_Concurrency.swiftmodule
$ uname -a
Linux Brown-rhinoceros-beetle 6.6.3-414.asahi.fc39.aarch64+16k #1 SMP PREEMPT_DYNAMIC Sun Mar 24 19:44:17 UTC 2024 aarch64 GNU/Linux

error: could not find module '_Concurrency' for target 'wasm32-unknown-wasip1-threads' also happens when using swift build with the Swift SDK.

@kateinoigakukun
Copy link
Member Author

I still need some build script engineering 🙃

@kkebo
Copy link

kkebo commented Apr 4, 2024

It's OK for now, thank you.

@kateinoigakukun
Copy link
Member Author

Tried to fix the issue around atomic.c in libclang_rt.builtin.a, but concluded that it's difficult to fix this with the current toolchain layout of clang, which requires the single builitin library for each arch.

From e3ab0445dce6d0aabdf9719742240eaafc5731a4 Mon Sep 17 00:00:00 2001
From: Yuta Saito <kateinoigakukun@gmail.com>
Date: Sun, 14 Apr 2024 16:48:59 +0000
Subject: [PATCH] [compiler-rt][wasm] Compile atomic.c with atomics and
 bulk-memory features

The bulitin object file for atomic.c is only referenced by user code
when the atomics and bulk-memory features are enabled and libcall is
required. However, the atomic.c itself was compiled without those
features and it leads to a linker error because all objects have to have
the feature when `--shared-memory` is enabled.
This patch compiles atomic.c with the atomics and bulk-memory features
enabled only for the object file.
---
 compiler-rt/lib/builtins/CMakeLists.txt | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index c139917d4f58..5af6c72a9102 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -839,11 +839,30 @@ else ()
         set(deps_aarch64 lse_builtin_symlinks)
       endif()

+      set(BUILTIN_OBJECT_LIBS_${arch})
+      # For WebAssembly, we need to compile the atomic.c with different flags than the rest
+      # to enable atomics and bulk-memory features only for the object file.
+      if((arch STREQUAL "wasm32" OR arch STREQUAL "wasm64") AND "atomic.c" IN_LIST ${arch}_SOURCES)
+        set(BUILTIN_ATOMIC_CFLAGS_${arch} ${BUILTIN_CFLAGS_${arch}})
+        list(APPEND BUILTIN_ATOMIC_CFLAGS_${arch} -matomics -mbulk-memory)
+        add_compiler_rt_object_libraries(clang_rt.builtins.${arch}.atomic
+                                         ARCHS ${arch}
+                                         DEPS ${deps_${arch}}
+                                         SOURCES atomic.c
+                                         DEFS ${BUILTIN_DEFS}
+                                         CFLAGS ${BUILTIN_ATOMIC_CFLAGS_${arch}})
+        # Include the atomic object file in the builtins archive
+        list(APPEND BUILTIN_OBJECT_LIBS_${arch} clang_rt.builtins.${arch}.atomic)
+        # Remove atomic.c from the main list of sources
+        list(REMOVE_ITEM ${arch}_SOURCES atomic.c)
+      endif()
+
       add_compiler_rt_runtime(clang_rt.builtins
                               STATIC
                               ARCHS ${arch}
                               DEPS ${deps_${arch}}
                               SOURCES ${${arch}_SOURCES}
+                              OBJECT_LIBS ${BUILTIN_OBJECT_LIBS_${arch}}
                               DEFS ${BUILTIN_DEFS}
                               CFLAGS ${BUILTIN_CFLAGS_${arch}}
                               PARENT_TARGET builtins)
--
2.43.2

@kateinoigakukun
Copy link
Member Author

Closing as we added basic infrastructure to use multi-thread. If you build Wasm with wasm32-unknown-wasip1-threads Swift SDK, the produced binary is compatible with WASI threads ABI. See https://book.swiftwasm.org/getting-started/setup-snapshot.html for how to install the SDK.

The produced binary runs on Wasm runtimes with the WASI threads support (e.g. wasmtime, wasm-micro-runtime).

FAQ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants