24 #include "cheetah/sps/detail/SpsTask.h" 25 #include "panda/TupleUtilities.h" 34 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
35 SpsTask<DmHandler, SpHandler, CommonTraits>::SpsTask(DmHandler dm_handler, SpHandler sp_handler)
36 : _dm_handler(
std::move(dm_handler))
37 , _sp_handler(
std::move(sp_handler))
41 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
42 SpsTask<DmHandler, SpHandler, CommonTraits>::~SpsTask()
46 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
47 template<
typename DataType>
50 return _dm_handler(std::forward<DataType>(d));
53 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
54 template<
typename DataType>
57 return _sp_handler(std::forward<DataType>(d));
60 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
63 PANDA_LOG_WARN <<
"no sps algo defined";
64 return std::make_shared<panda::ResourceJob>();
68 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
69 ,
typename PoolType,
typename... Algos>
72 , SpHandler sp_handler
75 : BaseT(dm_handler, sp_handler)
76 , _algos(std::forward<Algos>(algos)...)
81 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
82 ,
typename PoolType,
typename... Algos>
85 std::shared_ptr<SpecificSpsTask>
self = this->shared_from_this();
86 return _pool->submit(
self, std::move(buffer));
89 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
90 ,
typename PoolType,
typename... Algos>
91 template<
typename Arch>
94 auto& algo = _algos.template get<Arch>();
95 algo(resource, buffer, this->_dm_handler, this->_sp_handler);
99 template<
typename Arch>
102 template<
typename AlgoTuple>
103 inline void operator()(AlgoTuple
const& algos, std::size_t& max_size)
105 std::size_t bs = algos.template get<Arch>().buffer_overlap();
112 template<
typename Arch>
113 struct SetDedispersionStrategy
115 template<
typename AlgoTuple,
typename Data>
116 inline void operator()(AlgoTuple& algos, std::size_t& memory, std::size_t memory_limit, Data
const& data )
118 std::size_t mem = algos.template get<Arch>().set_dedispersion_strategy(memory_limit, data);
119 if(mem < memory) memory = mem;
124 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
130 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
131 ,
typename PoolType,
typename... Algos>
134 std::size_t buffer_overlap=0;
135 panda::ForEach<typename ImplementationsType::Architectures, BufferOverlap>::exec(_algos, buffer_overlap);
136 return buffer_overlap;
139 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
141 std::size_t memory_min
142 ,TimeFrequencyType
const&)
147 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
148 ,
typename PoolType,
typename... Algos>
150 std::size_t memory_limit
151 ,TimeFrequencyType
const& data)
153 std::size_t memory=(memory_limit==0)?std::numeric_limits<std::size_t>::max():memory_limit;
154 panda::ForEach<typename ImplementationsType::Architectures, SetDedispersionStrategy>::exec(_algos, memory, memory_limit, data);
158 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits>
161 panda::FinishTask<SpsTask> finish(*
this);
162 agg_buf_filler.full_buffer_handler( [&](
typename BufferFillerType::AggregationBufferType)
164 PANDA_LOG_WARN <<
"Sps has no implementation active";
167 if(agg_buf_filler.flush())
173 template<
typename DmHandler,
typename SpHandler,
typename CommonTraits
174 ,
typename PoolType,
typename... Algos>
177 panda::FinishTask<SpecificSpsTask> finish(*
this);
178 agg_buf_filler.full_buffer_handler( [&](
typename BufferFillerType::AggregationBufferType buffer)
180 auto job = _pool->submit(finish, std::move(buffer));
182 if(job->status() != ska::panda::ResourceJob::JobStatus::Finished )
188 if(agg_buf_filler.flush())
void finish(BufferFillerType &buffer_filler) override
block until all buffers are flushed and processed
void call_dm_handler(DataType &&d) const
call the dm handler directly with the provided data
Single pulse search asynchronous task.
std::size_t buffer_overlap() const override
the number of samples to be copied from the end of one buffer in tot the beginning of the next ...
Some limits and constants for FLDO.
std::size_t set_dedispersion_strategy(std::size_t memory_min, TimeFrequencyType const &data) override
specify parameters to generate a suitable dedispersion compute strategy
void call_sp_handler(DataType &&d) const
call the sp handler directly with the provided data
void operator()(panda::PoolResource< Arch > &, BufferType buffer)
execute Sps task on a given accelerator