Name Strings

   cl_altera_compiler_mode

Contributors

   David Neto, Altera Corporation

Contact

   Michael Kinsner, mkinsner 'at' altera 'dot' com

IP Status

   No known IP claims.

Version

   Version 1, 2014-02-06

Number

   TBD

Status

   Complete. 
   Shipping with the Altera SDK for OpenCL, version 14.0

   An earlier version shipped with the Altera SDK for OpenCL, version 13.0

Extension Type

   OpenCL platform extension

Dependencies

   OpenCL 1.0 is required.
   This document is written against revision 48 of the OpenCL 1.0 specification.

Overview

   This extension specifies alternative device code compilation flows
   for OpenCL.

   In standard OpenCL, there are two methods for preparing code for
   execution on an OpenCL device.  The first is to compile OpenCL C code
   from source text using an online compiler.  The second is to load a
   precompiled device binary.

   This extension specifies mechanisms to enable alternative workflows for
   compiling and loading device code.  They enable simplified or optimized
   support for the following development and deployment scenarios:

    1. The target OpenCL device is not available in the development
       environment.

    2. The platform does not provide an online compiler for the target
       OpenCL device, or full online compilation is not desirable during
       host application development.

    3. The application only requires one device program, and does not
       need read access to the device binary.

   The development and deployment of a particular application may involve
   more than one of these scenarios.

   The mechanisms specified by this extension are:

    1. An "offline device" feature:  This is the ability to specify that
       the OpenCL runtime should partially emulate the presence a device.
       From the perspective of the host program, emulation should be
       complete, except that kernel code may have no effect.  For example,
       kernels are enqueued, buffers are copied or mapped as required,
       and event profiling information is updated to reflect command
       progression.  However side effects produced by running the code
       inside kernels may not be visible.

    2. A "create program executable library" compiler mode:  
       The clBuildProgram API method does not fully compile device code.
       Instead, it performs an online stub compilation, and saves enough
       information in a data store to perform a deferred full (offline)
       compilation.

       2a. The stub compilation produces a binary which includes enough
          kernel interface information to satisfy further host activities
          such as creating cl_kernel objects, setting kernel arguments,
          and enqueueing kernels for execution.  But the stub binary
          may not have executable code, so the execution of kernels from
          such a binary may not produce valid data.

       2b. The data store is used to perform offline compilation of
          kernel programs.  Each logically distinct call of clBuildProgram
          generates an entry in the data store.  Each entry is a tuple
          consisting of:

         - The target device 

         - The kernel program source 

         - The options supplied to clBuildProgram 

         - A set of instructions (such as a script) for offline
           compilation of the kernel program.  The result of executing
           these instructions is to associate a device binary (including
           executable device code) with this tuple in the data store.

    3. A "use program executable library" mode:  We assume that an
       offline compilation has been performed for all entries in the
       data store generated by use of the "create program executable
       library" mode.  In the "use program exectuable library" mode,
       the clBuildProgram API method performs a lookup in the data store
       based on the following attributes:

         - The target device 

         - The kernel program source 

         - The options supplied to clBuildProgram

       If such an entry exists in the data store, then the associated
       binary is loaded into the cl_program object.  If no such entry
       exists, or if the entry is not associated with a device binary,
       then an error is returned.

    4. A "preloaded binary only" compiler mode:  In this mode, the
       runtime does not compile any programs, does not load the device
       with new code at runtime, and does not necessarily produce a valid
       device binary when requested by the CL_PROGRAM_BINARIES query to
       the clGetProgramInfo API method.  Instead:

         - The device is assumed to already have a program loaded 
           before the cl_context is created.

         - All cl_program objects behave as if they refer to the preloaded
           binary

         - The clBuildProgram API method is a no-op except for
           setting a successful build status.

   The following paragraphs describe the benefits provided by the
   mechanisms specified in this extension.

   Scenario 1: Developing the host part of an OpenCL application without
   a device being present:

       The offline device feature enables the execution of a host program
       even while a device is not present in the system.  This is
       useful for developing an application before a device has been
       manufactured, is otherwise scarce, or unavailable.  Although the
       data coming back from the emulated device is invalid, host code
       interaction with the runtime may be developed and tested.

   Scenario 2: Porting an existing application to a platform without an
   online compiler:

       Many OpenCL platforms provide an online OpenCL C compiler
       for each device.  Therefore host applications often use
       clCreateProgramWithSource and clBuildProgram to create
       executable device code.  The standard method of porting such
       a program to an environment without an online compiler is to
       replace the compile-from-source sequence of API calls with a
       find-and-load-from-binary code sequence.  Transforming the host
       application in this way introduces platform dependencies (such
       as APIs to access a filesystem) and adds bookkeeping complexity
       to map the original OpenCL C source and compile options with
       an associated device binary.  The porting and verification effort
       can be quite onerous if many portions of the host code must be
       modified, or if the device source code is parameterized at runtime.

       We can reduce porting effort in this scenario by using a three-phase
       approach.
       
       In the first phase, we run the host program with the runtime
       configured to use offline device mode, and also the "create program
       executable libary" compiler mode.  This generates a data store
       (the program executable library) containing enough information
       to compile the required device programs in an offline manner,
       i.e. outside the control of the host program.

       In the second phase, we perform an offline compilation of all
       entries in the data store.  This is done by enumerating the entries
       in the data store and following the compilation instructions for
       each entry.

       In the third phase, the application is fully functional.  The host
       is configured to use "use program executable library" compiler mode.
       Any API request to compile a device program from source is translated
       into a lookup of the (fully functional) device binary in the data store.

       This approach works when:

          - The device has a stable name. That is, the device name does not
            change from one run to another.

          - The host program calls clBuildProgram with only a finite
            set of combinations of device, kernel source, and build
            options.

          - Those combinations are consistent from one run to the next.
            That is, the kernel source and build options do not depend
            on the data results from executing a previous kernel.

          - Other context upon which the compilation depends is stable.
            For example, the location and contents of files included
            from the OpenCL C source remains the same.

   Scenario 3: An application needs only one cl_program, runs in a
   constrained environment, and may need "instant on" behaviour:

      The "preloaded binary only" compiler mode is desiged to be used
      by embedded applications.  Such applications typically have
      the following constraints:

          - The application is simple enough that only one cl_program
            is required.

          - The target system has tight memory and time constraints.
            It may be infeasible or undesirable to process a full device
            binary through the standard OpenCL runtime APIs.  For example,
            the device binary might be too large to map into host memory,
            or the application cannot tolerate the delay to load the
            device binary from external storage.

          - The application has no requirement to recover the device
            binary via the CL_PROGRAM_BINARIES query to clGetProgramInfo.
            Even moreso, it may be undesirable for intellectual property
            reasons or otherwise to allow the host program to recover
            the device binary.

          - It is desirable to develop the application in the normal way,
            but to minimize host program code changes before deployment.
            That is, application development uses the standard
            clCreateProgramWithSource, or clCreateProgramWithBinary APIs.
            But the transition to a test or production environment
            is limited to a configuration change, as opposed to a code
            change.

