LCOV - code coverage report
Current view: top level - src/Module/Stateful/Incrementer - Incrementer.cpp (source / functions) Hit Total Coverage
Test: streampu_clean.info Lines: 42 53 79.2 %
Date: 2025-01-11 12:25:42 Functions: 7 90 7.8 %

          Line data    Source code
       1             : #include <chrono>
       2             : #include <sstream>
       3             : 
       4             : #include "Module/Stateful/Incrementer/Incrementer.hpp"
       5             : 
       6             : using namespace spu;
       7             : using namespace spu::module;
       8             : 
       9             : template<typename T>
      10         523 : Incrementer<T>::Incrementer(const size_t n_elmts, const size_t ns)
      11             :   : Stateful()
      12         523 :   , n_elmts(n_elmts)
      13         523 :   , ns(ns)
      14             : {
      15         523 :     const std::string name = "Incrementer";
      16         523 :     this->set_name(name);
      17         523 :     this->set_short_name(name);
      18             : 
      19         523 :     if (n_elmts == 0)
      20             :     {
      21           0 :         std::stringstream message;
      22           0 :         message << "'n_elmts' has to be greater than 0 ('n_elmts' = " << n_elmts << ").";
      23           0 :         throw tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
      24           0 :     }
      25             : 
      26         523 :     auto& p1 = this->create_task("increment");
      27         523 :     auto p1s_in = this->template create_socket_in<T>(p1, "in", this->n_elmts);
      28         523 :     auto p1s_out = this->template create_socket_out<T>(p1, "out", this->n_elmts);
      29         523 :     this->create_codelet(
      30             :       p1,
      31     4191850 :       [p1s_in, p1s_out](Module& m, runtime::Task& t, const size_t frame_id) -> int
      32             :       {
      33     2097233 :           auto& inc = static_cast<Incrementer&>(m);
      34     2097233 :           inc._increment(t[p1s_in].template get_dataptr<const T>(), t[p1s_out].template get_dataptr<T>(), frame_id);
      35     2099323 :           return runtime::status_t::SUCCESS;
      36             :       });
      37             : 
      38         523 :     auto& p2 = this->create_task("incrementf");
      39         523 :     auto p2s_fwd = this->template create_socket_fwd<T>(p2, "fwd", this->n_elmts);
      40         523 :     this->create_codelet(
      41             :       p2,
      42      646712 :       [p2s_fwd](Module& m, runtime::Task& t, const size_t frame_id) -> int
      43             :       {
      44      323915 :           auto& inc = static_cast<Incrementer&>(m);
      45      323915 :           inc._increment(t[p2s_fwd].template get_dataptr<const T>(), t[p2s_fwd].template get_dataptr<T>(), frame_id);
      46      326752 :           return runtime::status_t::SUCCESS;
      47             :       });
      48         523 : }
      49             : 
      50             : template<typename T>
      51             : Incrementer<T>*
      52       17484 : Incrementer<T>::clone() const
      53             : {
      54       17484 :     auto m = new Incrementer(*this);
      55       17484 :     m->deep_copy(*this);
      56       17484 :     return m;
      57             : }
      58             : 
      59             : template<typename T>
      60             : size_t
      61         324 : Incrementer<T>::get_ns() const
      62             : {
      63         324 :     return this->ns;
      64             : }
      65             : 
      66             : template<typename T>
      67             : size_t
      68           0 : Incrementer<T>::get_n_elmts() const
      69             : {
      70           0 :     return this->n_elmts;
      71             : }
      72             : 
      73             : template<typename T>
      74             : void
      75         523 : Incrementer<T>::set_ns(const size_t ns)
      76             : {
      77         523 :     this->ns = ns;
      78         523 : }
      79             : 
      80             : template<typename T>
      81             : void
      82           0 : Incrementer<T>::increment(const T* in, T* out, const int frame_id, const bool managed_memory)
      83             : {
      84           0 :     (*this)[inc::sck::increment::in].bind(in);
      85           0 :     (*this)[inc::sck::increment::out].bind(out);
      86           0 :     (*this)[inc::tsk::increment].exec(frame_id, managed_memory);
      87           0 : }
      88             : 
      89             : template<typename T>
      90             : void
      91     2229493 : Incrementer<T>::_increment(const T* in, T* out, const size_t frame_id)
      92             : {
      93     2229493 :     std::chrono::time_point<std::chrono::steady_clock> t_start;
      94     2229493 :     if (this->ns) t_start = std::chrono::steady_clock::now();
      95             : 
      96  1433484414 :     for (size_t e = 0; e < this->n_elmts; e++)
      97  1431189296 :         out[e] = in[e] + 1;
      98             : 
      99     2295118 :     if (this->ns)
     100             :     {
     101     2298013 :         std::chrono::nanoseconds duration = std::chrono::steady_clock::now() - t_start;
     102     3131126 :         while ((size_t)duration.count() < this->ns) // active waiting
     103      725882 :             duration = std::chrono::steady_clock::now() - t_start;
     104             :     }
     105     2426505 : }
     106             : 
     107             : // ==================================================================================== explicit template instantiation
     108             : template class spu::module::Incrementer<int8_t>;
     109             : template class spu::module::Incrementer<uint8_t>;
     110             : template class spu::module::Incrementer<int16_t>;
     111             : template class spu::module::Incrementer<uint16_t>;
     112             : template class spu::module::Incrementer<int32_t>;
     113             : template class spu::module::Incrementer<uint32_t>;
     114             : template class spu::module::Incrementer<int64_t>;
     115             : template class spu::module::Incrementer<uint64_t>;
     116             : template class spu::module::Incrementer<float>;
     117             : template class spu::module::Incrementer<double>;
     118             : // ==================================================================================== explicit template instantiation

Generated by: LCOV version 1.14