Name

    ARM_printf

Name Strings

    cl_arm_printf

Contributors

    Scott Moyers, ARM
    Robert Elliott, ARM
    Mats Petersson, ARM
    Vatsalya Prasad, ARM

Contact

    Scott Moyers, ARM (scott.moyers 'at' ARM.com)

IP Status

    No claims or disclosures are known to exist.

Version

    Revision: #1, Jan 17th, 2014

Number

    OpenCL Extension #27

Status

    Complete.

Extension Type

    OpenCL device extension

Dependencies

    Requires OpenCL version 1.0 or later.

Overview

    This extension enables the device side printf built in function for OpenCL C
    versions prior to 1.2. It also extends the cl_context_properties enumeration
    to allow a user defined printf callback and/or printf buffer size.

    The printf built in function should be used for debugging purposes only and may
    have a significant negative impact on the performance of an OpenCL application.

Header File

    cl_ext.h

Glossary

    No new terminology is introduced by this extension.

New Types

    None

New Procedures and Functions

    Built-in Function

      int printf( constant char * restrict format, ... )

    Description

      The printf function, providing the same functionality defined in the
      OpenCL 1.2 specification. Refer to chapter 6.12.13 of the OpenCL 1.2
      specification for documentation on this built in function.

New Tokens

    Accepted by the <properties> argument to clCreateContext

      CL_PRINTF_CALLBACK_ARM    0x40B0
      CL_PRINTF_BUFFERSIZE_ARM  0x40B1

    OpenCL kernel code now has access to:

      #pragma OPENCL EXTENSION cl_arm_printf : enable
      The define cl_arm_printf is also present

    This pragma must be enabled for a kernel to have access to the printf built
    in function in OpenCL C versions prior to 1.2.

Additions to Chapter 4.3 of the OpenCL 1.1 Specification
(Contexts)

    This extension adds the following tokens to Table 4.4
    (List of supported properties by clCreateContext)

    Enum Name      : CL_PRINTF_CALLBACK_ARM
    Property Value : void printf_callback( const char *buffer, size_t len, size_t complete, void *user_data )
    Description    : Specifies a pointer to function to be invoked when printf data is available.
                     Upon invocation the arguments are set to the following values.

                     <buffer>    is a pointer to a character array of size <len> created by printf.
                     <len>       is the number of new characters in <buffer>.
                     <complete>  is set to a non zero value if there is no more data in the device's printf buffer.
                     <user_data> is the <user_data> parameter specified to clCreateContext.

                     If this property is not specified, no callback will be registered and any printf output from
                     a kernel will be discarded.

    Enum Name      : CL_PRINTF_BUFFERSIZE_ARM
    Property Value : size_t
    Description    : Specifies the size of printf buffer allocations to use within the driver. A printf buffer is
                     allocated per device per context, within a context the buffer will be shared between kernels
                     executing on a device. The implementation is free to round up or ignore this value.

                     If this property is not specified an implementation defined default size will be chosen.
                     For OpenCL driver versions prior to OpenCL 1.2 this value will be 1 MiB. For driver versions of
                     OpenCL 1.2 or greater this value is defined by the CL_DEVICE_PRINTF_BUFFER_SIZE parameter
                     name for clGetDeviceInfo, see table 4.3 OpenCL Device Queries from the OpenCL 1.2 specification.


Interactions with other extensions

    None

Issues

    None

Sample Code

      /** Host side C code. **/

      /* Define a printf callback function. */
      void printf_callback( const char *buffer, size_t len, size_t complete, void *user_data )
      {
          printf( "%.*s", len, buffer );
      }

      /* Create a cl_context with a printf_callback and user specified buffer size. */
      cl_context_properties properties[] =
      {
          /* Enable a printf callback function for this context. */
          CL_PRINTF_CALLBACK_ARM,   (cl_context_properties) printf_callback,

          /* Request a minimum printf buffer size of 4MiB for devices in the
             context that support this extension. */
          CL_PRINTF_BUFFERSIZE_ARM, (cl_context_properties) 0x100000,

          CL_CONTEXT_PLATFORM,      (cl_context_properties) platform,
          0
      };
      cl_context context = clCreateContext( properties, 1, &device, NULL, NULL, NULL );

      /** Device side OpenCL C code. **/
      #pragma OPENCL EXTENSION cl_arm_printf : enable

      kernel void hello_world( void )
      {
          printf( "Hello from work item %lu!\n", (ulong) get_global_id(0) );
      }

Conformance Tests

    None

Revision History

    Revision: #1, Jan 17th, 2014 - Initial revision
