fix CL_KERNEL_GLOBAL_WORK_SIZE bug.

Submitted by Luo, Xionghu on Oct. 10, 2014, 9:14 a.m.

Details

Message ID 894E4BC922C573429354F1EC4342D61C0F4461FA@SHSMSX101.ccr.corp.intel.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Luo, Xionghu Oct. 10, 2014, 9:14 a.m.
Ping for review the v3.
Thanks.

Luo Xionghu
Best Regards

-----Original Message-----
From: Luo, Xionghu 
Sent: Sunday, September 28, 2014 6:26 AM
To: piglit@lists.freedesktop.org
Cc: beignet@lists.freedesktop.org; Luo, Xionghu
Subject: [PATCH] fix CL_KERNEL_GLOBAL_WORK_SIZE bug.

From: Luo <xionghu.luo@intel.com>

the option  CL_KERNEL_GLOBAL_WORK_SIZE for clGetKernelWorkGroupInfo should call built in kernel or custom device according to the spec, this patch calls the built in kernel to query the GLOBAL_WORK_SIZE.

v2: use built in kernel to qury the GLOBAL_WORK_SIZE if exist, dummy kernel for other options, handle the case when no built in kernel is provided.

v3: fix indent issue; loop CL_KERNEL_GLOBAL_WORK_SIZE out, test it with the platform supports opencl-1.2.

Signed-off-by: Luo <xionghu.luo@intel.com>
---
 tests/cl/api/get-kernel-work-group-info.c |  127 +++++++++++++++++++++++++++++
 1 file changed, 127 insertions(+)

 		piglit_merge_result(&result, PIGLIT_FAIL);
 	}
 
+#ifdef CL_VERSION_1_2
+	if(env->version < 12){
+		    fprintf(stderr, "Could not query CL_KERNEL_GLOBAL_WORK_SIZE. Piglit was compiled against OpenCL version >= 1.2 and cannot run this test for versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not present.\n");
+		    piglit_merge_result(&result, PIGLIT_FAIL);
+	}
+
+	//use builtin kernel to test CL_KERNEL_GLOBAL_WORK_SIZE.
+	errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS, 0, 0, &built_in_kernels_size);
+	if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+		fprintf(stderr,
+		        "Failed (error code: %s): Get Device Info.\n",
+		        piglit_cl_get_error_name(errNo));
+		piglit_merge_result(&result, PIGLIT_FAIL);
+	}
+
+	if(built_in_kernels_size != 0)
+	{
+		char* built_in_kernel_names;
+		char* kernel_name;
+		size_t ret_sz;
+		built_in_kernel_names = (char* )malloc(built_in_kernels_size * 
+sizeof(char) );
+
+		errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS, built_in_kernels_size, (void*)built_in_kernel_names, &ret_sz);
+		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+			fprintf(stderr,
+		        "Failed (error code: %s): Get Device Info.\n",
+		        piglit_cl_get_error_name(errNo));
+			piglit_merge_result(&result, PIGLIT_FAIL);
+		}
+
+		built_in_prog = clCreateProgramWithBuiltInKernels(env->context->cl_ctx, 1, &env->device_id, built_in_kernel_names, &errNo);
+		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+			fprintf(stderr,
+		        "Failed (error code: %s): Create BuiltIn Program.\n",
+		        piglit_cl_get_error_name(errNo));
+			piglit_merge_result(&result, PIGLIT_FAIL);
+		}
+
+		kernel_name = strtok(built_in_kernel_names, ";");
+
+		built_in_kernel = clCreateKernel(built_in_prog, kernel_name,  &errNo);
+		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+			fprintf(stderr,
+		        "Failed (error code: %s): Create kernel.\n",
+		        piglit_cl_get_error_name(errNo));
+			piglit_merge_result(&result, PIGLIT_FAIL);
+		}
+		free(built_in_kernel_names);
+	/*
+	 * CL_INVALID_VALUE if kernel is not a built in kernel.
+	 */
+		errNo = clGetKernelWorkGroupInfo(kernel,
+		                                 env->device_id,
+		                                 CL_KERNEL_GLOBAL_WORK_SIZE,
+		                                 0,
+		                                 NULL,
+		                                 &param_value_size);
+		if(!piglit_cl_check_error(errNo, CL_INVALID_VALUE)) {
+			fprintf(stderr,
+			        "Failed (error code: %s): Trigger CL_INVALID_VALUE if kernel is not a builtin kernel for CL_KERNEL_GLOBAL_WORK_SIZE.\n",
+			        piglit_cl_get_error_name(errNo));
+			piglit_merge_result(&result, PIGLIT_FAIL);
+		}
+
+		if(built_in_kernel != NULL) {
+			errNo = clGetKernelWorkGroupInfo(built_in_kernel,
+			                                 env->device_id,
+			                                 CL_KERNEL_GLOBAL_WORK_SIZE,
+			                                 0,
+			                                 NULL,
+			                                 &param_value_size);
+			if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+				fprintf(stderr,
+				        "Failed (error code: %s): Get size of %s.\n",
+				        piglit_cl_get_error_name(errNo),
+				        piglit_cl_get_enum_name(kernel_work_group_infos[i]));
+				piglit_merge_result(&result, PIGLIT_FAIL);
+			}
+
+			param_value = malloc(param_value_size);
+			errNo = clGetKernelWorkGroupInfo(built_in_kernel,
+			                                 env->device_id,
+			                                 CL_KERNEL_GLOBAL_WORK_SIZE,
+			                                 param_value_size,
+			                                 param_value,
+			                                 NULL);
+			if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
+				fprintf(stderr,
+				        "Failed (error code: %s): Get value of %s.\n",
+				        piglit_cl_get_error_name(errNo),
+				        piglit_cl_get_enum_name(kernel_work_group_infos[i]));
+				piglit_merge_result(&result, PIGLIT_FAIL);
+			}
+
+			//TODO: output returned values
+			printf("\n");
+			free(param_value);
+		}else{
+			fprintf(stderr,
+			        "built in kernel create failed.\n");
+			piglit_merge_result(&result, PIGLIT_FAIL);
+		}
+		clReleaseKernel(built_in_kernel);
+		clReleaseProgram(built_in_prog);
+	}else{
+		fprintf(stderr,
+		        "no built in kernel provided.\n");
+		piglit_merge_result(&result, PIGLIT_WARN);
+	}
+#endif
+
 	clReleaseKernel(kernel);
 
 	return result;
