diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-12-02 15:29:58 +0100 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2015-12-02 15:29:58 +0100 | 
| commit | f637af457985fbcf6be5641e98df6d87ca622d24 (patch) | |
| tree | 4c015188c6b5e33c1a9d88032f61a434063259fb | |
| parent | e48d0a53730bb7faa2463a64db0989ba341e12b8 (diff) | |
| parent | 6d57f7874713e6632c2e49590538c6a48ddcc311 (diff) | |
| download | astra-f637af457985fbcf6be5641e98df6d87ca622d24.tar.gz astra-f637af457985fbcf6be5641e98df6d87ca622d24.tar.bz2 astra-f637af457985fbcf6be5641e98df6d87ca622d24.tar.xz astra-f637af457985fbcf6be5641e98df6d87ca622d24.zip | |
Merge branch 'master' into volgeom3d
41 files changed, 1728 insertions, 350 deletions
| diff --git a/astra_vc09.sln b/astra_vc09.sln index 9b93a0f..371e9b1 100644 --- a/astra_vc09.sln +++ b/astra_vc09.sln @@ -48,6 +48,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "astra_mex_log", "matlab\mex  		{12926444-6723-46A8-B388-12E65E0577FA} = {12926444-6723-46A8-B388-12E65E0577FA}  	EndProjectSection  EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "astra_mex_direct", "matlab\mex\astra_mex_direct_vc09.vcproj", "{85FE09A6-FA49-4314-A2B1-59D77C7442A8}" +	ProjectSection(ProjectDependencies) = postProject +		{12926444-6723-46A8-B388-12E65E0577FA} = {12926444-6723-46A8-B388-12E65E0577FA} +	EndProjectSection +EndProject  Global  	GlobalSection(SolutionConfigurationPlatforms) = preSolution  		Debug_CUDA|Win32 = Debug_CUDA|Win32 @@ -204,6 +209,22 @@ Global  		{CA2840B3-DA68-41B5-AC57-F5DFD20ED8F8}.Release|Win32.Build.0 = Release|Win32  		{CA2840B3-DA68-41B5-AC57-F5DFD20ED8F8}.Release|x64.ActiveCfg = Release|x64  		{CA2840B3-DA68-41B5-AC57-F5DFD20ED8F8}.Release|x64.Build.0 = Release|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug_CUDA|Win32.ActiveCfg = Debug_CUDA|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug_CUDA|Win32.Build.0 = Debug_CUDA|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug_CUDA|x64.ActiveCfg = Debug_CUDA|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug_CUDA|x64.Build.0 = Debug_CUDA|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug|Win32.ActiveCfg = Debug|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug|Win32.Build.0 = Debug|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug|x64.ActiveCfg = Debug|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Debug|x64.Build.0 = Debug|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release_CUDA|Win32.ActiveCfg = Release_CUDA|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release_CUDA|Win32.Build.0 = Release_CUDA|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release_CUDA|x64.ActiveCfg = Release_CUDA|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release_CUDA|x64.Build.0 = Release_CUDA|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release|Win32.ActiveCfg = Release|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release|Win32.Build.0 = Release|Win32 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release|x64.ActiveCfg = Release|x64 +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8}.Release|x64.Build.0 = Release|x64  	EndGlobalSection  	GlobalSection(SolutionProperties) = preSolution  		HideSolutionNode = FALSE @@ -217,5 +238,6 @@ Global  		{4DD6056F-8EEE-4C9A-B2A9-923F01A32E97} = {33EF0AC5-B475-40BF-BAE5-67075B204D10}  		{F94CCD79-AA11-42DF-AC8A-6C9D2238A883} = {33EF0AC5-B475-40BF-BAE5-67075B204D10}  		{CA2840B3-DA68-41B5-AC57-F5DFD20ED8F8} = {33EF0AC5-B475-40BF-BAE5-67075B204D10} +		{85FE09A6-FA49-4314-A2B1-59D77C7442A8} = {33EF0AC5-B475-40BF-BAE5-67075B204D10}  	EndGlobalSection  EndGlobal diff --git a/astra_vc11.sln b/astra_vc11.sln index 2832eab..92fb584 100644 --- a/astra_vc11.sln +++ b/astra_vc11.sln @@ -48,6 +48,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "astra_mex_log", "matlab\mex  		{BE9F1326-527C-4284-AE2C-D1E25D539CEA} = {BE9F1326-527C-4284-AE2C-D1E25D539CEA}  	EndProjectSection  EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "astra_mex_direct", "matlab\mex\astra_mex_direct_vc11.vcxproj", "{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}" +	ProjectSection(ProjectDependencies) = postProject +		{BE9F1326-527C-4284-AE2C-D1E25D539CEA} = {BE9F1326-527C-4284-AE2C-D1E25D539CEA} +	EndProjectSection +EndProject  Global  	GlobalSection(SolutionConfigurationPlatforms) = preSolution  		Debug_CUDA|Win32 = Debug_CUDA|Win32 @@ -204,6 +209,22 @@ Global  		{03B833F5-4FD6-4FBE-AAF4-E3305CD56D2E}.Release|Win32.Build.0 = Release|Win32  		{03B833F5-4FD6-4FBE-AAF4-E3305CD56D2E}.Release|x64.ActiveCfg = Release|x64  		{03B833F5-4FD6-4FBE-AAF4-E3305CD56D2E}.Release|x64.Build.0 = Release|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug_CUDA|Win32.ActiveCfg = Debug_CUDA|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug_CUDA|Win32.Build.0 = Debug_CUDA|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug_CUDA|x64.ActiveCfg = Debug_CUDA|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug_CUDA|x64.Build.0 = Debug_CUDA|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug|Win32.ActiveCfg = Debug|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug|Win32.Build.0 = Debug|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug|x64.ActiveCfg = Debug|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Debug|x64.Build.0 = Debug|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release_CUDA|Win32.ActiveCfg = Release_CUDA|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release_CUDA|Win32.Build.0 = Release_CUDA|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release_CUDA|x64.ActiveCfg = Release_CUDA|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release_CUDA|x64.Build.0 = Release_CUDA|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release|Win32.ActiveCfg = Release|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release|Win32.Build.0 = Release|Win32 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release|x64.ActiveCfg = Release|x64 +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}.Release|x64.Build.0 = Release|x64  	EndGlobalSection  	GlobalSection(SolutionProperties) = preSolution  		HideSolutionNode = FALSE @@ -217,5 +238,6 @@ Global  		{4DD6056F-8EEE-4C9A-B2A9-923F01A32E97} = {5E99A109-374E-4102-BE9B-99BA1FA8AA30}  		{F94CCD79-AA11-42DF-AC8A-6C9D2238A883} = {5E99A109-374E-4102-BE9B-99BA1FA8AA30}  		{03B833F5-4FD6-4FBE-AAF4-E3305CD56D2E} = {5E99A109-374E-4102-BE9B-99BA1FA8AA30} +		{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7} = {5E99A109-374E-4102-BE9B-99BA1FA8AA30}  	EndGlobalSection  EndGlobal diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in index 2d862f2..abbebe2 100644 --- a/build/linux/Makefile.in +++ b/build/linux/Makefile.in @@ -232,7 +232,8 @@ MATLAB_MEX=\  	matlab/mex/astra_mex_projector_c.$(MEXSUFFIX) \  	matlab/mex/astra_mex_projector3d_c.$(MEXSUFFIX) \  	matlab/mex/astra_mex_log_c.$(MEXSUFFIX) \ -	matlab/mex/astra_mex_data3d_c.$(MEXSUFFIX) +	matlab/mex/astra_mex_data3d_c.$(MEXSUFFIX) \ +	matlab/mex/astra_mex_direct_c.$(MEXSUFFIX)  OBJECT_DIRS = src/ tests/ cuda/2d/ cuda/3d/ matlab/mex/ ./ diff --git a/build/msvc/gen.py b/build/msvc/gen.py index aeca3b0..72d4582 100644 --- a/build/msvc/gen.py +++ b/build/msvc/gen.py @@ -24,6 +24,7 @@ P4 = create_mex_project("astra_mex_matrix", "9D041710-2119-4230-BCF2-5FBE753FDE4  P5 = create_mex_project("astra_mex_projector", "4DD6056F-8EEE-4C9A-B2A9-923F01A32E97", "4DD6056F-8EEE-4C9A-B2A9-923F01A32E97")  P6 = create_mex_project("astra_mex_projector3d", "F94CCD79-AA11-42DF-AC8A-6C9D2238A883", "F94CCD79-AA11-42DF-AC8A-6C9D2238A883")  P7 = create_mex_project("astra_mex_log", "03B833F5-4FD6-4FBE-AAF4-E3305CD56D2E", "CA2840B3-DA68-41B5-AC57-F5DFD20ED8F8") +P8 = create_mex_project("astra_mex_direct", "0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7", "85FE09A6-FA49-4314-A2B1-59D77C7442A8")  F_astra_mex = { "type": siguid,                  "name": "astra_mex", @@ -31,7 +32,7 @@ F_astra_mex = { "type": siguid,                  "file09": "astra_mex",                  "uuid11": "5E99A109-374E-4102-BE9B-99BA1FA8AA30",                  "uuid09": "33EF0AC5-B475-40BF-BAE5-67075B204D10", -                "entries": [ P0, P1, P2, P3, P4, P5, P6, P7 ] } +                "entries": [ P0, P1, P2, P3, P4, P5, P6, P7, P8 ] }  P0["files"] = [ @@ -98,6 +99,18 @@ P7["files"] = [  "mexInitFunctions.cpp",  "mexInitFunctions.h",  ] +P8["files"] = [ +"astra_mex_direct_c.cpp", +"mexHelpFunctions.cpp", +"mexHelpFunctions.h", +"mexCopyDataHelpFunctions.cpp", +"mexCopyDataHelpFunctions.h", +"mexDataManagerHelpFunctions.cpp", +"mexDataManagerHelpFunctions.h", +"mexInitFunctions.cpp", +"mexInitFunctions.h", +] + @@ -407,7 +420,7 @@ for f in P_astra["filters"]:    P_astra["files"].extend(P_astra["filters"][f][1:])  P_astra["files"].sort() -projects = [ P_astra, F_astra_mex, P0, P1, P2, P3, P4, P5, P6, P7 ] +projects = [ P_astra, F_astra_mex, P0, P1, P2, P3, P4, P5, P6, P7, P8 ]  bom = "\xef\xbb\xbf" @@ -1111,6 +1124,7 @@ if sys.argv[1] in ["vc11", "all"]:    write_mex_project11(P5)    write_mex_project11(P6)    write_mex_project11(P7) +  write_mex_project11(P8)  if sys.argv[1] in ["vc09", "all"]:    # HACK @@ -1126,3 +1140,4 @@ if sys.argv[1] in ["vc09", "all"]:    write_mex_project09(P5)    write_mex_project09(P6)    write_mex_project09(P7) +  write_mex_project09(P8) diff --git a/include/astra/CudaBackProjectionAlgorithm.h b/include/astra/CudaBackProjectionAlgorithm.h index 84899b0..2450376 100644 --- a/include/astra/CudaBackProjectionAlgorithm.h +++ b/include/astra/CudaBackProjectionAlgorithm.h @@ -85,13 +85,10 @@ public:  	 * @param _pProjector		Projector Object. (Ignored)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector,  	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaBackProjectionAlgorithm3D.h b/include/astra/CudaBackProjectionAlgorithm3D.h index 2d98218..74aeec8 100644 --- a/include/astra/CudaBackProjectionAlgorithm3D.h +++ b/include/astra/CudaBackProjectionAlgorithm3D.h @@ -147,6 +147,8 @@ protected:  	 */  	bool m_bSIRTWeighting; + +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaCglsAlgorithm.h b/include/astra/CudaCglsAlgorithm.h index c51093c..6aa0343 100644 --- a/include/astra/CudaCglsAlgorithm.h +++ b/include/astra/CudaCglsAlgorithm.h @@ -91,18 +91,13 @@ public:  	/** Initialize class, use sequential order.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram  	 * @param _pReconstruction	VolumeData2D for storing the reconstruction -	 * @param _iGPUindex		Index of GPU to use. (Starting at 0.) -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector,   					CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -					int _iPixelSuperSampling = 1); +					CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaCglsAlgorithm3D.h b/include/astra/CudaCglsAlgorithm3D.h index 77c41c1..3e4084b 100644 --- a/include/astra/CudaCglsAlgorithm3D.h +++ b/include/astra/CudaCglsAlgorithm3D.h @@ -161,6 +161,8 @@ protected:  	bool m_bAstraCGLSInit;  	int m_iDetectorSuperSampling;  	int m_iVoxelSuperSampling; + +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaEMAlgorithm.h b/include/astra/CudaEMAlgorithm.h index 97eb7ca..a9d2711 100644 --- a/include/astra/CudaEMAlgorithm.h +++ b/include/astra/CudaEMAlgorithm.h @@ -63,17 +63,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP.  	 */  	bool initialize(CProjector2D* _pProjector, -	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -	                int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -	                int _iPixelSuperSampling = 1); +	                CFloat32ProjectionData2D* _pSinogram, +	                CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaFDKAlgorithm3D.h b/include/astra/CudaFDKAlgorithm3D.h index 1b025f1..63f07fd 100644 --- a/include/astra/CudaFDKAlgorithm3D.h +++ b/include/astra/CudaFDKAlgorithm3D.h @@ -152,6 +152,8 @@ protected:  	int m_iGPUIndex;  	int m_iVoxelSuperSampling;  	bool m_bShortScan; + +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaFilteredBackProjectionAlgorithm.h b/include/astra/CudaFilteredBackProjectionAlgorithm.h index 33445b6..cf1f19f 100644 --- a/include/astra/CudaFilteredBackProjectionAlgorithm.h +++ b/include/astra/CudaFilteredBackProjectionAlgorithm.h @@ -85,6 +85,9 @@ protected:  	AstraFBP* m_pFBP;  	bool m_bAstraFBPInit; + +	void initializeFromProjector(); +	virtual bool requiresProjector() const { return false; }  };  // inline functions diff --git a/include/astra/CudaForwardProjectionAlgorithm.h b/include/astra/CudaForwardProjectionAlgorithm.h index d172a7a..449a610 100644 --- a/include/astra/CudaForwardProjectionAlgorithm.h +++ b/include/astra/CudaForwardProjectionAlgorithm.h @@ -33,16 +33,15 @@ $Id$  #include "Algorithm.h" -#include "ParallelProjectionGeometry2D.h" -#include "VolumeGeometry2D.h" - -#include "Float32ProjectionData2D.h" -#include "Float32VolumeData2D.h" -  #ifdef ASTRA_CUDA  namespace astra { +class CProjector2D; +class CProjectionGeometry2D; +class CFloat32ProjectionData2D; +class CFloat32VolumeData2D; +  /**   * \brief   * This class contains a GPU implementation of an algorithm that creates a forward projection  @@ -91,19 +90,15 @@ public:  	/** Initialize class.  	 * -	 * @param _pVolumeGeometry		Geometry of the volume. -	 * @param _pProjectionGeometry	Geometry of the projection. +	 * @param _pProjector		Projector2D object. (Optional)  	 * @param _pVolume				VolumeData2D object containing the phantom to compute sinogram from		  	 * @param _pSinogram			ProjectionData2D object to store sinogram data in. -	 * @param _iGPUindex		Index of GPU to use. (Starting at 0.) -	 * @param _iDetectorSuperSampling  Number of samples per detector element, used to compute the forward projection  	 * @return success  	 */ -	bool initialize(CProjectionGeometry2D* _pProjectionGeometry, -					CVolumeGeometry2D* _pVolumeGeometry,  -					CFloat32VolumeData2D* _pVolume,  -					CFloat32ProjectionData2D* _pSinogram, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1); +	bool initialize(CProjector2D* _pProjector, +	                CFloat32VolumeData2D* _pVolume, +	                CFloat32ProjectionData2D* _pSinogram); +  	/** Get all information parameters  	 * @@ -147,6 +142,9 @@ public:  	void setGPUIndex(int _iGPUIndex);  protected: +	//< Optional Projector2D object +	CProjector2D* m_pProjector; +  	//< ProjectionData2D object containing the sinogram.  	CFloat32ProjectionData2D* m_pSinogram;  	//< VolumeData2D object containing the phantom. @@ -157,6 +155,7 @@ protected:  	//< Number of rays per detector element  	int m_iDetectorSuperSampling; +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaForwardProjectionAlgorithm3D.h b/include/astra/CudaForwardProjectionAlgorithm3D.h index bdd1356..4198d56 100644 --- a/include/astra/CudaForwardProjectionAlgorithm3D.h +++ b/include/astra/CudaForwardProjectionAlgorithm3D.h @@ -122,6 +122,7 @@ protected:  	int m_iGPUIndex;  	int m_iDetectorSuperSampling; +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/CudaProjector2D.h b/include/astra/CudaProjector2D.h index ecfca41..2b4bacb 100644 --- a/include/astra/CudaProjector2D.h +++ b/include/astra/CudaProjector2D.h @@ -124,12 +124,14 @@ public:  	Cuda2DProjectionKernel getProjectionKernel() const { return m_projectionKernel; }  	int getVoxelSuperSampling() const { return m_iVoxelSuperSampling; }  	int getDetectorSuperSampling() const { return m_iDetectorSuperSampling; } +	int getGPUIndex() const { return m_iGPUIndex; }  protected:  	Cuda2DProjectionKernel m_projectionKernel;  	int m_iVoxelSuperSampling;  	int m_iDetectorSuperSampling; +	int m_iGPUIndex;  };  //---------------------------------------------------------------------------------------- diff --git a/include/astra/CudaProjector3D.h b/include/astra/CudaProjector3D.h index 1d570fe..da88d6d 100644 --- a/include/astra/CudaProjector3D.h +++ b/include/astra/CudaProjector3D.h @@ -117,12 +117,14 @@ public:  	Cuda3DProjectionKernel getProjectionKernel() const { return m_projectionKernel; }  	int getVoxelSuperSampling() const { return m_iVoxelSuperSampling; }  	int getDetectorSuperSampling() const { return m_iDetectorSuperSampling; } +	int getGPUIndex() const { return m_iGPUIndex; }  protected:  	Cuda3DProjectionKernel m_projectionKernel;  	int m_iVoxelSuperSampling;  	int m_iDetectorSuperSampling; +	int m_iGPUIndex;  }; diff --git a/include/astra/CudaReconstructionAlgorithm2D.h b/include/astra/CudaReconstructionAlgorithm2D.h index e19bb8f..dc93a1a 100644 --- a/include/astra/CudaReconstructionAlgorithm2D.h +++ b/include/astra/CudaReconstructionAlgorithm2D.h @@ -70,28 +70,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume.  	 */ -	bool initialize(CProjector2D* _pProjector,  -					CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction); - -	/** Initialize class. -	 * -	 * @param _pProjector		Projector Object. (Ignored) -	 * @param _pSinogram		ProjectionData2D object containing the sinogram data. -	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection -	 */  	virtual bool initialize(CProjector2D* _pProjector,   	                        CFloat32ProjectionData2D* _pSinogram,  -	                        CFloat32VolumeData2D* _pReconstruction, -	                        int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -	                        int _iPixelSuperSampling = 1); +	                        CFloat32VolumeData2D* _pReconstruction);  	/** Clear this class. @@ -166,6 +151,9 @@ protected:  	int m_iGPUIndex;  	bool m_bAlgoInit; + +	void initializeFromProjector(); +	virtual bool requiresProjector() const { return false; }  };  // inline functions diff --git a/include/astra/CudaSartAlgorithm.h b/include/astra/CudaSartAlgorithm.h index b370bd0..c22dc4f 100644 --- a/include/astra/CudaSartAlgorithm.h +++ b/include/astra/CudaSartAlgorithm.h @@ -84,16 +84,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP.  	 */  	bool initialize(CProjector2D* _pProjector, -	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1); +	                CFloat32ProjectionData2D* _pSinogram, +	                CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaSirtAlgorithm.h b/include/astra/CudaSirtAlgorithm.h index 607889a..929ac30 100644 --- a/include/astra/CudaSirtAlgorithm.h +++ b/include/astra/CudaSirtAlgorithm.h @@ -97,18 +97,13 @@ public:  	/** Initialize class.  	 * -	 * @param _pProjector		Projector Object. (Ignored) +	 * @param _pProjector		Projector Object. (Optional)  	 * @param _pSinogram		ProjectionData2D object containing the sinogram data.  	 * @param _pReconstruction	VolumeData2D object for storing the reconstructed volume. -	 * @param _iGPUindex		GPU to use. -	 * @param _iDetectorSuperSampling Supersampling factor for the FP. -	 * @param _iPixelSuperSampling  Square root of number of samples per voxel, used to compute the backprojection  	 */  	bool initialize(CProjector2D* _pProjector, -	                CFloat32ProjectionData2D* _pSinogram,  -					CFloat32VolumeData2D* _pReconstruction, -					int _iGPUindex = -1, int _iDetectorSuperSampling = 1, -					int _iPixelSuperSampling = 1); +	                CFloat32ProjectionData2D* _pSinogram, +	                CFloat32VolumeData2D* _pReconstruction);  	/** Get a description of the class.  	 * diff --git a/include/astra/CudaSirtAlgorithm3D.h b/include/astra/CudaSirtAlgorithm3D.h index fda4635..379720e 100644 --- a/include/astra/CudaSirtAlgorithm3D.h +++ b/include/astra/CudaSirtAlgorithm3D.h @@ -175,6 +175,8 @@ protected:  	bool m_bAstraSIRTInit;  	int m_iDetectorSuperSampling;  	int m_iVoxelSuperSampling; + +	void initializeFromProjector();  };  // inline functions diff --git a/include/astra/ReconstructionAlgorithm2D.h b/include/astra/ReconstructionAlgorithm2D.h index 60584e0..ac87c4f 100644 --- a/include/astra/ReconstructionAlgorithm2D.h +++ b/include/astra/ReconstructionAlgorithm2D.h @@ -208,6 +208,9 @@ protected:  	//< Use the fixed reconstruction mask?  	bool m_bUseSinogramMask; + +	//< Specify if initialize/check should check for a valid Projector +	virtual bool requiresProjector() const { return true; }  };  // inline functions diff --git a/matlab/mex/astra_mex_direct_c.cpp b/matlab/mex/astra_mex_direct_c.cpp new file mode 100755 index 0000000..38b3f59 --- /dev/null +++ b/matlab/mex/astra_mex_direct_c.cpp @@ -0,0 +1,348 @@ +/* +----------------------------------------------------------------------- +Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp +           2014-2015, CWI, Amsterdam + +Contact: astra@uantwerpen.be +Website: http://sf.net/projects/astra-toolbox + +This file is part of the ASTRA Toolbox. + + +The ASTRA Toolbox is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +The ASTRA Toolbox is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. + +----------------------------------------------------------------------- +$Id$ +*/ + +/** \file astra_mex_direct_c.cpp + * + *  \brief Utility functions for low-overhead FP and BP calls. + */ +#include <mex.h> +#include "mexHelpFunctions.h" +#include "mexCopyDataHelpFunctions.h" +#include "mexDataManagerHelpFunctions.h" + +#include <list> + +#include "astra/Globals.h" + +#include "astra/AstraObjectManager.h" + +#include "astra/Float32ProjectionData2D.h" +#include "astra/Float32VolumeData2D.h" +#include "astra/CudaProjector3D.h" +#include "astra/Projector3D.h" +#include "astra/Float32ProjectionData3DMemory.h" +#include "astra/Float32VolumeData3DMemory.h" + +#include "astra/CudaForwardProjectionAlgorithm3D.h" + +#include "astra/CudaBackProjectionAlgorithm3D.h" + +using namespace std; +using namespace astra; + +#define USE_MATLAB_UNDOCUMENTED + + +class CFloat32CustomMemory_simple : public astra::CFloat32CustomMemory { +public: +	CFloat32CustomMemory_simple(float *ptr) { m_fPtr = ptr; } +	~CFloat32CustomMemory_simple() { } +}; + +#ifdef ASTRA_CUDA + +//----------------------------------------------------------------------------------------- +/** + * projection = astra_mex_direct_c('FP3D', projector_id, volume); + * Both 'projection' and 'volume' are Matlab arrays. + */ +void astra_mex_direct_fp3d(int& nlhs, mxArray* plhs[], int& nrhs, const mxArray* prhs[]) +{ +	// TODO: Add an optional way of specifying extra options + +	if (nrhs < 3) { +		mexErrMsgTxt("Not enough arguments. Syntax: astra_mex_direct_c('FP3D', projector_id, data)"); +		return; +	} + +	int iPid = (int)(mxGetScalar(prhs[1])); +	astra::CProjector3D* pProjector; +	pProjector = astra::CProjector3DManager::getSingleton().get(iPid); +	if (!pProjector) { +		mexErrMsgTxt("Projector not found."); +		return; +	} +	if (!pProjector->isInitialized()) { +		mexErrMsgTxt("Projector not initialized."); +		return; +	} +	bool isCuda = false; +	if (dynamic_cast<CCudaProjector3D*>(pProjector)) +		isCuda = true; +	if (!isCuda) { +		mexErrMsgTxt("Only CUDA projectors are currently supported."); +		return; +	} + +	astra::CVolumeGeometry3D* pVolGeom = pProjector->getVolumeGeometry(); +	astra::CProjectionGeometry3D* pProjGeom = pProjector->getProjectionGeometry(); + +	const mxArray* const data = prhs[2]; +	if (!checkDataType(data)) { +		mexErrMsgTxt("Data must be single or double."); +		return; +	} + +	if (!checkDataSize(data, pVolGeom)) { +		mexErrMsgTxt("The dimensions of the data do not match those specified in the geometry."); +		return; +	} + + +	// Allocate input data +	astra::CFloat32VolumeData3DMemory* pInput; +	if (mxIsSingle(data)) { +		astra::CFloat32CustomMemory* m = new CFloat32CustomMemory_simple((float *)mxGetData(data)); +		pInput = new astra::CFloat32VolumeData3DMemory(pVolGeom, m); +	} else { +		pInput = new astra::CFloat32VolumeData3DMemory(pVolGeom); +		copyMexToCFloat32Array(data, pInput->getData(), pInput->getSize()); +	} + + +	// Allocate output data +	// If the input is single, we also allocate single output. +	// Otherwise, double. +	astra::CFloat32ProjectionData3DMemory* pOutput; +	mxArray *pOutputMx; +	if (mxIsSingle(data)) { +		mwSize dims[3]; +		dims[0] = pProjGeom->getDetectorColCount(); +		dims[1] = pProjGeom->getProjectionCount(); +		dims[2] = pProjGeom->getDetectorRowCount(); + +		// Allocate uninitialized mxArray of size dims. +		// (It will be zeroed by CudaForwardProjectionAlgorithm3D) +		const mwSize zero_dims[2] = {0, 0}; +		pOutputMx = mxCreateNumericArray(2, zero_dims, mxSINGLE_CLASS, mxREAL); +		mxSetDimensions(pOutputMx, dims, 3); +		const mwSize num_elems = mxGetNumberOfElements(pOutputMx); +		const mwSize elem_size = mxGetElementSize(pOutputMx); +		mxSetData(pOutputMx, mxMalloc(elem_size * num_elems)); + +		astra::CFloat32CustomMemory* m = new CFloat32CustomMemory_simple((float *)mxGetData(pOutputMx)); +		pOutput = new astra::CFloat32ProjectionData3DMemory(pProjGeom, m); +	} else { +		pOutput = new astra::CFloat32ProjectionData3DMemory(pProjGeom); +	} + +	// Perform FP + +	astra::CCudaForwardProjectionAlgorithm3D* pAlg; +	pAlg = new astra::CCudaForwardProjectionAlgorithm3D(); +	pAlg->initialize(pProjector, pOutput, pInput); + +	if (!pAlg->isInitialized()) { +		mexErrMsgTxt("Error initializing algorithm."); +		// TODO: Delete pOutputMx? +		delete pAlg; +		delete pInput; +		delete pOutput; +		return; +	} + +	pAlg->run(); + +	delete pAlg; + + +	if (mxIsSingle(data)) { + +	} else { +		pOutputMx = createEquivMexArray<mxDOUBLE_CLASS>(pOutput); +		copyCFloat32ArrayToMex(pOutput->getData(), pOutputMx); +	} +	plhs[0] = pOutputMx; + +	delete pOutput; +	delete pInput; +} +//----------------------------------------------------------------------------------------- +/** + * projection = astra_mex_direct_c('BP3D', projector_id, volume); + * Both 'projection' and 'volume' are Matlab arrays. + */ +void astra_mex_direct_bp3d(int& nlhs, mxArray* plhs[], int& nrhs, const mxArray* prhs[]) +{ +	// TODO: Add an optional way of specifying extra options + +	if (nrhs < 3) { +		mexErrMsgTxt("Not enough arguments. Syntax: astra_mex_direct_c('BP3D', projector_id, data)"); +		return; +	} + +	int iPid = (int)(mxGetScalar(prhs[1])); +	astra::CProjector3D* pProjector; +	pProjector = astra::CProjector3DManager::getSingleton().get(iPid); +	if (!pProjector) { +		mexErrMsgTxt("Projector not found."); +		return; +	} +	if (!pProjector->isInitialized()) { +		mexErrMsgTxt("Projector not initialized."); +		return; +	} +	bool isCuda = false; +	if (dynamic_cast<CCudaProjector3D*>(pProjector)) +		isCuda = true; +	if (!isCuda) { +		mexErrMsgTxt("Only CUDA projectors are currently supported."); +		return; +	} + +	astra::CVolumeGeometry3D* pVolGeom = pProjector->getVolumeGeometry(); +	astra::CProjectionGeometry3D* pProjGeom = pProjector->getProjectionGeometry(); + +	const mxArray* const data = prhs[2]; +	if (!checkDataType(data)) { +		mexErrMsgTxt("Data must be single or double."); +		return; +	} + +	if (!checkDataSize(data, pProjGeom)) { +		mexErrMsgTxt("The dimensions of the data do not match those specified in the geometry."); +		return; +	} + + +	// Allocate input data +	astra::CFloat32ProjectionData3DMemory* pInput; +	if (mxIsSingle(data)) { +		astra::CFloat32CustomMemory* m = new CFloat32CustomMemory_simple((float *)mxGetData(data)); +		pInput = new astra::CFloat32ProjectionData3DMemory(pProjGeom, m); +	} else { +		pInput = new astra::CFloat32ProjectionData3DMemory(pProjGeom); +		copyMexToCFloat32Array(data, pInput->getData(), pInput->getSize()); +	} + + +	// Allocate output data +	// If the input is single, we also allocate single output. +	// Otherwise, double. +	astra::CFloat32VolumeData3DMemory* pOutput; +	mxArray *pOutputMx; +	if (mxIsSingle(data)) { +		mwSize dims[3]; +		dims[0] = pVolGeom->getGridColCount(); +		dims[1] = pVolGeom->getGridRowCount(); +		dims[2] = pVolGeom->getGridSliceCount(); + +		// Allocate uninitialized mxArray of size dims. +		// (It will be zeroed by CudaBackProjectionAlgorithm3D) +		const mwSize zero_dims[2] = {0, 0}; +		pOutputMx = mxCreateNumericArray(2, zero_dims, mxSINGLE_CLASS, mxREAL); +		mxSetDimensions(pOutputMx, dims, 3); +		const mwSize num_elems = mxGetNumberOfElements(pOutputMx); +		const mwSize elem_size = mxGetElementSize(pOutputMx); +		mxSetData(pOutputMx, mxMalloc(elem_size * num_elems)); + +		astra::CFloat32CustomMemory* m = new CFloat32CustomMemory_simple((float *)mxGetData(pOutputMx)); +		pOutput = new astra::CFloat32VolumeData3DMemory(pVolGeom, m); +	} else { +		pOutput = new astra::CFloat32VolumeData3DMemory(pVolGeom); +	} + +	// Perform BP + +	astra::CCudaBackProjectionAlgorithm3D* pAlg; +	pAlg = new astra::CCudaBackProjectionAlgorithm3D(); +	pAlg->initialize(pProjector, pInput, pOutput); + +	if (!pAlg->isInitialized()) { +		mexErrMsgTxt("Error initializing algorithm."); +		// TODO: Delete pOutputMx? +		delete pAlg; +		delete pInput; +		delete pOutput; +		return; +	} + +	pAlg->run(); + +	delete pAlg; + + +	if (mxIsSingle(data)) { + +	} else { +		pOutputMx = createEquivMexArray<mxDOUBLE_CLASS>(pOutput); +		copyCFloat32ArrayToMex(pOutput->getData(), pOutputMx); +	} +	plhs[0] = pOutputMx; + +	delete pOutput; +	delete pInput; +} + +#endif + +//----------------------------------------------------------------------------------------- + +static void printHelp() +{ +	mexPrintf("Please specify a mode of operation.\n"); +	mexPrintf("Valid modes: FP3D, BP3D\n"); +} + + +//----------------------------------------------------------------------------------------- +/** + * ... = astra_mex_direct_c(mode,...); + */ +void mexFunction(int nlhs, mxArray* plhs[], +				 int nrhs, const mxArray* prhs[]) +{ + +	// INPUT: Mode +	string sMode; +	if (1 <= nrhs) { +		sMode = mexToString(prhs[0]); +	} else { +		printHelp(); +		return; +	} + +#ifndef ASTRA_CUDA +	mexErrMsgTxt("Only CUDA projectors are currently supported."); +	return; +#else + +	// 3D data +	if (sMode == "FP3D") { +		astra_mex_direct_fp3d(nlhs, plhs, nrhs, prhs); +	} else if (sMode == "BP3D") { +		astra_mex_direct_bp3d(nlhs, plhs, nrhs, prhs); +	} else { +		printHelp(); +	} +#endif + +	return; +} + + diff --git a/matlab/mex/astra_mex_direct_vc09.vcproj b/matlab/mex/astra_mex_direct_vc09.vcproj new file mode 100644 index 0000000..5d27c65 --- /dev/null +++ b/matlab/mex/astra_mex_direct_vc09.vcproj @@ -0,0 +1,628 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject +	ProjectType="Visual C++" +	Version="9.00" +	Name="astra_mex_direct" +	ProjectGUID="{85FE09A6-FA49-4314-A2B1-59D77C7442A8}" +	RootNamespace="astraMatlab" +	TargetFrameworkVersion="131072" +	> +	<Platforms> +		<Platform +			Name="Win32" +		/> +		<Platform +			Name="x64" +		/> +	</Platforms> +	<ToolFiles> +	</ToolFiles> +	<Configurations> +		<Configuration +			Name="Debug_CUDA|Win32" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;"$(CUDA_INC_PATH)";..\..\lib\include;..\..\include" +				PreprocessorDefinitions="ASTRA_CUDA;__SSE2__" +				Optimization="0" +				RuntimeLibrary="3" +				EnableEnhancedInstructionSet="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="AstraCuda32D.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw32" +				AdditionalLibraryDirectories="..\..\bin\win32;$(MATLAB_ROOT)\extern\lib\win32\microsoft;..\..\lib\win32" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="true" +				TargetMachine="1" +			/> +		</Configuration> +		<Configuration +			Name="Debug_CUDA|x64" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;"$(CUDA_INC_PATH)";..\..\lib\include;..\..\include" +				PreprocessorDefinitions="ASTRA_CUDA;__SSE2__" +				Optimization="0" +				RuntimeLibrary="3" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="AstraCuda64D.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw64" +				AdditionalLibraryDirectories="..\..\bin\x64;$(MATLAB_ROOT)\extern\lib\win64\microsoft;..\..\lib\x64" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="true" +				TargetMachine="17" +			/> +		</Configuration> +		<Configuration +			Name="Debug|Win32" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;..\..\lib\include;..\..\include" +				PreprocessorDefinitions="__SSE2__" +				Optimization="0" +				RuntimeLibrary="3" +				EnableEnhancedInstructionSet="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="Astra32D.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw32" +				AdditionalLibraryDirectories="..\..\bin\win32;$(MATLAB_ROOT)\extern\lib\win32\microsoft;..\..\lib\win32" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="true" +				TargetMachine="1" +			/> +		</Configuration> +		<Configuration +			Name="Debug|x64" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;..\..\lib\include;..\..\include" +				PreprocessorDefinitions="__SSE2__" +				Optimization="0" +				RuntimeLibrary="3" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="Astra64D.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw64" +				AdditionalLibraryDirectories="..\..\bin\x64;$(MATLAB_ROOT)\extern\lib\win64\microsoft;..\..\lib\x64" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="true" +				TargetMachine="17" +			/> +		</Configuration> +		<Configuration +			Name="Release_CUDA|Win32" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;"$(CUDA_INC_PATH)";..\..\lib\include;..\..\include" +				PreprocessorDefinitions="ASTRA_CUDA;__SSE2__" +				Optimization="2" +				RuntimeLibrary="2" +				EnableEnhancedInstructionSet="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="AstraCuda32.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw32" +				AdditionalLibraryDirectories="..\..\bin\win32;$(MATLAB_ROOT)\extern\lib\win32\microsoft;..\..\lib\win32" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="false" +				TargetMachine="1" +			/> +		</Configuration> +		<Configuration +			Name="Release_CUDA|x64" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;"$(CUDA_INC_PATH)";..\..\lib\include;..\..\include" +				PreprocessorDefinitions="ASTRA_CUDA;__SSE2__" +				Optimization="2" +				RuntimeLibrary="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="AstraCuda64.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw64" +				AdditionalLibraryDirectories="..\..\bin\x64;$(MATLAB_ROOT)\extern\lib\win64\microsoft;..\..\lib\x64" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="false" +				TargetMachine="17" +			/> +		</Configuration> +		<Configuration +			Name="Release|Win32" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;..\..\lib\include;..\..\include" +				PreprocessorDefinitions="__SSE2__" +				Optimization="2" +				RuntimeLibrary="2" +				EnableEnhancedInstructionSet="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="Astra32.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw32" +				AdditionalLibraryDirectories="..\..\bin\win32;$(MATLAB_ROOT)\extern\lib\win32\microsoft;..\..\lib\win32" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="false" +				TargetMachine="1" +			/> +		</Configuration> +		<Configuration +			Name="Release|x64" +			OutputDirectory="$(SolutionDir)bin\$(PlatformName)\$(ConfigurationName)" +			IntermediateDirectory="$(OutDir)\obj\$(ProjectName)" +			ConfigurationType="2" +			> +			<Tool +				Name="VCPreBuildEventTool" +			/> +			<Tool +				Name="VCCustomBuildTool" +			/> +			<Tool +				Name="VCXMLDataGeneratorTool" +			/> +			<Tool +				Name="VCWebServiceProxyGeneratorTool" +			/> +			<Tool +				Name="VCMIDLTool" +			/> +			<Tool +				Name="VCManagedResourceCompilerTool" +			/> +			<Tool +				Name="VCResourceCompilerTool" +			/> +			<Tool +				Name="VCPreLinkEventTool" +			/> +			<Tool +				Name="VCALinkTool" +			/> +			<Tool +				Name="VCManifestTool" +			/> +			<Tool +				Name="VCXDCMakeTool" +			/> +			<Tool +				Name="VCBscMakeTool" +			/> +			<Tool +				Name="VCFxCopTool" +			/> +			<Tool +				Name="VCAppVerifierTool" +			/> +			<Tool +				Name="VCPostBuildEventTool" +			/> +			<Tool +				Name="VCCLCompilerTool" +				AdditionalIncludeDirectories="$(MATLAB_ROOT)\extern\include\;..\..\lib\include;..\..\include" +				PreprocessorDefinitions="__SSE2__" +				Optimization="2" +				RuntimeLibrary="2" +				OpenMP="true" +				AdditionalOptions="/MP" +			/> +			<Tool +				Name="VCLinkerTool" +				AdditionalDependencies="Astra64.lib libmex.lib libmx.lib libut.lib" +				OutputFile="$(OutDir)\$(ProjectName)_c.mexw64" +				AdditionalLibraryDirectories="..\..\bin\x64;$(MATLAB_ROOT)\extern\lib\win64\microsoft;..\..\lib\x64" +				ModuleDefinitionFile="mex.def" +				GenerateDebugInformation="false" +				TargetMachine="17" +			/> +		</Configuration> +	</Configurations> +	<References> +	</References> +	<Files> +		<File +			RelativePath=".\astra_mex_direct_c.cpp" +			> +		</File> +		<File +			RelativePath=".\mexHelpFunctions.cpp" +			> +		</File> +		<File +			RelativePath=".\mexHelpFunctions.h" +			> +		</File> +		<File +			RelativePath=".\mexCopyDataHelpFunctions.cpp" +			> +		</File> +		<File +			RelativePath=".\mexCopyDataHelpFunctions.h" +			> +		</File> +		<File +			RelativePath=".\mexDataManagerHelpFunctions.cpp" +			> +		</File> +		<File +			RelativePath=".\mexDataManagerHelpFunctions.h" +			> +		</File> +		<File +			RelativePath=".\mexInitFunctions.cpp" +			> +		</File> +		<File +			RelativePath=".\mexInitFunctions.h" +			> +		</File> +	</Files> +	<Globals> +	</Globals> +</VisualStudioProject> diff --git a/matlab/mex/astra_mex_direct_vc11.vcxproj b/matlab/mex/astra_mex_direct_vc11.vcxproj new file mode 100644 index 0000000..bc2db62 --- /dev/null +++ b/matlab/mex/astra_mex_direct_vc11.vcxproj @@ -0,0 +1,310 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug_CUDA|Win32"> +      <Configuration>Debug_CUDA</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug_CUDA|x64"> +      <Configuration>Debug_CUDA</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release_CUDA|Win32"> +      <Configuration>Release_CUDA</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release_CUDA|x64"> +      <Configuration>Release_CUDA</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectName>astra_mex_direct</ProjectName> +    <ProjectGuid>{0F68F4E2-BE1B-4A9A-B101-AECF4C069CC7}</ProjectGuid> +    <RootNamespace>astraMatlab</RootNamespace> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|Win32'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|x64'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|Win32'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|x64'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>DynamicLibrary</ConfigurationType> +    <PlatformToolset>v110</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|x64'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|x64'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup> +    <_ProjectFileVersion>11.0.60610.1</_ProjectFileVersion> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|Win32'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw32</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|x64'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw64</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw32</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw64</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|Win32'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw32</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|x64'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw64</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw32</TargetExt> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> +    <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir> +    <TargetName>$(ProjectName)_c</TargetName> +    <TargetExt>.mexw64</TargetExt> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|Win32'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> +      <Optimization>Disabled</Optimization> +      <PreprocessorDefinitions>ASTRA_CUDA;__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw32</OutputFile> +      <AdditionalDependencies>AstraCuda32D.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\win32\;..\..\bin\win32\Debug_CUDA;$(MATLAB_ROOT)\extern\lib\win32\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CUDA|x64'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <Optimization>Disabled</Optimization> +      <PreprocessorDefinitions>ASTRA_CUDA;__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw64</OutputFile> +      <AdditionalDependencies>AstraCuda64D.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\x64\;..\..\bin\x64\Debug_CUDA;$(MATLAB_ROOT)\extern\lib\win64\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> +      <Optimization>Disabled</Optimization> +      <PreprocessorDefinitions>__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw32</OutputFile> +      <AdditionalDependencies>Astra32D.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\win32\;..\..\bin\win32\Debug;$(MATLAB_ROOT)\extern\lib\win32\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <Optimization>Disabled</Optimization> +      <PreprocessorDefinitions>__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw64</OutputFile> +      <AdditionalDependencies>Astra64D.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\x64\;..\..\bin\x64\Debug;$(MATLAB_ROOT)\extern\lib\win64\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|Win32'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> +      <Optimization>MaxSpeed</Optimization> +      <PreprocessorDefinitions>ASTRA_CUDA;__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw32</OutputFile> +      <AdditionalDependencies>AstraCuda32.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\win32\;..\..\bin\win32\Release_CUDA;$(MATLAB_ROOT)\extern\lib\win32\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_CUDA|x64'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <Optimization>MaxSpeed</Optimization> +      <PreprocessorDefinitions>ASTRA_CUDA;__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw64</OutputFile> +      <AdditionalDependencies>AstraCuda64.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\x64\;..\..\bin\x64\Release_CUDA;$(MATLAB_ROOT)\extern\lib\win64\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> +      <Optimization>MaxSpeed</Optimization> +      <PreprocessorDefinitions>__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw32</OutputFile> +      <AdditionalDependencies>Astra32.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\win32\;..\..\bin\win32\Release;$(MATLAB_ROOT)\extern\lib\win32\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> +      <AdditionalIncludeDirectories>$(MATLAB_ROOT)\extern\include\;$(CUDA_PATH)\include;..\..\lib\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <OpenMPSupport>true</OpenMPSupport> +      <Optimization>MaxSpeed</Optimization> +      <PreprocessorDefinitions>__SSE2__;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <MultiProcessorCompilation>true</MultiProcessorCompilation> +    </ClCompile> +    <Link> +      <OutputFile>$(OutDir)$(ProjectName)_c.mexw64</OutputFile> +      <AdditionalDependencies>Astra64.lib;libmex.lib;libmx.lib;libut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>..\..\lib\x64\;..\..\bin\x64\Release;$(MATLAB_ROOT)\extern\lib\win64\microsoft;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <ModuleDefinitionFile>mex.def</ModuleDefinitionFile> +      <GenerateDebugInformation>true</GenerateDebugInformation> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="astra_mex_direct_c.cpp" /> +    <ClCompile Include="mexHelpFunctions.cpp" /> +    <ClCompile Include="mexCopyDataHelpFunctions.cpp" /> +    <ClCompile Include="mexDataManagerHelpFunctions.cpp" /> +    <ClCompile Include="mexInitFunctions.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="mexHelpFunctions.h" /> +    <ClInclude Include="mexCopyDataHelpFunctions.h" /> +    <ClInclude Include="mexDataManagerHelpFunctions.h" /> +    <ClInclude Include="mexInitFunctions.h" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/matlab/tools/astra_create_projector.m b/matlab/tools/astra_create_projector.m index da9c083..9bbef9e 100644 --- a/matlab/tools/astra_create_projector.m +++ b/matlab/tools/astra_create_projector.m @@ -1,7 +1,7 @@ -function proj_id = astra_create_projector(type, proj_geom, vol_geom) +function proj_id = astra_create_projector(type, proj_geom, vol_geom, options)  %-------------------------------------------------------------------------- -% proj_id = astra_create_projector(type, proj_geom, vol_geom) +% proj_id = astra_create_projector(type, proj_geom, vol_geom, options)  %   % Create a new projector object based on projection and volume geometry.    % Used when the default values of each projector are sufficient.   @@ -9,6 +9,7 @@ function proj_id = astra_create_projector(type, proj_geom, vol_geom)  % type: type of the projector.  'blob', 'line', 'linear' 'strip', ... See API for more information.  % proj_geom: MATLAB struct containing the projection geometry.  % vol_geom: MATLAB struct containing the volume geometry. +% options: Optional MATLAB struct containing projector options (like: 'GPUindex', 'DetectorSuperSampling', and 'VoxelSuperSampling')  % proj_id: identifier of the projector as it is now stored in the astra-library.  %--------------------------------------------------------------------------  %-------------------------------------------------------------------------- @@ -38,6 +39,10 @@ if strcmp(type,'blob')  	cfg_proj.Kernel.KernelValues = blob_values;  end +if exist('options', 'var') +    cfg_proj.options = options; +end +  if strcmp(type,'linear3d') || strcmp(type,'linearcone') || strcmp(type,'cuda3d')  	proj_id = astra_mex_projector3d('create', cfg_proj);  else diff --git a/matlab/tools/astra_mex_direct.m b/matlab/tools/astra_mex_direct.m new file mode 100644 index 0000000..58c4fd2 --- /dev/null +++ b/matlab/tools/astra_mex_direct.m @@ -0,0 +1,24 @@ +function [varargout] = astra_mex_direct(varargin) +%------------------------------------------------------------------------ +% Reference page in Help browser +%    <a href="matlab:docsearch('astra_mex_direct' )">astra_mex_data3d</a>. +%------------------------------------------------------------------------ +%------------------------------------------------------------------------ +% This file is part of the ASTRA Toolbox +%  +% Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp +%            2014-2015, CWI, Amsterdam +% License: Open Source under GPLv3 +% Contact: astra@uantwerpen.be +% Website: http://sf.net/projects/astra-toolbox +%------------------------------------------------------------------------ +% $Id$ +if nargout == 0 +    astra_mex_direct_c(varargin{:}); +    if exist('ans','var') +        varargout{1} = ans; +    end +else +    varargout = cell(1,nargout); +    [varargout{:}] = astra_mex_direct_c(varargin{:}); +end diff --git a/src/CudaBackProjectionAlgorithm.cpp b/src/CudaBackProjectionAlgorithm.cpp index 365e058..a73f895 100644 --- a/src/CudaBackProjectionAlgorithm.cpp +++ b/src/CudaBackProjectionAlgorithm.cpp @@ -76,10 +76,9 @@ bool CCudaBackProjectionAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaBackProjectionAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, 1, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaBackProjectionAlgorithm3D.cpp b/src/CudaBackProjectionAlgorithm3D.cpp index a5c3445..8cf4c3b 100644 --- a/src/CudaBackProjectionAlgorithm3D.cpp +++ b/src/CudaBackProjectionAlgorithm3D.cpp @@ -38,6 +38,8 @@ $Id$  #include "astra/ParallelVecProjectionGeometry3D.h"  #include "astra/ConeVecProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -87,6 +89,24 @@ bool CCudaBackProjectionAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaBackProjectionAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to BP3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)  { @@ -103,21 +123,18 @@ bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	CCudaProjector3D* pCudaProjector = 0; -	pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); -	if (!pCudaProjector) { -		// TODO: Report -	} - -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); - +	initializeFromProjector(); -	m_iVoxelSuperSampling = 1; -	if (pCudaProjector) -		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +	// Deprecated options  	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_bSIRTWeighting = _cfg.self.getOptionBool("SIRTWeighting", false);  	CC.markOptionParsed("SIRTWeighting"); @@ -143,6 +160,8 @@ bool CCudaBackProjectionAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; +	initializeFromProjector(); +  	// success  	m_bIsInitialized = _check();  	return m_bIsInitialized; diff --git a/src/CudaCglsAlgorithm.cpp b/src/CudaCglsAlgorithm.cpp index 0cedff6..9dd4f78 100644 --- a/src/CudaCglsAlgorithm.cpp +++ b/src/CudaCglsAlgorithm.cpp @@ -77,11 +77,9 @@ bool CCudaCglsAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaCglsAlgorithm::initialize(CProjector2D* _pProjector,                                      CFloat32ProjectionData2D* _pSinogram,  -                                    CFloat32VolumeData2D* _pReconstruction, -                                    int _iGPUindex, int _iDetectorSuperSampling, -                                    int _iPixelSuperSampling) +                                    CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaCglsAlgorithm3D.cpp b/src/CudaCglsAlgorithm3D.cpp index 2d28964..abc18d1 100644 --- a/src/CudaCglsAlgorithm3D.cpp +++ b/src/CudaCglsAlgorithm3D.cpp @@ -37,6 +37,8 @@ $Id$  #include "astra/ParallelVecProjectionGeometry3D.h"  #include "astra/ConeVecProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -90,6 +92,26 @@ bool CCudaCglsAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaCglsAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to CGLS3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)  { @@ -107,27 +129,20 @@ bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	CCudaProjector3D* pCudaProjector = 0; -	pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); -	if (!pCudaProjector) { -		// TODO: Report -	} - -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); +	initializeFromProjector(); -	m_iVoxelSuperSampling = 1; -	m_iDetectorSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); -		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); -	}  	// Deprecated options  	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling);  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling");  	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_pCgls = new AstraCGLS3d(); @@ -155,6 +170,8 @@ bool CCudaCglsAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; +	initializeFromProjector(); +  	m_pCgls = new AstraCGLS3d;  	m_bAstraCGLSInit = false; diff --git a/src/CudaEMAlgorithm.cpp b/src/CudaEMAlgorithm.cpp index 5c71f3d..d0afd80 100644 --- a/src/CudaEMAlgorithm.cpp +++ b/src/CudaEMAlgorithm.cpp @@ -76,11 +76,9 @@ bool CCudaEMAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaEMAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp index e700945..1316daa 100644 --- a/src/CudaFDKAlgorithm3D.cpp +++ b/src/CudaFDKAlgorithm3D.cpp @@ -35,6 +35,8 @@ $Id$  #include "astra/CudaProjector3D.h"  #include "astra/ConeProjectionGeometry3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -85,6 +87,24 @@ bool CCudaFDKAlgorithm3D::_check()  }  //--------------------------------------------------------------------------------------- +void CCudaFDKAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to FDK_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)  { @@ -101,20 +121,18 @@ bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	CCudaProjector3D* pCudaProjector = 0; -	pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); -	if (!pCudaProjector) { -		// TODO: Report -	} - -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); +	initializeFromProjector(); -	m_iVoxelSuperSampling = 1; -	if (pCudaProjector) -		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +	// Deprecated options  	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_bShortScan = _cfg.self.getOptionBool("ShortScan", false);  	CC.markOptionParsed("ShortScan"); diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp index 6353c46..bcd70c4 100644 --- a/src/CudaFilteredBackProjectionAlgorithm.cpp +++ b/src/CudaFilteredBackProjectionAlgorithm.cpp @@ -67,6 +67,24 @@ CCudaFilteredBackProjectionAlgorithm::~CCudaFilteredBackProjectionAlgorithm()  	}  } +void CCudaFilteredBackProjectionAlgorithm::initializeFromProjector() +{ +	m_iPixelSuperSampling = 1; +	m_iGPUIndex = -1; + +	// Projector +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector2D passed to FBP_CUDA"); +		} +	} else { +		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} +  bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  {  	ASTRA_ASSERT(_cfg.self); @@ -163,27 +181,24 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)  	}  	CC.markNodeParsed("FilterD"); // TODO: Only for some types! -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); - -	m_iPixelSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); -	} -	// Deprecated options -	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling); -	CC.markOptionParsed("PixelSuperSampling"); - -  	// Fan beam short scan mode  	if (m_pSinogram && dynamic_cast<CFanFlatProjectionGeometry2D*>(m_pSinogram->getGeometry())) {  		m_bShortScan = (int)_cfg.self.getOptionBool("ShortScan", false);  		CC.markOptionParsed("ShortScan");  	} +	initializeFromProjector(); +	// Deprecated options +	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling); +	CC.markOptionParsed("PixelSuperSampling"); + +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex");  	m_pFBP = new AstraFBP; diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp index b382f2e..9ca13ae 100644 --- a/src/CudaForwardProjectionAlgorithm.cpp +++ b/src/CudaForwardProjectionAlgorithm.cpp @@ -38,8 +38,11 @@ $Id$  #include <boost/lexical_cast.hpp>  #include "astra/AstraObjectManager.h" +#include "astra/ParallelProjectionGeometry2D.h"  #include "astra/FanFlatProjectionGeometry2D.h"  #include "astra/FanFlatVecProjectionGeometry2D.h" +#include "astra/Float32ProjectionData2D.h" +#include "astra/Float32VolumeData2D.h"  #include "astra/CudaProjector2D.h"  #include "astra/Logging.h" @@ -66,6 +69,24 @@ CCudaForwardProjectionAlgorithm::~CCudaForwardProjectionAlgorithm()  }  //--------------------------------------------------------------------------------------- +void CCudaForwardProjectionAlgorithm::initializeFromProjector() +{ +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	// Projector +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA"); +		} +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  { @@ -74,14 +95,9 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  	// Projector  	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	CCudaProjector2D* pCudaProjector = 0;  	if (node) {  		int id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		pCudaProjector = dynamic_cast<CCudaProjector2D*>(projector); -		if (!pCudaProjector) { -			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA"); -		} +		m_pProjector = CProjector2DManager::getSingleton().get(id);  	}  	CC.markNodeParsed("ProjectorId"); @@ -101,22 +117,18 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  	m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));  	CC.markNodeParsed("VolumeDataId"); +	initializeFromProjector(); + +	// Deprecated options +	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	CC.markOptionParsed("DetectorSuperSampling");  	// GPU number  	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);  	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); -	CC.markOptionParsed("GPUindex"); -	if (!_cfg.self.hasOption("GPUindex")) -		CC.markOptionParsed("GPUIndex"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); -	// Detector supersampling factor -	m_iDetectorSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); -	} -	// Deprecated option -	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); -	CC.markOptionParsed("DetectorSuperSampling");  	// return success @@ -125,20 +137,16 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)  //----------------------------------------------------------------------------------------  // Initialize - C++ -bool CCudaForwardProjectionAlgorithm::initialize(CProjectionGeometry2D* _pProjectionGeometry, -												 CVolumeGeometry2D* _pReconstructionGeometry, +bool CCudaForwardProjectionAlgorithm::initialize(CProjector2D* _pProjector,  												 CFloat32VolumeData2D* _pVolume, -												 CFloat32ProjectionData2D* _pSinogram, -												 int _iGPUindex, int _iDetectorSuperSampling) +												 CFloat32ProjectionData2D* _pSinogram)  {  	// store classes -	//m_pProjectionGeometry = _pProjectionGeometry; -	//m_pReconstructionGeometry = _pReconstructionGeometry; +	m_pProjector = _pProjector;  	m_pVolume = _pVolume;  	m_pSinogram = _pSinogram; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iGPUIndex = _iGPUindex; +	initializeFromProjector();  	// return success  	return check(); diff --git a/src/CudaForwardProjectionAlgorithm3D.cpp b/src/CudaForwardProjectionAlgorithm3D.cpp index 3da61ff..e57e077 100644 --- a/src/CudaForwardProjectionAlgorithm3D.cpp +++ b/src/CudaForwardProjectionAlgorithm3D.cpp @@ -72,6 +72,23 @@ CCudaForwardProjectionAlgorithm3D::~CCudaForwardProjectionAlgorithm3D()  }  //--------------------------------------------------------------------------------------- +void CCudaForwardProjectionAlgorithm3D::initializeFromProjector() +{ +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to FP3D_CUDA"); +		} +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} +} + +//---------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)  { @@ -97,29 +114,21 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)  	// optional: projector  	node = _cfg.self.getSingleNode("ProjectorId"); -	CCudaProjector3D* pCudaProjector = 0;  	m_pProjector = 0;  	if (node) {  		id = boost::lexical_cast<int>(node.getContent());  		m_pProjector = CProjector3DManager::getSingleton().get(id); -		pCudaProjector = dynamic_cast<CCudaProjector3D*>(CProjector3DManager::getSingleton().get(id)); -		m_pProjector = pCudaProjector; -		if (!pCudaProjector) { -			// TODO: Report -		}  	}  	CC.markNodeParsed("ProjectorId"); -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); - +	initializeFromProjector(); -	m_iDetectorSuperSampling = 1; -	if (pCudaProjector) -		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +	// Deprecated options  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex);  	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUindex"); +  	// success  	m_bIsInitialized = check(); @@ -142,8 +151,15 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(CProjector3D* _pProjector,  	m_pProjections = _pProjections;  	m_pVolume = _pVolume; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iGPUIndex = _iGPUindex; +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		// TODO: Report +		m_iDetectorSuperSampling = _iDetectorSuperSampling; +		m_iGPUIndex = _iGPUindex; +	} else { +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	}  	// success  	m_bIsInitialized = check(); diff --git a/src/CudaProjector2D.cpp b/src/CudaProjector2D.cpp index a26e32d..acf6000 100644 --- a/src/CudaProjector2D.cpp +++ b/src/CudaProjector2D.cpp @@ -61,6 +61,7 @@ void CCudaProjector2D::_clear()  	m_projectionKernel = ker2d_default;  	m_iVoxelSuperSampling = 1;  	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  }  //---------------------------------------------------------------------------------------- @@ -125,18 +126,18 @@ bool CCudaProjector2D::initialize(const Config& _cfg)  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);  	CC.markOptionParsed("DetectorSuperSampling"); +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_bIsInitialized = _check();  	return m_bIsInitialized;  } -/* -bool CProjector2D::initialize(astra::CProjectionGeometry2D *, astra::CVolumeGeometry2D *) -{ -	ASTRA_ASSERT(false); - -	return false; -} -*/  std::string CCudaProjector2D::description() const  { diff --git a/src/CudaProjector3D.cpp b/src/CudaProjector3D.cpp index d2fd74c..bbfbd34 100644 --- a/src/CudaProjector3D.cpp +++ b/src/CudaProjector3D.cpp @@ -64,6 +64,7 @@ void CCudaProjector3D::_clear()  	m_projectionKernel = ker3d_default;  	m_iVoxelSuperSampling = 1;  	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  }  //---------------------------------------------------------------------------------------- @@ -128,6 +129,12 @@ bool CCudaProjector3D::initialize(const Config& _cfg)  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);  	CC.markOptionParsed("DetectorSuperSampling"); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); +  	m_bIsInitialized = _check();  	return m_bIsInitialized;  } diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp index 18627fc..71dddf7 100644 --- a/src/CudaReconstructionAlgorithm2D.cpp +++ b/src/CudaReconstructionAlgorithm2D.cpp @@ -84,111 +84,51 @@ void CCudaReconstructionAlgorithm2D::_clear()  }  //--------------------------------------------------------------------------------------- -// Initialize - Config -bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg) +void CCudaReconstructionAlgorithm2D::initializeFromProjector()  { -	ASTRA_ASSERT(_cfg.self); -	ConfigStackCheck<CAlgorithm> CC("CudaReconstructionAlgorithm2D", this, _cfg); - -	// if already initialized, clear first -	if (m_bIsInitialized) { -		clear(); -	} +	m_iPixelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1;  	// Projector -	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	CCudaProjector2D* pCudaProjector = 0; -	if (node) { -		int id = boost::lexical_cast<int>(node.getContent()); -		CProjector2D *projector = CProjector2DManager::getSingleton().get(id); -		pCudaProjector = dynamic_cast<CCudaProjector2D*>(projector); -		if (!pCudaProjector) { +	CCudaProjector2D* pCudaProjector = dynamic_cast<CCudaProjector2D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) {  			ASTRA_WARN("non-CUDA Projector2D passed");  		} -	} -	CC.markNodeParsed("ProjectorId"); - - -	// sinogram data -	node = _cfg.self.getSingleNode("ProjectionDataId"); -	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ProjectionDataId tag specified."); -	int id = boost::lexical_cast<int>(node.getContent()); -	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); -	CC.markNodeParsed("ProjectionDataId"); - -	// reconstruction data -	node = _cfg.self.getSingleNode("ReconstructionDataId"); -	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ReconstructionDataId tag specified."); -	id = boost::lexical_cast<int>(node.getContent()); -	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id)); -	CC.markNodeParsed("ReconstructionDataId"); - -	// fixed mask -	if (_cfg.self.hasOption("ReconstructionMaskId")) { -		m_bUseReconstructionMask = true; -		id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId")); -		m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id)); -		ASTRA_CONFIG_CHECK(m_pReconstructionMask, "CudaReconstruction2D", "Invalid ReconstructionMaskId."); -	} -	CC.markOptionParsed("ReconstructionMaskId"); -	// fixed mask -	if (_cfg.self.hasOption("SinogramMaskId")) { -		m_bUseSinogramMask = true; -		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId")); -		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id)); -		ASTRA_CONFIG_CHECK(m_pSinogramMask, "CudaReconstruction2D", "Invalid SinogramMaskId."); -	} -	CC.markOptionParsed("SinogramMaskId"); - -	// Constraints - NEW -	if (_cfg.self.hasOption("MinConstraint")) { -		m_bUseMinConstraint = true; -		m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f); -		CC.markOptionParsed("MinConstraint"); -	} else { -		// Constraint - OLD -		m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false); -		CC.markOptionParsed("UseMinConstraint"); -		if (m_bUseMinConstraint) { -			m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f); -			CC.markOptionParsed("MinConstraintValue"); -		} -	} -	if (_cfg.self.hasOption("MaxConstraint")) { -		m_bUseMaxConstraint = true; -		m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f); -		CC.markOptionParsed("MaxConstraint");  	} else { -		// Constraint - OLD -		m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false); -		CC.markOptionParsed("UseMaxConstraint"); -		if (m_bUseMaxConstraint) { -			m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f); -			CC.markOptionParsed("MaxConstraintValue"); -		} -	} - -	// GPU number -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); -	CC.markOptionParsed("GPUindex"); -	if (!_cfg.self.hasOption("GPUindex")) -		CC.markOptionParsed("GPUIndex"); - -	// Supersampling factors -	m_iDetectorSuperSampling = 1; -	m_iPixelSuperSampling = 1; -	if (pCudaProjector) { -		// New interface  		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling();  		m_iPixelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex();  	} +} + +//--------------------------------------------------------------------------------------- +// Initialize - Config +bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg) +{ +	ASTRA_ASSERT(_cfg.self); +	ConfigStackCheck<CAlgorithm> CC("CudaReconstructionAlgorithm2D", this, _cfg); + +	m_bIsInitialized = CReconstructionAlgorithm2D::initialize(_cfg); + +	if (!m_bIsInitialized) +		return false; + +	initializeFromProjector(); +  	// Deprecated options  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling);  	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", m_iPixelSuperSampling);  	CC.markOptionParsed("DetectorSuperSampling");  	CC.markOptionParsed("PixelSuperSampling"); +	// GPU number +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex");  	return _check();  } @@ -199,32 +139,18 @@ bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,                                        CFloat32VolumeData2D* _pReconstruction)  { -	return initialize(_pProjector, _pSinogram, _pReconstruction, 0, 1); -} - -//--------------------------------------------------------------------------------------- -// Initialize - C++ -bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector, -                                     CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, -                                     int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) -{  	// if already initialized, clear first  	if (m_bIsInitialized) {  		clear();  	} -	m_pProjector = 0; +	m_pProjector = _pProjector;  	// required classes  	m_pSinogram = _pSinogram;  	m_pReconstruction = _pReconstruction; -	m_iDetectorSuperSampling = _iDetectorSuperSampling; -	m_iPixelSuperSampling = _iPixelSuperSampling; -	m_iGPUIndex = _iGPUindex; +	initializeFromProjector();  	return _check();  } @@ -234,40 +160,13 @@ bool CCudaReconstructionAlgorithm2D::initialize(CProjector2D* _pProjector,  // Check  bool CCudaReconstructionAlgorithm2D::_check()   { -	// TODO: CLEAN UP - - -	// check pointers -	//ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object."); -	ASTRA_CONFIG_CHECK(m_pSinogram, "SIRT_CUDA", "Invalid Projection Data Object."); -	ASTRA_CONFIG_CHECK(m_pReconstruction, "SIRT_CUDA", "Invalid Reconstruction Data Object."); - -	// check initializations -	//ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized."); -	ASTRA_CONFIG_CHECK(m_pSinogram->isInitialized(), "SIRT_CUDA", "Projection Data Object Not Initialized."); -	ASTRA_CONFIG_CHECK(m_pReconstruction->isInitialized(), "SIRT_CUDA", "Reconstruction Data Object Not Initialized."); - -	ASTRA_CONFIG_CHECK(m_iDetectorSuperSampling >= 1, "SIRT_CUDA", "DetectorSuperSampling must be a positive integer."); -	ASTRA_CONFIG_CHECK(m_iPixelSuperSampling >= 1, "SIRT_CUDA", "PixelSuperSampling must be a positive integer."); -	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "SIRT_CUDA", "GPUIndex must be a non-negative integer."); - -	// check compatibility between projector and data classes -//	ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "SIRT_CUDA", "Projection Data not compatible with the specified Projector."); -//	ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "SIRT_CUDA", "Reconstruction Data not compatible with the specified Projector."); - -	// todo: turn some of these back on +	if (!CReconstructionAlgorithm2D::_check()) +		return false; -// 	ASTRA_CONFIG_CHECK(m_pProjectionGeometry, "SIRT_CUDA", "ProjectionGeometry not specified."); -// 	ASTRA_CONFIG_CHECK(m_pProjectionGeometry->isInitialized(), "SIRT_CUDA", "ProjectionGeometry not initialized."); -// 	ASTRA_CONFIG_CHECK(m_pReconstructionGeometry, "SIRT_CUDA", "ReconstructionGeometry not specified."); -// 	ASTRA_CONFIG_CHECK(m_pReconstructionGeometry->isInitialized(), "SIRT_CUDA", "ReconstructionGeometry not initialized."); +	ASTRA_CONFIG_CHECK(m_iDetectorSuperSampling >= 1, "CudaReconstructionAlgorithm2D", "DetectorSuperSampling must be a positive integer."); +	ASTRA_CONFIG_CHECK(m_iPixelSuperSampling >= 1, "CudaReconstructionAlgorithm2D", "PixelSuperSampling must be a positive integer."); +	ASTRA_CONFIG_CHECK(m_iGPUIndex >= -1, "CudaReconstructionAlgorithm2D", "GPUIndex must be a non-negative integer or -1."); -	// check dimensions -	//ASTRA_CONFIG_CHECK(m_pSinogram->getAngleCount() == m_pProjectionGeometry->getProjectionAngleCount(), "SIRT_CUDA", "Sinogram data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pSinogram->getDetectorCount() == m_pProjectionGeometry->getDetectorCount(), "SIRT_CUDA", "Sinogram data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pReconstruction->getWidth() == m_pReconstructionGeometry->getGridColCount(), "SIRT_CUDA", "Reconstruction data object size mismatch."); -	//ASTRA_CONFIG_CHECK(m_pReconstruction->getHeight() == m_pReconstructionGeometry->getGridRowCount(), "SIRT_CUDA", "Reconstruction data object size mismatch."); -	  	// check restrictions  	// TODO: check restrictions built into cuda code diff --git a/src/CudaSartAlgorithm.cpp b/src/CudaSartAlgorithm.cpp index 8c0c6d7..d202847 100644 --- a/src/CudaSartAlgorithm.cpp +++ b/src/CudaSartAlgorithm.cpp @@ -116,10 +116,9 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaSartAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, 1); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaSirtAlgorithm.cpp b/src/CudaSirtAlgorithm.cpp index d424915..ab0a418 100644 --- a/src/CudaSirtAlgorithm.cpp +++ b/src/CudaSirtAlgorithm.cpp @@ -98,11 +98,9 @@ bool CCudaSirtAlgorithm::initialize(const Config& _cfg)  // Initialize - C++  bool CCudaSirtAlgorithm::initialize(CProjector2D* _pProjector,                                       CFloat32ProjectionData2D* _pSinogram,  -                                     CFloat32VolumeData2D* _pReconstruction, -                                     int _iGPUindex, int _iDetectorSuperSampling, -                                     int _iPixelSuperSampling) +                                     CFloat32VolumeData2D* _pReconstruction)  { -	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction, _iGPUindex, _iDetectorSuperSampling, _iPixelSuperSampling); +	m_bIsInitialized = CCudaReconstructionAlgorithm2D::initialize(_pProjector, _pSinogram, _pReconstruction);  	if (!m_bIsInitialized)  		return false; diff --git a/src/CudaSirtAlgorithm3D.cpp b/src/CudaSirtAlgorithm3D.cpp index b833e07..1fa0da2 100644 --- a/src/CudaSirtAlgorithm3D.cpp +++ b/src/CudaSirtAlgorithm3D.cpp @@ -38,6 +38,8 @@ $Id$  #include "astra/ConeVecProjectionGeometry3D.h"  #include "astra/CudaProjector3D.h" +#include "astra/Logging.h" +  #include "../cuda/3d/astra3d.h"  using namespace std; @@ -90,7 +92,27 @@ bool CCudaSirtAlgorithm3D::_check()  	return true;  } -//--------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +void CCudaSirtAlgorithm3D::initializeFromProjector() +{ +	m_iVoxelSuperSampling = 1; +	m_iDetectorSuperSampling = 1; +	m_iGPUIndex = -1; + +	CCudaProjector3D* pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); +	if (!pCudaProjector) { +		if (m_pProjector) { +			ASTRA_WARN("non-CUDA Projector3D passed to SIRT3D_CUDA"); +		} +	} else { +		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); +		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); +		m_iGPUIndex = pCudaProjector->getGPUIndex(); +	} + +} + +//--------------------------------------------------------------------------------------  // Initialize - Config  bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)  { @@ -108,28 +130,20 @@ bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)  		return false;  	} -	CCudaProjector3D* pCudaProjector = 0; -	pCudaProjector = dynamic_cast<CCudaProjector3D*>(m_pProjector); -	if (!pCudaProjector) { -		// TODO: Report -	} +	initializeFromProjector(); -	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1); -	CC.markOptionParsed("GPUindex"); - - -	m_iVoxelSuperSampling = 1; -	m_iDetectorSuperSampling = 1; -	if (pCudaProjector) { -		// New interface -		m_iVoxelSuperSampling = pCudaProjector->getVoxelSuperSampling(); -		m_iDetectorSuperSampling = pCudaProjector->getDetectorSuperSampling(); -	}  	// Deprecated options  	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", m_iVoxelSuperSampling);  	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", m_iDetectorSuperSampling); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", m_iGPUIndex); +	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);  	CC.markOptionParsed("VoxelSuperSampling");  	CC.markOptionParsed("DetectorSuperSampling"); +	CC.markOptionParsed("GPUIndex"); +	if (!_cfg.self.hasOption("GPUIndex")) +		CC.markOptionParsed("GPUindex"); + +  	m_pSirt = new AstraSIRT3d(); diff --git a/src/ReconstructionAlgorithm2D.cpp b/src/ReconstructionAlgorithm2D.cpp index 767efe6..4575ff7 100644 --- a/src/ReconstructionAlgorithm2D.cpp +++ b/src/ReconstructionAlgorithm2D.cpp @@ -85,9 +85,16 @@ bool CReconstructionAlgorithm2D::initialize(const Config& _cfg)  	// projector  	XMLNode node = _cfg.self.getSingleNode("ProjectorId"); -	ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified."); -	int id = boost::lexical_cast<int>(node.getContent()); -	m_pProjector = CProjector2DManager::getSingleton().get(id); +	if (requiresProjector()) { +		ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified."); +	} +	int id; +	if (node) { +		id = boost::lexical_cast<int>(node.getContent()); +		m_pProjector = CProjector2DManager::getSingleton().get(id); +	} else { +		m_pProjector = 0; +	}  	CC.markNodeParsed("ProjectorId");  	// sinogram data @@ -205,18 +212,22 @@ void CReconstructionAlgorithm2D::setSinogramMask(CFloat32ProjectionData2D* _pMas  bool CReconstructionAlgorithm2D::_check()   {  	// check pointers -	ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object."); +	if (requiresProjector()) +		ASTRA_CONFIG_CHECK(m_pProjector, "Reconstruction2D", "Invalid Projector Object.");  	ASTRA_CONFIG_CHECK(m_pSinogram, "Reconstruction2D", "Invalid Projection Data Object.");  	ASTRA_CONFIG_CHECK(m_pReconstruction, "Reconstruction2D", "Invalid Reconstruction Data Object.");  	// check initializations -	ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized."); +	if (requiresProjector()) +		ASTRA_CONFIG_CHECK(m_pProjector->isInitialized(), "Reconstruction2D", "Projector Object Not Initialized.");  	ASTRA_CONFIG_CHECK(m_pSinogram->isInitialized(), "Reconstruction2D", "Projection Data Object Not Initialized.");  	ASTRA_CONFIG_CHECK(m_pReconstruction->isInitialized(), "Reconstruction2D", "Reconstruction Data Object Not Initialized.");  	// check compatibility between projector and data classes -	ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "Reconstruction2D", "Projection Data not compatible with the specified Projector."); -	ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "Reconstruction2D", "Reconstruction Data not compatible with the specified Projector."); +	if (requiresProjector()) { +		ASTRA_CONFIG_CHECK(m_pSinogram->getGeometry()->isEqual(m_pProjector->getProjectionGeometry()), "Reconstruction2D", "Projection Data not compatible with the specified Projector."); +		ASTRA_CONFIG_CHECK(m_pReconstruction->getGeometry()->isEqual(m_pProjector->getVolumeGeometry()), "Reconstruction2D", "Reconstruction Data not compatible with the specified Projector."); +	}  	// success  	return true; | 
