<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook MathML Module V1.1b1//EN"
              "http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd">[
]>

<refentry>
    <refentryinfo>
        <keywordset>
            <keyword>enqueue_kernel</keyword>
        </keywordset>
    </refentryinfo>

    <refmeta>
        <refentrytitle>enqueue_kernel</refentrytitle>

        <refmiscinfo>
            <copyright>
                <year>2007-2013</year>
                <holder>The Khronos Group Inc.
 Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the condition that this copyright notice and permission notice shall be included
in all copies or substantial portions of the Materials.</holder>
            </copyright>
        </refmiscinfo>
        <manvolnum>3</manvolnum>
    </refmeta>

<!-- ================================ SYNOPSIS -->

    <refnamediv id="enqueue_kernel">
        <refname>enqueue_kernel</refname>

        <refpurpose>
            Enqueue the block for execution to <varname>queue</varname>.
        </refpurpose>
    </refnamediv>

    <refsynopsisdiv xmlns:xlink="http://www.w3.org/1999/xlink"><title></title>
        <funcsynopsis>
            <funcprototype>
                <funcdef>
                    <link xlink:href="scalarDataTypes.html">int</link>
                    <function>
                        enqueue_kernel
                    </function>
                </funcdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">queue_t</link>
                <parameter>queue</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="enums.html#kernel_enqueue_flags_t">kernel_enqueue_flags_t</link>
                <parameter>flags</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">ndrange_t</link>
                <parameter>ndrange</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">void</link>
                (<parameter>^block)(void)</parameter>
            </paramdef>
            </funcprototype>
        </funcsynopsis>

        <funcsynopsis>
            <funcprototype>
                <funcdef>
                    <link xlink:href="scalarDataTypes.html">int</link>
                    <function>
                        enqueue_kernel
                    </function>
                </funcdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">queue_t</link>
                <parameter>queue</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="enums.html#kernel_enqueue_flags_t">kernel_enqueue_flags_t</link>
                <parameter>flags</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">ndrange_t</link>
                <parameter>ndrange</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">uint</link>
                <parameter>num_events_in_wait_list</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">clk_event_t</link>
                *<parameter>event_wait_list</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">clk_event_t</link>
                *<parameter>event_ret</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">void</link>
                (<parameter>^block)(void)</parameter>
            </paramdef>
            </funcprototype>
        </funcsynopsis>
        
        <funcsynopsis>
            <funcprototype>
                <funcdef>
                    <link xlink:href="scalarDataTypes.html">int</link>
                    <function>
                        enqueue_kernel
                    </function>
                </funcdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">queue_t</link>
                <parameter>queue</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="enums.html#kernel_enqueue_flags_t">kernel_enqueue_flags_t</link>
                <parameter>flags</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">ndrange_t</link>
                <parameter>ndrange</parameter>
            </paramdef>
            
            <paramdef>
                <link xlink:href="scalarDataTypes.html">void</link>
                (<parameter>^block)(local void *, ...)</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">uint</link>
                <parameter>size0, ...</parameter>
            </paramdef>
            </funcprototype>
        </funcsynopsis>

        <funcsynopsis>
            <funcprototype>
                <funcdef>
                    <link xlink:href="scalarDataTypes.html">int</link>
                    <function>
                        enqueue_kernel
                    </function>
                </funcdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">queue_t</link>
                <parameter>queue</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="enums.html#kernel_enqueue_flags_t">kernel_enqueue_flags_t</link>
                <parameter>flags</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">ndrange_t</link>
                <parameter>ndrange</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">uint</link>
                <parameter>num_events_in_wait_list</parameter>
            </paramdef>
            <paramdef>
                const <link xlink:href="otherDataTypes.html">clk_event_t</link>
                *<parameter>event_wait_list</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="otherDataTypes.html">clk_event_t</link>
                *<parameter>event_ret</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">void</link>
                (<parameter>^block)(local void *, ...)</parameter>
            </paramdef>
            <paramdef>
                <link xlink:href="scalarDataTypes.html">uint</link>
                <parameter>size0, ...</parameter>
            </paramdef>
            </funcprototype>
        </funcsynopsis>

    </refsynopsisdiv>

