use crate::common::error::AicError;
use crate::operators::attention::query_mem_op;
use crate::operators::base::PerformanceResult;
use crate::perf_database::PerfDatabase;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ElementwiseOp {
pub name: String,
pub scale_factor: f64,
pub bytes_per_token: f64,
#[serde(default = "crate::operators::gemm::default_seq_split")]
pub scale_num_tokens: u32,
#[serde(default = "crate::operators::gemm::default_seq_split")]
pub seq_split: u32,
}
impl ElementwiseOp {
pub fn new(name: impl Into<String>, bytes_per_token: f64) -> Self {
Self {
name: name.into(),
scale_factor: 1.0,
bytes_per_token,
scale_num_tokens: 1,
seq_split: 1,
}
}
pub fn query(&self, db: &PerfDatabase, num_tokens: u32) -> Result<PerformanceResult, AicError> {
let num_tokens = num_tokens / self.scale_num_tokens.max(1);
let num_tokens = num_tokens.div_ceil(self.seq_split.max(1)); let bytes = self.bytes_per_token * (num_tokens as f64);
Ok(query_mem_op(db, bytes).scaled(self.scale_factor))
}
}