summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2017-11-09 20:57:31 +0100
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2018-01-09 14:23:54 +0100
commit0ad6cb01b9176e99c3e4bb5643ac6a5dd477aad6 (patch)
tree69b27fa6406cf318d785c827e1fd05b786da2876
parentde27e439a0c59fade175fba4e0b4a1e0c84b933d (diff)
downloadastra-0ad6cb01b9176e99c3e4bb5643ac6a5dd477aad6.tar.gz
astra-0ad6cb01b9176e99c3e4bb5643ac6a5dd477aad6.tar.bz2
astra-0ad6cb01b9176e99c3e4bb5643ac6a5dd477aad6.tar.xz
astra-0ad6cb01b9176e99c3e4bb5643ac6a5dd477aad6.zip
Check for CUDA support at run-time in use_cuda()
-rw-r--r--cuda/2d/astra.cu11
-rw-r--r--cuda/2d/astra.h2
-rw-r--r--cuda/3d/mem3d.cu19
-rw-r--r--cuda/3d/mem3d.h1
-rw-r--r--include/astra/Globals.h17
-rw-r--r--matlab/mex/astra_mex_c.cpp2
-rw-r--r--python/astra/astra_c.pyx3
-rw-r--r--src/CompositeGeometryManager.cpp3
-rw-r--r--src/Globals.cpp16
9 files changed, 38 insertions, 36 deletions
diff --git a/cuda/2d/astra.cu b/cuda/2d/astra.cu
index 81459de..69a4e86 100644
--- a/cuda/2d/astra.cu
+++ b/cuda/2d/astra.cu
@@ -529,5 +529,16 @@ _AstraExport bool setGPUIndex(int iGPUIndex)
return true;
}
+_AstraExport size_t availableGPUMemory()
+{
+ size_t free, total;
+ cudaError_t err = cudaMemGetInfo(&free, &total);
+ if (err != cudaSuccess)
+ return 0;
+ return free;
+}
+
+
+
}
diff --git a/cuda/2d/astra.h b/cuda/2d/astra.h
index 9355cb4..119d172 100644
--- a/cuda/2d/astra.h
+++ b/cuda/2d/astra.h
@@ -121,5 +121,7 @@ _AstraExport std::string getCudaDeviceString(int device);
_AstraExport bool setGPUIndex(int index);
+_AstraExport size_t availableGPUMemory();
+
}
#endif
diff --git a/cuda/3d/mem3d.cu b/cuda/3d/mem3d.cu
index 2369149..e55cc13 100644
--- a/cuda/3d/mem3d.cu
+++ b/cuda/3d/mem3d.cu
@@ -32,6 +32,8 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#include "mem3d.h"
+#include "../2d/astra.h"
+
#include "astra3d.h"
#include "cone_fp.h"
#include "cone_bp.h"
@@ -53,15 +55,6 @@ struct SMemHandle3D_internal
unsigned int nz;
};
-size_t availableGPUMemory()
-{
- size_t free, total;
- cudaError_t err = cudaMemGetInfo(&free, &total);
- if (err != cudaSuccess)
- return 0;
- return free;
-}
-
int maxBlockDimension()
{
int dev;
@@ -88,7 +81,7 @@ MemHandle3D allocateGPUMemory(unsigned int x, unsigned int y, unsigned int z, Me
hnd.ny = y;
hnd.nz = z;
- size_t free = availableGPUMemory();
+ size_t free = astraCUDA::availableGPUMemory();
cudaError_t err;
err = cudaMalloc3D(&hnd.ptr, make_cudaExtent(sizeof(float)*x, y, z));
@@ -97,7 +90,7 @@ MemHandle3D allocateGPUMemory(unsigned int x, unsigned int y, unsigned int z, Me
return MemHandle3D();
}
- size_t free2 = availableGPUMemory();
+ size_t free2 = astraCUDA::availableGPUMemory();
ASTRA_DEBUG("Allocated %d x %d x %d on GPU. (Pre: %lu, post: %lu)", x, y, z, free, free2);
@@ -127,9 +120,9 @@ bool zeroGPUMemory(MemHandle3D handle, unsigned int x, unsigned int y, unsigned
bool freeGPUMemory(MemHandle3D handle)
{
- size_t free = availableGPUMemory();
+ size_t free = astraCUDA::availableGPUMemory();
cudaError_t err = cudaFree(handle.d->ptr.ptr);
- size_t free2 = availableGPUMemory();
+ size_t free2 = astraCUDA::availableGPUMemory();
ASTRA_DEBUG("Freeing memory. (Pre: %lu, post: %lu)", free, free2);
diff --git a/cuda/3d/mem3d.h b/cuda/3d/mem3d.h
index 619354b..12a532d 100644
--- a/cuda/3d/mem3d.h
+++ b/cuda/3d/mem3d.h
@@ -77,7 +77,6 @@ enum Mem3DZeroMode {
INIT_ZERO
};
-size_t availableGPUMemory();
int maxBlockDimension();
_AstraExport MemHandle3D wrapHandle(float *D_ptr, unsigned int x, unsigned int y, unsigned int z, unsigned int pitch);
diff --git a/include/astra/Globals.h b/include/astra/Globals.h
index 8d0d619..f7f130f 100644
--- a/include/astra/Globals.h
+++ b/include/astra/Globals.h
@@ -105,22 +105,6 @@ namespace astra {
}
//----------------------------------------------------------------------------------------
-// globals vars & functions
-//namespace astra {
-//#define ToolboxVersion 0.1f;
-
-//float32 getVersion() { return ToolboxVersion; }
-
-//_AstraExport bool cudaEnabled() {
-//#ifdef ASTRA_CUDA
-// return true;
-//#else
-// return false;
-//#endif
-//}
-//}
-
-//----------------------------------------------------------------------------------------
// variables
namespace astra {
const float32 PI = 3.14159265358979323846264338328f;
@@ -169,6 +153,7 @@ namespace astra {
namespace astra {
_AstraExport inline int getVersion() { return ASTRA_TOOLBOXVERSION; }
_AstraExport inline const char* getVersionString() { return ASTRA_TOOLBOXVERSION_STRING; }
+_AstraExport bool cudaAvailable();
#ifdef ASTRA_CUDA
_AstraExport inline bool cudaEnabled() { return true; }
#else
diff --git a/matlab/mex/astra_mex_c.cpp b/matlab/mex/astra_mex_c.cpp
index 017946a..eda5337 100644
--- a/matlab/mex/astra_mex_c.cpp
+++ b/matlab/mex/astra_mex_c.cpp
@@ -78,7 +78,7 @@ void astra_mex_credits(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[
void astra_mex_use_cuda(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
if (1 <= nlhs) {
- plhs[0] = mxCreateDoubleScalar(astra::cudaEnabled() ? 1 : 0);
+ plhs[0] = mxCreateDoubleScalar(astra::cudaAvailable() ? 1 : 0);
}
}
diff --git a/python/astra/astra_c.pyx b/python/astra/astra_c.pyx
index f25fc2a..8858244 100644
--- a/python/astra/astra_c.pyx
+++ b/python/astra/astra_c.pyx
@@ -38,6 +38,7 @@ from .PyIndexManager cimport CAstraObjectManagerBase
cdef extern from "astra/Globals.h" namespace "astra":
bool cudaEnabled()
+ bool cudaAvailable()
IF HAVE_CUDA==True:
cdef extern from "../cuda/2d/astra.h" namespace "astraCUDA":
@@ -74,7 +75,7 @@ def credits():
def use_cuda():
- return cudaEnabled()
+ return cudaAvailable()
IF HAVE_CUDA==True:
def set_gpu_index(idx, memory=0):
diff --git a/src/CompositeGeometryManager.cpp b/src/CompositeGeometryManager.cpp
index 8af430c..cfc2db3 100644
--- a/src/CompositeGeometryManager.cpp
+++ b/src/CompositeGeometryManager.cpp
@@ -43,6 +43,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#include "astra/Float32VolumeData3DGPU.h"
#include "astra/Logging.h"
+#include "../cuda/2d/astra.h"
#include "../cuda/3d/mem3d.h"
#include <cstring>
@@ -1653,7 +1654,7 @@ bool CCompositeGeometryManager::doJobs(TJobList &jobs)
// Get memory from first GPU. Not optimal...
if (!m_GPUIndices.empty())
astraCUDA3d::setGPUIndex(m_GPUIndices[0]);
- maxSize = astraCUDA3d::availableGPUMemory();
+ maxSize = astraCUDA::availableGPUMemory();
if (maxSize == 0) {
ASTRA_WARN("Unable to get available GPU memory. Defaulting to 1GB.");
maxSize = 1024 * 1024 * 1024;
diff --git a/src/Globals.cpp b/src/Globals.cpp
index 0edb397..bbe0c2f 100644
--- a/src/Globals.cpp
+++ b/src/Globals.cpp
@@ -26,9 +26,19 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
*/
#include "astra/Globals.h"
+#include "cuda/2d/astra.h"
+
+namespace astra {
+
+bool running_in_matlab=false;
+
+_AstraExport bool cudaAvailable() {
+#ifdef ASTRA_CUDA
+ return astraCUDA::availableGPUMemory() > 0;
+#else
+ return false;
+#endif
+}
-namespace astra{
- bool running_in_matlab=false;
}
-// nothing to see here :)