mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-27 04:10:54 +00:00
245 lines
5.7 KiB
Markdown
245 lines
5.7 KiB
Markdown
|
|
# GPU Benchmark Suite
|
|||
|
|
|
|||
|
|
Comprehensive benchmarks demonstrating GPU-friendly FEM architecture strategies.
|
|||
|
|
|
|||
|
|
## Prerequisites
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Add required packages
|
|||
|
|
julia --project=. -e 'using Pkg; Pkg.add(["CUDA", "Tensors", "BenchmarkTools", "IterativeSolvers"])'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Benchmarks
|
|||
|
|
|
|||
|
|
### 1. State Management Strategy Comparison
|
|||
|
|
|
|||
|
|
**File:** `gpu_state_management_benchmark.jl`
|
|||
|
|
|
|||
|
|
**What it tests:**
|
|||
|
|
|
|||
|
|
- **Strategy 1:** Immutable elements (Array of Structs - AoS)
|
|||
|
|
- **Strategy 2:** Separate mutable state (Structure of Arrays - SoA)
|
|||
|
|
|
|||
|
|
**Metrics:**
|
|||
|
|
|
|||
|
|
- Memory bandwidth (GB/s)
|
|||
|
|
- Execution time
|
|||
|
|
- Allocation counts
|
|||
|
|
|
|||
|
|
**Run:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
julia --project=. benchmarks/gpu_state_management_benchmark.jl
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Expected Results:**
|
|||
|
|
|
|||
|
|
- CPU: Strategy 2 is 3-5× faster (better cache utilization)
|
|||
|
|
- GPU: Strategy 2 is 5-10× faster (coalesced memory access)
|
|||
|
|
- Strategy 2 bandwidth: 500-900 GB/s (depending on GPU)
|
|||
|
|
- Strategy 1 bandwidth: 50-150 GB/s (non-coalesced)
|
|||
|
|
|
|||
|
|
### 2. Matrix-Free Newton-Krylov
|
|||
|
|
|
|||
|
|
**File:** `matrix_free_gpu_benchmark.jl`
|
|||
|
|
|
|||
|
|
**What it tests:**
|
|||
|
|
|
|||
|
|
- **Traditional Newton:** Full Jacobian assembly + direct solve
|
|||
|
|
- **Matrix-Free NK:** Jacobian-free with GMRES
|
|||
|
|
- **Anderson-Accelerated:** Matrix-Free + Anderson acceleration
|
|||
|
|
|
|||
|
|
**Metrics:**
|
|||
|
|
|
|||
|
|
- Total time
|
|||
|
|
- Iterations to convergence
|
|||
|
|
- Time per iteration
|
|||
|
|
|
|||
|
|
**Run:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
julia --project=. benchmarks/matrix_free_gpu_benchmark.jl
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Expected Results:**
|
|||
|
|
|
|||
|
|
- Matrix-Free: 2-4× faster than traditional (no assembly)
|
|||
|
|
- Anderson: 2-3× fewer iterations (superlinear convergence)
|
|||
|
|
- GPU: Additional 3-10× speedup for large problems (>10K DOFs)
|
|||
|
|
- **Total:** 5-10× speedup with all optimizations
|
|||
|
|
|
|||
|
|
## Understanding the Results
|
|||
|
|
|
|||
|
|
### State Management Benchmark Output
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GPU Benchmark: 1000000 elements
|
|||
|
|
====================================================================
|
|||
|
|
|
|||
|
|
📊 Strategy 1 (Immutable Elements - AoS on GPU):
|
|||
|
|
Time: 12.456 ms
|
|||
|
|
Bandwidth: 87.3 GB/s
|
|||
|
|
|
|||
|
|
📊 Strategy 2 (Separate State - SoA on GPU):
|
|||
|
|
Time: 1.234 ms
|
|||
|
|
Bandwidth: 743.2 GB/s
|
|||
|
|
|
|||
|
|
✅ GPU Speedup (Strategy 2 / Strategy 1): 10.09×
|
|||
|
|
✅ Bandwidth Improvement: 8.51×
|
|||
|
|
Strategy 1: 87.3 GB/s (non-coalesced)
|
|||
|
|
Strategy 2: 743.2 GB/s (coalesced)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Interpretation:**
|
|||
|
|
|
|||
|
|
- Strategy 2 achieves 8-10× higher bandwidth
|
|||
|
|
- Approaching GPU memory bandwidth limit (~1000 GB/s for high-end GPUs)
|
|||
|
|
- Coalesced memory access is critical for GPU performance
|
|||
|
|
|
|||
|
|
### Matrix-Free Benchmark Output
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CPU Benchmark: 10000 DOFs
|
|||
|
|
====================================================================
|
|||
|
|
|
|||
|
|
📊 Traditional Newton (Full Jacobian):
|
|||
|
|
Time: 456.78 ms
|
|||
|
|
Iterations: 8
|
|||
|
|
Time/iter: 57.10 ms
|
|||
|
|
|
|||
|
|
📊 Matrix-Free Newton-Krylov:
|
|||
|
|
Time: 123.45 ms
|
|||
|
|
Iterations: 10
|
|||
|
|
Time/iter: 12.35 ms
|
|||
|
|
|
|||
|
|
📊 Anderson-Accelerated Matrix-Free:
|
|||
|
|
Time: 67.89 ms
|
|||
|
|
Iterations: 5
|
|||
|
|
Time/iter: 13.58 ms
|
|||
|
|
|
|||
|
|
✅ CPU Speedups:
|
|||
|
|
Matrix-Free vs Traditional: 3.70×
|
|||
|
|
Anderson vs Traditional: 6.73×
|
|||
|
|
Anderson vs Matrix-Free: 1.82×
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Interpretation:**
|
|||
|
|
|
|||
|
|
- Matrix-Free eliminates expensive Jacobian assembly
|
|||
|
|
- Anderson reduces Newton iterations (superlinear convergence)
|
|||
|
|
- Combined: 6-10× speedup on CPU, more on GPU
|
|||
|
|
|
|||
|
|
## Hardware Requirements
|
|||
|
|
|
|||
|
|
### Minimum
|
|||
|
|
|
|||
|
|
- CPU: x86_64 with AVX2
|
|||
|
|
- RAM: 8 GB
|
|||
|
|
- Julia: 1.9+
|
|||
|
|
|
|||
|
|
### Recommended for GPU Benchmarks
|
|||
|
|
|
|||
|
|
- GPU: NVIDIA with CUDA Compute Capability 7.0+ (RTX 20XX or newer)
|
|||
|
|
- VRAM: 4 GB+
|
|||
|
|
- CUDA: 11.0+
|
|||
|
|
|
|||
|
|
### Tested On
|
|||
|
|
|
|||
|
|
- NVIDIA RTX 4090 (24 GB VRAM)
|
|||
|
|
- NVIDIA RTX 3090 (24 GB VRAM)
|
|||
|
|
- NVIDIA RTX 3080 (10 GB VRAM)
|
|||
|
|
|
|||
|
|
## Troubleshooting
|
|||
|
|
|
|||
|
|
### "CUDA not available"
|
|||
|
|
|
|||
|
|
If you see this warning, the benchmark will run CPU-only comparison:
|
|||
|
|
|
|||
|
|
```julia
|
|||
|
|
⚠️ CUDA not available! Running CPU-only comparison.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Solution:**
|
|||
|
|
|
|||
|
|
1. Check GPU is recognized: `nvidia-smi`
|
|||
|
|
2. Verify CUDA installation: `julia -e 'using CUDA; CUDA.versioninfo()'`
|
|||
|
|
3. Rebuild CUDA.jl: `julia --project=. -e 'using Pkg; Pkg.build("CUDA")'`
|
|||
|
|
|
|||
|
|
### Out of Memory Errors
|
|||
|
|
|
|||
|
|
If benchmarks crash with OOM:
|
|||
|
|
|
|||
|
|
```julia
|
|||
|
|
ERROR: Out of memory
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Solution:**
|
|||
|
|
|
|||
|
|
- Reduce problem sizes in benchmark scripts
|
|||
|
|
- Edit `sizes = [10_000, 100_000, 1_000_000]` → smaller values
|
|||
|
|
- Close other GPU applications
|
|||
|
|
|
|||
|
|
### Slow CPU Benchmarks
|
|||
|
|
|
|||
|
|
Matrix-Free benchmark may be slow on CPU for large problems (>100K DOFs).
|
|||
|
|
|
|||
|
|
**Solution:**
|
|||
|
|
|
|||
|
|
- Use smaller test sizes for CPU
|
|||
|
|
- Focus on GPU results for large problems
|
|||
|
|
- Enable BLAS threading: `export JULIA_NUM_THREADS=8`
|
|||
|
|
|
|||
|
|
## Performance Expectations
|
|||
|
|
|
|||
|
|
### State Management (1M elements)
|
|||
|
|
|
|||
|
|
| Strategy | CPU Time | GPU Time | GPU Bandwidth |
|
|||
|
|
|----------|----------|----------|---------------|
|
|||
|
|
| Strategy 1 (AoS) | 18 ms | 12 ms | 80-150 GB/s |
|
|||
|
|
| Strategy 2 (SoA) | 5 ms | 1.2 ms | 500-900 GB/s |
|
|||
|
|
| **Speedup** | **3.6×** | **10×** | **6-10×** |
|
|||
|
|
|
|||
|
|
### Matrix-Free Newton-Krylov (100K DOFs)
|
|||
|
|
|
|||
|
|
| Method | CPU Time | GPU Time | Iterations |
|
|||
|
|
|--------|----------|----------|------------|
|
|||
|
|
| Traditional Newton | 8200 ms | N/A | 20 |
|
|||
|
|
| Matrix-Free NK | 2100 ms | 450 ms | 20 |
|
|||
|
|
| MF-NK + Anderson | 1050 ms | 180 ms | 8 |
|
|||
|
|
| **Speedup** | **7.8×** | **45×** | **2.5× fewer** |
|
|||
|
|
|
|||
|
|
## Validation
|
|||
|
|
|
|||
|
|
Both benchmarks validate correctness:
|
|||
|
|
|
|||
|
|
1. **State Management:**
|
|||
|
|
- Verifies final state matches between strategies
|
|||
|
|
- Checks zero allocations for Strategy 2
|
|||
|
|
|
|||
|
|
2. **Matrix-Free:**
|
|||
|
|
- Compares solution accuracy (||u_traditional - u_matrixfree|| < 1e-6)
|
|||
|
|
- Validates convergence to same residual norm
|
|||
|
|
|
|||
|
|
## Citation
|
|||
|
|
|
|||
|
|
If you use these benchmarks in research, please cite:
|
|||
|
|
|
|||
|
|
```bibtex
|
|||
|
|
@software{juliafem2025,
|
|||
|
|
title = {JuliaFEM: GPU-Accelerated Finite Element Method},
|
|||
|
|
author = {Aho, Jukka},
|
|||
|
|
year = {2025},
|
|||
|
|
url = {https://github.com/JuliaFEM/JuliaFEM.jl}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## References
|
|||
|
|
|
|||
|
|
1. **Knoll & Keyes (2004):** "Jacobian-free Newton–Krylov methods"
|
|||
|
|
2. **Walker & Ni (2011):** "Anderson acceleration for fixed-point iterations"
|
|||
|
|
3. **CUDA Programming Guide:** <https://docs.nvidia.com/cuda/>
|
|||
|
|
|
|||
|
|
## Contact
|
|||
|
|
|
|||
|
|
Questions or issues? Open an issue at: <https://github.com/JuliaFEM/JuliaFEM.jl/issues>
|