use scirs2_core::gpu::GpuError;
use scirs2_core::ndarray::{Array, Dimension};
use scirs2_core::numeric::Float;
pub mod backends;
pub mod kernel_fusion;
pub mod memory;
pub mod mixed_precision;
pub mod multi_gpu;
pub mod occupancy;
pub mod optimizers;
pub mod quantization;
pub mod shaders;
pub mod sparse_optimizer;
pub mod tensor_cores;
pub mod utils;
pub use backends::GpuBackend;
pub use kernel_fusion::{FusionGraph, FusionGroup, FusionOp, FusionPlan, FusionPlanner, OpKind};
pub use memory::MemoryPool;
pub use mixed_precision::{
f16_bits_to_f32, f32_to_f16_bits, DynamicLossScaler, MixedPrecisionConfig, OverflowStats,
};
pub use occupancy::{
calculate_occupancy, optimal_block_size, KernelResourceUsage, OccupancyLimiter,
OccupancyResult, SmResourceLimits,
};
pub use optimizers::{
AdagradParams, AdamParams, GpuAdagrad, GpuAdam, GpuAdamW, GpuLamb, GpuOptimizerConfig,
GpuRmsprop, GpuSgd, RmspropParams, SgdParams,
};
pub use quantization::{
fake_quant_backward, fake_quant_fp8, fake_quant_int, fake_quant_int_per_channel,
per_channel_params, Fp8Format, IntDtype, QatConfig, QatOptimizer, QuantParams, QuantScheme,
QuantTarget, RoundingMode,
};
pub use sparse_optimizer::{
CooGradient, CsrGradient, LazyAdamMode, SparseAdam, SparseAdamConfig, SparseAdamTable,
SparseSgd, SparseSgdConfig, SparseSgdTable,
};
#[derive(Debug, thiserror::Error)]
pub enum GpuOptimError {
#[error("GPU error: {0}")]
GpuError(#[from] GpuError),
#[error("Operation not supported: {0}")]
UnsupportedOperation(String),
#[error("Invalid optimizer state: {0}")]
InvalidState(String),
#[error("Dimension mismatch: expected {expected:?}, got {actual:?}")]
DimensionMismatch {
expected: Vec<usize>,
actual: Vec<usize>,
},
#[error("GPU optimizer not initialized")]
NotInitialized,
#[error("CUDA is not available on this system")]
CudaNotAvailable,
}
pub trait GpuOptimizer<A: Float, D: Dimension> {
fn is_gpu_available(&self) -> bool;
fn move_to_gpu(&mut self) -> Result<(), GpuOptimError>;
fn move_to_cpu(&mut self) -> Result<(), GpuOptimError>;
#[deprecated(since = "0.3.2", note = "renamed to `move_to_gpu`")]
fn to_gpu(&mut self) -> Result<(), GpuOptimError> {
self.move_to_gpu()
}
#[deprecated(since = "0.3.2", note = "renamed to `move_to_cpu`")]
fn to_cpu(&mut self) -> Result<(), GpuOptimError> {
self.move_to_cpu()
}
fn step_gpu(
&mut self,
params: &mut Array<A, D>,
gradients: &Array<A, D>,
) -> Result<(), GpuOptimError>;
}