24 #include "cheetah/ddtr/fpga/Ddtr.h" 32 template<
typename DdtrTraits>
33 Ddtr<DdtrTraits>::WorkerFactory::WorkerFactory(ddtr::Config
const& config)
38 template<
typename DdtrTraits>
39 Ddtr<DdtrTraits>::Ddtr(ConfigType
const& config)
41 , _workers(WorkerFactory(config))
43 , _dev_memory(
std::numeric_limits<
std::size_t>::max())
45 auto const& pool = config.pool();
46 if(pool.template free_resources<Architecture>().empty()) _dev_memory = 0;
49 for(
auto const& fpga : pool.template free_resources<Architecture>())
52 std::size_t device_memory = fpga->device_memory();
53 if(device_memory < _dev_memory) {
54 _dev_memory=device_memory;
57 PANDA_LOG <<
"maximum device memory suitable for all devices in the pool is " << _dev_memory;
58 #endif // ENABLE_OPENCL 61 template<
typename DdtrTraits>
62 Ddtr<DdtrTraits>::Ddtr(Ddtr&& other)
63 : _first_call(other._first_call)
64 , _dedispersion_handler(other._dedispersion_handler)
65 , _workers(
std::move(other._workers))
66 , _config(
std::move(other._config))
67 , _dev_memory(
std::move(other._dev_memory))
77 template<
typename DdtrTraits>
78 Ddtr<DdtrTraits>::~Ddtr()
84 template<
typename DdtrTraits>
87 _dedispersion_handler(_workers(device)(input_data,_dm_factors, _max_delay));
90 template<
typename DdtrTraits>
91 void Ddtr<DdtrTraits>::init(TimeFrequencyType
const& data)
93 DmListType dm_trials = this->_config.dm_trials();
94 Dm max_dm = this->_config.max_dm();
95 auto const& channel_freqs = data.channel_frequencies();
96 auto freq_pair = data.low_high_frequencies();
97 FrequencyType freq_top = freq_pair.second;
98 FrequencyType freq_bottom = freq_pair.first;
99 _max_delay = std::size_t((_config.dm_constant().value()
100 * (1.0/(freq_bottom*freq_bottom) - 1.0/(freq_top*freq_top))
101 * max_dm / data.sample_interval()).value()) + 1;
103 for (
auto freq: channel_freqs)
105 double factor = (_config.dm_constant().value() * (1.0/(freq*freq) - 1.0/(freq_top*freq_top)) / data.sample_interval()).value();
106 _dm_factors.push_back(factor);
108 _dedispersion_samples = this->_config.dedispersion_samples();
109 if (_dedispersion_samples < 2 * _max_delay)
111 PANDA_LOG_WARN <<
"Requested number of samples to dedisperse (" 112 << this->_config.dedispersion_samples()
113 <<
") is less than twice the max dispersion delay (" 114 << 2 * _max_delay <<
"): Setting number of samples to dedisperse to " 116 _dedispersion_samples = 2 * _max_delay;
120 _agg_buffer_filler_ptr->resize(std::min(_dev_memory, this->_config.dedispersion_samples() * data.number_of_channels()));
121 _agg_buffer_filler_ptr->set_overlap(_max_delay * data.number_of_channels());
124 template<
typename DdtrTraits>
125 template<
typename TimeFrequencyT>
129 this->init(input_data);
132 (*_agg_buffer_filler_ptr) << input_data;
Some limits and constants for FLDO.
void operator()(TimeFreqDataT const &input)
dedisperses chunk of buffer data to a dm-time chunk.