First Commit
This commit is contained in:
120
README.md
120
README.md
@@ -1,2 +1,120 @@
|
||||
# performance-tests
|
||||
# Performance Tests — CPU vs WebAssembly vs Node.js vs OpenCL vs Browser Pthread
|
||||
|
||||
This project benchmarks performance of the same arithmetic workload across multiple execution models:
|
||||
|
||||
```
|
||||
c[i] = a[i] + b[i]
|
||||
```
|
||||
|
||||
Array size: ~15 million `float` elements.
|
||||
|
||||
Compared implementations:
|
||||
|
||||
• Native C — single core
|
||||
• Native C — Pthreads
|
||||
• Native C — OpenMP
|
||||
• Node.js — JavaScript
|
||||
• Node.js — WebAssembly (single core)
|
||||
• Node.js — WebAssembly + Pthreads (multi-core)
|
||||
• Browser — WebAssembly + Pthreads (multi-core)
|
||||
• OpenCL — CPU and GPU
|
||||
|
||||
---
|
||||
|
||||
## Build & Run (All Tests)
|
||||
|
||||
Run every benchmark automatically (native, Node.js, WebAssembly, OpenCL):
|
||||
|
||||
```
|
||||
bash compile.sh
|
||||
```
|
||||
|
||||
The script:
|
||||
|
||||
1. Compiles all binaries (.c → ./binaries/*)
|
||||
2. Builds WebAssembly versions using Emscripten
|
||||
3. Executes each performance test in sequence
|
||||
4. Prints timing + result samples
|
||||
|
||||
Requirements:
|
||||
|
||||
• gcc / clang
|
||||
• Node.js
|
||||
• Emscripten (for WASM builds)
|
||||
• OpenCL dev libs (optional, for OpenCL tests)
|
||||
|
||||
---
|
||||
|
||||
## Run Browser WebAssembly + Pthreads Version
|
||||
|
||||
```
|
||||
cd wasm_pthread_fast/web
|
||||
node server.js
|
||||
```
|
||||
|
||||
Then open:
|
||||
|
||||
```
|
||||
http://localhost:1234
|
||||
```
|
||||
|
||||
This runs the multithreaded WASM benchmark inside the browser with correct SharedArrayBuffer support.
|
||||
|
||||
---
|
||||
|
||||
## Example Results
|
||||
|
||||
All implementations validate correct output values (`c[0] = 0`, `c[1] = 3`, …)
|
||||
|
||||
Times in milliseconds:
|
||||
|
||||
| Method | Platform | Cores | Total / Calc Time (ms) | Status |
|
||||
| ------------------------- | -------- | ----- | ---------------------- | ---------------- |
|
||||
| Native C | CPU | 1 | 210.63 | OK |
|
||||
| Node.js | CPU | 1 | 215.15 | OK |
|
||||
| Wasm Node.js | CPU | 1 | 219.81 | OK |
|
||||
| OpenMP | CPU | multi | 140.58 | OK |
|
||||
| C Pthreads | CPU | multi | 21.98 (calc) | **Fastest CPU** |
|
||||
| Wasm + Pthreads (Node.js) | CPU | multi | 23.08 (calc) | **Very fast** |
|
||||
| Wasm + Pthreads (Browser) | CPU | multi | 35.21 (calc) | **Fast** |
|
||||
| OpenCL CPU only | CPU | many? | 162.36 total | OK |
|
||||
| OpenCL GPU | GPU | many | Crash | Driver dependent |
|
||||
|
||||
---
|
||||
|
||||
## Folder Overview
|
||||
|
||||
| Path | Description |
|
||||
| --------------------- | ------------------------------ |
|
||||
| add_single_core.c | Single-threaded C baseline |
|
||||
| pthread_add.c | Multi-core with Pthreads |
|
||||
| openmp_add.c | Multi-core with OpenMP |
|
||||
| opencl_add_cpu.c | CPU via OpenCL runtime |
|
||||
| opencl_add_gpu.c | GPU compute attempt |
|
||||
| wasm_add.c | WebAssembly (single-core) |
|
||||
| wasm_add_pthread.c | WebAssembly (multi-core) |
|
||||
| wasm_node.js | Node test for single-core WASM |
|
||||
| wasm_pthread_fast/ | Multi-threaded WASM version |
|
||||
| wasm_pthread_fast/web | Browser runner + local server |
|
||||
| compile.sh | Complete build + test pipeline |
|
||||
|
||||
---
|
||||
|
||||
## Findings
|
||||
|
||||
• Multi-core CPU execution is far superior to single-threaded versions
|
||||
• Node.js + WebAssembly threads approach native CPU performance
|
||||
• Browser WASM threading provides strong performance with minimal overhead
|
||||
• GPU workloads are not benefited due to memory transfer bottlenecks
|
||||
– GPU will win when computation-per-element is higher
|
||||
|
||||
---
|
||||
|
||||
## Future Expansion
|
||||
|
||||
• Higher compute complexity test kernels
|
||||
• Multi-run average statistics
|
||||
• Visual charts comparing performance gaps
|
||||
• GPU-friendly workloads showing real acceleration crossover
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user