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