Skip to content

Commit ecf243e

Browse files
committed
add simd example
1 parent 643a567 commit ecf243e

File tree

4 files changed

+86
-0
lines changed

4 files changed

+86
-0
lines changed

examples/rust/simd/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "simd"
3+
version = "0.1.0"
4+
edition = "2018"
5+
6+
[dependencies]
7+
wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen.git" }
8+
9+
[lib]
10+
crate-type = ["cdylib"]

examples/rust/simd/README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Simd Rust
2+
3+
A simple simd example using [core::arch::wasm32](https://doc.rust-lang.org/core/arch/wasm32/index.html#simd)
4+
5+
## Build
6+
7+
```sh
8+
cargo build --target wasm32-unknown-unknown
9+
```
10+
11+
## Create Function
12+
13+
```sql
14+
CREATE FUNCTION mul AS WASM FROM INFILE 'target/wasm32-unknown-unknown/debug/simd.wasm' WITH WIT FROM INFILE 'simd.wit'
15+
CREATE FUNCTION dot AS WASM FROM INFILE 'target/wasm32-unknown-unknown/debug/simd.wasm' WITH WIT FROM INFILE 'simd.wit'
16+
CREATE FUNCTION `inner` RETURNS TABLE AS WASM FROM INFILE 'target/wasm32-unknown-unknown/debug/simd.wasm' WITH WIT FROM INFILE 'simd.wit'
17+
```
18+
19+
## Example Queries
20+
21+
```sql
22+
SELECT mul(3,4);
23+
SELECT dot([1,2,3], [0,5,6]);
24+
SELECT * FROM `inner`([1,2,3], [3,4,5]);
25+
```

examples/rust/simd/simd.wit

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
mul: func(a: u64, b: u64) -> u64
2+
dot: func(a: list<u64>, b: list<u64>) -> u64
3+
inner: func(a: list<u64>, b: list<u64>) -> list<u64>
4+
mmul: func(a: list<list<u64>>, b: list<list<u64>>) -> list<list<u64>>

examples/rust/simd/src/lib.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#[cfg(target_arch = "wasm32")]
2+
wit_bindgen_rust::export!("simd.wit");
3+
4+
struct Simd;
5+
6+
use core::arch::wasm32::*;
7+
8+
impl simd::Simd for Simd {
9+
fn mul(a: u64, b: u64) -> u64 {
10+
let va: v128 = u64x2_splat(a);
11+
let vb: v128 = u64x2_splat(b);
12+
let c = u64x2_extract_lane::<1>(i64x2_mul(va, vb));
13+
c
14+
}
15+
fn dot(a: Vec<u64>, b: Vec<u64>) -> u64 {
16+
assert!(a.len() == b.len());
17+
let mut sum: u64 = 0;
18+
for i in 0..a.len() {
19+
sum += Self::mul(a[i], b[i]);
20+
}
21+
sum
22+
}
23+
fn inner(a: Vec<u64>, b: Vec<u64>) -> Vec<u64> {
24+
assert!(a.len() == b.len());
25+
let mut res = vec![0; a.len()];
26+
for i in 0..a.len() {
27+
res[i] = Self::mul(a[i], b[i]);
28+
}
29+
res
30+
}
31+
fn mmul(a: Vec<Vec<u64>>, b: Vec<Vec<u64>>) -> Vec<Vec<u64>> {
32+
if a.len() == 0 && b.len() == 0 {
33+
return Vec::with_capacity(0);
34+
}
35+
assert!(a[0].len() == b.len());
36+
37+
let mut res = vec![vec![0; a.len()]; b[0].len()];
38+
for i in 0..a.len() {
39+
for j in 0..b[0].len() {
40+
for k in 0..b.len() {
41+
res[i][j] += Self::mul(a[i][k], b[k][j]);
42+
}
43+
}
44+
}
45+
res
46+
}
47+
}

0 commit comments

Comments
 (0)