<!-- ================================ DESCRIPTION  -->

    <refsect1 id="description"><title>Description</title>
        <para>
            Enqueue the block for execution to <varname>queue</varname>. 
            If an event is returned, <function>enqueue_kernel</function>
            performs an implicit retain on the returned event.
        </para>

        <para>
            OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
            interaction. A kernel may enqueue code represented by Block syntax, and control execution
            order with event dependencies including user events and markers. There are several advantages
            to using the Block syntax: it is more compact; it does not require a 
            <type>cl_kernel</type> object; and
            enqueuing can be done as a single semantic step.
        </para>

        <para>
            The <function>enqueue_kernel</function> built-in function 
            allows a work-item to enqueue a block. Work-items can
            enqueue multiple blocks to a device queue(s).
        </para>

        <para>
            The <type>kernel_enqueue_flags_t</type> argument to 
            <function>enqueue_kernel</function> built-in functions can 
            be used to specify when the child kernel begins 
            execution. Supported values are described in the 
            table below. (Implementations are not required to honor this flag. 
            Implementations may not schedule kernel launch earlier than 
            the point specified by this flag, however):
        </para>

        <!-- table 6.32 -->
        <informaltable frame="all">
        <tgroup cols="2" align="left" colsep="1" rowsep="1">
            <colspec colname="col1" colnum="1" />
            <colspec colname="col2" colnum="2" />
            <thead>
                <row>
                <entry>kernel_enqueue_flags_t enum</entry>
                <entry>Description</entry>
                </row>
            </thead>

            <tbody>
                <row>
                    <entry><constant>CLK_ENQUEUE_FLAGS_NO_WAIT</constant></entry>
                    <entry>
                        Indicates that the enqueued kernels 
                        do not need to wait for the parent 
                        kernel to finish execution before 
                        they begin execution.
                    </entry>
                </row>

                <row>
                    <entry><constant>CLK_ENQUEUE_FLAGS_WAIT_KERNEL</constant></entry>
                    <entry>
                        Indicates that all work-items of the 
                        parent kernel must finish executing 
                        and all immediate side effects 
                        committed before the enqueued 
                        child kernel may begin execution.
                        (Immediate meaning not side effects resulting from child kernels. 
                        The side effects would include stores to global 
                        memory and pipe reads and writes.)
                    </entry>
                </row>

                <row>
                    <entry><constant>CLK_ENQUEUE_FLAGS_WAIT_WORK_GROUP</constant></entry>
                    <entry>
                        Indicates that the enqueued kernels 
                        wait only for the workgroup that 
                        enqueued the kernels to finish 
                        before they begin execution.
                        This acts as a memory synchronization point between 
                        work-items in a work-group and child kernels enqueued by 
                        work-items in the work-group.
                    </entry>
                </row>

            </tbody>
        </tgroup>
        </informaltable>

        <para>
            NOTE: The <type>kernel_enqueue_flags_t</type> 
            flags are useful when a kernel enqueued from the 
            host and executing on a device enqueues kernels 
            on the device. The kernel enqueued from the 
            host may not have an event associated with it. 
            The <type>kernel_enqueue_flags_t</type> flags allow 
            the developer to indicate when the child 
            kernels can begin execution.
        </para>

    </refsect1>

<!--================================ NOTES  -->

    <refsect1 id="notes"><title>Notes</title>
        <para>
            A block passed to <function>enqueue_kernel</function> 
            can have arguments declared to be a pointer to local
            memory. The <function>enqueue_kernel</function> built-in 
            function variants allow blocks to be enqueued with a
            variable number of arguments. Each argument must be 
            declared to be a pointer of a data type to
            local memory. These <function>enqueue_kernel</function> 
            built-in function variants also have a corresponding
            number of arguments each of type uint that follow 
            the block argument. These arguments
            specify the size of each local memory pointer 
            argument of the enqueued block.
        </para>

        <para>
            If the
            <citerefentry><refentrytitle>cl_khr_device_enqueue_local_arg_types</refentrytitle></citerefentry>
            extension is enabled, then replace all occurrences of
            <code>local void *</code>
            in the table above with
            <code>local gentype *</code>. 
            We use the generic type name <code>gentype</code> 
            to indicate the built-in OpenCL C scalar or
            vector integer or floating-point data types, or 
            any user defined type built from these scalar and
            vector data types which can be used as the type 
            of the pointee of the arguments of the kernel
            enqueue functions listed above.
        </para>

    </refsect1>


<!-- ================================ EXAMPLE  -->
<!-- DO NOT DELETE IN CASE AN EXAMPLE IS ADDED IN THE FUTURE -->

    <refsect2 id="example1">
        <title>
            Example
        </title>

        <para>
            Below are some examples of how to enqueue a block.
        </para>

        <informaltable frame="none">
            <tgroup cols="1" align="left" colsep="0" rowsep="0">
                <colspec colname="col1" colnum="1" />
                <tbody>
                    <row>
                        <entry>
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
    ...
}

kernel void
my_func_B(global int *a, global int *b, global int *c)
{
    ndrange_t ndrange;
    // build ndrange information
    ...

    // example – enqueue a kernel as a block
    enqueue_kernel(get_default_queue(), ndrange,
                           ^{my_func_A(a, b, c);});
    ...
}

kernel void
my_func_C(global int *a, global int *b, global int *c)
{
    ndrange_t ndrange;
    // build ndrange information
    ...

    // note that a, b and c are variables in scope of 
    // the block
    void (^my_block_A)(void) = ^{my_func_A(a, b, c);};

    // enqueue the block variable
    enqueue_kernel(get_default_queue(), 
                   CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
                   ndrange, 
                   my_block_A);
    ...
}
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </informaltable>

        <para>
            The example below shows how to declare a block literal and enqueue it.
        </para>

        <informaltable frame="none">
            <tgroup cols="1" align="left" colsep="0" rowsep="0">
                <colspec colname="col1" colnum="1" />
                <tbody>
                    <row>
                        <entry>