Header File

   Interface constants are defined in cl_ext.h

New Tokens

   New context properties to be used in the <properties> array
   supplied to to clCreateContext or clCreateContextFromType:

      CL_CONTEXT_COMPILER_MODE_ALTERA                             0x40F0
      CL_CONTEXT_PROGRAM_EXE_LIBRARY_ROOT_ALTERA                  0x40F1
      CL_CONTEXT_OFFLINE_DEVICE_ALTERA                            0x40F2

   Values to be supplied for context property
   CL_CONTEXT_COMPILER_MODE_ALTERA:

      CL_CONTEXT_COMPILER_MODE_OFFLINE_ALTERA                     0
      CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA  1
      CL_CONTEXT_COMPILER_MODE_OFFLINE_USE_EXE_LIBRARY_ALTERA     2
      CL_CONTEXT_COMPILER_MODE_PRELOADED_BINARY_ONLY_ALTERA       3



Additions to Chapter 4 of the OpenCL 1.0 (v48) Specification

   Add the following to Table 4.4, List of supported properties by
   clCreateContext:


      cl_context_properties enum:
         CL_CONTEXT_OFFLINE_DEVICE_ALTERA
      Property value:
         const char*
      Description:
         Specifies that the runtime should partly emulate the presence
         of the named device.  The device should behave normally except
         that kernels executed on such an "offline" device might
         not produce any side effects.

         The specified name value should be the first word in the full
         name returned by the CL_DEVICE_NAME, in C-style form.

         An implementation may restrict the use of this property as
         follows:

            - A platform may require external initialization when using
            this context property.  For example, Altera's
            platform implementations require that environment variable
            CL_CONTEXT_OFFLINE_DEVICE_ALTERA be set to the same device
            name string as supplied to this property.

            - When this property is specified, the specified device
            may be the only available device in the platform.

         This property may be useful for developing or porting
         applications when no online compiler is available, and
         when the CL_CONTEXT_COMPILER_MODE_ALTERA property is set to
         CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA.


      cl_context_properties enum:
         CL_CONTEXT_COMPILER_MODE_ALTERA
      Property value:
         cl_ulong
      Description:
         For devices without an online compiler, this property
         specifies alternative behaviour for building, loading,
         and querying device programs.
         (Platforms implementing the embedded profile are the
         only ones that may omit providing an online compiler.)

         The value should be one of the following:
            CL_CONTEXT_COMPILER_MODE_OFFLINE_ALTERA,
            CL_CONTEXT_COMPILER_MODE_PRELOADED_BINARY_ONLY_ALTERA,
            CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA,
            CL_CONTEXT_COMPILER_MODE_OFFLINE_USE_EXE_LIBRARY_ALTERA.

         CL_CONTEXT_COMPILER_MODE_OFFLINE_ALTERA - The clBuildProgram
            and clCreateProgramWithBinary, and clGetProgramInfo
            API methods behave in the standard way.  
            In particular, clBuildProgram may fail with error
            CL_COMPILER_NOT_AVAILABLE.
            This value is the default, and is the only value
            which specifies conformant behaviour.

         CL_CONTEXT_COMPILER_MODE_PRELOADED_BINARY_ONLY_ALTERA - The device
            is assumed to already have a program loaded before
            the first OpenCL APIs are invoked.
            All cl_program objects behave as if they refer to the
            preloaded device binary.
            The clBuildProgram API method always succeeds when compiling
            for this device, but does not produce an executable
            device binary.
            The clCreateProgramWithBinary does not validate
            the provided binary.  It always succeeds provided its
            arguments are well-formed.
            The data returned by the CL_PROGRAM_BINARIES query 
            for clGetProgramInfo is unspecified.  It may not be
            a valid device binary.
            
         CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA -
            When compiling a program created with
            clCreateProgramWithSource, the clBuildProgram method
            performs a "stub" compilation, and populates a data store
            with enough information to perform a program compilation
            offline (i.e. outside the control of the host program).
            
            The online stub compilation produces a binary which includes
            enough information to satsify further runtime API activities
            such as creating cl_kernel objects, setting kernel arguments,
            and enqueing kernels for execution.  The stub binary may not
            have executable code, so the execution of kernels from such
            a binary may not produce valid data.

            This value for CL_CONTEXT_COMPILER_MODE_ALTERA is designed
            to be used with the CL_CONTEXT_OFFLINE_DEVICE_ALTERA context
            property.

            Additionally, each logically distinct call of clBuildProgram
            generates an entry in an external data store which persists
            beyond the lifetime of the host program.  Each entry is a
            tuple consisting of:

            - The target device 

            - The kernel program source 

            - The options supplied to clBuildProgram 

            - A set of instructions (such as a script) for offline
              compilation of the kernel program.  The result of executing
              these instructions is to associate a device binary (including
              executable device code) with this tuple in the data store.

            In Altera's platform implementation, the data store is a tree of
            directories and files.  Each data store entry is a leaf
            directory in this tree containing:
               - a file named "kernels.cl" containing the kernel program
               source
               - a file named "build.cmd" containing the list of operating
               system commands to be used to compile the program to a
               device binary, and to store that device binary in a file
               named "kernels.aocx" in the same directory.

         CL_CONTEXT_COMPILER_MODE_OFFLINE_USE_EXE_LIBRARY_ALTERA -
            When compiling a program created with clCreateProgramWithSoruce,
            the clBuildProgram API method performs a lookup in the data store
            based on the following attributes:

            - The target device 

            - The kernel program source 

            - The options supplied to clBuildProgram

             If such an entry exists in the data store, then the associated
             binary is loaded into the cl_program.  If no such entry exists,
             or if the entry is not associated with a device binary, then an
             error is returned.


      cl_context_properties enum:
         CL_CONTEXT_PROGRAM_EXE_LIBRARY_ROOT_ALTERA
      Property value:
         const char*
      Description:
         Specifies the filesystem root directory
         for the data store used when either value
         CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA or value
         CL_CONTEXT_COMPILER_MODE_OFFLINE_USE_EXE_LIBRARY_ALTERA is specified
         for context property CL_CONTEXT_COMPILER_MODE_ALTERA.

         The specified value may be a relative directory name, but
         will be resolved to an absolute path at context creation time.

         If this property is left unspecified, then data store root
         is implementation-defined.

         In Altera's platform implementation, the default is the
         "aocl_program_library" subdirectory in the current directory
         in effect at context creation time.



