finally fast googlenet with correct latency artifacts for fair comparison
Validate Operations / validate-operations (push) Has been cancelled
Validate Operations / validate-operations (push) Has been cancelled
This commit is contained in:
@@ -16,7 +16,7 @@ use anyhow::{Context, Result, ensure};
|
||||
use rayon::prelude::*;
|
||||
|
||||
use paste::paste;
|
||||
use std::{borrow::Cow, cell::OnceCell, collections::HashMap };
|
||||
use std::{borrow::Cow, cell::OnceCell, collections::HashMap, mem::size_of};
|
||||
use std::{collections::HashSet, sync::LazyLock};
|
||||
|
||||
macro_rules! add_name {
|
||||
@@ -170,8 +170,6 @@ macro_rules! add_simd_to_map {
|
||||
tmp.insert((32_usize,64_usize), ([<$id _impl>]::<f32, f64> as InstructionType));
|
||||
tmp.insert((64_usize,32_usize), ([<$id _impl>]::<f64, f32> as InstructionType));
|
||||
tmp.insert((64_usize,64_usize), ([<$id _impl>]::<f64, f64> as InstructionType));
|
||||
//TODO WTF WHY
|
||||
tmp.insert((8_usize,8_usize), ([<$id _impl>]::<f32, f32> as InstructionType));
|
||||
$storage.insert($id as *const () as usize, tmp);
|
||||
|
||||
}
|
||||
@@ -224,6 +222,14 @@ pub fn is_setbw(functor: InstructionType) -> bool {
|
||||
functor as usize == setbw as *const () as usize
|
||||
}
|
||||
|
||||
fn vector_lengths<F>(imm_len: i32) -> Result<(usize, usize)> {
|
||||
let element_count: usize = imm_len.try_into().context("imm_len can not be negative")?;
|
||||
let byte_len = element_count
|
||||
.checked_mul(size_of::<F>())
|
||||
.context("vector byte length overflow")?;
|
||||
Ok((element_count, byte_len))
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
pub fn setbw(cores: &mut CPU, data: InstructionData) -> Result<InstructionStatus> {
|
||||
panic!("You are calling a placeholder, this instruction is resolved in the construction phase");
|
||||
@@ -361,11 +367,11 @@ where
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_val = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let imm_len: usize = imm_len.try_into().context("imm_len can not be negative")?;
|
||||
let (element_count, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
|
||||
let loads = core
|
||||
.reserve_load(r1_val, imm_len)?
|
||||
.reserve_load(r2_val, imm_len)?
|
||||
.reserve_load(r1_val, byte_len)?
|
||||
.reserve_load(r2_val, byte_len)?
|
||||
.execute_load::<F>()?;
|
||||
let (load1, load2) = (loads[0], loads[1]);
|
||||
let res: Vec<F> = load1
|
||||
@@ -374,7 +380,7 @@ where
|
||||
.map(|(&a, &b)| a + b)
|
||||
.collect();
|
||||
ensure!(
|
||||
imm_len / size_of::<F>() == res.len(),
|
||||
element_count == res.len(),
|
||||
"vvadd generate a vector bigger thant it's requested elements"
|
||||
);
|
||||
let res_up: Cow<[T]> = res.as_slice().up();
|
||||
@@ -405,11 +411,11 @@ where
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_val = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let imm_len: usize = imm_len.try_into().context("imm_len can not be negative")?;
|
||||
let (element_count, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
|
||||
let loads = core
|
||||
.reserve_load(r1_val, imm_len)?
|
||||
.reserve_load(r2_val, imm_len)?
|
||||
.reserve_load(r1_val, byte_len)?
|
||||
.reserve_load(r2_val, byte_len)?
|
||||
.execute_load::<F>()?;
|
||||
let (load1, load2) = (loads[0], loads[1]);
|
||||
let res: Vec<F> = load1
|
||||
@@ -418,7 +424,7 @@ where
|
||||
.map(|(&a, &b)| a - b)
|
||||
.collect();
|
||||
ensure!(
|
||||
imm_len / size_of::<F>() == res.len(),
|
||||
element_count == res.len(),
|
||||
"vvadd generate a vector bigger thant it's requested elements"
|
||||
);
|
||||
let res_up: Cow<[T]> = res.as_slice().up();
|
||||
@@ -447,10 +453,10 @@ where
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_val = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let imm_len: usize = imm_len.try_into().context("imm_len can not be negative")?;
|
||||
let (element_count, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core
|
||||
.reserve_load(r1_val, imm_len)?
|
||||
.reserve_load(r2_val, imm_len)?
|
||||
.reserve_load(r1_val, byte_len)?
|
||||
.reserve_load(r2_val, byte_len)?
|
||||
.execute_load::<F>()?;
|
||||
let (load1, load2) = (loads[0], loads[1]);
|
||||
let res: Vec<F> = load1
|
||||
@@ -459,7 +465,7 @@ where
|
||||
.map(|(&a, &b)| a * b)
|
||||
.collect();
|
||||
ensure!(
|
||||
imm_len / size_of::<F>() == res.len(),
|
||||
element_count == res.len(),
|
||||
"vvadd generate a vector bigger thant it's requested elements"
|
||||
);
|
||||
let res_up: Cow<[T]> = res.as_slice().up();
|
||||
@@ -488,9 +494,10 @@ where
|
||||
let rd_val = core.register(rd);
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_val = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core
|
||||
.reserve_load(r1_val, imm_len)?
|
||||
.reserve_load(r2_val, imm_len)?
|
||||
.reserve_load(r1_val, byte_len)?
|
||||
.reserve_load(r2_val, byte_len)?
|
||||
.execute_load::<F>()?;
|
||||
let (load1, load2) = (loads[0], loads[1]);
|
||||
let res: [F; 1] = [load1
|
||||
@@ -527,10 +534,11 @@ where
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_val = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
|
||||
let loads = core
|
||||
.reserve_load(r1_val, imm_len)?
|
||||
.reserve_load(r2_val, imm_len)?
|
||||
.reserve_load(r1_val, byte_len)?
|
||||
.reserve_load(r2_val, byte_len)?
|
||||
.execute_load::<F>()?;
|
||||
let (load1, load2) = (loads[0], loads[1]);
|
||||
let res: Vec<F> = load1
|
||||
@@ -583,7 +591,8 @@ where
|
||||
"Offset select cannot be different from 1"
|
||||
);
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let loads = core.reserve_load(r1_val, imm_len)?.execute_load::<F>()?;
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core.reserve_load(r1_val, byte_len)?.execute_load::<F>()?;
|
||||
let load1 = loads[0];
|
||||
let len = load1.len();
|
||||
let res: [F; _] =
|
||||
@@ -613,7 +622,8 @@ where
|
||||
let rd_val = core.register(rd);
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let loads = core.reserve_load(r1_val, imm_len)?.execute_load::<F>()?;
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core.reserve_load(r1_val, byte_len)?.execute_load::<F>()?;
|
||||
let load1 = loads[0];
|
||||
let res: Vec<F> = load1
|
||||
.iter()
|
||||
@@ -646,7 +656,8 @@ where
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
|
||||
let loads = core.reserve_load(r1_val, imm_len)?.execute_load::<F>()?;
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core.reserve_load(r1_val, byte_len)?.execute_load::<F>()?;
|
||||
let load1 = loads[0];
|
||||
let res: Vec<F> = load1.iter().map(|&a| a.tanh()).collect();
|
||||
|
||||
@@ -675,7 +686,8 @@ where
|
||||
let rd_val = core.register(rd);
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let loads = core.reserve_load(r1_val, imm_len)?.execute_load::<F>()?;
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core.reserve_load(r1_val, byte_len)?.execute_load::<F>()?;
|
||||
let load1 = loads[0];
|
||||
let res: Vec<F> = load1.iter().map(|&a| a.sigm()).collect();
|
||||
let res_up: Cow<[T]> = res.as_slice().up();
|
||||
@@ -706,7 +718,8 @@ where
|
||||
let rd_val = core.register(rd);
|
||||
let r1_val = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let rd_val = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let loads = core.reserve_load(r1_val, imm_len)?.execute_load::<F>()?;
|
||||
let (_, byte_len) = vector_lengths::<F>(imm_len)?;
|
||||
let loads = core.reserve_load(r1_val, byte_len)?.execute_load::<F>()?;
|
||||
let load1 = loads[0];
|
||||
ensure!(!load1.is_empty(), "vsoftmax does not support empty vectors");
|
||||
let max_val = load1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::{tracing::trace::pretty_print, utility::add_offset_r2};
|
||||
use std::fs::File;
|
||||
use std::{fs::File, mem::size_of};
|
||||
|
||||
use crate::{
|
||||
cpu::CPU,
|
||||
@@ -381,7 +381,15 @@ impl Trace {
|
||||
writeln!(file, "\trs1({}): {}", r1, r1_val);
|
||||
writeln!(file, "\trs2({}): {}", r2, r2_val);
|
||||
writeln!(file, "{} Immediate:", prefix);
|
||||
writeln!(file, "\tLoad Length: {} bytes", imm_len);
|
||||
let element_count: usize = imm_len.try_into().expect("imm_len can not be negative");
|
||||
let byte_len = element_count
|
||||
.checked_mul(size_of::<F>())
|
||||
.expect("vector byte length overflow");
|
||||
writeln!(
|
||||
file,
|
||||
"\tLoad Length: {} elements ({} bytes)",
|
||||
element_count, byte_len
|
||||
);
|
||||
writeln!(
|
||||
file,
|
||||
"\toffset_select: {} offset_value: {}",
|
||||
@@ -390,22 +398,21 @@ impl Trace {
|
||||
let r1_final = add_offset_r1(r1_val, offset_select, offset_value);
|
||||
let r2_final = add_offset_r2(r2_val, offset_select, offset_value);
|
||||
let rd_final = add_offset_rd(rd_val, offset_select, offset_value);
|
||||
let imm_len: usize = imm_len.try_into().expect("imm_len can not be negative");
|
||||
let loads = core
|
||||
.reserve_load(r1_final, imm_len)
|
||||
.reserve_load(r1_final, byte_len)
|
||||
.unwrap()
|
||||
.reserve_load(r2_final, imm_len)
|
||||
.reserve_load(r2_final, byte_len)
|
||||
.unwrap()
|
||||
.reserve_load(rd_final, imm_len)
|
||||
.reserve_load(rd_final, byte_len)
|
||||
.unwrap()
|
||||
.execute_load::<F>()
|
||||
.unwrap();
|
||||
writeln!(file, "{} Memory:", prefix);
|
||||
write!(file, "\tLocal[{}:{}](A): ", r1_final, r1_final + imm_len);
|
||||
write!(file, "\tLocal[{}:{}](A): ", r1_final, r1_final + byte_len);
|
||||
pretty_print::print_slice::<_,f32>(file, loads[0], 30);
|
||||
write!(file, "\tLocal[{}:{}](B): ", r2_final , r2_final + imm_len);
|
||||
write!(file, "\tLocal[{}:{}](B): ", r2_final , r2_final + byte_len);
|
||||
pretty_print::print_slice::<_,f32>(file, loads[1], 30);
|
||||
write!(file, "\tLocal[{}:{}](out): ", rd_final, rd_final+ imm_len);
|
||||
write!(file, "\tLocal[{}:{}](out): ", rd_final, rd_final+ byte_len);
|
||||
pretty_print::print_slice::<_,f32>(file, loads[2], 30);
|
||||
if prefix == "Post" {
|
||||
writeln!(file, "\n###############################################\n");
|
||||
|
||||
@@ -25,7 +25,7 @@ fn wrong_size_place_holder() {
|
||||
vvadd,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<f32>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -33,6 +33,25 @@ fn wrong_size_place_holder() {
|
||||
executable.execute();
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "Function not found for the requested size input:8 output:8")]
|
||||
fn unsupported_8_bit_vectors_do_not_alias_f32() {
|
||||
let mut inst_builder = InstructionsBuilder::new();
|
||||
let mut idata_build = InstructionDataBuilder::new();
|
||||
idata_build.set_core_indx(0).fix_core_indx();
|
||||
inst_builder.make_inst(
|
||||
setbw,
|
||||
idata_build.set_ibiw_obiw(8, 8).build(),
|
||||
);
|
||||
inst_builder.make_inst(
|
||||
vvadd,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
fn place_holder(inst : InstructionType) {
|
||||
|
||||
@@ -55,7 +55,7 @@ where
|
||||
vvadd,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -159,7 +159,7 @@ where
|
||||
vvsub,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -263,7 +263,7 @@ where
|
||||
vvmul,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -367,7 +367,7 @@ where
|
||||
vvdmul,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -464,7 +464,7 @@ where
|
||||
vvmax,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 2)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -565,7 +565,7 @@ where
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 1)
|
||||
.set_offset_select(1)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -658,7 +658,7 @@ where
|
||||
vrelu,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 1)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -758,7 +758,7 @@ where
|
||||
vtanh,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 1)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
@@ -860,7 +860,7 @@ where
|
||||
vsigm,
|
||||
idata_build
|
||||
.set_rdr1r2(3, 1, 1)
|
||||
.set_imm_len(8 * size_of::<F>() as i32)
|
||||
.set_imm_len(8)
|
||||
.build(),
|
||||
);
|
||||
let core_instruction = vec![inst_builder.build().into()];
|
||||
|
||||
Reference in New Issue
Block a user