Name Strings

   cl_altera_live_object_tracking

Contributors

   David Neto, Altera Corporation

Contact

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

IP Status

   No known IP issues.

Version

   Version 0, May 6, 2013.

Number

   TBD

Status

   Complete
   Shipping with Intel(R) FPGA SDK for OpenCL(TM), 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 an API for debugging OpenCL API object
   leaks in user applications.  It provides a mechanism for tracking
   all live API objects, and for enumerating them on demand.

   The OpenCL runtime API generates and uses many kinds of objects
   such as contexts, programs, kernels, memory objects, command queues,
   and events.

   It is very easy for an application to lose track of what objects it
   has created but not yet fully released.  Forgetting to fully release
   an object after use may result in undesirable behaviour, such as
   increased memory use or even command scheduler lockup.  This problem
   gets much worse when new objects leak each time through an application
   loop.

   This extension defines two runtime API methods.  
   
   The first method specifies a future interest in enumerating all the
   live objects in the runtime API.  Live object tracking is a debugging
   feature which may increase memory use and runtime of the application.
   So it should be explicitly requested.

   Ideally, the request to begin tracking live objects should occur as
   early as possible in the program, so that no leaked objects escape
   undetected.

   The second method requests an enumeration of those objects via a callback
   mechanism.


Header File

   Externsion interfaces are defined in cl_ext.h

New Procedures and Functions

   void clTrackLiveObjectsIntelFPGA( cl_platform_id platform );

   void clReportLiveObjectsIntelFPGA(
      cl_platform_id platform,
      void (CL_CALLBACK * report_fn)(
         void* /* user_data */,
         void* /* obj_ptr */,
         const char* /* type_name */,
         cl_uint /* refcount */ 
         ),
      void* user_data
      );

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

   Add a new section 5.11 "Debugging API object leaks"

      The OpenCL runtime API generates and uses many kinds of objects
      such as contexts, programs, kernels, memory objects, command queues,
      and events.

      An application may lose track of what objects it has created but
      not yet fully released, i.e. the set of live objects.  We say an
      object has "leaked" when it remains live after its last intended
      use.  Leaking objects may increase application memory use and
      runtime, or even cause the OpenCL command scheduler to lockup.

      This section defines two methods for tracking the live OpenCL objects
      in an application.

      The function

         void clTrackLiveObjectsIntelFPGA( cl_platform_id platform )

      registers a future interest in enumerating all the live objects
      in the runtime API.  Registering such an interest may itself
      increase memory use and runtime, which is why is must be explicitly
      requested.  
      
      Behaviour is unspecified if the clTrackLiveObjectsIntelFPGA method
      is called before the the first call to clGetPlatformIDs.

      The function

         void clReportLiveObjectsIntelFPGA(
            cl_platform_id platform,
            void (CL_CALLBACK * report_fn)(
               void* /* user_data */,
               void* /* obj_ptr */,
               const char* /* type_name */,
               cl_uint /* refcount */ 
               ),
            void* user_data
            )

      requests an enumeration of all live objects in the runtime.  The enumeration
      is performed by calling the callback function once for each live object
      in some implementation-defined sequence (i.e. not concurrently).

      The arguments to clReportLiveObjectsIntelFPGA are as follows:

         platform is the platform for which live objects are being tracked.

         report_fn is a callback function.  
             It is called for every live object in the runtime.  
             The arguments to the callback function are:
               
                user_data is the user_data argument specified to
                  clReportLiveObjectsIntelFPGA

                obj_ptr is a pointer to the live object, cast to type void*.
                  (Note that all OpenCL API objects tracked are type-defined
                  in the OpenCL API header files to be pointers to
                  implementation-defined structs.)

                type_name is a C string corresponding to the OpenCL API object
                  type.  For example, a leaked cl_mem object will have 
                  "cl_mem" as its type string.
                  
                refcount is an instantaneous reference count for the object.
                  Consider it to be immediately stale.

         user_data is a pointer to user supplied data.


Implementation and usage notes

   In Altera's platform implementation, more recently created objects
   are enumerated earlier than older objects.  

   Also, the runtime may cause some objects to automatically retain
   other objects, so reference counts may be higher than apparent from
   host program source code.

   It is an artifact of Altera's platform implementation that sometimes
   cl_event objects my be enumerated even when they have a reference
   count of 0.  These remain in the system and do occupy resources
   until they are released when the command scheduler makes further
   forward progress.

   Generally speaking, the strategy for fixing a leak is to find the
   first object in the enumeration which has a non-zero reference count,
   and stop leaking it (i.e. release it immediately after its last
   intended use).

Issues

   1. The information conveyed by the callback is imprecise.  For example, 
      at best you might only determine what type of object is leaking,
      but not where it was created.  It would be highly useful to add
      host source file and line number information to the callback.
      The callback API therefore is a strong candidate for further evolution.


Sample Code

   Example for finding an event leak.

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

      #ifdef cl_altera_live_object_tracking
      // Define the callback used to enumerate each live OpenCL API object.
      #ifdef __cplusplus
      extern "C"
      #endif
      static void CL_CALLBACK show_live_obj(
         void *user_data,
         void* object,
         const char* type_name,
         cl_uint refcount )
      {
         // We didn't need the user_data context in this example.
         // But maybe we could have used it to provide a logger object,
         // or an output file descriptor.
         user_data = user_data; 

         printf(" Live %s object: %p refcount %u\n", type_name, object, refcount );
      }
      #endif

      int main(...) {
         cl_platform platform = 0;
         cl_device_id device = 0;

         CHECK( clGetPlatformIDs(1,&platform,0) );

         #ifdef cl_altera_live_object_tracking
         // I want to list the live objects later.
         // Register this interest very soon after getting the platform handle.
         if ( debug_leaks ) clTrackLiveObjectsIntelFPGA(platform);
         #endif

         ...

         for ( int i = 0; i < 10 ;  i++ ) {
            // We leak these events, but don't know it until we use
            // the live object tracking and enumeration APIs.
            cl_event leaked_event, another;
            clEnqueueTask(..., &leaked_event );
            clEnqueueReadBuffer(..., 1, &leaked_event, &another );
            // The events are not released!
         }

         // Request an enumeration of all the live objects.
         // We should see 20 leaked cl_event objects.
         #ifdef cl_altera_live_object_tracking
         if ( debug_leaks ) clReportLiveObjectsIntelFPGA( platform, show_live_obj, 0 );
         #endif

         ...
      }

Conformance Tests

   None.

Revision History

   Version 0, 2013-05-06 - Initial revision.
      Documents the behaviours in the Intel(R) FPGA SDK for OpenCL(TM), version 13.0.
