00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef SYNTHESIS_MULTITHREADEDVISIBILITYRESAMPLER_H
00030 #define SYNTHESIS_MULTITHREADEDVISIBILITYRESAMPLER_H
00031
00032 #include <synthesis/TransformMachines/VisibilityResamplerBase.h>
00033 #include <synthesis/MeasurementComponents/ResamplerWorklet.h>
00034 #include <synthesis/TransformMachines/CFStore.h>
00035 #include <synthesis/TransformMachines/VBStore.h>
00036 #include <synthesis/MeasurementComponents/MThWorkIDEnum.h>
00037 #include <msvis/MSVis/UtilJ.h>
00038 #include <msvis/MSVis/VisBuffer.h>
00039 #include <casa/Arrays/Array.h>
00040 #include <casa/Arrays/Vector.h>
00041
00042 #include <casa/Logging/LogIO.h>
00043 #include <casa/Logging/LogSink.h>
00044 #include <casa/Logging/LogMessage.h>
00045 #define DEFAULTNOOFCORES -1
00046 #define FTMachineNumThreadsEnvVar "ftmachine_num_threads"
00047 namespace casa {
00048 class MultiThreadedVisibilityResampler: public VisibilityResamplerBase
00049 {
00050 public:
00051
00052 MultiThreadedVisibilityResampler():
00053 resamplers_p(), doubleGriddedData_p(), singleGriddedData_p(),
00054 sumwt_p(), gridderWorklets_p(), vbsVec_p(), visResamplerCtor_p(),
00055 whoLoadedVB_p(MThWorkID::NOONE), currentVBS_p(0)
00056 {
00057 nelements_p = SynthesisUtils::getenv(FTMachineNumThreadsEnvVar, 1);
00058 if (nelements_p < 0) nelements_p = 1;
00059
00060 };
00061
00062 MultiThreadedVisibilityResampler(const Bool& doublePrecision,
00063 const Int& n=DEFAULTNOOFCORES);
00064
00065 MultiThreadedVisibilityResampler(const Bool& doublePrecision,
00066 CountedPtr<VisibilityResamplerBase>& visResampler,
00067 const Int& n=DEFAULTNOOFCORES);
00068 virtual ~MultiThreadedVisibilityResampler()
00069 {
00070 cleanup();
00071 nelements_p=0;
00072 currentVBS_p=0;
00073 }
00074
00075 MultiThreadedVisibilityResampler(const MultiThreadedVisibilityResampler& other) : VisibilityResamplerBase() {copy(other);};
00076
00077
00078
00079 MultiThreadedVisibilityResampler* clone()
00080 {
00081
00082 MultiThreadedVisibilityResampler *clonedCopy;
00083 clonedCopy = new MultiThreadedVisibilityResampler(*this);
00084
00085 clonedCopy->allocateDataBuffers();
00086 return clonedCopy;
00087 };
00088
00089 MultiThreadedVisibilityResampler& operator=(const MultiThreadedVisibilityResampler& other);
00090
00091 void cleanup();
00092 void releaseBuffers();
00093
00094 void copy(const MultiThreadedVisibilityResampler& other);
00095
00096 virtual Int nelements() {return nelements_p;};
00097 virtual void setParams(const Vector<Double>& uvwScale, const Vector<Double>& offset,
00098 const Vector<Double>& dphase);
00099
00100 virtual void setMaps(const Vector<Int>& chanMap, const Vector<Int>& polMap);
00101 virtual void setCFMaps(const Vector<Int>& cfMap, const Vector<Int>& conjCFMap);
00102 virtual void setFreqMaps(const Matrix<Double>& spwChanFreqs, const Matrix<Double>& spwChanConjFreqs);
00103
00104 virtual void setConvFunc(const CFStore& cfs);
00105 void init(const Bool& doublePrecision);
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 virtual void DataToGrid(Array<DComplex>& griddedData,
00116 VBStore& vbs,
00117 Matrix<Double>& sumwt,
00118 const Bool& dopsf,Bool =False)
00119 {DataToGridImpl_p(griddedData, vbs, sumwt,dopsf);}
00120
00121 virtual void DataToGrid(Array<Complex>& griddedData,
00122 VBStore& vbs,
00123 Matrix<Double>& sumwt,
00124 const Bool& dopsf,Bool =False)
00125 {
00126 DataToGridImpl_p(griddedData, vbs, sumwt,dopsf);
00127 }
00128
00129
00130
00131
00132 void GatherGrids(Array<DComplex>& griddedData, Matrix<Double>& sumwt);
00133 void GatherGrids(Array<Complex>& griddedData, Matrix<Double>& sumwt);
00134 void initializePutBuffers(const Array<DComplex>& griddedData,
00135 const Matrix<Double>& sumwt);
00136 void initializePutBuffers(const Array<Complex>& griddedData,
00137 const Matrix<Double>& sumwt);
00138 void initializeDataBuffers(VBStore& ) {};
00139
00140
00141
00142
00143
00144
00145 virtual void GridToData(VBStore& vbs, const Array<Complex>& griddedData);
00146
00147
00148 virtual void ComputeResiduals(VBStore& vbs);
00149
00150
00151
00152
00153
00154 private:
00155 template <class T>
00156 void DataToGridImpl_p(Array<T>& griddedData, VBStore& vb,
00157 Matrix<Double>& sumwt,const Bool& dopsf,Bool useConjFreqCF=False);
00158
00159
00160
00161
00162
00163
00164
00165
00166 void allocateBuffers(Bool newDataBuffers=True);
00167 void makeInfrastructureContainers();
00168 Double allocateDataBuffers();
00169 void startThreads();
00170 void scatter(Matrix<VBStore>& vbsStores,const VBStore& vbs);
00171
00172 Int nelements_p;
00173 Bool doublePrecision_p;
00174 Vector<CountedPtr<VisibilityResamplerBase> > resamplers_p;
00175 Vector<CountedPtr<Array<DComplex> > > doubleGriddedData_p;
00176 Vector<CountedPtr<Array<Complex> > > singleGriddedData_p;
00177 Vector<CountedPtr<Matrix<Double> > > sumwt_p;
00178 Vector<CountedPtr<ResamplerWorklet> > gridderWorklets_p;
00179
00180 Matrix<VBStore> vbsVec_p;
00181
00182 CountedPtr<ThreadCoordinator<Int> > threadClerk_p;
00183 Bool threadStarted_p;
00184 casa::utilj::DeltaThreadTimes tSetupG, tSendDataG, tWaitForWorkG, tOutsideG;
00185 casa::utilj::DeltaThreadTimes tSetupDG, tSendDataDG, tWaitForWorkDG, tOutsideDG;
00186 casa::utilj::ThreadTimes t4G_p,t4DG_p;
00187
00188 CountedPtr<VisibilityResamplerBase> visResamplerCtor_p;
00189 Int whoLoadedVB_p;
00190 Int currentVBS_p;
00191 };
00192 };
00193
00194 #endif //