[Piglit] [PATCH] cl: add clEnqueueMigrateMemObjects

Serge Martin edb+piglit at sigluy.net
Fri Sep 18 04:32:21 PDT 2015


On Thursday 17 September 2015 19:30:41 Jan Vesely wrote:
> On Sat, 2015-09-12 at 14:53 +0200, Serge Martin wrote:
> > On Thursday 13 August 2015 23:14:23 Serge Martin wrote:
> > 
> > 
> > Please note that I will made those changes :
> > 
> > s/Migrating the buffer./Migrating the buffer/
> > s/Migrating the buffer with flag./Migrating the buffer with flag/
> > 
> > in order to remove the extra dot printed in case of error for the
> > normal case.
> > 
> > With this, can I get a R-b ?
> > 
> > > ---
> > > 
> > >  tests/cl.py                                |   1 +
> > >  tests/cl/api/CMakeLists.cl.txt             |   1 +
> > >  tests/cl/api/enqueue-migrate-mem-objects.c | 227
> > > 
> > > +++++++++++++++++++++++++++++
> > > 
> > >  3 files changed, 229 insertions(+)
> > >  create mode 100644 tests/cl/api/enqueue-migrate-mem-objects.c
> > > 
> > > diff --git a/tests/cl.py b/tests/cl.py
> > > index 4668ddc..07f5fd4 100644
> > > --- a/tests/cl.py
> > > +++ b/tests/cl.py
> > > @@ -58,6 +58,7 @@ with profile.group_manager(PiglitCLTest, 'api')
> > > 
> > > as g:
> > >      g(['cl-api-enqueue-copy-buffer-rect'],
> > > 
> > > 'clEnqueueCopyBufferRect')
> > > 
> > >      g(['cl-api-enqueue-read_write-buffer'],
> > >      
> > >        'clEnqueueReadBuffer and clEnqueueWriteBuffer')
> > > 
> > > +    g(['enqueue-migrate-mem-objects'],
> > > 'clEnqueueMigrateMemObjects')
> > > 
> > >      g(['cl-api-get-mem-object-info'], 'clGetMemObjectInfo')
> > >      g(['cl-api-get-image-info'], 'clGetImageInfo')
> > >      g(['cl-api-retain_release-mem-object'],
> > > 
> > > diff --git a/tests/cl/api/CMakeLists.cl.txt
> > > b/tests/cl/api/CMakeLists.cl.txt
> > > index b598528..939f1f3 100644
> > > --- a/tests/cl/api/CMakeLists.cl.txt
> > > +++ b/tests/cl/api/CMakeLists.cl.txt
> > > @@ -21,6 +21,7 @@ piglit_cl_add_api_test (enqueue-copy-buffer
> > > enqueue-copy-buffer.c)
> > > 
> > >  piglit_cl_add_api_test (enqueue-map-buffer enqueue-map-buffer.c)
> > >  piglit_cl_add_api_test (enqueue-copy-buffer-rect enqueue-copy
> > > 
> > > -buffer-rect.c)
> > > 
> > >  piglit_cl_add_api_test (enqueue-read_write-buffer enqueue
> > > 
> > > -read_write-buffer.c)
> > > +piglit_cl_add_api_test (enqueue-migrate-mem-objects enqueue
> > > -migrate-mem-objects.c)
> > > 
> > >  piglit_cl_add_api_test (retain_release-mem-object retain_release
> > > 
> > > -mem-object.c)
> > > 
> > >  piglit_cl_add_api_test (get-mem-object-info get-mem-object-info.c)
> > >  piglit_cl_add_api_test (get-image-info get-image-info.c)
> > > 
> > > diff --git a/tests/cl/api/enqueue-migrate-mem-objects.c
> > > b/tests/cl/api/enqueue-migrate-mem-objects.c
> > > new file mode 100644
> > > index 0000000..eafadce
> > > --- /dev/null
> > > +++ b/tests/cl/api/enqueue-migrate-mem-objects.c
> > > @@ -0,0 +1,227 @@
> > > +/*
> > > + * Copyright © 2015 Serge Martin (EdB) <edb+piglit at sigluy.net>
> > > + *
> > > + * Permission is hereby granted, free of charge, to any person
> > > obtaining a
> > > + * copy of this software and associated documentation files (the
> > > "Software"),
> > > + * to deal in the Software without restriction, including without
> > > limitation
> > > + * the rights to use, copy, modify, merge, publish, distribute,
> > > sublicense,
> > > + * and/or sell copies of the Software, and to permit persons to
> > > whom the
> > > + * Software is furnished to do so, subject to the following
> > > conditions:
> > > + *
> > > + * The above copyright notice and this permission notice
> > > (including the next
> > > + * paragraph) shall be included in all copies or substantial
> > > portions of the
> > > + * Software.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > > EXPRESS OR
> > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > > MERCHANTABILITY,
> > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
> > > EVENT SHALL
> > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> > > DAMAGES OR OTHER
> > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> > > ARISING
> > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> > > OTHER
> > > + * DEALINGS IN THE SOFTWARE.
> > > + */
> > > +
> > > +/**
> > > + * @file enqueue-migrate-mem-objects.c
> > > + *
> > > + * Test API function:
> > > + *
> > > + *   cl_int
> > > + *   clEnqueueMigrateMemObjects(cl_command_queue command_queue,
> > > + *                              cl_uint num_mem_objects,
> > > + *                              const cl_mem *mem_objects,
> > > + *                              cl_mem_migration_flags flags,
> > > + *                              cl_uint num_events_in_wait_list,
> > > + *                              const cl_event *event_wait_list,
> > > + *                              cl_event *event)
> > > + */
> > > +
> > > +#include "piglit-framework-cl-api.h"
> > > +
> > > +
> > > +PIGLIT_CL_API_TEST_CONFIG_BEGIN
> > > +
> > > +	config.name = "clEnqueueMigrateMemObjects";
> > > +	config.version_min = 12;
> > > +
> > > +	config.run_per_platform = true;
> > > +	config.create_context = true;
> > > +
> > > +PIGLIT_CL_API_TEST_CONFIG_END
> > > +
> > > +
> > > +#if defined(CL_VERSION_1_2)
> > > +static bool
> > > +test(cl_command_queue queue, cl_uint num_mem_objects,
> > > +     const cl_mem *mem_objects, cl_mem_migration_flags flags,
> > > +     cl_uint num_events_in_wait_list, const cl_event
> > > *event_wait_list,
> > > +     cl_event *event,
> 
> whitespace error here    ^^^ (git complains)

ok

> 
> > > +     cl_int expected_error, enum piglit_result* result,
> > > +     const char* test_str) {
> > > +	cl_int errNo;
> > > +
> > > +	errNo = clEnqueueMigrateMemObjects(queue, num_mem_objects,
> > > +	                                   mem_objects, flags,
> > > +
> > > 
> > >  num_events_in_wait_list,
> > > 
> > > +	                                   event_wait_list,
> > > +	                                   event);
> > > +
> > > +	if(!piglit_cl_check_error(errNo, expected_error)) {
> > > +		fprintf(stderr, "Failed (error code: %s): %s.\n",
> > > +		        piglit_cl_get_error_name(errNo),
> > > test_str);
> > > +		piglit_merge_result(result, PIGLIT_FAIL);
> > > +		return false;
> > > +	}
> > > +
> > > +	return true;
> > > +}
> > > +#endif
> > > +
> > > +enum piglit_result
> > > +piglit_cl_test(const int argc,
> > > +               const char **argv,
> > > +               const struct piglit_cl_api_test_config* config,
> > > +               const struct piglit_cl_api_test_env* env)
> > > +{
> > > +#if defined(CL_VERSION_1_2)
> > > +	enum piglit_result result = PIGLIT_PASS;
> > > +	cl_mem device_buffer;
> > > +	cl_mem invalid_buffer = NULL;
> > > +	cl_command_queue queue;
> > > +	cl_event event;
> > > +	int i;
> > > +
> > > +/*** Normal usage ***/
> > > +	device_buffer = piglit_cl_create_buffer(env->context,
> > > +	                                        CL_MEM_READ_WRITE|
> > > +
> > > 
> > >  CL_MEM_ALLOC_HOST_PTR, 32);
> > > 
> > > +
> > > +	for(i = 0; i < env->context->num_devices; ++i) {
> > > +		fprintf(stderr, "Testing on device %d\n", i);
> > > +		queue = env->context->command_queues[i];
> > > +		if (!test(queue, 1, &device_buffer, 0,
> > > +		          0, NULL, NULL,
> > > +		          CL_SUCCESS, &result, "Migrating the
> > > buffer.")) {
> > > +			return PIGLIT_FAIL;
> > > +		}
> > > +
> > > +		if (!test(queue, 1, &device_buffer,
> > > +		          CL_MIGRATE_MEM_OBJECT_HOST|
> > > +		          CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED,
> > > +		          0, NULL, NULL,
> > > +		          CL_SUCCESS, &result, "Migrating the
> > > buffer with flag.")) {
> > > +			return PIGLIT_FAIL;
> > > +		}
> 
> I think the other two possibilities (with only one flag set).

Sure

> also your
> treatment of the test return value is a bit inconsistent. Why return
> early in positive cases and not in error cases?

I think some other cl test also do that (I will have a closer look)
However, if the normal case failed, is there a point to test error case, they 
will probably fail in the same way and it save execution time

> Also why not test the error cases for all devices?

The error is about input validation, my understanding is that the will failled 
before dealing with device. But if you prefer, It could be made per devices.

> 
> > > +	}
> > > +
> > > +/*** Errors ***/
> > > +
> > > +	/*
> > > +	 * CL_INVALID_COMMAND_QUEUE if command_queue is not a
> > > valid command-queue.
> > > +	 */
> > > +	test(NULL, 1, &device_buffer, 0,
> > > +	     0, NULL, NULL,
> > > +	     CL_INVALID_COMMAND_QUEUE, &result,
> > > +	     "CL_INVALID_COMMAND_QUEUE if command_queue is not a
> > > valid command-queue");
> > > +
> > > +	/*
> > > +	 * CL_INVALID_CONTEXT if the context associated with
> > > command_queue and
> > > +	 * buffer are not the same or if the context associated
> > > with command_queue
> > > +	 * and events in event_wait_list are not the same.
> > > +	 */
> > > +	{
> > > +		piglit_cl_context context;
> > > +		cl_int err;
> > > +		context = piglit_cl_create_context(env
> > > ->platform_id,
> > > +	                                      env->context
> > > ->device_ids, 1);
> > > +		if (context) {
> > > +			test(context->command_queues[0], 1,
> > > &device_buffer, 0,
> > > +			     0, NULL, NULL,
> > > +			     CL_INVALID_CONTEXT, &result,
> > > +			     "CL_INVALID_CONTEXT if the context
> > > associated with command_queue and buffer are not the same");
> > > +
> > > +			event = clCreateUserEvent(context->cl_ctx,
> > > &err);
> > > +			if (err == CL_SUCCESS) {
> > > +				err = clSetUserEventStatus(event,
> > > CL_COMPLETE);
> > > +				if (err == CL_SUCCESS) {
> > > +					test(queue, 1,
> > > &device_buffer, 0,
> > > +					     1, &event, NULL,
> > > +					     CL_INVALID_CONTEXT,
> > > &result,
> > > +					     "CL_INVALID_CONTEXT
> > > if the context associated with command_queue and events in
> > > event_wait_list are not the same");
> > > +				} else {
> > > +					fprintf(stderr, "Could not
> > > set event status.\n");
> > > +					piglit_merge_result(&resul
> > > t, PIGLIT_WARN);
> > > +				}
> > > +				clReleaseEvent(event);
> > > +			} else {
> > > +				fprintf(stderr, "Could not create
> > > user event.\n");
> > > +				piglit_merge_result(&result,
> > > PIGLIT_WARN);
> > > +			}
> > > +
> > > +			piglit_cl_release_context(context);
> > > +		} else {
> > > +			fprintf(stderr, "Could not test triggering
> > > CL_INVALID_CONTEXT.\n");
> > > +			piglit_merge_result(&result, PIGLIT_WARN);
> > > +		}
> > > +	}
> > > +
> > > +	/*
> > > +	 * CL_INVALID_MEM_OBJECT if any of the memory objects in
> > > mem_objs is not a
> > > +	 * valid memory object.
> > > +	 */
> > > +	test(queue, 1, &invalid_buffer, 0,
> > > +	     0, NULL, NULL,
> > > +	     CL_INVALID_MEM_OBJECT, &result,
> > > +	     "CL_INVALID_MEM_OBJECT if any of the memory objects
> > > in mem_objs is not a valid memory object");
> > > +
> > > +	/*
> > > +	 * CL_INVALID_VALUE if num_mem_objects is zero or if
> > > mem_objects is NULL.
> > > +	 */
> > > +	test(queue, 0, &device_buffer, 0,
> > > +	     0, NULL, NULL,
> > > +	     CL_INVALID_VALUE, &result,
> > > +	     "CL_INVALID_VALUE if num_mem_objects is zero");
> > > +
> > > +	test(queue, 1, NULL, 0,
> > > +	     0, NULL, NULL,
> > > +	     CL_INVALID_VALUE, &result,
> > > +	     "CL_INVALID_VALUE if num_mem_objects is NULL");
> > > +
> > > +	/*
> > > +	 * CL_INVALID_VALUE if flags is not 0 or is not any of the
> > > values
> > > +	 * described in the table above.
> > > +	 */
> > > +	test(queue, 1, &device_buffer, -1,
> > > +	     0, NULL, NULL,
> > > +	     CL_INVALID_VALUE, &result,
> > > +	     "CL_INVALID_VALUE if flags is not 0 or is not any of
> > > the values described in the table above");
> > > +
> > > +	/*
> > > +	 * CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL
> > > and
> > > +	 * num_events_in_wait_list > 0, or event_wait_list is not
> > > NULL and
> > > +	 * num_events_in_wait_list is 0, or if event objects in
> > > event_wait_list
> > > +	 * are not valid events.
> > > +	 */
> > > +	event = NULL;
> > > +	test(queue, 1, &device_buffer, 0,
> > > +	     1, NULL, NULL,
> > > +	     CL_INVALID_EVENT_WAIT_LIST, &result,
> > > +	     "CL_INVALID_EVENT_WAIT_LIST if event_wait_list is
> > > NULL and num_events_in_wait_list > 0");
> > > +
> > > +	test(queue, 1, &device_buffer, 0,
> > > +	     0, &event, 0,
> > > +	     CL_INVALID_EVENT_WAIT_LIST, &result,
> > > +	     "CL_INVALID_EVENT_WAIT_LIST if event_wait_list is not
> > > NULL and num_events_in_wait_list is 0");
> > > +
> > > +	test(queue, 1, &device_buffer, 0,
> > > +	     1, &event, 0,
> > > +	     CL_INVALID_EVENT_WAIT_LIST, &result,
> > > +	     "CL_INVALID_EVENT_WAIT_LIST if event objects in
> > > event_wait_list are not valid events");
> > > +
> > > +
> > > +	clReleaseMemObject(device_buffer);
> > > +	return result;
> > > +#else
> > > +	return PIGLIT_SKIP;
> > > +#endif
> > > +}
> > 
> > _______________________________________________
> > Piglit mailing list
> > Piglit at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/piglit



More information about the Piglit mailing list