Additions to Chapter 5 of the OpenCL 1.0 (v48) Specification
   
   Additions to Section 5.4.1 Creating Program Objects

      When context property CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA is
      specified with value CL_CONTEXT_COMPILER_PRELOADED_BINARY_ONLY_ALTERA,
      the clCreateProgramWithBinary API method behaves in a non-standard
      way.  See the description of this property value in Table 4.4 for
      more information.

   Additions to Section 5.4.2 Building Program Exectuables

      When context property CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA is
      specified, the clBuildProgram API method behaves in a non-standard
      way when compiling for devices without an online compiler.
      See the description of this property value in Table 4.4 for more
      information.

   Additions to Section 5.4.5 Program Object Queries

      The following is added to the description of the 
      CL_PROGRAM_BINARIES query in Table 5.11:

         When context property CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA
         is specified with either value
         CL_CONTEXT_COMPILER_MODE_PRELOADED_BINARY_ONLY_ALTERA
         or value CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA,
         then the binary returned by this query may not be a valid device
         binary.
         See the description of the CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA
         property value in Table 4.4 for more information.

   Additions to Section 5.6 Executing Kernels

      When context property CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA
      is specified with value 
      CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA,
      or if context property CL_CONTEXT_OFFLINE_DEVICE_ALTERA is specified,
      then a kernel execution may behave as if the kernel code
      produces no side effects, i.e. as if the body of the kernel
      contains no statements.
      (All other runtime activites must occur.  For example,
      the kernels are still enqueued, buffers are copied or mapped
      as required to satisfy kernel arguments, and event profiling
      information is updated to reflect command progression.)
      See the description of the CL_CONTEXT_OFFLINE_COMPILER_MODE_ALTERA
      property value in Table 4.4 for more information.
   

