diff options
| -rw-r--r-- | include/astra/CudaReconstructionAlgorithm2D.h | 3 | ||||
| -rw-r--r-- | include/astra/CudaSirtAlgorithm.h | 4 | ||||
| -rw-r--r-- | src/CudaReconstructionAlgorithm2D.cpp | 22 | ||||
| -rw-r--r-- | src/CudaSirtAlgorithm.cpp | 35 | 
4 files changed, 31 insertions, 33 deletions
| diff --git a/include/astra/CudaReconstructionAlgorithm2D.h b/include/astra/CudaReconstructionAlgorithm2D.h index dc93a1a..bb5f2a7 100644 --- a/include/astra/CudaReconstructionAlgorithm2D.h +++ b/include/astra/CudaReconstructionAlgorithm2D.h @@ -141,6 +141,9 @@ protected:  	 */  	bool setupGeometry(); +	/** Initialize CUDA algorithm. For internal use only. +	 */ +	virtual void initCUDAAlgorithm();  	/** The internally used CUDA algorithm object  	 */  diff --git a/include/astra/CudaSirtAlgorithm.h b/include/astra/CudaSirtAlgorithm.h index 929ac30..91cc206 100644 --- a/include/astra/CudaSirtAlgorithm.h +++ b/include/astra/CudaSirtAlgorithm.h @@ -93,8 +93,6 @@ public:  	 */  	virtual bool initialize(const Config& _cfg); -	virtual void run(int _iNrIterations); -  	/** Initialize class.  	 *  	 * @param _pProjector		Projector Object. (Optional) @@ -114,6 +112,8 @@ public:  protected:  	CFloat32VolumeData2D* m_pMinMask;  	CFloat32VolumeData2D* m_pMaxMask; + +	virtual void initCUDAAlgorithm();  };  // inline functions diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp index 5a1910c..2798434 100644 --- a/src/CudaReconstructionAlgorithm2D.cpp +++ b/src/CudaReconstructionAlgorithm2D.cpp @@ -329,6 +329,20 @@ bool CCudaReconstructionAlgorithm2D::setupGeometry()  }  //---------------------------------------------------------------------------------------- + +void CCudaReconstructionAlgorithm2D::initCUDAAlgorithm() +{ +	bool ok; + +	ok = setupGeometry(); +	ASTRA_ASSERT(ok); + +	ok = m_pAlgo->allocateBuffers(); +	ASTRA_ASSERT(ok); +} + + +//----------------------------------------------------------------------------------------  // Iterate  void CCudaReconstructionAlgorithm2D::run(int _iNrIterations)  { @@ -339,13 +353,7 @@ void CCudaReconstructionAlgorithm2D::run(int _iNrIterations)  	const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry();  	if (!m_bAlgoInit) { - -		ok = setupGeometry(); -		ASTRA_ASSERT(ok); - -		ok = m_pAlgo->allocateBuffers(); -		ASTRA_ASSERT(ok); - +		initCUDAAlgorithm();  		m_bAlgoInit = true;  	} diff --git a/src/CudaSirtAlgorithm.cpp b/src/CudaSirtAlgorithm.cpp index 33e381a..7beb30e 100644 --- a/src/CudaSirtAlgorithm.cpp +++ b/src/CudaSirtAlgorithm.cpp @@ -113,36 +113,23 @@ bool CCudaSirtAlgorithm::initialize(CProjector2D* _pProjector,  }  //---------------------------------------------------------------------------------------- -// Iterate -void CCudaSirtAlgorithm::run(int _iNrIterations) -{ -	// check initialized -	ASTRA_ASSERT(m_bIsInitialized); -	if (!m_bAlgoInit) { -		// We only override the initialisation step to copy the min/max masks +void CCudaSirtAlgorithm::initCUDAAlgorithm() +{ +	CCudaReconstructionAlgorithm2D::initCUDAAlgorithm(); -		bool ok = setupGeometry(); -		ASTRA_ASSERT(ok); +	astraCUDA::SIRT* pSirt = dynamic_cast<astraCUDA::SIRT*>(m_pAlgo); -		ok = m_pAlgo->allocateBuffers(); +	if (m_pMinMask || m_pMaxMask) { +		const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry(); +		const float *pfMinMaskData = 0; +		const float *pfMaxMaskData = 0; +		if (m_pMinMask) pfMinMaskData = m_pMinMask->getDataConst(); +		if (m_pMaxMask) pfMaxMaskData = m_pMaxMask->getDataConst(); +		bool ok = pSirt->uploadMinMaxMasks(pfMinMaskData, pfMaxMaskData, volgeom.getGridColCount());  		ASTRA_ASSERT(ok); - -		if (m_pMinMask || m_pMaxMask) { -			const CVolumeGeometry2D& volgeom = *m_pReconstruction->getGeometry(); -			astraCUDA::SIRT* pSirt = dynamic_cast<astraCUDA::SIRT*>(m_pAlgo); -			const float *pfMinMaskData = 0; -			const float *pfMaxMaskData = 0; -			if (m_pMinMask) pfMinMaskData = m_pMinMask->getDataConst(); -			if (m_pMaxMask) pfMaxMaskData = m_pMaxMask->getDataConst(); -			ok = pSirt->uploadMinMaxMasks(pfMinMaskData, pfMaxMaskData, volgeom.getGridColCount()); -			ASTRA_ASSERT(ok); -		} - -		m_bAlgoInit = true;  	} -	CCudaReconstructionAlgorithm2D::run(_iNrIterations);  } | 
