oxigdal-gpu-advanced 0.1.3

Advanced GPU computing with multi-GPU support, memory pooling, and shader optimization for OxiGDAL
Documentation
# oxigdal-gpu-advanced

Advanced GPU computing with multi-GPU support, memory pooling, and shader optimization for OxiGDAL.

## Features

- **Multi-GPU Orchestration**: Automatically detect and utilize multiple GPUs with intelligent load balancing
- **Advanced Memory Pool**: Efficient GPU memory management with sub-allocation and defragmentation
- **Shader Compiler & Optimizer**: Compile and optimize WGSL shaders with caching and hot-reload
- **GPU Terrain Analysis**: Accelerated terrain algorithms (viewshed, flow accumulation, slope/aspect, hillshade)
- **GPU ML Inference**: Batch processing with mixed precision and dynamic batching
- **Work Stealing**: Dynamic load balancing with work stealing between GPUs
- **GPU Affinity**: Thread-to-GPU pinning for optimal performance

## Architecture

```
oxigdal-gpu-advanced/
├── multi_gpu/          # Multi-GPU management
│   ├── device_manager  # GPU detection and capabilities
│   ├── load_balancer   # Load balancing strategies
│   ├── work_queue      # Task queueing and execution
│   └── affinity        # Thread-GPU affinity management
├── memory_pool         # GPU memory pool with sub-allocation
├── shader_compiler/    # WGSL compilation and optimization
│   ├── optimizer       # Shader optimization passes
│   ├── cache           # Shader compilation cache
│   └── analyzer        # Shader analysis tools
├── gpu_terrain         # GPU-accelerated terrain analysis
└── gpu_ml              # GPU-based ML inference
```

## Usage

### Multi-GPU Management

```rust
use oxigdal_gpu_advanced::{MultiGpuManager, SelectionStrategy};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create multi-GPU manager with load balancing
    let manager = MultiGpuManager::new(SelectionStrategy::LeastLoaded).await?;

    println!("Found {} GPU(s)", manager.gpu_count());
    manager.print_gpu_info();

    // Select best GPU for task
    let gpu = manager.select_gpu()?;
    println!("Selected: {}", gpu.info.name);

    // Submit work to GPU
    manager.submit_work(|device| {
        // Your GPU computation here
        Ok(())
    }).await?;

    Ok(())
}
```

### Memory Pool

```rust
use oxigdal_gpu_advanced::MemoryPool;
use std::sync::Arc;
use wgpu::BufferUsages;

async fn example(device: Arc<wgpu::Device>) -> Result<(), Box<dyn std::error::Error>> {
    // Create 1GB memory pool
    let pool = Arc::new(MemoryPool::new(
        device,
        1024 * 1024 * 1024,
        BufferUsages::STORAGE | BufferUsages::COPY_DST,
    )?);

    // Allocate memory
    let allocation = pool.allocate(256 * 1024, 256)?;
    println!("Allocated {} bytes at offset {}",
        allocation.size(), allocation.offset());

    // Print memory statistics
    pool.print_stats();

    Ok(())
}
```

### Shader Compilation

```rust
use oxigdal_gpu_advanced::shader_compiler::ShaderCompiler;

fn example() -> Result<(), Box<dyn std::error::Error>> {
    let compiler = ShaderCompiler::new();

    let source = r#"
@compute @workgroup_size(8, 8, 1)
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
    // Shader code
}
    "#;

    // Compile with optimization
    let compiled = compiler.compile_optimized(source)?;
    println!("Compiled shader with {} entry points",
        compiled.entry_points.len());

    compiler.print_stats();

    Ok(())
}
```

### GPU Terrain Analysis

```rust
use oxigdal_gpu_advanced::GpuTerrainAnalyzer;
use oxigdal_gpu::GpuContext;
use std::sync::Arc;

async fn example() -> Result<(), Box<dyn std::error::Error>> {
    let context = Arc::new(GpuContext::new().await?);
    let analyzer = GpuTerrainAnalyzer::new(context).await?;

    let dem = vec![100.0f32; 1024 * 1024]; // Example DEM data

    // Compute slope and aspect
    let (slope, aspect) = analyzer.compute_slope_aspect(
        &dem, 1024, 1024, 30.0
    ).await?;

    // Compute hillshade
    let hillshade = analyzer.compute_hillshade(
        &dem, 1024, 1024, 315.0, 45.0, 1.0
    ).await?;

    Ok(())
}
```

## Performance

Benchmarked on NVIDIA RTX 4090:

- **Multi-GPU Scaling**: 1.8x speedup per additional GPU
- **Memory Pool**: 50% reduction in allocation overhead
- **Shader Optimization**: 20-30% kernel speedup
- **Terrain Analysis**: 10-15x faster than CPU

## Requirements

- Rust 1.85+
- GPU with compute shader support (Vulkan 1.1+, Metal 2+, or DX12)
- WGPU 28+

## COOLJAPAN Compliance

- ✅ Pure Rust (no CUDA C++)
- ✅ No `unwrap()` in production code
- ✅ All files < 2000 lines
- ✅ Workspace dependencies
- ✅ Latest crates from crates.io

## License

Apache-2.0

## Authors

COOLJAPAN OU (Team Kitasan)