Implementation Notes

   For each context property defined in this extension specification,
   Altera's platform implementation allows the property to be specified
   by setting an environment variable of the same name.

   For CL_CONTEXT_OFFLINE_DEVICE_ALTERA, the environment variable
   of *must* be set before any platform APIs are called.

   For CL_CONTEXT_COMPILER_MODE_ALTERA, value of the environment variable
   is the numerical value for the corresponding value enum as defined
   in the CL/cl_ext.h header file.

   Precedence:  For context properties CL_CONTEXT_COMPILER_MODE_ALTERA and
   CL_CONTEXT_PROGRAM_EXE_LIBRARY_ROOT_ALTERA, any value explicitly
   provided to the clCreateContext or clCreateContextFromType
   API methods will override an environment variable setting.

   If property CL_CONTEXT_OFFLINE_DEVICE_ALTERA is explicitly
   provided to the clCreateCOTNEXT or clCreateContextFromType
   methods, then it must match the value set for environment variable
   CL_CONTEXT_OFFLINE_DEVICE_ALTERA.


Issues

   1. The use of context property CL_CONTEXT_OFFLINE_DEVICE_ALTERA is
      rather restricted:

         - It must be set at the "beginning of time" for a host application,
           e.g. via an environment variable setting.

         - If an "offline device" is used in a context, then online
           devices cannot be used in any context for the platform.
   
      In this light, it might be more natural to call it a "platform"
      property.  But in OpenCL platforms are stateless, so this would
      not be appropriate.  Instead the most basic runtime controls are
      applied to contexts, not platforms.

      These restrictions reflect limitations of Altera's original
      implementation.  However, the feature in its current form is still
      quite useful for application development and porting.


