并行计算斐波那契数

前置条件

这个示例使用了如下的包:

  • wasmedge-sys v0.7.0
  • wasmedge-types v0.1.1

概述

在这个例子中,我们将演示如何使用 wasmedge-sys 中定义的对象和 API 来并行地计算斐波那契数。

示例

在下面的代码中,我们创建了两个子线程,thread_athread_b,它们分别负责通过调用宿主函数 fib 来计算 Fib(4)Fib(5)。之后,主线程通过将 thread_athread_b 返回的数字相加来计算 Fib(6)

第一步:创建一个 Vm 上下文并注册 WebAssembly 模块。

  1. ```rust
  2. // create a Config context
  3. let mut config = Config::create()?;
  4. config.bulk_memory_operations(true);
  5. // create a Store context
  6. let mut store = Store::create()?;
  7. // create a Vm context with the given Config and Store
  8. let mut vm = Vm::create(Some(config), Some(&mut store))?;
  9. // register a wasm module from a wasm file
  10. let file = std::path::PathBuf::from(env!("WASMEDGE_DIR"))
  11. .join("bindings/rust/wasmedge-sys/tests/data/fibonacci.wasm");
  12. vm.register_wasm_from_file("extern", file)?;
  13. ```

第二步:创建两个子线程,分别计算 Fib(4) 和 Fib(5)。

  1. ```rust
  2. let vm = Arc::new(Mutex::new(vm));
  3. // compute fib(4) by a child thread
  4. let vm_cloned = Arc::clone(&vm);
  5. let handle_a = thread::spawn(move || {
  6. let vm_child_thread = vm_cloned.lock().expect("fail to lock vm");
  7. let returns = vm_child_thread
  8. .run_registered_function("extern", "fib", [Value::from_i32(4)])
  9. .expect("fail to compute fib(4)");
  10. let fib4 = returns[0].to_i32();
  11. println!("fib(4) by child thread: {}", fib4);
  12. fib4
  13. });
  14. // compute fib(5) by a child thread
  15. let vm_cloned = Arc::clone(&vm);
  16. let handle_b = thread::spawn(move || {
  17. let vm_child_thread = vm_cloned.lock().expect("fail to lock vm");
  18. let returns = vm_child_thread
  19. .run_registered_function("extern", "fib", [Value::from_i32(5)])
  20. .expect("fail to compute fib(5)");
  21. let fib5 = returns[0].to_i32();
  22. println!("fib(5) by child thread: {}", fib5);
  23. fib5
  24. });
  25. ```

第三步:从两个子线程中获取返回值,计算 Fib(6)。

  1. ```Rust
  2. let fib4 = handle_a.join().unwrap();
  3. let fib5 = handle_b.join().unwrap();
  4. // compute fib(6)
  5. println!("fib(6) = fib(5) + fib(1) = {}", fib5 + fib4);
  6. ```

上述代码的最终结果将会像下面这样被打印在屏幕上。

  1. fib(4) by child thread: 5
  2. fib(5) by child thread: 8
  3. fib(6) = fib(5) + fib(1) = 13

这个演示的完整源代码可以在 WasmEdge Github 找到。