#![allow(clippy::unwrap_used)]
mod collectors;
mod divergence;
mod fuse;
mod helpers;
#[cfg(test)]
mod tests;
pub use fuse::{fuse_programs, fuse_programs_vec};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum FusionError {
SelfAliasing(FusionSelfAliasingError),
Aliasing(FusionAliasingError),
OverDispatch(FusionOverDispatchError),
}
impl std::fmt::Display for FusionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FusionError::SelfAliasing(e) => write!(f, "{e}"),
FusionError::Aliasing(e) => write!(f, "{e}"),
FusionError::OverDispatch(e) => write!(f, "{e}"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FusionOverDispatchError {
pub max_arm_threads: u64,
pub fused_threads: u64,
pub fix: &'static str,
}
impl std::fmt::Display for FusionOverDispatchError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"fusion would over-dispatch: fused geometry launches {} threads vs largest single arm {}. Fix: {}",
self.fused_threads, self.max_arm_threads, self.fix
)
}
}
impl std::error::Error for FusionError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FusionSelfAliasingError {
pub op_id: String,
pub fix: &'static str,
}
impl std::fmt::Display for FusionSelfAliasingError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"fusion self-aliasing on op_id `{}`: two copies of a non-composable parser were fused. Fix: {}",
self.op_id, self.fix
)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FusionAliasingError {
pub buffer_name: String,
pub read_arm: usize,
pub write_arm: usize,
pub fix_hint: &'static str,
}
impl std::fmt::Display for FusionAliasingError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"fusion aliasing on buffer `{}`: arm {} reads and arm {} writes without a barrier. Fix: {}",
self.buffer_name, self.read_arm, self.write_arm, self.fix_hint
)
}
}