cu_dorabench/
tasks.rs

1use bincode::de::Decoder;
2use bincode::enc::Encoder;
3use bincode::error::{DecodeError, EncodeError};
4use bincode::{Decode, Encode};
5use cu29::prelude::*;
6use serde::Serializer;
7use std::sync::Arc;
8
9pub struct DoraSource<const S: usize> {
10    pub pool: Arc<CuHostMemoryPool<Vec<u8>>>,
11}
12
13impl<const S: usize> Freezable for DoraSource<S> {}
14
15impl<const S: usize> CuSrcTask for DoraSource<S> {
16    type Output<'m> = output_msg!(DoraPayload);
17
18    fn new(_config: Option<&ComponentConfig>) -> CuResult<Self>
19    where
20        Self: Sized,
21    {
22        let pool = CuHostMemoryPool::new("dummybuffers", 3, || vec![0u8; S])?;
23        Ok(Self { pool })
24    }
25
26    fn process(&mut self, clock: &RobotClock, new_msg: &mut Self::Output<'_>) -> CuResult<()> {
27        new_msg.tov = Tov::Time(clock.now());
28        let buffer = self.pool.acquire().unwrap();
29        buffer.lock().unwrap()[42] = 42;
30        new_msg.set_payload(DoraPayload(buffer));
31        Ok(())
32    }
33}
34
35pub struct DoraSink<const S: usize> {}
36
37impl<const S: usize> Freezable for DoraSink<S> {}
38
39impl<const S: usize> CuSinkTask for DoraSink<S> {
40    type Input<'m> = input_msg!(DoraPayload);
41
42    fn new(_config: Option<&ComponentConfig>) -> CuResult<Self>
43    where
44        Self: Sized,
45    {
46        Ok(Self {})
47    }
48
49    fn process(&mut self, _clock: &RobotClock, input: &Self::Input<'_>) -> CuResult<()> {
50        let incoming = input.payload().unwrap();
51        assert_eq!(incoming.0.lock().unwrap()[42], 42);
52        Ok(())
53    }
54}
55
56// select a specific case
57const FORTY_MEG: usize = 40 * 1024 * 1024;
58
59#[allow(dead_code)]
60pub type FortyMegSrc = DoraSource<FORTY_MEG>;
61
62#[allow(dead_code)]
63pub type FortyMegSink = DoraSink<FORTY_MEG>;
64
65#[derive(Default, Debug, Clone)]
66pub struct DoraPayload(CuHandle<Vec<u8>>);
67
68impl Decode<()> for DoraPayload {
69    fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, DecodeError> {
70        let handle = CuHandle::<Vec<u8>>::decode(decoder)?;
71        Ok(DoraPayload(handle))
72    }
73}
74
75impl Encode for DoraPayload {
76    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
77        self.0.encode(encoder)
78    }
79}
80
81impl Serialize for DoraPayload {
82    fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
83    where
84        S: Serializer,
85    {
86        // Not needed for this benchmark.
87        todo!()
88    }
89}