Sample Code

   Example for using an "offline device", with creation and initialization of
   a data store for offline compilation of program binaries.

      #include <CL/opencl.h>
      #include <stdlib.h>
      #include <assert.h>
      #define CHECK(X) assert(CL_SUCCESS == (X))

      int main(...) {
         cl_platform platform = 0;
         cl_device_id device = 0;
         cl_context context = 0;
         cl_int status = 0;

         // Specify an offline device via environment variable here, or externally
         // before program startup.
         // This must occur befor the first OpenCL API method call.
         setenv("CL_CONTEXT_OFFLINE_DEVICE_ALTERA","mydevice");

         CHECK( clGetPlatformIDs(1,&platform,0) );
         CHECK( clGetDeviceIDs(platform,CL_DEVICE_TYPE_ACCELERATOR,1,&device,0) );

         cl_context_properties props[] = {

            // Specify creation and initialization of a program library data store.
            CL_CONTEXT_COMPILER_MODE_ALTERA, 
               (cl_context_properties)CL_CONTEXT_COMPILER_MODE_OFFLINE_CREATE_EXE_LIBRARY_ALTERA

            // Where is the data store rooted?
            CL_CONTEXT_PROGRAM_EXE_LIBRARY_ROOT_ALTERA
               (cl_context_properties)"/data/myproject/proglib"

            // Terminate the properties list.
            0
         };
         context = clCreateContext( props, 1, &device, 0, 0, &status );
         CHECK( status );

         cl_command_queue cq = clCreateCommandQueue( context, device, 0, &status );
         CHECK( status );

         const char* source = "kernel void foo( global int* A ) { *A = 42; }";
         cl_program program = clCreateProgramWithSource( context, 1, &source, NULL, &status );
         CHECK( status );

         // Perform a stub compilation, and create an entry for this (device,source,options)
         // combination in the program library data store.
         CHECK( clBuildProgram( program, 1, &device, "-cl-opt-disable", 0, 0 ) );

         cl_mem mem = clCreateBuffer(context,CL_MEM_READ_WRITE,sizeof(cl_int),0,&status);
         CHECK( status );

         // Only a stub compilation has been performed.
         // But this still enables full setup and enqueue of a kernel for execution.
         cl_kernel kernel = clCreateKernel( program, "foo", &status );
         CHECK( status );
         CHECK( clSetKernelArg( kernel, 0, sizeof(cl_mem), &mem ) );

         // Expect that kernels scheduled by clEnqueueNDRangeKernel and
         // clEnqueueTask may not produce expected side effects.  
         // It may appear that each kernel executes no statements.
         
         CHECK( clEnqueueTask( cq, kernel, 0, 0, 0 ) );
         cl_int the_answer = 0;
         CHECK( clEnqueueReadBuffer( cq, mem, 1 /*block*/, 0, sizeof(the_answer),&the_answer,0,0,0) );

         // Because we're using an "offline device", we can't rely on the_answer being 42.

         // ...



   Example for using an already-populated data store of program binaries compiled
   in an offline manner.  The code is the same as the previous example, except
   use these context properties instead:

         cl_context_properties props[] = {

            // Specify the use of a program data store library of pre-compiled device binaries.
            CL_CONTEXT_COMPILER_MODE_ALTERA, 
               (cl_context_properties)CL_CONTEXT_COMPILER_MODE_OFFLINE_USE_EXE_LIBRARY_ALTERA

            // Where is the data store rooted?
            CL_CONTEXT_PROGRAM_EXE_LIBRARY_ROOT_ALTERA
               (cl_context_properties)"/data/myproject/proglib"

            // Terminate the properties list.
            0
         };



   Example for using a "preloaded binary":

         cl_context_properties props[] = {

            // Specify the use of a preloaded binary.
            CL_CONTEXT_COMPILER_MODE_ALTERA, 
               (cl_context_properties)CL_CONTEXT_COMPILER_MODE_PRELOADED_BINARY_ONLY_ALTERA,

            // Terminate the properties list.
            0
         };
         context = clCreateContext( props, 1, &device, 0, 0, &status );

         ...

         // All cl_program objects refer to the preloaded binary.
         // clCreateProgramWithBinary accepts invalid device binaries.
         // clBuildProgram succeeds but does not actually compile the program from source.


Conformance Tests

   None.

Revision History

   Version 0, 2013-05-06 - Initial revision.
      Documents the behaviours in the Altera SDK for OpenCL, version 13.0.

   Version 1, 2014-02-06 - Assigned registered values to tokens.
      
