Name Strings

    cl_ext_migrate_memobject
    
Contributors
    Yariv Aridor
    Greg Bellows
    Aaftab Munshi
    Barry Minor
    Ian Ollmann
    Amit Rao
    Ofer Rosenberg

Contact

    Greg Bellows, gbello 'at' us 'dot. ibm 'dot' com

IP Status

    No known IP issues

Version

    Version 1, June 8, 2010

Number

    OpenCL Extension #10

Status

    Approved by contributing members

Extension Type

    OpenCL device extension

Dependencies

    None

Overview

    This extension defines a mechanism for assigning which device an OpenCL 
    memory object resides.

Header File

    Extension interfaces and constants defined in cl_ext.h

New Procedures and Functions

    cl_int clEnqueueMigrateMemObjectEXT(
        cl_command_queue command_queue,
        cl_uint num_mem_objects,
        const cl_mem *mem_objects, 
        cl_mem_migration_flags_ext flags, 
        cl_uint num_events_in_wait_list, 
        const cl_event *event_wait_list, 
        cl_event *event);

New Types

    typedef cl_bitfield cl_mem_migration_flags_ext;

New Tokens

    Besides a value of zero, the following cl_mem_migration_flags_ext values are
    allowed:

        CL_MIGRATE_MEM_OBJECT_HOST_EXT                  0x1

    Returned in the <param_value> parameter of the clGetEventInfo when
    <param_name> is CL_EVENT_COMMAND_TYPE:

        CL_COMMAND_MIGRATE_MEM_OBJECT_EXT               0x4040


Additions to Section 5.2 (Memory Objects, Buffers, Images...)

    "clEnqueueMigrateMemObjectEXT provides the application with a way to 
    indicate which device a set of memory objects should be associated. 
    Typically, memory objects are implicitly migrated to a device for which 
    enqueued commands, using the memory object, are targeted. 
    clEnqueueMigrateMemObjectEXT allows this migration to be explicitly 
    performed ahead of the dependent commands. This permits an application to 
    overlap the placement of memory objects with other unrelated operations. 
    Once the OpenCL event, returned from clEnqueueMigrateMemObject, has been 
    marked CL_COMPLETE the memory objects specified in mem_objects have been 
    successfully migrated to the device associated with command_queue. The 
    migrated memory object shall remain resident on the device until another 
    command is enqueued that either implicitly or explicitly migrates it away. 
    As well, clEnqueueMigrateMemObjectEXT can be used to direct the initial 
    placement of a memory object, after creation, possibly avoiding the initial 
    overhead of instantiating the object on the first enqueued command to use 
    it.

    The user is responsible for managing the event dependencies, associated 
    with this command, in order to avoid overlapping access to memory objects. 
    Improperly specified event dependencies passed to clEnqueueMigrateMemObject 
    could result in undefined results.

        cl_int clEnqueueMigrateMemObjectEXT(cl_command_queue command_queue,
                                            cl_uint num_mem_objects, 
                                            const cl_mem *mem_objects, 
                                            cl_mem_migration_flags_ext flags, 
                                            cl_uint num_events_in_wait_list, 
                                            const cl_event *event_wait_list, 
                                            cl_event *event);

    <command_queue> is a valid command queue. The specified set of memory 
    objects in <mem_objects> will be migrated to the OpenCL device associated 
    with <command_queue> or to the application host if the 
    CL_MIGRATE_MEM_OBJECT_HOST_EXT flag has been specified.

    <num_mem_objects> is the number of memory objects specified in the 
    mem_objects argument.

    <mem_objects> is a pointer to a list of valid memory objects.

    <flags> is a bitfield that is used to specify migration options. Table 2.1 
    describes the possible values for flags:

    --------------------------------------------------------------------
    flags                             description
    -----------		                    ----------------------------------
    CL_MIGRATE_MEM_OBJECT_HOST_EXT    This flag specifies that the specified 
                                      set of memory objects are to be migrated 
                                      to the host, regardless of the target 
                                      command queue.
    --------------------------------------------------------------------
          Table 2.1 - Supported cl_mem_migration_flags_ext flags

    <event_wait_list> and <num_events_in_wait_list> specify events that need to 
    complete before this particular command can be executed. If 
    <event_wait_list> is NULL, then this particular command does not wait on 
    any event to complete. If <event_wait_list> is NULL,
    <num_events_in_wait_list> must be 0. If <event_wait_list> is not NULL, the 
    list of events pointed to by <event_wait_list> must be valid and
    <num_events_in_wait_list> must be greater than 0. The events specified in
    <event_wait_list> act as synchronization points. The context associated with
    events in <event_wait_list> and <command_queue> must be the same.

    <event> returns an event object that identifies this particular command and 
    can be used to query or queue a wait for this particular command to 
    complete. <event> can be NULL in which case it will not be possible for the 
    application to query the status of this command or queue a wait for this 
    command to complete.

    clEnqueueMigrateMemObjectEXT returns CL_SUCCESS if the operation was
    successfully queued. Otherwise, it returns one of the following errors:

    - CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid command queue.
    - CL_INVALID_CONTEXT if the context associated with <command_queue> and
      memory objects in <mem_objects> are not the same or if the context 
      associated with <command_queue> and events in <event_wait_list> are not 
      the same.
    - CL_INVALID_VALUE if <num_mem_objects> is zero.
    - CL_INVALID_VALUE if <mem_objects> is NULL.
    - CL_INVALID_VALUE if flags is not 0 or CL_MIGRATE_MEM_OBJECT_HOST_EXT.
    - CL_INVALID_MEM_OBJECT if <mem_objects> contains an invalid memory object.
    - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory 
      for the specified set of memory objects in <mem_objects>.
    - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required 
      by the OpenCL implementation on the device.
    - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources 
      required by the OpenCL implementation on the host.
    - CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and
      <num_events_in_wait_list> > 0, or <event_wait_list> is not NULL and
      <num_events_in_wait_list> is 0, or if event objects in <event_wait_list> 
      are not valid events. "
