use hpt_common::Pointer;
use hpt_traits::tensor::CommonBounds;
pub trait MatmulMicroKernel
where
Self: CommonBounds + Sized,
{
#[allow(unused_variables)]
fn get_kernel(
nr: usize,
mr: usize,
) -> fn(Pointer<Self>, Pointer<Self>, Pointer<Self>, i64, i64, usize, usize, i64, bool) {
#[cfg(target_feature = "avx2")]
{
use crate::define_matmul_micro_kernel;
assert_eq!(nr, 2);
define_matmul_micro_kernel!(x2x1, 2, 1);
define_matmul_micro_kernel!(x2x2, 2, 2);
define_matmul_micro_kernel!(x2x3, 2, 3);
define_matmul_micro_kernel!(x2x4, 2, 4);
define_matmul_micro_kernel!(x2x5, 2, 5);
define_matmul_micro_kernel!(x2x6, 2, 6);
return [x2x1, x2x2, x2x3, x2x4, x2x5, x2x6][mr - 1];
}
#[cfg(all(not(target_feature = "avx2"), target_feature = "sse"))]
{
use crate::define_matmul_micro_kernel;
assert_eq!(nr, 4);
define_matmul_micro_kernel!(x4x1, 4, 1);
define_matmul_micro_kernel!(x4x2, 4, 2);
define_matmul_micro_kernel!(x4x3, 4, 3);
return [x4x1, x4x2, x4x3][mr - 1];
}
#[cfg(target_feature = "neon")]
{
use crate::define_matmul_micro_kernel;
assert_eq!(nr, 8);
define_matmul_micro_kernel!(x8x1, 8, 1);
define_matmul_micro_kernel!(x8x2, 8, 2);
return [x8x1, x8x2][mr - 1];
}
#[cfg(all(
not(target_feature = "avx2"),
not(target_feature = "sse"),
not(target_feature = "neon")
))]
{
unimplemented!()
}
}
#[allow(unused_variables)]
fn get_kernel_with_post_op<F: Fn(Self) -> Self, G: Fn(Self::Vec) -> Self::Vec>(
nr: usize,
mr: usize,
) -> fn(
Pointer<Self>,
Pointer<Self>,
Pointer<Self>,
i64,
i64,
usize,
usize,
i64,
bool,
bool,
F,
G,
) {
#[cfg(target_feature = "avx2")]
{
use crate::define_post_op_matmul_micro_kernel;
assert_eq!(nr, 2);
define_post_op_matmul_micro_kernel!(x2x1, 2, 1);
define_post_op_matmul_micro_kernel!(x2x2, 2, 2);
define_post_op_matmul_micro_kernel!(x2x3, 2, 3);
define_post_op_matmul_micro_kernel!(x2x4, 2, 4);
define_post_op_matmul_micro_kernel!(x2x5, 2, 5);
define_post_op_matmul_micro_kernel!(x2x6, 2, 6);
return [x2x1, x2x2, x2x3, x2x4, x2x5, x2x6][mr - 1];
}
#[cfg(all(not(target_feature = "avx2"), target_feature = "sse"))]
{
use crate::define_post_op_matmul_micro_kernel;
assert_eq!(nr, 4);
define_post_op_matmul_micro_kernel!(x4x1, 4, 1);
define_post_op_matmul_micro_kernel!(x4x2, 4, 2);
define_post_op_matmul_micro_kernel!(x4x3, 4, 3);
return [x4x1, x4x2, x4x3][mr - 1];
}
#[cfg(target_feature = "neon")]
{
use crate::define_post_op_matmul_micro_kernel;
assert_eq!(nr, 8);
define_post_op_matmul_micro_kernel!(x8x1, 8, 1);
define_post_op_matmul_micro_kernel!(x8x2, 8, 2);
return [x8x1, x8x2][mr - 1];
}
#[cfg(all(
not(target_feature = "avx2"),
not(target_feature = "sse"),
not(target_feature = "neon")
))]
{
unimplemented!()
}
}
#[allow(unused_variables)]
fn get_mixed_precision_kernel<MixedType>(
nr: usize,
mr: usize,
) -> fn(
Pointer<MixedType>,
Pointer<MixedType>,
Pointer<Self>,
i64,
i64,
usize,
usize,
i64,
bool,
fn(*const MixedType::Vec) -> Self::Vec,
fn(MixedType) -> Self,
)
where
MixedType: CommonBounds,
{
unimplemented!("mixed precision kernel is required for user to implement")
}
#[allow(unused_variables)]
fn get_mixed_precision_kernel_with_post_op<
MixedType,
F: Fn(Self) -> Self,
G: Fn(Self::Vec) -> Self::Vec,
>(
nr: usize,
mr: usize,
) -> fn(
Pointer<MixedType>,
Pointer<MixedType>,
Pointer<Self>,
i64,
i64,
usize,
usize,
i64,
bool,
bool,
fn(*const MixedType::Vec) -> Self::Vec,
fn(MixedType) -> Self,
F,
G,
)
where
MixedType: CommonBounds,
{
unimplemented!("mixed precision kernel is required for user to implement")
}
fn get_max_mixed_precision_mr() -> usize {
unimplemented!()
}
fn get_max_mixed_precision_nr() -> usize {
unimplemented!()
}
fn get_max_mr() -> usize {
#[cfg(target_feature = "avx2")]
{
6
}
#[cfg(all(not(target_feature = "avx2"), target_feature = "sse"))]
{
3
}
#[cfg(target_feature = "neon")]
{
2
}
#[cfg(all(
not(target_feature = "avx2"),
not(target_feature = "sse"),
not(target_feature = "neon")
))]
{
unimplemented!()
}
}
fn get_max_nr() -> usize {
#[cfg(target_feature = "avx2")]
{
2
}
#[cfg(all(not(target_feature = "avx2"), target_feature = "sse"))]
{
4
}
#[cfg(target_feature = "neon")]
{
8
}
#[cfg(all(
not(target_feature = "avx2"),
not(target_feature = "sse"),
not(target_feature = "neon")
))]
{
unimplemented!()
}
}
}