use burn_tensor::ops::{ConvOptions, ConvTransposeOptions};
use crate::{
kernel::conv::ConvLaunchError, tensor::JitTensor, FloatElement, IntElement, JitRuntime,
};
#[cfg(feature = "autotune")]
use super::{conv2d_autotune, conv_transpose2d_autotune};
use super::{
conv2d_direct, conv2d_im2col, conv_transpose2d_col2im, conv_transpose2d_direct,
gemm::launch::conv2d_gemm_cmma_large_m, implicit_gemm::conv2d_implicit_gemm,
};
pub enum Conv2dStrategy {
Direct,
#[cfg(feature = "autotune")]
Autotune,
Gemm,
ImplicitGemm,
ImplicitGemmComplex,
}
impl Default for Conv2dStrategy {
fn default() -> Self {
#[cfg(feature = "autotune")]
return Conv2dStrategy::Autotune;
#[cfg(not(feature = "autotune"))]
Conv2dStrategy::Direct
}
}
pub enum ConvTranspose2dStrategy {
Direct,
#[cfg(feature = "autotune")]
Autotune,
Gemm,
}
impl Default for ConvTranspose2dStrategy {
fn default() -> Self {
#[cfg(feature = "autotune")]
return ConvTranspose2dStrategy::Autotune;
#[cfg(not(feature = "autotune"))]
ConvTranspose2dStrategy::Direct
}
}
pub fn conv2d<R: JitRuntime, E: FloatElement>(
input: JitTensor<R>,
weight: JitTensor<R>,
bias: Option<JitTensor<R>>,
options: ConvOptions<2>,
strategy: Conv2dStrategy,
) -> Result<JitTensor<R>, ConvLaunchError> {
match strategy {
Conv2dStrategy::Direct => conv2d_direct::<R, E>(input, weight, bias, options),
#[cfg(feature = "autotune")]
Conv2dStrategy::Autotune => Ok(conv2d_autotune::<R, E>(input, weight, bias, options)),
Conv2dStrategy::Gemm => conv2d_im2col::<R, E>(input, weight, bias, options),
Conv2dStrategy::ImplicitGemm => conv2d_implicit_gemm::<R, E>(input, weight, bias, options),
Conv2dStrategy::ImplicitGemmComplex => {
conv2d_gemm_cmma_large_m::<R, E>(input, weight, bias, options)
}
}
}
pub fn conv_transpose2d<R: JitRuntime, E: FloatElement, I: IntElement>(
input: JitTensor<R>,
weight: JitTensor<R>,
bias: Option<JitTensor<R>>,
options: ConvTransposeOptions<2>,
strategy: ConvTranspose2dStrategy,
) -> Result<JitTensor<R>, ConvLaunchError> {
match strategy {
ConvTranspose2dStrategy::Direct => {
conv_transpose2d_direct::<R, E>(input, weight, bias, options)
}
#[cfg(feature = "autotune")]
ConvTranspose2dStrategy::Autotune => Ok(conv_transpose2d_autotune::<R, E>(
input, weight, bias, options,
)),
ConvTranspose2dStrategy::Gemm => {
conv_transpose2d_col2im::<R, E>(input, weight, bias, options)
}
}
}