kernel void
my_func(global int *a, global int *b)
{
    ndrange_t ndrange;
    // build ndrange information
    ...

    // note that a, b and c are variables in scope of 
    // the block
    void (^my_block_A)(void) = 
          ^{ size_t id = get_global_id(0);
             b[id] += a[id]; 
        };

    // enqueue the block variable
    enqueue_kernel(get_default_queue(), 
                   CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
                   ndrange, 
                   my_block_A);

    // or we could have done the following
    enqueue_kernel(get_default_queue(), 
                   CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
                   ndrange,
                   ^{ 
                     size_t id = get_global_id(0);
                     b[id] += a[id]; 
                    }; 
}
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </informaltable>

        <para>
            NOTE: Blocks passed to <function>enqueue_kernel</function> 
            cannot use global variables or stack variables 
            local to the enclosing lexical scope that are a 
            pointer type in the local or private address space.
        </para>

        <informaltable frame="none">
            <tgroup cols="1" align="left" colsep="0" rowsep="0">
                <colspec colname="col1" colnum="1" />
                <tbody>
                    <row>
                        <entry>
kernel void
foo(global int *a, local int *lptr, …)
{
    enqueue_kernel(get_default_queue(),
           CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
           ndrange,
           ^{ 
              size_t id = get_global_id(0);
              local int *p = lptr; // undefined behavior
            };
}
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </informaltable>

        <para>
            See section 6.13.17 of the specification for more information and examples.
        </para>

    </refsect2>


<!-- ================================ ERRORS  -->

    <refsect1 id="errors"><title>Errors</title>
        <para>
            <function>enqueue_kernel</function> returns 
            <errorname>CL_SUCCESS</errorname> if the
            block is enqueued successfully and returns 
            <errorname>CL_ENQUEUE_FAILURE</errorname>
            otherwise. If the –g compile option is 
            specified in compiler options passed to 
            <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry> or 
            <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>
            when compiling or building the parent program, the following
            errors may be returned instead of 
            <errorname>CL_ENQUEUE_FAILURE</errorname> to indicate 
            why <function>enqueue_kernel</function> 
            failed to enqueue the block:
        </para>

        <itemizedlist mark="disc">
            <listitem>
              <errorname>CLK_INVALID_QUEUE</errorname> if <varname>queue</varname> is not
              a valid device queue.
            </listitem>

            <listitem>
                <errorname>CLK_INVALID_NDRANGE</errorname> if <varname>ndrange</varname>
                is not a valid ND-range descriptor or if the 
                program was compiled with <code>–cl-uniform-work-group-size</code> 
                and the local_work_size is specified in <varname>ndrange</varname> 
                but the global_work_size specified in <varname>ndrange</varname> 
                is not a multiple of the local_work_size.
            </listitem>

            <listitem>
                <errorname>CLK_INVALID_EVENT_WAIT_LIST</errorname> if 
                <varname>event_wait_list</varname> is NULL and
                <varname>num_events_in_wait_list</varname> > 0, or if 
                <varname>event_wait_list</varname> is not NULL and
                <varname>num_events_in_wait_list</varname> is 0, or if event objects in 
                <varname>event_wait_list</varname> are not valid events.
            </listitem>

            <listitem>
                <errorname>CLK_DEVICE_QUEUE_FULL</errorname> if 
                <varname>queue</varname> is full.
            </listitem>

            <listitem>
              <errorname>CLK_INVALID_ARG_SIZE</errorname> if size of local memory arguments is 0.
            </listitem>

            <listitem>
                <errorname>CLK_EVENT_ALLOCATION_FAILURE</errorname>
                if <varname>event_ret</varname> is not NULL and an event could not
                be allocated.
            </listitem>

            <listitem>
                <errorname>CLK_OUT_OF_RESOURCES</errorname>
                if there is a failure to queue the block in <varname>queue</varname> 
                because of insufficient resources needed to execute the kernel.
            </listitem>

        </itemizedlist>
    </refsect1>

<!-- ================================ SPECIFICATION  -->
<!-- Set the "uri" attribute in the <olink /> element to the "named destination" for the PDF page
-->
    <refsect1 id="specification"><title>Specification</title>
        <para>
            <imageobject>
                <imagedata fileref="pdficon_small1.gif" format="gif" />
            </imageobject>

            <olink uri="enqueueKernelFunctions">OpenCL Specification</olink>
        </para>
    </refsect1>

<!-- ================================ ALSO SEE  

    <refsect1 id="seealso"><title>Also see</title>
        <para>
            <citerefentry href="eventFunctions"><refentrytitle>Event Functions</refentrytitle></citerefentry>
        </para>
    </refsect1>-->

<!-- ============================== COPYRIGHT -->
<!-- Content included from copyright.inc.xsl -->

    <refsect3 id="Copyright"><title></title>
        <imageobject>
                <imagedata fileref="KhronosLogo.jpg" format="jpg" />
        </imageobject>
        <para />
    </refsect3>

 <!-- 27-Oct-2015, C lang 2.0 rev 30 -->
</refentry>