--
1.7.9.5

Patch hide | download patch | download mbox

diff --git a/tests/cl/api/get-kernel-work-group-info.c b/tests/cl/api/get-kernel-work-group-info.c
index 47d09da..f3fd6e5 100644
--- a/tests/cl/api/get-kernel-work-group-info.c
+++ b/tests/cl/api/get-kernel-work-group-info.c
@@ -61,6 +61,11 @@  piglit_cl_test(const int argc,
 	int i;
 	cl_int errNo;
 	cl_kernel kernel;
+#ifdef CL_VERSION_1_2
+	cl_program built_in_prog = NULL;
+	cl_kernel built_in_kernel = NULL;
+	size_t built_in_kernels_size;
+#endif
 
 	size_t param_value_size;
 	void* param_value;
@@ -84,6 +89,17 @@  piglit_cl_test(const int argc,
 	for(i = 0; i < num_kernel_work_group_infos; i++) {
 		printf("%s ", piglit_cl_get_enum_name(kernel_work_group_infos[i]));
 
+#ifdef CL_VERSION_1_2
+		if(kernel_work_group_infos[i] == CL_KERNEL_GLOBAL_WORK_SIZE){
+			if(env->version >= 12) {
+				continue;
+			}else{
+				fprintf(stderr, "Could not query CL_KERNEL_GLOBAL_WORK_SIZE. Piglit was compiled against OpenCL version >= 1.2 and cannot run this test for versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not present.\n");
+				piglit_merge_result(&result, PIGLIT_FAIL);
+			}
+		}
+#endif
+
 		errNo = clGetKernelWorkGroupInfo(kernel,
 		                                 env->device_id,
 		                                 kernel_work_group_infos[i], @@ -187,6 +203,117 @@ piglit_cl_test(const int argc,

Comments

On Friday, October 10, 2014 09:14:19 AM Luo, Xionghu wrote:
> Ping for review the v3.
> Thanks.
> 
> Luo Xionghu
> Best Regards

Hello
I came up with a different version and was about to post it when I saw yours.
I'll post mine as a reply to get your opinion.

Here is my comments on yours. Please not that I'm not a commiter.

> 
> -----Original Message-----
> From: Luo, Xionghu
> Sent: Sunday, September 28, 2014 6:26 AM
> To: piglit@lists.freedesktop.org
> Cc: beignet@lists.freedesktop.org; Luo, Xionghu
> Subject: [PATCH] fix CL_KERNEL_GLOBAL_WORK_SIZE bug.
> 
> From: Luo <xionghu.luo@intel.com>
> 
> the option  CL_KERNEL_GLOBAL_WORK_SIZE for clGetKernelWorkGroupInfo should
> call built in kernel or custom device according to the spec, this patch
> calls the built in kernel to query the GLOBAL_WORK_SIZE.
> 
> v2: use built in kernel to qury the GLOBAL_WORK_SIZE if exist, dummy kernel
> for other options, handle the case when no built in kernel is provided.
> 
> v3: fix indent issue; loop CL_KERNEL_GLOBAL_WORK_SIZE out, test it with the
> platform supports opencl-1.2.
> 
> Signed-off-by: Luo <xionghu.luo@intel.com>
> ---
>  tests/cl/api/get-kernel-work-group-info.c |  127
> +++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+)
> 
> diff --git a/tests/cl/api/get-kernel-work-group-info.c
> b/tests/cl/api/get-kernel-work-group-info.c index 47d09da..f3fd6e5 100644
> --- a/tests/cl/api/get-kernel-work-group-info.c
> +++ b/tests/cl/api/get-kernel-work-group-info.c
> @@ -61,6 +61,11 @@ piglit_cl_test(const int argc,
>  	int i;
>  	cl_int errNo;
>  	cl_kernel kernel;
> +#ifdef CL_VERSION_1_2
> +	cl_program built_in_prog = NULL;
> +	cl_kernel built_in_kernel = NULL;
> +	size_t built_in_kernels_size;
> +#endif

I think it ok you don't #ifdef those

> 
>  	size_t param_value_size;
>  	void* param_value;
> @@ -84,6 +89,17 @@ piglit_cl_test(const int argc,
>  	for(i = 0; i < num_kernel_work_group_infos; i++) {
>  		printf("%s ", piglit_cl_get_enum_name(kernel_work_group_infos[i]));
> 
> +#ifdef CL_VERSION_1_2
> +		if(kernel_work_group_infos[i] == CL_KERNEL_GLOBAL_WORK_SIZE){
> +			if(env->version >= 12) {

You could keep this test on a custom device

> +				continue;
> +			}else{
> +				fprintf(stderr, "Could not query 
CL_KERNEL_GLOBAL_WORK_SIZE. Piglit was
> compiled against OpenCL version >= 1.2 and cannot run this test for
> versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not
> present.\n"); +				piglit_merge_result(&result, PIGLIT_FAIL);
> +			}

You don't need the else,
PIGLIT_CL_ENUM_NUM(cl_kernel_work_group_info, env->version)
already take care of it

> +		}
> +#endif
> +
>  		errNo = clGetKernelWorkGroupInfo(kernel,
>  		                                 env->device_id,
>  		                                 kernel_work_group_infos[i], @@ 
-187,6
> +203,117 @@ piglit_cl_test(const int argc, piglit_merge_result(&result,
> PIGLIT_FAIL);
>  	}
> 
> +#ifdef CL_VERSION_1_2
> +	if(env->version < 12){
> +		    fprintf(stderr, "Could not query CL_KERNEL_GLOBAL_WORK_SIZE. 
Piglit
> was compiled against OpenCL version >= 1.2 and cannot run this test for
> versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not
> present.\n"); +		    piglit_merge_result(&result, PIGLIT_FAIL);
> +	}

You shouldn't fail here. The same way 
PIGLIT_CL_ENUM_NUM(cl_kernel_work_group_info, env->version)
ignore this flag, skip it and don't tell the user.
It doesn't expect it to be tested on version < 1.2 anyway

> +
> +	//use builtin kernel to test CL_KERNEL_GLOBAL_WORK_SIZE.
> +	errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS, 0, 0,
> &built_in_kernels_size); +	if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +		fprintf(stderr,
> +		        "Failed (error code: %s): Get Device Info.\n",
> +		        piglit_cl_get_error_name(errNo));
> +		piglit_merge_result(&result, PIGLIT_FAIL);
> +	}
> +
> +	if(built_in_kernels_size != 0)
> +	{
> +		char* built_in_kernel_names;
> +		char* kernel_name;
> +		size_t ret_sz;
> +		built_in_kernel_names = (char* )malloc(built_in_kernels_size *
> +sizeof(char) );
> +
> +		errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS,
> built_in_kernels_size, (void*)built_in_kernel_names, &ret_sz);
> +		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +			fprintf(stderr,
> +		        "Failed (error code: %s): Get Device Info.\n",
> +		        piglit_cl_get_error_name(errNo));
> +			piglit_merge_result(&result, PIGLIT_FAIL);
> +		}
> +

built_in_kernel_names = piglit_cl_get_device_info(env->device_id,
				                          CL_DEVICE_BUILT_IN_KERNELS);
is shorter


> +		built_in_prog = clCreateProgramWithBuiltInKernels(env->context-
>cl_ctx,
> 1, &env->device_id, built_in_kernel_names, &errNo);
> +		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +			fprintf(stderr,
> +		        "Failed (error code: %s): Create BuiltIn Program.\n",
> +		        piglit_cl_get_error_name(errNo));
> +			piglit_merge_result(&result, PIGLIT_FAIL);
> +		}

Would you be better to PIGLIT_WARN and skip test with built-in ?

> +
> +		kernel_name = strtok(built_in_kernel_names, ";");
> +
> +		built_in_kernel = clCreateKernel(built_in_prog, kernel_name,  
&errNo);
> +		if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +			fprintf(stderr,
> +		        "Failed (error code: %s): Create kernel.\n",
> +		        piglit_cl_get_error_name(errNo));
> +			piglit_merge_result(&result, PIGLIT_FAIL);

PIGLIT_WARN ?

- EdB

> +		}
> +		free(built_in_kernel_names);
> +	/*
> +	 * CL_INVALID_VALUE if kernel is not a built in kernel.
> +	 */
> +		errNo = clGetKernelWorkGroupInfo(kernel,
> +		                                 env->device_id,
> +		                                 CL_KERNEL_GLOBAL_WORK_SIZE,
> +		                                 0,
> +		                                 NULL,
> +		                                 &param_value_size);
> +		if(!piglit_cl_check_error(errNo, CL_INVALID_VALUE)) {
> +			fprintf(stderr,
> +			        "Failed (error code: %s): Trigger CL_INVALID_VALUE if 
kernel is
> not a builtin kernel for CL_KERNEL_GLOBAL_WORK_SIZE.\n", +			       
> piglit_cl_get_error_name(errNo));
> +			piglit_merge_result(&result, PIGLIT_FAIL);
> +		}
> +
> +		if(built_in_kernel != NULL) {
> +			errNo = clGetKernelWorkGroupInfo(built_in_kernel,
> +			                                 env->device_id,
> +			                                 CL_KERNEL_GLOBAL_WORK_SIZE,
> +			                                 0,
> +			                                 NULL,
> +			                                 &param_value_size);
> +			if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +				fprintf(stderr,
> +				        "Failed (error code: %s): Get size of %s.\n",
> +				        piglit_cl_get_error_name(errNo),
> +				        
piglit_cl_get_enum_name(kernel_work_group_infos[i]));
> +				piglit_merge_result(&result, PIGLIT_FAIL);
> +			}
> +
> +			param_value = malloc(param_value_size);
> +			errNo = clGetKernelWorkGroupInfo(built_in_kernel,
> +			                                 env->device_id,
> +			                                 CL_KERNEL_GLOBAL_WORK_SIZE,
> +			                                 param_value_size,
> +			                                 param_value,
> +			                                 NULL);
> +			if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +				fprintf(stderr,
> +				        "Failed (error code: %s): Get value of %s.\n",
> +				        piglit_cl_get_error_name(errNo),
> +				        
piglit_cl_get_enum_name(kernel_work_group_infos[i]));
> +				piglit_merge_result(&result, PIGLIT_FAIL);
> +			}
> +
> +			//TODO: output returned values
> +			printf("\n");
> +			free(param_value);
> +		}else{
> +			fprintf(stderr,
> +			        "built in kernel create failed.\n");
> +			piglit_merge_result(&result, PIGLIT_FAIL);
> +		}
> +		clReleaseKernel(built_in_kernel);
> +		clReleaseProgram(built_in_prog);
> +	}else{
> +		fprintf(stderr,
> +		        "no built in kernel provided.\n");
> +		piglit_merge_result(&result, PIGLIT_WARN);
> +	}
> +#endif
> +
>  	clReleaseKernel(kernel);
> 
>  	return result;
> --
> 1.7.9.5
> 
> _______________________________________________
> Piglit mailing list
> Piglit@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit