[Beignet] [PATCH] add the usage of link program from llvm binary.

Zhigang Gong zhigang.gong at linux.intel.com
Mon Jun 30 21:56:43 PDT 2014


Pushed with slight change.
Thanks.

On Fri, Jun 27, 2014 at 08:27:03AM +0800, xionghu.luo at intel.com wrote:
> From: Luo <xionghu.luo at intel.com>
> 
> user A could compile and link kernel source to llvm binary first, then
> query the binary to save to file; With the binary, user B can call
> clCreateProgramWithBinary without compile the source again.
> this usage could protect those who need to protect the kernel source.
> 
> Signed-off-by: Luo <xionghu.luo at intel.com>
> ---
>  utests/runtime_compile_link.cpp | 41 ++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/utests/runtime_compile_link.cpp b/utests/runtime_compile_link.cpp
> index 8aeea31..f27b1dd 100644
> --- a/utests/runtime_compile_link.cpp
> +++ b/utests/runtime_compile_link.cpp
> @@ -67,12 +67,47 @@ void runtime_compile_link(void)
>  
>    OCL_ASSERT(err==CL_SUCCESS);
>    cl_program input_programs[2] = { program_A, program_B};
> -  cl_program linked_program = clLinkProgram(ctx, 0, NULL, NULL, 2, input_programs, NULL, NULL, &err);
> -
> +  cl_program linked_program = clLinkProgram(ctx, 0, NULL, "-create-library", 2, input_programs, NULL, NULL, &err);
>  
>    OCL_ASSERT(linked_program != NULL);
>    OCL_ASSERT(err == CL_SUCCESS);
> +  size_t      binarySize;
> +  unsigned char *binary;
> +
> +  // Get the size of the resulting binary (only one device)
> +  err= clGetProgramInfo( linked_program, CL_PROGRAM_BINARY_SIZES, sizeof( binarySize ), &binarySize, NULL );
> +  OCL_ASSERT(err==CL_SUCCESS);
> +
> +  // Create a buffer and get the actual binary
> +  binary = (unsigned char*)malloc(sizeof(unsigned char)*binarySize);
> +  if (binary == NULL) {
> +    OCL_ASSERT(0);
> +    return ;
> +  }
> +
> +  unsigned char *buffers[ 1 ] = { binary };
> +  // Do another sanity check here first
> +  size_t size;
> +  cl_int loadErrors[ 1 ];
> +  err = clGetProgramInfo( linked_program, CL_PROGRAM_BINARIES, 0, NULL, &size );
> +  OCL_ASSERT(err==CL_SUCCESS);
> +  if( size != sizeof( buffers ) ){
> +    free(binary);
> +    return ;
> +  }
> +
> +  err = clGetProgramInfo( linked_program, CL_PROGRAM_BINARIES, sizeof( buffers ), &buffers, NULL );
> +  OCL_ASSERT(err==CL_SUCCESS);
> +
> +  cl_device_id deviceID;
> +  err = clGetProgramInfo( linked_program, CL_PROGRAM_DEVICES, sizeof( deviceID), &deviceID, NULL );
> +  OCL_ASSERT(err==CL_SUCCESS);
> +
> +  cl_program program_with_binary = clCreateProgramWithBinary(ctx, 1, &deviceID, &binarySize, (const unsigned char**)buffers, loadErrors, &err);
> +  OCL_ASSERT(err==CL_SUCCESS);
>  
> +  cl_program my_newly_linked_program = clLinkProgram(ctx, 1, &deviceID, NULL, 1, &program_with_binary, NULL, NULL, &err);
> +  OCL_ASSERT(err==CL_SUCCESS);
>    // link success, run this kernel.
>  
>    const size_t n = 16;
> @@ -104,7 +139,7 @@ void runtime_compile_link(void)
>    OCL_UNMAP_BUFFER(0);
>    OCL_UNMAP_BUFFER(1);
>  
> -  kernel = clCreateKernel(linked_program, "runtime_compile_link_a", &err);
> +  kernel = clCreateKernel(my_newly_linked_program, "runtime_compile_link_a", &err);
>  
>    OCL_ASSERT(err == CL_SUCCESS);
>  
> -- 
> 1.8.1.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list