blob: 7bc32ba4518bf8b24c718ac207b589b39d16bbcf [file] [log] [blame]
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