diff options
-rw-r--r-- | src/cl-utils.c | 38 | ||||
-rw-r--r-- | src/cl-utils.h | 11 | ||||
-rw-r--r-- | tests/gpu_sim_check.c | 10 |
3 files changed, 53 insertions, 6 deletions
diff --git a/src/cl-utils.c b/src/cl-utils.c index fee2b53e..7c069ed1 100644 --- a/src/cl-utils.c +++ b/src/cl-utils.c @@ -3,11 +3,11 @@ * * OpenCL utility functions * - * Copyright © 2012-2018 Deutsches Elektronen-Synchrotron DESY, + * Copyright © 2012-2019 Deutsches Elektronen-Synchrotron DESY, * a research centre of the Helmholtz Association. * * Authors: - * 2010-2018 Thomas White <taw@physics.org> + * 2010-2019 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -43,6 +43,40 @@ #include "utils.h" +/* Return 1 if a GPU device is present, 0 if not, 2 on error. */ +int have_gpu_device() +{ + cl_uint nplat; + cl_platform_id platforms[8]; + cl_context_properties prop[3]; + cl_int err; + int i; + + err = clGetPlatformIDs(8, platforms, &nplat); + if ( err != CL_SUCCESS ) return 2; + if ( nplat == 0 ) return 0; + + /* Find a GPU platform in the list */ + for ( i=0; i<nplat; i++ ) { + + prop[0] = CL_CONTEXT_PLATFORM; + prop[1] = (cl_context_properties)platforms[i]; + prop[2] = 0; + + clCreateContextFromType(prop, CL_DEVICE_TYPE_GPU, + NULL, NULL, &err); + + if ( err != CL_SUCCESS ) { + if ( err != CL_DEVICE_NOT_FOUND ) return 2; + } else { + return 1; + } + } + + return 0; +} + + const char *clError(cl_int err) { switch ( err ) { diff --git a/src/cl-utils.h b/src/cl-utils.h index fcaf1380..92bea562 100644 --- a/src/cl-utils.h +++ b/src/cl-utils.h @@ -3,11 +3,11 @@ * * OpenCL utility functions * - * Copyright © 2012-2018 Deutsches Elektronen-Synchrotron DESY, + * Copyright © 2012-2019 Deutsches Elektronen-Synchrotron DESY, * a research centre of the Helmholtz Association. * * Authors: - * 2010-2018 Thomas White <taw@physics.org> + * 2010-2019 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -34,6 +34,13 @@ #endif +#ifdef HAVE_CL_CL_H +#include <CL/cl.h> +#else +#include <cl.h> +#endif + +extern int have_gpu_device(void); extern const char *clError(cl_int err); extern cl_device_id get_cl_dev(cl_context ctx, int n); extern cl_program load_program_from_string(const char *source_in, size_t len, diff --git a/tests/gpu_sim_check.c b/tests/gpu_sim_check.c index aee7a068..e42bc68b 100644 --- a/tests/gpu_sim_check.c +++ b/tests/gpu_sim_check.c @@ -3,11 +3,11 @@ * * Check that GPU simulation agrees with CPU version * - * Copyright © 2012-2015 Deutsches Elektronen-Synchrotron DESY, + * Copyright © 2012-2019 Deutsches Elektronen-Synchrotron DESY, * a research centre of the Helmholtz Association. * * Authors: - * 2012-2015 Thomas White <taw@physics.org> + * 2012-2019 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -42,6 +42,7 @@ #include "../src/diffraction.h" #include "../src/diffraction-gpu.h" +#include "../src/cl-utils.h" #include <detector.h> #include <utils.h> #include <symmetry.h> @@ -90,6 +91,11 @@ int main(int argc, char *argv[]) SymOpList *sym; gsl_rng *rng; + if ( have_gpu_device() == 0 ) { + ERROR("No GPU device found - skipping test.\n"); + return 0; + } + rng = gsl_rng_alloc(gsl_rng_mt19937); gctx = setup_gpu(1, NULL, NULL, NULL, 0); |