use super::VariableGroupedFp4Spec;
use crate::{Context, DeviceBuffer, Result, Stream, bf16};
pub struct VariableGroupedFp4Operands<'a> {
pub a: &'a DeviceBuffer<u8>,
pub a_scales: &'a DeviceBuffer<u8>,
pub b: &'a DeviceBuffer<u8>,
pub b_scales: &'a DeviceBuffer<u8>,
pub alphas: &'a DeviceBuffer<f32>,
pub output: &'a mut DeviceBuffer<bf16>,
}
#[derive(Clone, Copy)]
pub struct VariableGroupedFp4Metadata<'a> {
pub indices: &'a DeviceBuffer<u32>,
pub rows: &'a DeviceBuffer<u32>,
pub offsets: &'a DeviceBuffer<u32>,
}
pub struct PairedVariableGroupedFp4Launch<'a> {
pub left: VariableGroupedFp4Operands<'a>,
pub right: VariableGroupedFp4Operands<'a>,
pub metadata: VariableGroupedFp4Metadata<'a>,
}
#[derive(Debug)]
pub struct PairedVariableGroupedFp4Plan {
native: mircuda_sys::PairedVariableGroupedFp4Plan,
spec: VariableGroupedFp4Spec,
}
impl PairedVariableGroupedFp4Plan {
pub fn new(context: &Context, stream: &Stream, spec: VariableGroupedFp4Spec) -> Result<Self> {
Ok(Self {
native: context
.native
.create_paired_variable_grouped_fp4_plan(&stream.native, spec.native())?,
spec,
})
}
#[must_use]
pub const fn spec(&self) -> VariableGroupedFp4Spec {
self.spec
}
pub fn execute(
&mut self,
stream: &Stream,
launch: &mut PairedVariableGroupedFp4Launch<'_>,
) -> Result<()> {
Ok(self.native.execute(
&stream.native,
&launch.left.a.native,
&launch.left.a_scales.native,
&launch.left.b.native,
&launch.left.b_scales.native,
&launch.left.alphas.native,
&launch.right.a.native,
&launch.right.a_scales.native,
&launch.right.b.native,
&launch.right.b_scales.native,
&launch.right.alphas.native,
&launch.metadata.indices.native,
&launch.metadata.rows.native,
&launch.metadata.offsets.native,
&launch.left.output.native,
&launch.right.output.native,
)?)
}
}