24 #include "cheetah/sps/astroaccelerate/detail/SpsCuda.h" 25 #include "cheetah/cuda_utils/cuda_errorhandling.h" 26 #include "cheetah/data/TimeFrequency.h" 27 #include "cheetah/data/Units.h" 28 #include "panda/Resource.h" 29 #include "panda/Log.h" 37 namespace astroaccelerate {
39 #ifdef ENABLE_ASTROACCELERATE 41 SpsCuda::SpsCuda(sps::Config
const& config)
42 : BaseT(config.astroaccelerate_config(), config)
45 auto it = config.subsection(
"dedispersion");
46 while (it != config.subsection_end())
48 ddtr::DedispersionConfig
const& c =
static_cast<ddtr::DedispersionConfig const&
>(*it);
49 _dedisp_configs.push_back(&c);
53 _threshold = config.threshold();
54 _samples = config.dedispersion_samples();
61 std::size_t SpsCuda::buffer_overlap()
const 63 assert(_samples > _dedispersion_strategy->get_dedispersed_time_samples());
64 return _samples - _dedispersion_strategy->get_dedispersed_time_samples();
67 ::astroaccelerate::DedispersionStrategy
const& SpsCuda::dedispersion_strategy()
const 69 return *_dedispersion_strategy;
73 std::size_t SpsCuda::set_dedispersion_strategy(std::size_t min_gpu_memory, TimeFrequencyType
const& tf_data)
75 PANDA_LOG_DEBUG <<
"Setting SpsCuda dedispersion strategy. GPU memory=" << min_gpu_memory;
76 std::size_t nranges = _dedisp_configs.size();
79 throw panda::Error(
"No dedispersion plan set.");
81 std::vector<float> user_dm_low;
82 std::vector<float> user_dm_high;
83 std::vector<float> user_dm_step;
84 std::vector<int> in_bin;
85 std::vector<int> out_bin;
87 for (
auto& config: _dedisp_configs)
89 PANDA_LOG <<
"Configuring DM range: " 90 << (float)config->dm_start().value() <<
" to " 91 << (float)config->dm_end().value() <<
" pc/cc in steps of " 92 << (float)config->dm_step().value() <<
" pc/cc";
93 user_dm_low.push_back((
float)config->dm_start().value());
94 user_dm_high.push_back((
float)config->dm_end().value());
95 user_dm_step.push_back((
float)config->dm_step().value());
96 PANDA_LOG <<
"Disabling downsampling for DM range";
101 _chan_high = FrequencyType(0.0*boost::units::si::hertz);
102 _chan_low = FrequencyType(std::numeric_limits<typename FrequencyType::value_type>::max()*boost::units::si::hertz);
103 std::vector<float> chan_freqs;
104 for (
auto const& freq: tf_data.channel_frequencies())
106 if (freq > _chan_high)
110 else if( freq < _chan_low )
114 chan_freqs.push_back(freq.value());
117 PANDA_LOG_DEBUG <<
"Generating new DedispersionStrategy object";
118 PANDA_LOG_DEBUG <<
"User-requested samples to dedisperse: " << _samples;
119 _dedispersion_strategy.reset( new ::astroaccelerate::DedispersionStrategy(
125 , std::max(ArchitectureCapability::total_memory, min_gpu_memory)
127 ,(
int) _dedisp_configs.size()
131 ,tf_data.sample_interval().value()
145 return calculate_internals(tf_data.sample_interval());
148 std::size_t SpsCuda::calculate_internals(TimeType samp_interval)
150 PANDA_LOG_DEBUG <<
"Calculating SpsCuda output sizes";
152 _dm_time.reset(new ::astroaccelerate::DmTime<float>(*_dedispersion_strategy));
154 std::size_t nranges = _dm_time->number_of_dm_ranges();
156 std::size_t nsamps_processed = *std::max_element(_dm_time->nsamples().begin(), _dm_time->nsamples().end());
158 _dm_trial_metadata.reset(
new data::DmTrialsMetadata(samp_interval, nsamps_processed));
160 for (std::size_t range=0; range < nranges; ++range)
162 std::size_t ndms = std::size_t(_dedispersion_strategy->get_ndms()[range]);
163 data::DedispersionMeasureType<float> dm(_dedispersion_strategy->get_dm_low()[range] * data::parsecs_per_cube_cm);
164 data::DedispersionMeasureType<float> dm_step(_dedispersion_strategy->get_dm_step()[range] * data::parsecs_per_cube_cm);
165 std::size_t size = _dm_time->nsamples()[range];
167 for (std::size_t dm_idx =0; dm_idx < ndms; ++dm_idx)
169 _dm_trial_metadata->emplace_back(dm,nsamps_processed/size);
176 #endif // ENABLE_ASTROACCELERATE Some limits and constants for FLDO.