This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 9f28b1da7a [WEB] Update web runtime to support latest emcc (#14046)
9f28b1da7a is described below
commit 9f28b1da7a371c5a0447590f2a709c6ecd161ccb
Author: Tianqi Chen <[email protected]>
AuthorDate: Sun Feb 19 18:29:46 2023 -0500
[WEB] Update web runtime to support latest emcc (#14046)
[WEB] Update web runtime to latest emcc
This PR provide fixes to re-enable web build for latest emcc.
WASM runtime now works. WebGPU still need some catch up due
to freq updates of the API spec. Tested locally.
---
python/tvm/contrib/emcc.py | 13 ++++++++-----
src/runtime/dso_library.cc | 5 +++++
src/runtime/library_module.cc | 5 -----
web/.gitignore | 1 +
web/Makefile | 11 +++++------
web/emcc/tvmjs_support.cc | 2 +-
web/src/webgpu.ts | 12 ++++++++----
7 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/python/tvm/contrib/emcc.py b/python/tvm/contrib/emcc.py
index 671e573b1c..8be4865126 100644
--- a/python/tvm/contrib/emcc.py
+++ b/python/tvm/contrib/emcc.py
@@ -40,9 +40,9 @@ def create_tvmjs_wasm(output, objects, options=None,
cc="emcc"):
"""
cmd = [cc]
cmd += ["-O3"]
-
cmd += ["-std=c++17"]
cmd += ["--no-entry"]
+ cmd += ["-s", "WASM_BIGINT=1"]
cmd += ["-s", "ERROR_ON_UNDEFINED_SYMBOLS=0"]
cmd += ["-s", "STANDALONE_WASM=1"]
cmd += ["-s", "ALLOW_MEMORY_GROWTH=1"]
@@ -54,14 +54,17 @@ def create_tvmjs_wasm(output, objects, options=None,
cc="emcc"):
if obj.find("wasm_runtime.bc") != -1:
with_runtime = True
+ libs = []
if not with_runtime:
- objects += [find_lib_path("wasm_runtime.bc")[0]]
+ libs += [find_lib_path("wasm_runtime.bc")[0]]
- objects += [find_lib_path("tvmjs_support.bc")[0]]
- objects += [find_lib_path("webgpu_runtime.bc")[0]]
+ libs += [find_lib_path("tvmjs_support.bc")[0]]
+ libs += [find_lib_path("webgpu_runtime.bc")[0]]
cmd += ["-o", output]
- cmd += objects
+
+ # let libraries go before normal object
+ cmd += libs + objects
if options:
cmd += options
diff --git a/src/runtime/dso_library.cc b/src/runtime/dso_library.cc
index a0c6c48b5e..e4f4937a8a 100644
--- a/src/runtime/dso_library.cc
+++ b/src/runtime/dso_library.cc
@@ -148,5 +148,10 @@ ObjectPtr<Library> CreateDSOLibraryObject(std::string
library_path) {
n->Init(library_path);
return n;
}
+
+TVM_REGISTER_GLOBAL("runtime.module.loadfile_so").set_body([](TVMArgs args,
TVMRetValue* rv) {
+ ObjectPtr<Library> n = CreateDSOLibraryObject(args[0]);
+ *rv = CreateModuleFromLibrary(n);
+});
} // namespace runtime
} // namespace tvm
diff --git a/src/runtime/library_module.cc b/src/runtime/library_module.cc
index 54fd362387..d6c2f791de 100644
--- a/src/runtime/library_module.cc
+++ b/src/runtime/library_module.cc
@@ -221,10 +221,5 @@ Module CreateModuleFromLibrary(ObjectPtr<Library> lib,
PackedFuncWrapper packed_
return root_mod;
}
-
-TVM_REGISTER_GLOBAL("runtime.module.loadfile_so").set_body([](TVMArgs args,
TVMRetValue* rv) {
- ObjectPtr<Library> n = CreateDSOLibraryObject(args[0]);
- *rv = CreateModuleFromLibrary(n);
-});
} // namespace runtime
} // namespace tvm
diff --git a/web/.gitignore b/web/.gitignore
index 082c5a2677..1f7cc0916a 100644
--- a/web/.gitignore
+++ b/web/.gitignore
@@ -3,3 +3,4 @@
out
node_modules
build
+debug
diff --git a/web/Makefile b/web/Makefile
index 1153990a18..026cb7ebc0 100644
--- a/web/Makefile
+++ b/web/Makefile
@@ -26,21 +26,20 @@ all: dist/wasm/tvmjs_runtime.wasm
dist/wasm/tvmjs_runtime.wasi.js
EMCC = emcc
-EMCC_CFLAGS = $(INCLUDE_FLAGS) -O3 -std=c++17 -Wno-ignored-attributes
--no-entry \
- -s ALLOW_MEMORY_GROWTH=1 -s STANDALONE_WASM=1 -s
ERROR_ON_UNDEFINED_SYMBOLS=0
+EMCC_CFLAGS = $(INCLUDE_FLAGS) -O3 -std=c++17 -Wno-ignored-attributes
-EMCC_LDFLAGS = --pre-js emcc/preload.js
+EMCC_LDFLAGS = --no-entry -s WASM_BIGINT=1 -s ALLOW_MEMORY_GROWTH=1 -s
STANDALONE_WASM=1\
+ -s ERROR_ON_UNDEFINED_SYMBOLS=0 --pre-js emcc/preload.js
dist/wasm/%.bc: emcc/%.cc
@mkdir -p $(@D)
$(EMCC) $(EMCC_CFLAGS) -c -MM -MT dist/wasm/$*.bc $< >dist/wasm/$*.d
- $(EMCC) $(EMCC_CFLAGS) -c -o dist/wasm/$*.bc $<
+ $(EMCC) $(EMCC_CFLAGS) -emit-llvm -c -o dist/wasm/$*.bc $<
dist/wasm/tvmjs_runtime.wasm: dist/wasm/wasm_runtime.bc
dist/wasm/tvmjs_support.bc dist/wasm/webgpu_runtime.bc
@mkdir -p $(@D)
- $(EMCC) $(EMCC_CFLAGS) -o dist/wasm/tvmjs_runtime.js $+ $(EMCC_LDFLAGS)
-
+ $(EMCC) $(EMCC_CFLAGS) -o dist/wasm/tvmjs_runtime.js $+ $(EMCC_LDFLAGS)
dist/wasm/tvmjs_runtime.wasi.js: dist/wasm/tvmjs_runtime.wasm
emcc/decorate_as_wasi.py
python3 emcc/decorate_as_wasi.py dist/wasm/tvmjs_runtime.js $@
diff --git a/web/emcc/tvmjs_support.cc b/web/emcc/tvmjs_support.cc
index 6395bfbb08..5bc1c32382 100644
--- a/web/emcc/tvmjs_support.cc
+++ b/web/emcc/tvmjs_support.cc
@@ -214,7 +214,7 @@ class AsyncLocalSession : public LocalSession {
local_to.dtype = remote_from->dtype;
local_to.strides = nullptr;
local_to.byte_offset = 0;
- this->GetDeviceAPI(remote_from->device)->CopyDataFromTo(&local_to,
remote_from, nullptr);
+ this->GetDeviceAPI(remote_from->device)->CopyDataFromTo(remote_from,
&local_to, nullptr);
this->AsyncStreamWait(remote_from->device, nullptr, on_complete);
} catch (const std::runtime_error& e) {
this->SendException(on_complete, e.what());
diff --git a/web/src/webgpu.ts b/web/src/webgpu.ts
index daaa122682..5de47c200d 100644
--- a/web/src/webgpu.ts
+++ b/web/src/webgpu.ts
@@ -89,7 +89,10 @@ export class WebGPUContext {
if (dtype == "handle") {
layoutEntries.push({
binding: i,
- visibility: GPUShaderStage.COMPUTE
+ visibility: GPUShaderStage.COMPUTE,
+ buffer : {
+ type: "storage"
+ }
});
} else {
throw new Error("Cannot handle argument type " + dtype + " in WebGPU
shader");
@@ -99,7 +102,7 @@ export class WebGPUContext {
entries: layoutEntries
});
- const textDecoder = new TextDecoder('utf-8')
+ const textDecoder = new TextDecoder("utf-8")
const codeString = textDecoder.decode(data.buffer)
const pipeline = this.device.createComputePipeline({
@@ -287,8 +290,9 @@ export class WebGPUContext {
this.numPendingReads += 1;
- const readEvent = gpuTemp.mapAsync(GPUMapMode.READ).then((data: unknown)
=> {
- this.memory.storeRawBytes(to, new Uint8Array(data as ArrayBuffer));
+ const readEvent = gpuTemp.mapAsync(GPUMapMode.READ).then(() => {
+ const data = gpuTemp.getMappedRange();
+ this.memory.storeRawBytes(to, new Uint8Array(data));
this.numPendingReads -= 1;
gpuTemp.destroy();
});