[Piglit] [PATCH v2] cl: add clLinkProgram test

Timothy Arceri t_arceri at yahoo.com.au
Mon Jul 13 02:38:43 PDT 2015


On Tue, 2015-01-06 at 21:20 +0100, EdB wrote:
> I don't have commit acces. Can someone push it?

I think you need to update tests/cl.py before this can be pushed.


> 
> Le 2014-12-19 20:41, Tom Stellard a écrit :
> > On Fri, Dec 19, 2014 at 02:39:06PM +0100, EdB wrote:
> > > v2:
> > > Use piglit_cl_get_program_build_info instead of 
> > > piglit_cl_get_program_info,
> > > I was expected it to fail so I didn't paid attention.
> > > 
> > > Remove "-invalid- --link-- options" on CL_INVALID_OPERATION test.
> > 
> > Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> > 
> > > ---
> > >  tests/cl/api/CMakeLists.cl.txt |   1 +
> > >  tests/cl/api/link-program.c    | 394 
> > > +++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 395 insertions(+)
> > >  create mode 100644 tests/cl/api/link-program.c
> > > 
> > > diff --git a/tests/cl/api/CMakeLists.cl.txt 
> > > b/tests/cl/api/CMakeLists.cl.txt
> > > index 7e78491..b598528 100644
> > > --- a/tests/cl/api/CMakeLists.cl.txt
> > > +++ b/tests/cl/api/CMakeLists.cl.txt
> > > @@ -31,6 +31,7 @@ piglit_cl_add_api_test (create-program-with-source 
> > > create-program-with-source.c)
> > >  piglit_cl_add_api_test (retain_release-program 
> > > retain_release-program.c)
> > >  piglit_cl_add_api_test (build-program build-program.c)
> > >  piglit_cl_add_api_test (compile-program compile-program.c)
> > > +piglit_cl_add_api_test (link-program link-program.c)
> > >  piglit_cl_add_api_test (unload-compiler unload-compiler.c)
> > >  piglit_cl_add_api_test (get-program-info get-program-info.c)
> > >  piglit_cl_add_api_test (get-program-build-info 
> > > get-program-build-info.c)
> > > diff --git a/tests/cl/api/link-program.c b/tests/cl/api/link-program.c
> > > new file mode 100644
> > > index 0000000..e98f428
> > > --- /dev/null
> > > +++ b/tests/cl/api/link-program.c
> > > @@ -0,0 +1,394 @@
> > > +/*
> > > + * Copyright © 2014 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 link-program.c
> > > + *
> > > + * Test API function:
> > > + *
> > > + *   cl_program
> > > + *   clLinkProgram(cl_context context,
> > > + *         cl_uint num_devices, const cl_device_id device_list,
> > > + *         const char *options,
> > > + *         cl_uint num_input_programs, const cl_program 
> > > *input_programs,
> > > + *         void (CL_CALLBACK *pfn_notify)(cl_program program, void 
> > > *user_data),
> > > + *         void *user_data,
> > > + *         cl_int *errcode_ret)
> > > + */
> > > +
> > > +#include "piglit-framework-cl-api.h"
> > > +
> > > +
> > > +PIGLIT_CL_API_TEST_CONFIG_BEGIN
> > > +
> > > + config.name = "clLinkProgram";
> > > + config.version_min = 12;
> > > +
> > > + config.run_per_platform = true;
> > > + config.create_context = true;
> > > +
> > > +PIGLIT_CL_API_TEST_CONFIG_END
> > > +
> > > +
> > > +const char* strings[] = {
> > > + "int get_number() { return 42; }",
> > > + "int get_number();\n",
> > > + "kernel void test_kernel() { int i = get_number(); }",
> > > + "int get_number() { return 0; }"
> > > +};
> > > +
> > > +#if defined(CL_VERSION_1_2)
> > > +static cl_program
> > > +compile_program(cl_context context,
> > > +                cl_uint num_devices, const cl_device_id *device_list,
> > > +                cl_uint count, const char **strings,
> > > +                const char* err_str) {
> > > + cl_int errNo;
> > > + cl_program program;
> > > +
> > > + /* Create program with source */
> > > + program = clCreateProgramWithSource(context,
> > > +                                     count,
> > > +                                     strings,
> > > +                                     NULL,
> > > +                                     &errNo);
> > > + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> > > +         fprintf(stderr,
> > > +                 "Failed (error code: %s): Create program with 
> > > source (for 
> > > the %s).\n",
> > > +                 piglit_cl_get_error_name(errNo), err_str);
> > > +         return NULL;
> > > + }
> > > +
> > > + /* Compile program */
> > > + errNo = clCompileProgram(program,
> > > +                        num_devices, device_list,
> > > +                        " ",
> > > +                        0, NULL, NULL,
> > > +                        NULL, NULL);
> > > +
> > > + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> > > +         fprintf(stderr, "Failed (error code: %s): Compile 
> > > program (for the 
> > > %s).\n",
> > > +                 piglit_cl_get_error_name(errNo), err_str);
> > > +         clReleaseProgram(program);
> > > +         return NULL;
> > > + }
> > > +
> > > + return program;
> > > +}
> > > +
> > > +static bool
> > > +test(cl_context context,
> > > +     cl_uint num_devices, const cl_device_id *device_list,
> > > +     const char *options,
> > > +     cl_uint num_input_programs, const cl_program *input_programs,
> > > +     void (CL_CALLBACK *pfn_notify)(cl_program program, void 
> > > *user_data),
> > > +     void *user_data,
> > > +     cl_program *ret_program,
> > > +     cl_int expected_error, enum piglit_result* result,
> > > +     const char* test_str) {
> > > + cl_program program;
> > > + cl_int errNo;
> > > +
> > > + program = clLinkProgram(context,
> > > +                         num_devices, device_list,
> > > +                         options,
> > > +                         num_input_programs, input_programs,
> > > +                         pfn_notify, user_data,
> > > +                         &errNo);
> > > +
> > > + if (ret_program) {
> > > +         *ret_program = program;
> > > + } else {
> > > +         if (program)
> > > +                 clReleaseProgram(program);
> > > + }
> > > +
> > > + 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;
> > > +
> > > + int i;
> > > + cl_program_binary_type* binary_type;
> > > + cl_program compiled_programs[2];
> > > + cl_program function_prog;
> > > + cl_program kernel_prog;
> > > + cl_program linked_prog;
> > > +
> > > + /* Create compiled program */
> > > + function_prog = compile_program(env->context->cl_ctx,
> > > +                                 env->context->num_devices, 
> > > env->context->device_ids,
> > > +                                 1, &strings[0],
> > > +                                 "function program");
> > > + kernel_prog = compile_program(env->context->cl_ctx,
> > > +                               env->context->num_devices, 
> > > env->context->device_ids,
> > > +                               2, &strings[1],
> > > +                                 "kernel program");
> > > +
> > > + if (!function_prog || !kernel_prog) {
> > > +         clReleaseProgram(function_prog);
> > > +         clReleaseProgram(kernel_prog);
> > > +         return PIGLIT_FAIL;
> > > + }
> > > +
> > > + compiled_programs[0] = function_prog;
> > > + compiled_programs[1] = kernel_prog;
> > > +
> > > +/*** Normal usage ***/
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "-create-library",
> > > +      1, compiled_programs,
> > > +      NULL, NULL,
> > > +      &linked_prog,
> > > +      CL_SUCCESS, &result, "Link program as library");
> > > +
> > > + for(i = 0; i < env->context->num_devices; ++i) {
> > > +         binary_type = 
> > > piglit_cl_get_program_build_info(linked_prog,
> > > +                                                        
> > > env->context->device_ids[i],
> > > +                                                        
> > > CL_PROGRAM_BINARY_TYPE);
> > > +         if (*binary_type != CL_PROGRAM_BINARY_TYPE_LIBRARY) {
> > > +                 piglit_merge_result(&result, PIGLIT_FAIL);
> > > +                 fprintf(stderr,
> > > +                    "Failed: binary is not of type 
> > > CL_PROGRAM_BINARY_TYPE_LIBRARY.\n");
> > > +         }
> > > +         free(binary_type);
> > > + }
> > > +
> > > + clReleaseProgram(linked_prog);
> > > +
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      2, compiled_programs,
> > > +      NULL, NULL,
> > > +      &linked_prog,
> > > +      CL_SUCCESS, &result, "Link program as executable");
> > > +
> > > + for(i = 0; i < env->context->num_devices; ++i) {
> > > +         binary_type = 
> > > piglit_cl_get_program_build_info(linked_prog,
> > > +                                                        
> > > env->context->device_ids[i],
> > > +                                                        
> > > CL_PROGRAM_BINARY_TYPE);
> > > +         if (*binary_type != CL_PROGRAM_BINARY_TYPE_EXECUTABLE) 
> > > {
> > > +                 piglit_merge_result(&result, PIGLIT_FAIL);
> > > +                 fprintf(stderr,
> > > +                    "Failed: binary is not of type 
> > > CL_PROGRAM_BINARY_TYPE_EXECUTABLE.\n");
> > > +         }
> > > +         free(binary_type);
> > > + }
> > > +
> > > +
> > > +/*** Errors ***/
> > > +
> > > + /*
> > > +  * CL_INVALID_VALUE if device_list is NULL and num_devices is 
> > > greater than
> > > +  * zero, or if device_list is not NULL and num_devices is zero
> > > +  */
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, NULL,
> > > +      "",
> > > +      2, compiled_programs,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if device_list is NULL and 
> > > num_devices is greater than zero");
> > > +
> > > + test(env->context->cl_ctx,
> > > +      0, env->context->device_ids,
> > > +      "",
> > > +      2, compiled_programs,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if device_list is not NULL and 
> > > num_devices is zero");
> > > +
> > > + /*
> > > +  * CL_INVALID_VALUE if num_input_programs is zero and 
> > > input_programs 
> > > is NULL
> > > +  * or if num_input_programs is zero and input_programs is not 
> > > NULL
> > > +  * or if num_input_programs is not zero and input_programs is 
> > > NULL
> > > +  */
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      0, NULL,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if num_input_programs is zero 
> > > and 
> > > input_programs is NULL");
> > > +
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      0, compiled_programs,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if num_input_programs is zero 
> > > and 
> > > input_programs is not NULL");
> > > +
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      2, NULL,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if num_input_programs is not 
> > > zero and 
> > > input_programs is NULL");
> > > +
> > > + /*
> > > +  * CL_INVALID_PROGRAM if programs specified in input_programs 
> > > are 
> > > not valid program objects
> > > +  */
> > > +
> > > +
> > > + /*
> > > +  * CL_INVALID_VALUE if pfn_notify is NULL but user_data is not 
> > > NULL.
> > > +  */
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      2, compiled_programs,
> > > +      NULL, &i,
> > > +      NULL,
> > > +      CL_INVALID_VALUE, &result,
> > > +      "Trigger CL_INVALID_VALUE if pfn_notify is NULL but 
> > > user_data 
> > > is not NULL");
> > > +
> > > + /*
> > > +  * CL_INVALID_DEVICE if OpenCL devices listed in device_list 
> > > are not 
> > > in the
> > > +  * list of devices associated with context
> > > +  */
> > > +
> > > +
> > > + /*
> > > +  
> > > * CL_INVALID_LINKER_OPTIONS if the linker options specified by 
> > > options are
> > > +  * invalid
> > > +  */
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "-invalid- --link-- options",
> > > +      2, compiled_programs,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_LINKER_OPTIONS, &result,
> > > +      "Trigger CL_INVALID_LINKER_OPTIONS if the linker options 
> > > specified by options are invalid");
> > > +
> > > + /*
> > > +  * CL_INVALID_OPERATION if the compilation or build of a 
> > > program 
> > > executable
> > > +  * for any of the devices listed in device_list by a previous 
> > > call 
> > > to
> > > +  * clCompileProgram or clBuildProgram for program has not 
> > > completed
> > > +  */
> > > +
> > > +
> > > + /*
> > > +  * CL_INVALID_OPERATION if the rules for devices containing 
> > > compiled 
> > > binaries
> > > +  * or libraries as described in input_programs argument above 
> > > are 
> > > not followed
> > > +  */
> > > + compiled_programs[0] = linked_prog;
> > > + test(env->context->cl_ctx,
> > > +      env->context->num_devices, env->context->device_ids,
> > > +      "",
> > > +      2, compiled_programs,
> > > +      NULL, NULL,
> > > +      NULL,
> > > +      CL_INVALID_OPERATION, &result,
> > > +      "Trigger CL_INVALID_OPERATION if the rules for devices 
> > > containing compiled binaries or libraries as described in 
> > > input_programs argument above are not followed");
> > > +
> > > + /*
> > > +  * CL_LINKER_NOT_AVAILABLE if a linker is not available
> > > +  * i.e. CL_DEVICE_LINKER_AVAILABLE specified in the table of 
> > > allowed 
> > > values
> > > +  * for param_name for clGetDeviceInfo is set to CL_FALSE.
> > > +  */
> > > + for(i = 0; i < env->context->num_devices; ++i) {
> > > +         cl_bool* linker_available =
> > > +                 piglit_cl_get_device_info(env->context
> > > ->device_ids[i],
> > > +                                          
> > >  CL_DEVICE_LINKER_AVAILABLE);
> > > +                 if(!(*linker_available)) {
> > > +                         test(env->context->cl_ctx,
> > > +                              env->context->num_devices, env
> > > ->context->device_ids,
> > > +                              "",
> > > +                              2, compiled_programs,
> > > +                              NULL, NULL,
> > > +                              NULL,
> > > +                              CL_LINKER_NOT_AVAILABLE, &result,
> > > +                              "Trigger CL_LINKER_NOT_AVAILABLE 
> > > if a linker is not 
> > > available");
> > > +         }
> > > +         free(linker_available);
> > > + }
> > > +
> > > +
> > > +/* Release programs */
> > > + clReleaseProgram(function_prog);
> > > + clReleaseProgram(kernel_prog);
> > > + clReleaseProgram(linked_prog);
> > > +
> > > + /*
> > > +  * CL_LINK_PROGRAM_FAILURE if there is a failure to link the 
> > > compiled binaries
> > > +  * and/or libraries.
> > > +  */
> > > + function_prog = compile_program(env->context->cl_ctx,
> > > +                                 env->context->num_devices, 
> > > env->context->device_ids,
> > > +                                 1, &strings[0],
> > > +                                 "2nd function program");
> > > + kernel_prog = compile_program(env->context->cl_ctx,
> > > +                               env->context->num_devices, 
> > > env->context->device_ids,
> > > +                               2, &strings[2],
> > > +                                 "2nd kernel program");
> > > +
> > > + if (!function_prog || !kernel_prog) {
> > > +         result = PIGLIT_FAIL;
> > > + } else {
> > > +         compiled_programs[0] = function_prog;
> > > +         compiled_programs[1] = kernel_prog;
> > > +
> > > +         test(env->context->cl_ctx,
> > > +              env->context->num_devices, env->context
> > > ->device_ids,
> > > +              "",
> > > +              2, compiled_programs,
> > > +              NULL, NULL,
> > > +              NULL,
> > > +              CL_LINK_PROGRAM_FAILURE, &result,
> > > +              "Trigger CL_LINK_PROGRAM_FAILURE if there is a 
> > > failure to link 
> > > the compiled binaries and/or libraries");
> > > + }
> > > +
> > > +/* Release programs */
> > > + clReleaseProgram(function_prog);
> > > + clReleaseProgram(kernel_prog);
> > > +
> > > + return result;
> > > +#else
> > > + return PIGLIT_SKIP;
> > > +#endif
> > > +}
> > > --
> > > 2.2.0
> > > 
> > > _______________________________________________
> > > Piglit mailing list
> > > Piglit at lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/piglit
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list