use crate::errors::InstructionModelError;
use crate::instructions::Instruction;
pub struct ElemWiseBuffersMulInstruction {
input_ptrs: Vec<usize>,
output_ptr: usize,
data_size: usize,
}
impl ElemWiseBuffersMulInstruction {
pub fn new(input_ptrs: Vec<usize>, output_ptr: usize, data_size: usize) -> Self {
Self {
input_ptrs,
output_ptr,
data_size,
}
}
}
impl Instruction for ElemWiseBuffersMulInstruction {
fn output_ptr(&self) -> usize {
self.output_ptr
}
fn data_size(&self) -> usize {
self.data_size
}
fn apply(&self, unified_computation_buffer: &mut [f32]) -> Result<(), InstructionModelError> {
if self.input_ptrs.len() < 2 {
return Err(InstructionModelError::InsufficientInputBuffers);
}
if self.input_ptrs.len() == 2 {
let input1_start = self.input_ptrs[0];
let input2_start = self.input_ptrs[1];
let output_start = self.output_ptr;
for i in 0..self.data_size {
unified_computation_buffer[output_start + i] = unified_computation_buffer
[input1_start + i]
* unified_computation_buffer[input2_start + i];
}
} else {
for i in 0..self.data_size {
let mut product = unified_computation_buffer[self.input_ptrs[0] + i];
for &input_ptr in &self.input_ptrs[1..] {
product *= unified_computation_buffer[input_ptr + i];
}
unified_computation_buffer[self.output_ptr + i] = product;
}
}
Ok(())
}
}