From c7d952174fc63db7570d2a69b5b53f0ce01859f6 Mon Sep 17 00:00:00 2001 From: Jan David Mol <mol@astron.nl> Date: Mon, 13 Nov 2017 10:41:42 +0000 Subject: [PATCH] Task #11406: Statically allocate flagsPerChannel, and removed unused propagateFlags. --- .../BeamFormerPreprocessingStep.h | 2 +- .../src/cuda/SubbandProcs/CorrelatorStep.cc | 60 ++++++++----------- .../src/cuda/SubbandProcs/CorrelatorStep.h | 12 ++-- .../test/SubbandProcs/tCorrelatorStep.cc | 18 +++++- .../SubbandProcs/tCorrelatorSubbandProc.cc | 15 ++++- 5 files changed, 63 insertions(+), 44 deletions(-) diff --git a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/BeamFormerPreprocessingStep.h b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/BeamFormerPreprocessingStep.h index e9b46d3bc3c..cf560c5d9ca 100644 --- a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/BeamFormerPreprocessingStep.h +++ b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/BeamFormerPreprocessingStep.h @@ -80,7 +80,7 @@ namespace LOFAR void process(const SubbandProcInputData &input); private: - // Flags for FFT-ed data + // Preallocated flags for FFT-ed data -- used locally MultiDimArray<SparseSet<unsigned>, 1> flagsPerChannel; //Data members diff --git a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.cc b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.cc index e4d68345a01..53139adc081 100644 --- a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.cc +++ b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.cc @@ -77,31 +77,6 @@ namespace LOFAR { } - - void CorrelatorStep::Flagger::propagateFlags( - Parset const &parset, - MultiDimArray<LOFAR::SparseSet<unsigned>, 1>const &inputFlags, - SubbandProcOutputData::CorrelatedData &output) - { - // Object for storing transformed flags - MultiDimArray<SparseSet<unsigned>, 1> flagsPerChannel( - boost::extents[parset.settings.antennaFields.size()]); - - // First transform the flags to channel flags: taking in account - // reduced resolution in time and the size of the filter - Cobalt::Flagger::convertFlagsToChannelFlags( - inputFlags, - flagsPerChannel, - parset.settings.blockSize, - parset.settings.correlator.nrChannels, - parset.settings.correlator.nrChannels == 1 ? 0 : NR_TAPS - 1); - - // Calculate the number of flags per baseline and assign to - // output object. - calcNrValidSamples(parset, flagsPerChannel, output); - } - - namespace { // Return the baseline number for a pair of stations unsigned baseline(unsigned major, unsigned minor) @@ -260,6 +235,8 @@ namespace LOFAR : ProcessStep(parset, i_queue), correlatorPPF(ps.settings.correlator.nrChannels > 1), + flagsWithHistorySamples(boost::extents[parset.settings.antennaFields.size()]), + flagsPerChannel(boost::extents[parset.settings.antennaFields.size()]), devE(context, std::max(factories.correlator.bufferSize(CorrelatorKernel::INPUT_DATA), factories.correlator.bufferSize(CorrelatorKernel::OUTPUT_DATA))), outputCounter(context, "output (correlator)"), @@ -320,15 +297,13 @@ namespace LOFAR fftKernel->enqueue(input.blockID); // Process flags enough to determine which data to zero - MultiDimArray<LOFAR::SparseSet<unsigned>, 1> flags = input.inputFlags; - MultiDimArray<SparseSet<unsigned>, 1> flagsPerChannel( - boost::extents[ps.settings.antennaFields.size()]); + flagsWithHistorySamples = input.inputFlags; firFilterKernel->prefixHistoryFlags( - flags, input.blockID.subbandProcSubbandIdx); + flagsWithHistorySamples, input.blockID.subbandProcSubbandIdx); Cobalt::Flagger::convertFlagsToChannelFlags( - flags, + flagsWithHistorySamples, flagsPerChannel, ps.settings.blockSize, ps.settings.correlator.nrChannels, @@ -366,16 +341,31 @@ namespace LOFAR void CorrelatorStep::processCPU(const SubbandProcInputData &input, SubbandProcOutputData &output) { // Propagate the flags. - MultiDimArray<LOFAR::SparseSet<unsigned>, 1> flags = input.inputFlags; if (correlatorPPF) { + flagsWithHistorySamples = input.inputFlags; + // Put the history flags in front of the sample flags, - // because Flagger::propagateFlags expects it that way. firFilterKernel->prefixHistoryFlags( - flags, input.blockID.subbandProcSubbandIdx); - } + flagsWithHistorySamples, input.blockID.subbandProcSubbandIdx); - Flagger::propagateFlags(ps, flags, output.correlatedData); + // Transform the flags to channel flags: taking in account + // reduced resolution in time and the size of the filter + Cobalt::Flagger::convertFlagsToChannelFlags( + flagsWithHistorySamples, + flagsPerChannel, + ps.settings.blockSize, + ps.settings.correlator.nrChannels, + NR_TAPS - 1); + + // Calculate the number of flags per baseline and assign to + // output object. + Flagger::calcNrValidSamples(ps, flagsPerChannel, output.correlatedData); + } else { + // Calculate the number of flags per baseline and assign to + // output object. + Flagger::calcNrValidSamples(ps, input.inputFlags, output.correlatedData); + } } diff --git a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.h b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.h index 052c850cb21..4e4c0daba15 100644 --- a/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.h +++ b/RTCP/Cobalt/GPUProc/src/cuda/SubbandProcs/CorrelatorStep.h @@ -95,12 +95,6 @@ namespace LOFAR class Flagger: public Cobalt::Flagger { public: - // 1. Convert input flags to channel flags, calculate the amount flagged - // samples and save this in output - static void propagateFlags(Parset const & parset, - MultiDimArray<LOFAR::SparseSet<unsigned>, 1>const &inputFlags, - SubbandProcOutputData::CorrelatedData &output); - // 1.1 Convert the flags per station to channel flags, change time scale // if nchannel > 1 // (Uses convertFlagsToChannelFlags) @@ -136,6 +130,12 @@ namespace LOFAR private: const bool correlatorPPF; + // Preallocated flags for input data, to prefix with FIR history -- used locally + MultiDimArray<SparseSet<unsigned>, 1> flagsWithHistorySamples; + + // Preallocated flags for FFT-ed data -- used locally + MultiDimArray<SparseSet<unsigned>, 1> flagsPerChannel; + //Data members boost::shared_ptr<gpu::DeviceMemory> devA; boost::shared_ptr<gpu::DeviceMemory> devB; diff --git a/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorStep.cc b/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorStep.cc index 15a6d205df0..9f435aab1e2 100644 --- a/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorStep.cc +++ b/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorStep.cc @@ -142,8 +142,24 @@ TEST(propagateFlags) BudgetTimer processCPUTimer("processCPU", parset.settings.blockDuration() / nrSubbandsPerSubbandProc, true, true); + //propageFlags: exercise the functionality + MultiDimArray<LOFAR::SparseSet<unsigned>, 1> flagsPerChannel(boost::extents[parset.settings.antennaFields.size()]); + processCPUTimer.start(); - CorrelatorStep::Flagger::propagateFlags(parset, flags, correlatedData); + + // Compress input flags to flags per channel + Flagger::convertFlagsToChannelFlags( + flags, + flagsPerChannel, + parset.settings.blockSize, + parset.settings.correlator.nrChannels, + + // we don't have a FIR history to prepend + 0); + + // calculate nr of valid samples per baseline + CorrelatorStep::Flagger::calcNrValidSamples(parset, flagsPerChannel, correlatedData); + processCPUTimer.stop(); } diff --git a/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorSubbandProc.cc b/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorSubbandProc.cc index 5c137cc6297..6b13abf3428 100644 --- a/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorSubbandProc.cc +++ b/RTCP/Cobalt/GPUProc/test/SubbandProcs/tCorrelatorSubbandProc.cc @@ -87,7 +87,20 @@ TEST(propagateFlags) // ********************************************************************************************* //propageFlags: exercise the functionality - CorrelatorStep::Flagger::propagateFlags(parset, inputFlags, output); + MultiDimArray<SparseSet<unsigned>, 1> flagsPerChannel(boost::extents[parset.settings.antennaFields.size()]); + + // Compress input flags to flags per channel + Cobalt::Flagger::convertFlagsToChannelFlags( + inputFlags, + flagsPerChannel, + parset.settings.blockSize, + parset.settings.correlator.nrChannels, + + // We don't prepend FIR history, but we need it to obtain the right weights + NR_TAPS - 1); + + // calculate nr of valid samples per baseline + CorrelatorStep::Flagger::calcNrValidSamples(parset, flagsPerChannel, output); // now perform weighting of the data based on the number of valid samples CorrelatorStep::Flagger::applyNrValidSamples(parset, *output.subblocks[0]); -- GitLab