cubecl_core/frontend/
subcube.rsuse super::{CubeContext, CubePrimitive, ExpandElement};
use crate::prelude::ExpandElementTyped;
use crate::{
ir::{Elem, InitOperator, Item, Operation, Subcube, UnaryOperator},
unexpanded,
};
pub fn subcube_elect() -> bool {
unexpanded!()
}
pub mod subcube_elect {
use super::*;
pub fn expand(context: &mut CubeContext) -> ExpandElementTyped<bool> {
let output = context.create_local_binding(Item::new(Elem::Bool));
let out = *output;
context.register(Operation::Subcube(Subcube::Elect(InitOperator { out })));
output.into()
}
}
#[allow(unused_variables)]
pub fn subcube_broadcast<E: CubePrimitive>(value: E, index: u32) -> E {
unexpanded!()
}
pub mod subcube_broadcast {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
value: ExpandElementTyped<E>,
id: ExpandElementTyped<u32>,
) -> ExpandElementTyped<E> {
let output = context.create_local_binding(value.expand.item());
let out = *output;
let lhs = *value.expand;
let rhs = *id.expand;
context.register(Operation::Subcube(Subcube::Broadcast(
crate::ir::BinaryOperator { lhs, rhs, out },
)));
output.into()
}
}
#[allow(unused_variables)]
pub fn subcube_sum<E: CubePrimitive>(value: E) -> E {
unexpanded!()
}
pub mod subcube_sum {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::Sum(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_prod<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_prod {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::Prod(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_max<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_max {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::Max(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_min<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_min {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::Min(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_all(_elem: bool) -> bool {
unexpanded!()
}
pub mod subcube_all {
use super::*;
pub fn expand(
context: &mut CubeContext,
elem: ExpandElementTyped<bool>,
) -> ExpandElementTyped<bool> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::All(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_any(_elem: bool) -> bool {
unexpanded!()
}
pub mod subcube_any {
use super::*;
pub fn expand(
context: &mut CubeContext,
elem: ExpandElementTyped<bool>,
) -> ExpandElementTyped<bool> {
let elem: ExpandElement = elem.into();
let output = context.create_local_binding(elem.item());
let out = *output;
let input = *elem;
context.register(Operation::Subcube(Subcube::Any(UnaryOperator {
input,
out,
})));
output.into()
}
}