Browse Source

Add starpu_opencl_set_kernel_args().

Cyril Roelandt 13 years ago
parent
commit
394209fc9a

+ 19 - 0
include/starpu_opencl.h

@@ -69,6 +69,25 @@ int starpu_opencl_release_kernel(cl_kernel kernel);
 
 
 int starpu_opencl_collect_stats(cl_event event);
 int starpu_opencl_collect_stats(cl_event event);
 
 
+/*
+ * Sets the arguments of an OpenCL kernel.
+ * Arguments to pass to the kernel should be given as follows :
+ * 
+ * 	size of the argument,  pointer to the argument
+ *
+ * In case of failure, returns the id of the argument that could not be set,
+ * and sets "error" to the error returned. Otherwise, returns "nargs".
+ *
+ * Example :
+ * int n;
+ * cl_int err;
+ * cl_kernel kernel;
+ * n = starpu_opencl_set_kernel_args(&err, 2, &kernel,
+ *				     sizeof(foo), &foo, sizeof(bar), &bar);
+ * if (n != 2)
+ * 	fprintf(stderr, "Error : %d\n", err);
+ */
+int starpu_opencl_set_kernel_args(cl_int *error, int nargs, cl_kernel *kernel, ...);
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

+ 23 - 0
src/drivers/opencl/driver_opencl_utils.c

@@ -466,3 +466,26 @@ void starpu_opencl_display_error(const char *func, const char *file, int line, c
 		printf("oops in %s (%s:%d) ... <%s> (%d) \n", func, file, line, errormsg, status);
 		printf("oops in %s (%s:%d) ... <%s> (%d) \n", func, file, line, errormsg, status);
 
 
 }
 }
+
+int starpu_opencl_set_kernel_args(cl_int *error, int nargs, cl_kernel *kernel, ...)
+{
+	int i;
+	va_list ap;
+
+	va_start(ap, kernel);
+
+	for (i = 0; i < nargs; i++)
+	{
+		int size = va_arg(ap, int);
+		cl_mem *ptr = va_arg(ap, cl_mem *);
+		int err = clSetKernelArg(*kernel, i, size, ptr);
+		if (err != CL_SUCCESS)
+		{
+			*error = err;
+			break;
+		}
+	}
+
+	va_end(ap);
+	return i;
+}

+ 12 - 15
tests/datawizard/interfaces/vector/test_vector_opencl.c

@@ -57,22 +57,19 @@ test_vector_opencl_func(void *buffers[], void *args)
 	if (err != CL_SUCCESS)
 	if (err != CL_SUCCESS)
 		STARPU_OPENCL_REPORT_ERROR(err);
 		STARPU_OPENCL_REPORT_ERROR(err);
 
 
-	err  = clSetKernelArg(kernel, 0, sizeof(val), &val);
-	if (err != CL_SUCCESS)
-		STARPU_OPENCL_REPORT_ERROR(err);
-
-	err = clSetKernelArg(kernel, 1, sizeof(n), &n);
-	if (err)
-		STARPU_OPENCL_REPORT_ERROR(err);
-
-	err = clSetKernelArg(kernel, 2, sizeof(fail), &fail);
-	if (err)
-		STARPU_OPENCL_REPORT_ERROR(err);
-
-	err = clSetKernelArg(kernel, 3, sizeof(factor), &factor);
-	if (err)
+	int nargs;
+	nargs = starpu_opencl_set_kernel_args(&err, 4, &kernel,
+					      sizeof(val), &val,
+					      sizeof(n), &n,
+					      sizeof(fail), &fail,
+					      sizeof(factor), &factor);
+
+	if (nargs != 4)
+	{
+		fprintf(stderr, "Failed to set argument #%d\n", err);
 		STARPU_OPENCL_REPORT_ERROR(err);
 		STARPU_OPENCL_REPORT_ERROR(err);
-
+	}
+			
 	{
 	{
 		size_t global=n;
 		size_t global=n;
 		size_t local;
 		size_t local;