aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2017-02-12 21:04:58 +1300
committerDavid Phillips <david@sighup.nz>2017-02-12 21:12:05 +1300
commit6605c05adf8775eddb1d4045b408895e0183f931 (patch)
treeedb9333d528d8fa22b900bbf7cccc57966cbe945
parentc83eacc524ffd0cc3e93a2b88ea69e98c04859ec (diff)
downloadfractal-gen-opencl-6605c05adf8775eddb1d4045b408895e0183f931.tar.xz
Add stringy CL error messages
-rw-r--r--Makefile2
-rw-r--r--cl_error.c84
-rw-r--r--cl_error.h3
-rw-r--r--trampoline.c26
4 files changed, 107 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 1dd24f6..a108bef 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
include config.mk
-fractal-gen: fractal-gen.o trampoline.o slurp.o
+fractal-gen: fractal-gen.o cl_error.o trampoline.o slurp.o
.PHONY: clean
diff --git a/cl_error.c b/cl_error.c
new file mode 100644
index 0000000..293a3d8
--- /dev/null
+++ b/cl_error.c
@@ -0,0 +1,84 @@
+#include <cl.h>
+
+static const char *cl_error_strings[] = {
+ "CL_SUCCESS",
+ "CL_DEVICE_NOT_FOUND",
+ "CL_DEVICE_NOT_AVAILABLE",
+ "CL_COMPILER_NOT_AVAILABLE",
+ "CL_MEM_OBJECT_ALLOCATION_FAILURE",
+ "CL_OUT_OF_RESOURCES",
+ "CL_OUT_OF_HOST_MEMORY",
+ "CL_PROFILING_INFO_NOT_AVAILABLE",
+ "CL_MEM_COPY_OVERLAP",
+ "CL_IMAGE_FORMAT_MISMATCH",
+ "CL_IMAGE_FORMAT_NOT_SUPPORTED",
+ "CL_BUILD_PROGRAM_FAILURE",
+ "CL_MAP_FAILURE",
+ "CL_MISALIGNED_SUB_BUFFER_OFFSET",
+ "CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST",
+ "CL_COMPILE_PROGRAM_FAILURE",
+ "CL_LINKER_NOT_AVAILABLE",
+ "CL_LINK_PROGRAM_FAILURE",
+ "CL_DEVICE_PARTITION_FAILED",
+ "CL_KERNEL_ARG_INFO_NOT_AVAILABLE",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "(Invalid)",
+ "CL_INVALID_VALUE",
+ "CL_INVALID_DEVICE_TYPE",
+ "CL_INVALID_PLATFORM",
+ "CL_INVALID_DEVICE",
+ "CL_INVALID_CONTEXT",
+ "CL_INVALID_QUEUE_PROPERTIES",
+ "CL_INVALID_COMMAND_QUEUE",
+ "CL_INVALID_HOST_PTR",
+ "CL_INVALID_MEM_OBJECT",
+ "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR",
+ "CL_INVALID_IMAGE_SIZE",
+ "CL_INVALID_SAMPLER",
+ "CL_INVALID_BINARY",
+ "CL_INVALID_BUILD_OPTIONS",
+ "CL_INVALID_PROGRAM",
+ "CL_INVALID_PROGRAM_EXECUTABLE",
+ "CL_INVALID_KERNEL_NAME",
+ "CL_INVALID_KERNEL_DEFINITION",
+ "CL_INVALID_KERNEL",
+ "CL_INVALID_ARG_INDEX",
+ "CL_INVALID_ARG_VALUE",
+ "CL_INVALID_ARG_SIZE",
+ "CL_INVALID_KERNEL_ARGS",
+ "CL_INVALID_WORK_DIMENSION",
+ "CL_INVALID_WORK_GROUP_SIZE",
+ "CL_INVALID_WORK_ITEM_SIZE",
+ "CL_INVALID_GLOBAL_OFFSET",
+ "CL_INVALID_EVENT_WAIT_LIST",
+ "CL_INVALID_EVENT",
+ "CL_INVALID_OPERATION",
+ "CL_INVALID_GL_OBJECT",
+ "CL_INVALID_BUFFER_SIZE",
+ "CL_INVALID_MIP_LEVEL",
+ "CL_INVALID_GLOBAL_WORK_SIZE",
+ "CL_INVALID_PROPERTY",
+ "CL_INVALID_IMAGE_DESCRIPTOR",
+ "CL_INVALID_COMPILER_OPTIONS",
+ "CL_INVALID_LINKER_OPTIONS",
+ "CL_INVALID_DEVICE_PARTITION_COUNT",
+ "CL_INVALID_PIPE_SIZE",
+ "CL_INVALID_DEVICE_QUEUE",
+};
+
+const char *get_cl_error_string(cl_int error)
+{
+ error = -error;
+ if (error < 0 || error > sizeof(cl_error_strings) / sizeof(const char *))
+ return "Error value out of bounds";
+
+ return cl_error_strings[error];
+}
diff --git a/cl_error.h b/cl_error.h
new file mode 100644
index 0000000..7f4a95d
--- /dev/null
+++ b/cl_error.h
@@ -0,0 +1,3 @@
+#include <cl.h>
+
+const char *get_cl_error_string(cl_int error);
diff --git a/trampoline.c b/trampoline.c
index 2dbccc9..fcc3402 100644
--- a/trampoline.c
+++ b/trampoline.c
@@ -2,6 +2,7 @@
#include <string.h>
#include <opencl.h>
+#include "cl_error.h"
#include "slurp.h"
static cl_platform_id platform;
@@ -92,8 +93,10 @@ int tramp_load_kernel(const char *filename)
program = clCreateProgramWithSource(context, 1, (const char **)&source, &length, &res);
- if (res != CL_SUCCESS)
+ if (res != CL_SUCCESS) {
+ fprintf(stderr, "Failed to create program from source code: %s ", get_cl_error_string(res));
return 1;
+ }
free(source);
source = NULL;
@@ -156,21 +159,30 @@ int tramp_set_kernel_args(unsigned int s, unsigned int it)
size = s;
iterations = it;
-
device_buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, size*size, NULL, &ret);
if (ret != CL_SUCCESS)
return 1;
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), &device_buffer);
- fprintf(stderr, "first: %d\n", ret);
+ if (ret != CL_SUCCESS) {
+ fprintf(stderr, "Error on buffer argument: %s ", get_cl_error_string(ret));
+ return 1;
+ }
+
ret = clSetKernelArg(kernel, 1, sizeof(unsigned int), &size);
- fprintf(stderr, "first: %d\n", ret);
+ if (ret != CL_SUCCESS) {
+ fprintf(stderr, "Error on size argument: %s ", get_cl_error_string(ret));
+ return 1;
+ }
+
ret = clSetKernelArg(kernel, 2, sizeof(unsigned int), &iterations);
- fprintf(stderr, "first: %d\n", ret);
+ if (ret != CL_SUCCESS) {
+ fprintf(stderr, "Error on iteration argument: %s ", get_cl_error_string(ret));
+ return 1;
+ }
- /* FIXME check all clSetKernelArg */
- return ret != CL_SUCCESS;
+ return 0;
}
int tramp_run_kernel()