| 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 |
| |
| OpenCL Extension #28 |
| |
| Status |
| |
| Complete |
| Shipping with 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 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 clTrackLiveObjectsAltera( cl_platform_id platform ); |
| |
| void clReportLiveObjectsAltera( |
| 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 clTrackLiveObjectsAltera( 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 clTrackLiveObjectsAltera method |
| is called before the the first call to clGetPlatformIDs. |
| |
| The function |
| |
| void clReportLiveObjectsAltera( |
| 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 clReportLiveObjectsAltera 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 |
| clReportLiveObjectsAltera |
| |
| 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 ) clTrackLiveObjectsAltera(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 ) clReportLiveObjectsAltera( platform, show_live_obj, 0 ); |
| #endif |
| |
| ... |
| } |
| |
| Conformance Tests |
| |
| None. |
| |
| Revision History |
| |
| Version 0, 2013-05-06 - Initial revision. |
| Documents the behaviours in the Altera SDK for OpenCL, version 13.0. |