aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2019-05-13 15:41:54 +0200
committerThomas White <taw@physics.org>2019-05-13 15:41:54 +0200
commit8aff8c658925f0c7522555ff5907632bcafe4554 (patch)
tree5d9ec01501d87894537145972dffc7c1e0c1ee9c /src
parent6121e26bd0282dadcb0090611cb26aceaac1ed30 (diff)
gpu_sim_check: Succeed if GPU not available
On recent OSes, OpenCL (the API) is always available, but a GPU device not always. Therefore, this test will always be built, and shouldn't fail just because a GPU isn't present.
Diffstat (limited to 'src')
-rw-r--r--src/cl-utils.c38
-rw-r--r--src/cl-utils.h11
2 files changed, 45 insertions, 4 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,