LCOV - code coverage report
Current view: top level - src/Module/Stateful/Initializer - Initializer.cpp (source / functions) Hit Total Coverage
Test: streampu_clean.info Lines: 35 70 50.0 %
Date: 2025-01-11 12:25:42 Functions: 6 100 6.0 %

          Line data    Source code
       1             : #include <algorithm>
       2             : #include <chrono>
       3             : #include <sstream>
       4             : #include <string>
       5             : #include <thread>
       6             : 
       7             : #include "Module/Stateful/Initializer/Initializer.hpp"
       8             : 
       9             : using namespace spu;
      10             : using namespace spu::module;
      11             : 
      12             : template<typename T>
      13         117 : Initializer<T>::Initializer(const size_t n_elmts)
      14             :   : Stateful()
      15         117 :   , init_data(this->get_n_frames(), std::vector<T>(n_elmts, 0))
      16             : {
      17         117 :     const std::string name = "Initializer";
      18         117 :     this->set_name(name);
      19         117 :     this->set_short_name(name);
      20             : 
      21         117 :     if (n_elmts == 0)
      22             :     {
      23           0 :         std::stringstream message;
      24           0 :         message << "'n_elmts' has to be greater than 0.";
      25           0 :         throw tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
      26           0 :     }
      27             : 
      28         117 :     auto& p = this->create_task("initialize");
      29         117 :     auto ps_out = this->template create_socket_out<T>(p, "out", n_elmts);
      30         117 :     this->create_codelet(p,
      31      298175 :                          [ps_out](Module& m, runtime::Task& t, const size_t frame_id) -> int
      32             :                          {
      33      298175 :                              auto& ini = static_cast<Initializer&>(m);
      34      298175 :                              ini._initialize(t[ps_out].template get_dataptr<T>(), frame_id);
      35      302548 :                              return runtime::status_t::SUCCESS;
      36             :                          });
      37         117 : }
      38             : 
      39             : template<typename T>
      40             : Initializer<T>*
      41        2551 : Initializer<T>::clone() const
      42             : {
      43        2551 :     auto m = new Initializer(*this);
      44        2551 :     m->deep_copy(*this);
      45        2551 :     return m;
      46             : }
      47             : 
      48             : template<typename T>
      49             : const std::vector<std::vector<T>>&
      50           0 : Initializer<T>::get_init_data() const
      51             : {
      52           0 :     return this->init_data;
      53             : }
      54             : 
      55             : template<typename T>
      56             : void
      57           0 : Initializer<T>::set_init_data(const std::vector<T>& init_data)
      58             : {
      59           0 :     if (init_data.size() != this->init_data[0].size())
      60             :     {
      61           0 :         std::stringstream message;
      62           0 :         message << "'init_data.size()' has to be equal to 'this->init_data[0].size()' ('init_data.size()' = "
      63           0 :                 << init_data.size() << ", 'this->init_data[0].size()' = " << this->init_data[0].size() << ").";
      64           0 :         throw tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
      65           0 :     }
      66             : 
      67           0 :     for (auto& ini : this->init_data)
      68           0 :         ini = init_data;
      69           0 : }
      70             : 
      71             : template<typename T>
      72             : void
      73        2551 : Initializer<T>::set_init_data(const std::vector<std::vector<T>>& init_data)
      74             : {
      75        2551 :     if (init_data.size() != this->get_n_frames())
      76             :     {
      77           0 :         std::stringstream message;
      78           0 :         message << "'init_data.size()' has to be equal to 'this->get_n_frames()' ('init_data.size()' = "
      79           0 :                 << init_data.size() << ", 'this->get_n_frames()' = " << this->get_n_frames() << ").";
      80           0 :         throw tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
      81           0 :     }
      82             : 
      83       26716 :     for (size_t f = 0; f < init_data.size(); f++)
      84             :     {
      85       24165 :         if (init_data[f].size() != this->init_data[f].size())
      86             :         {
      87           0 :             std::stringstream message;
      88           0 :             message << "'init_data[f].size()' has to be equal to 'this->init_data[f].size()' ('init_data[f].size()' = "
      89           0 :                     << init_data[f].size() << ", 'this->init_data[f].size()' = " << this->init_data[f].size()
      90           0 :                     << ", 'f' = " << f << ").";
      91           0 :             throw tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
      92           0 :         }
      93       24165 :         this->init_data[f] = init_data[f];
      94             :     }
      95        2551 : }
      96             : 
      97             : template<typename T>
      98             : void
      99           0 : Initializer<T>::set_init_data(const T val)
     100             : {
     101           0 :     for (auto& ini : this->init_data)
     102           0 :         std::fill(ini.begin(), ini.end(), val);
     103           0 : }
     104             : 
     105             : template<typename T>
     106             : void
     107        3706 : Initializer<T>::set_n_frames(const size_t n_frames)
     108             : {
     109        3706 :     const auto old_n_frames = this->get_n_frames();
     110        3706 :     if (old_n_frames != n_frames)
     111             :     {
     112        3706 :         Module::set_n_frames(n_frames);
     113             : 
     114        3706 :         this->init_data.resize(n_frames);
     115       25320 :         for (size_t f = old_n_frames; f < n_frames; f++)
     116       21614 :             this->init_data[f] = this->init_data[0];
     117             :     }
     118        3706 : }
     119             : 
     120             : template<typename T>
     121             : void
     122           0 : Initializer<T>::initialize(T* out, const int frame_id, const bool managed_memory)
     123             : {
     124           0 :     (*this)[ini::sck::initialize::out].bind(out);
     125           0 :     (*this)[ini::tsk::initialize].exec(frame_id, managed_memory);
     126           0 : }
     127             : 
     128             : template<typename T>
     129             : void
     130      297933 : Initializer<T>::_initialize(T* out, const size_t frame_id)
     131             : {
     132      297933 :     std::copy(this->init_data[frame_id].begin(), this->init_data[frame_id].end(), out);
     133      302712 : }
     134             : 
     135             : // ==================================================================================== explicit template instantiation
     136             : template class spu::module::Initializer<int8_t>;
     137             : template class spu::module::Initializer<uint8_t>;
     138             : template class spu::module::Initializer<int16_t>;
     139             : template class spu::module::Initializer<uint16_t>;
     140             : template class spu::module::Initializer<int32_t>;
     141             : template class spu::module::Initializer<uint32_t>;
     142             : template class spu::module::Initializer<int64_t>;
     143             : template class spu::module::Initializer<uint64_t>;
     144             : template class spu::module::Initializer<float>;
     145             : template class spu::module::Initializer<double>;
     146             : // ==================================================================================== explicit template instantiation

Generated by: LCOV version 1.14