diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 579c541..1e9fb21 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -30,6 +30,8 @@ jobs: run: | cd viewer npm ci + #rustup toolchain install nightly-2023-10-03-x86_64-unknown-linux-gnu + #rustup component add rust-src --toolchain nightly-2023-10-03-x86_64-unknown-linux-gnu npm run wasm npm run build --if-present diff --git a/Cargo.lock b/Cargo.lock index 9b01d89..355f8a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -979,6 +979,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spmc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1101,6 +1107,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-rayon" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df87c67450805c305d3ae44a3ac537b0253d029153c25afc3ecd2edc36ccafb1" +dependencies = [ + "js-sys", + "rayon", + "spmc", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-shared" version = "0.2.87" @@ -1123,6 +1141,7 @@ dependencies = [ "serde", "serde-wasm-bindgen 0.6.1", "wasm-bindgen", + "wasm-bindgen-rayon", "web-sys", ] diff --git a/viewer/package.json b/viewer/package.json index 53ab982..d90e0c1 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite", "build": "vite build", - "wasm": "wasm-pack build --release --target web ../lts && wasm-pack build --release --target web ../wasm-od2net", + "wasm": "wasm-pack build --release --target web ../lts && rustup run nightly-2023-10-03 wasm-pack build --release --target web ../wasm-od2net", "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json", "fmt": "npx prettier --write *.html src/**" diff --git a/viewer/src/InteractiveApp.svelte b/viewer/src/InteractiveApp.svelte index b698136..82bdee3 100644 --- a/viewer/src/InteractiveApp.svelte +++ b/viewer/src/InteractiveApp.svelte @@ -3,7 +3,7 @@ import type { Map as MapType } from "maplibre-gl"; import { onMount } from "svelte"; import { GeoJSON, MapLibre, Marker } from "svelte-maplibre"; - import init, { JsNetwork } from "wasm-od2net"; + import init, { initThreadPool, JsNetwork } from "wasm-od2net"; import markerSvg from "../assets/marker.svg?raw"; import CostFunction from "./CostFunction.svelte"; import Header from "./Header.svelte"; @@ -13,6 +13,7 @@ onMount(async () => { await init(); + await initThreadPool(navigator.hardwareConcurrency); await initLts(); }); @@ -24,7 +25,7 @@ features: [], }; - let maxRequests = 1000; + let maxRequests = 1000000; // TODO When we load a network.bin, overwrite this let cost = "Distance"; let controls = { diff --git a/wasm-od2net/.cargo/config b/wasm-od2net/.cargo/config new file mode 100644 index 0000000..3dcae60 --- /dev/null +++ b/wasm-od2net/.cargo/config @@ -0,0 +1,5 @@ +[target.wasm32-unknown-unknown] +rustflags = ["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals"] + +[unstable] +build-std = ["panic_abort", "std"] diff --git a/wasm-od2net/Cargo.toml b/wasm-od2net/Cargo.toml index 4d4deb5..43134e0 100644 --- a/wasm-od2net/Cargo.toml +++ b/wasm-od2net/Cargo.toml @@ -19,4 +19,5 @@ rstar = "0.11.0" serde = "1.0.188" serde-wasm-bindgen = "0.6.0" wasm-bindgen = "0.2.87" +wasm-bindgen-rayon = "1.0.3" web-sys = { version = "0.3.64", features = ["console"] } diff --git a/wasm-od2net/src/lib.rs b/wasm-od2net/src/lib.rs index e73a438..9b590de 100644 --- a/wasm-od2net/src/lib.rs +++ b/wasm-od2net/src/lib.rs @@ -3,6 +3,7 @@ extern crate log; use std::sync::Once; +pub use wasm_bindgen_rayon::init_thread_pool; use instant::Instant; use rstar::RTree; use serde::Deserialize; @@ -129,7 +130,7 @@ impl JsNetwork { } let routing_time = Instant::now().duration_since(routing_start); - info!("Got counts for {} edges", counts.count_per_edge.len()); + info!("Got counts for {} edges in {:?}", counts.count_per_edge.len(), routing_time); let output_metadata = od2net::OutputMetadata::new(config, &counts, num_requests, routing_time); let mut gj_bytes = Vec::new();