use ruda_kernel::dsl as kernel_dsl;
use crate::kernel_ir::{
components::stage::NumStages,
definition::{
AccG, Blueprint, LhsG, MatmulElems, MatmulProblem, MatmulSetupError, MatmulTypes,
MatmulVectorSizes, RhsG,
},
};
use crate::kernel_ir::{
definition::{RudaMapping, RudaMappingLaunch},
launch::{InputRuntimeArg, MatmulArgs, OutputRuntimeArg},
{components::RudaDimResource, launch::RuntimeConfig},
{components::global::memory::GlobalLayoutConfig, launch::ConfigRuntimeArg},
};
use ruda_kernel::dsl::ir::DeviceProperties;
use ruda_kernel::dsl::prelude::*;
use std::{fmt::Debug, hash::Hash};
pub trait BatchMatmulFamily<RC: RuntimeConfig>: 'static + Send + Sync {
type Matmul<MP: MatmulTypes>: BatchMatmul<RC, MP, Config = Self::Config>;
type Config: BatchConfig;
type Blueprint: Blueprint;
fn expand_config(
device_props: &DeviceProperties,
blueprint: &Self::Blueprint,
dtypes: &MatmulElems,
vector_sizes: &MatmulVectorSizes,
) -> Result<Self::Config, MatmulSetupError>;
fn num_stages() -> NumStages;
#[allow(clippy::too_many_arguments)]
unsafe fn launch_unchecked<MA: MatmulArgs<Config = RC>, R: Runtime>(
client: &ComputeClient<R>,
ruda_dim: RudaDim,
ruda_count: RudaCount,
address_type: AddressType,
input: InputRuntimeArg<MA, R>,
output: OutputRuntimeArg<MA, R>,
config: ConfigRuntimeArg<MA, R>,
ruda_mapping: RudaMappingLaunch<R>,
blueprint: Self::Blueprint,
dtypes: &MatmulElems,
vector_sizes: &MatmulVectorSizes,
) -> Result<(), LaunchError>;
#[allow(clippy::too_many_arguments)]
fn prepare_kernel<MA: MatmulArgs<Config = RC>, R: Runtime>(
_client: &ComputeClient<R>, _ruda_dim: RudaDim, _ruda_count: RudaCount,
_address_type: AddressType, _input: InputRuntimeArg<MA, R>,
_output: OutputRuntimeArg<MA, R>, _config: ConfigRuntimeArg<MA, R>,
_mapping: RudaMappingLaunch<R>, _blueprint: Self::Blueprint,
_dtypes: &MatmulElems, _vectors: &MatmulVectorSizes,
) -> Option<PreparedKernel<R>> { None }
fn rudadim_resource(
blueprint: &Self::Blueprint,
dtypes: &MatmulElems,
vector_sizes: &MatmulVectorSizes,
) -> Result<RudaDimResource, MatmulSetupError>;
fn validate_blueprint<R: Runtime>(
client: &ComputeClient<R>,
blueprint: &Self::Blueprint,
problem: &MatmulProblem,
dtypes: &MatmulElems,
vector_sizes: &MatmulVectorSizes,
) -> Result<(), MatmulSetupError>;
}
#[ruda]
pub trait BatchMatmul<RC: RuntimeConfig, MP: MatmulTypes>: 'static + Send + Sync {
type Config: BatchConfig;
fn execute<Args: MatmulArgs<Config = RC>>(
state: &mut Args::State<LhsG<MP>, RhsG<MP>, AccG<MP>>,
ruda_mapping: RudaMapping,
#[comptime] config: Self::Config,
);
}
pub trait BatchConfig:
Copy + Clone + Eq + PartialEq + Hash + Debug + Send + Sync + 'static
{
fn lhs_global_layout_config(&self) -> GlobalLayoutConfig;
fn rhs_global_layout_config(&self) -> GlobalLayoutConfig;
fn out_global_layout_config(&self) -> GlobalLayoutConfig;
}
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub enum CheckBounds {
None,
Checked,
Terminate,
}