cubek_convolution/kernels/backward_data/selector/
select_kernel.rs1use crate::{
2 backward_data::args::{ConcreteArgs, ConcreteInputsFactory, ConcreteOutputFactory},
3 components::{ConvSetupError, ConvolutionProblem, global::args::RuntimeArgs},
4};
5use cubecl::{client::Client, prelude::TensorBinding};
6use cubek_matmul::{
7 definition::{AccumulatorOperand, MatmulElems, MatmulVectorSizes},
8 multi_level::{
9 BatchMatmulRoutine,
10 args::{InputArg, OutputArg},
11 },
12 routine::BlueprintStrategy,
13};
14use cubek_std::InputBinding;
15
16#[allow(clippy::result_large_err, clippy::too_many_arguments)]
20pub fn launch_kernel_concrete<Args: ConcreteArgs<A>, A: BatchMatmulRoutine<RuntimeArgs>>(
21 client: &Client,
22 out_grad: InputBinding,
23 weights: InputBinding,
24 in_grad: TensorBinding,
25 problem: ConvolutionProblem,
26 vector_sizes: MatmulVectorSizes,
27 blueprint_strategy: &BlueprintStrategy<RuntimeArgs, A>,
28 dtypes: &MatmulElems,
29) -> Result<(), ConvSetupError> {
30 let mut view_vector_sizes = vector_sizes;
31
32 if let InputBinding::Quantized { scheme, .. } = out_grad {
33 view_vector_sizes.lhs *= scheme.num_quants();
34 }
35 if let InputBinding::Quantized { scheme, .. } = weights {
36 view_vector_sizes.rhs *= scheme.num_quants();
37 }
38
39 let device_settings = A::device_settings(client, view_vector_sizes);
40 let expand_info = A::expand_blueprint(
41 &problem.as_matmul_problem(AccumulatorOperand::Absent),
42 &device_settings,
43 blueprint_strategy,
44 )?;
45
46 let problem = Args::adjust_problem(client, problem, &expand_info.blueprint, dtypes);
47 let launch_info = A::prepare(
48 &problem.as_matmul_problem(AccumulatorOperand::Absent),
49 &device_settings,
50 expand_info,
51 )?;
52
53 let (input, runtime_args) = <InputArg<Args> as ConcreteInputsFactory<A>>::create(
54 out_grad,
55 weights,
56 &launch_info.blueprint,
57 &problem,
58 dtypes,
59 );
60 let output = <OutputArg<Args> as ConcreteOutputFactory<A>>::create(
61 in_grad,
62 &launch_info.blueprint,
63 &problem,
64 );
65
66 let result = cubek_matmul::multi_level::launch_kernel::<Args, A>(
67 client,
68 input,
69 output,
70 runtime_args,
71 launch_info,
72 );
73
74 result.map_err(ConvSetupError::Matmul)
75}