Fix for some typos in User's Guide

This commit is contained in:
Dmitry Babokin
2013-03-04 03:04:46 +04:00
parent 524939dc5b
commit 3cb827ac56

View File

@@ -1714,7 +1714,7 @@ isn't performed implicitly, for example for function calls.
Function Pointer Types Function Pointer Types
---------------------- ----------------------
Pointers to functions can also be to be taken and used as in C and C++. Pointers to functions can also be taken and used as in C and C++.
The syntax for declaring function pointer types is the same as in those The syntax for declaring function pointer types is the same as in those
languages; it's generally easiest to use a ``typedef`` to help: languages; it's generally easiest to use a ``typedef`` to help:
@@ -1788,7 +1788,7 @@ Enumeration Types
----------------- -----------------
It is possible to define user-defined enumeration types in ``ispc`` with It is possible to define user-defined enumeration types in ``ispc`` with
the ``enum`` keyword, which is followed by an option enumeration type name the ``enum`` keyword, which is followed by an optional enumeration type name
and then a brace-delimited list of enumerators with optional values: and then a brace-delimited list of enumerators with optional values:
:: ::
@@ -2043,7 +2043,7 @@ Here, ``b`` is a ``varying Bar`` (since ``varying`` is the default
variability). If ``Bar`` is defined as above, then ``vb.a`` is still a variability). If ``Bar`` is defined as above, then ``vb.a`` is still a
``uniform int``, since its varaibility was bound in the original ``uniform int``, since its varaibility was bound in the original
declaration of the ``Bar`` type. Similarly, ``vb.b`` is ``varying``. The declaration of the ``Bar`` type. Similarly, ``vb.b`` is ``varying``. The
variability fo ``vb.c`` is ``varying``, since ``vb`` is ``varying``. variability of ``vb.c`` is ``varying``, since ``vb`` is ``varying``.
(Similarly, ``ub.a`` is ``uniform``, ``ub.b`` is ``varying``, and ``ub.c`` (Similarly, ``ub.a`` is ``uniform``, ``ub.b`` is ``varying``, and ``ub.c``
is ``uniform``.) is ``uniform``.)
@@ -2293,8 +2293,8 @@ serviced by corresponding calls the system C library's ``malloc()`` and
``free()`` functions. ``free()`` functions.
Note that the rules for ``uniform`` and ``varying`` for ``new`` are Note that the rules for ``uniform`` and ``varying`` for ``new`` are
analogous to the corresponding rules are for pointers (as described in analogous to the corresponding rules for pointers (as described in
`Pointer Types`_.) Specifically, if a specific rate qualifier isn't `Pointer Types`_). Specifically, if a specific rate qualifier isn't
provided with the ``new`` expression, then the default is that a "varying" provided with the ``new`` expression, then the default is that a "varying"
``new`` is performed, where each program instance performs a unique ``new`` is performed, where each program instance performs a unique
allocation. The allocated type, in turn, is by default ``uniform``. allocation. The allocated type, in turn, is by default ``uniform``.
@@ -2533,7 +2533,7 @@ Iteration over unique elements: "foreach_unique"
------------------------------------------------ ------------------------------------------------
It can be useful to iterate over the elements of a varying variable, It can be useful to iterate over the elements of a varying variable,
processing the subsets of of them that have the same value together. For processing the subsets of them that have the same value together. For
example, consider a varying variable ``x`` that has the values ``{1, 2, 2, example, consider a varying variable ``x`` that has the values ``{1, 2, 2,
1, 1, 0, 0, 0}``, where the program is running on a target with a gang size 1, 1, 0, 0, 0}``, where the program is running on a target with a gang size
of 8 program instances. Here, ``x`` has three unique values across the of 8 program instances. Here, ``x`` has three unique values across the
@@ -2571,7 +2571,7 @@ Parallel Iteration Statements: "foreach" and "foreach_tiled"
The ``foreach`` and ``foreach_tiled`` constructs specify loops over a The ``foreach`` and ``foreach_tiled`` constructs specify loops over a
possibly multi-dimensional domain of integer ranges. Their role goes possibly multi-dimensional domain of integer ranges. Their role goes
beyond "syntactic sugar"; they provides one of the two key ways of beyond "syntactic sugar"; they provide one of the two key ways of
expressing parallel computation in ``ispc``. expressing parallel computation in ``ispc``.
In general, a ``foreach`` or ``foreach_tiled`` statement takes one or more In general, a ``foreach`` or ``foreach_tiled`` statement takes one or more
@@ -2892,7 +2892,7 @@ following code:
The general idea is that we are first using SPMD parallelism to determine The general idea is that we are first using SPMD parallelism to determine
which of the items requires further processing, checking a gang's worth of which of the items requires further processing, checking a gang's worth of
them concurrently inside the ``foreach`` loop. Assuming that only a subset them concurrently inside the ``foreach`` loop. Assuming that only a subset
of them need further processing, would be wasteful to do this work within of them needs further processing, would be wasteful to do this work within
the ``foreach`` loop in the same program instance that made the initial the ``foreach`` loop in the same program instance that made the initial
determination of whether more work as needed; in this case, all of the determination of whether more work as needed; in this case, all of the
program instances corresponding to items that didn't need further program instances corresponding to items that didn't need further
@@ -3114,7 +3114,7 @@ with the given size and alignment. Note that there is no explicit
``ISPCFree()`` call; instead, all memory allocated within an ``ispc`` ``ISPCFree()`` call; instead, all memory allocated within an ``ispc``
function should be freed when ``ISPCSync()`` is called. function should be freed when ``ISPCSync()`` is called.
``ISPCLaunch()`` is called to launch to launch one or more asynchronous ``ISPCLaunch()`` is called to launch one or more asynchronous
tasks. Each ``launch`` statement in ``ispc`` code causes a call to tasks. Each ``launch`` statement in ``ispc`` code causes a call to
``ISPCLaunch()`` to be emitted in the generated code. The three parameters ``ISPCLaunch()`` to be emitted in the generated code. The three parameters
after the handle pointer to the function are relatively straightforward; after the handle pointer to the function are relatively straightforward;
@@ -3164,7 +3164,7 @@ Recall from `Expressions`_ that ``ispc`` short-circuits the evaluation of
logical and selection operators: given an expression like ``(index < count logical and selection operators: given an expression like ``(index < count
&& array[index] == 0)``, then ``array[index] == 0`` is only evaluated if && array[index] == 0)``, then ``array[index] == 0`` is only evaluated if
``index < count`` is true. This property is useful for writing expressions ``index < count`` is true. This property is useful for writing expressions
like the preceeding one, where the second expression may not be safe to like the preceding one, where the second expression may not be safe to
evaluate in some cases. evaluate in some cases.
This short-circuiting can impose overhead in the generated code; additional This short-circuiting can impose overhead in the generated code; additional
@@ -3789,7 +3789,7 @@ implemented as:
void scan_add(int *in_array, int *result_array, int count) { void scan_add(int *in_array, int *result_array, int count) {
result_array[0] = 0; result_array[0] = 0;
for (int i = 0; i < count; ++i) for (int i = 1; i < count; ++i)
result_array[i] = result_array[i-1] + in_array[i-1]; result_array[i] = result_array[i-1] + in_array[i-1];
} }
@@ -4025,7 +4025,7 @@ to do floating-point math directly with ``half`` types in ``ispc``; these
functions facilitate converting to and from half-format data in memory. functions facilitate converting to and from half-format data in memory.
To use them, half-format data should be loaded into an ``int16`` and the To use them, half-format data should be loaded into an ``int16`` and the
``half_to_float()`` function used to convert it the a 32-bit floating point ``half_to_float()`` function used to convert it to a 32-bit floating point
value. To store a value to memory in half format, the ``float_to_half()`` value. To store a value to memory in half format, the ``float_to_half()``
function returns the 16 bits that are the closest match to the given function returns the 16 bits that are the closest match to the given
``float``, in half format. ``float``, in half format.
@@ -4120,11 +4120,11 @@ stored in the location that ``ptr`` points to has that program instance's
value "delta" added to it atomically, and the old value at that location is value "delta" added to it atomically, and the old value at that location is
returned from the function. returned from the function.
One thing to note is that that the type of the value being added to a One thing to note is that the type of the value being added to is a
``uniform`` integer, while the increment amount and the return value are ``uniform`` integer, while the increment amount and the return value are
``varying``. In other words, the semantics of this call are that each ``varying``. In other words, the semantics of this call are that each
running program instance individually issues the atomic operation with its running program instance individually issues the atomic operation with its
own ``delta`` value and gets the previous value of back in return. The own ``delta`` value and gets the previous value back in return. The
atomics for the running program instances may be issued in arbitrary order; atomics for the running program instances may be issued in arbitrary order;
it's not guaranteed that they will be issued in ``programIndex`` order, for it's not guaranteed that they will be issued in ``programIndex`` order, for
example. example.
@@ -4332,7 +4332,7 @@ System Information
The value of a high-precision hardware clock counter is returned by the The value of a high-precision hardware clock counter is returned by the
``clock()`` routine; its value increments by one each processor cycle. ``clock()`` routine; its value increments by one each processor cycle.
Thus, taking the difference between the values returned by ``clock()`` and Thus, taking the difference between the values returned by ``clock()`` at
different points in program execution gives the number of cycles between different points in program execution gives the number of cycles between
those points in the program. those points in the program.
@@ -4439,7 +4439,7 @@ It is illegal to overload functions declared with ``extern "C"`` linkage;
``ispc`` issues an error in this case. ``ispc`` issues an error in this case.
**Only a single function call is made back to C++ for the entire gang of **Only a single function call is made back to C++ for the entire gang of
runing program instances**. Furthermore, function calls back to C/C++ are not running program instances**. Furthermore, function calls back to C/C++ are not
made if none of the program instances want to make the call. For example, made if none of the program instances want to make the call. For example,
given code like: given code like:
@@ -4541,7 +4541,7 @@ Because ``varying`` types have size that depends on the size of the gang of
program instances, ``ispc`` prohibits any varying types from being used in program instances, ``ispc`` prohibits any varying types from being used in
parameters to functions with the ``export`` qualifier. (``ispc`` also parameters to functions with the ``export`` qualifier. (``ispc`` also
prohibits passing structures that themselves have varying types as members, prohibits passing structures that themselves have varying types as members,
etc.) Thus, all datatypes that is shared with the application must have etc.) Thus, all datatypes that are shared with the application must have
the ``uniform`` or ``soa`` rate qualifier applied to them. (See `Use the ``uniform`` or ``soa`` rate qualifier applied to them. (See `Use
"Structure of Arrays" Layout When Possible`_ in the Performance Guide for "Structure of Arrays" Layout When Possible`_ in the Performance Guide for
more discussion of how to load vectors of SOA data from the application.) more discussion of how to load vectors of SOA data from the application.)
@@ -4576,7 +4576,7 @@ application code if possible.
Data Alignment and Aliasing Data Alignment and Aliasing
--------------------------- ---------------------------
There are are two important constraints that must be adhered to when There are two important constraints that must be adhered to when
passing pointers from the application to ``ispc`` programs. passing pointers from the application to ``ispc`` programs.
The first is that it is required that it be valid to read memory at the The first is that it is required that it be valid to read memory at the
@@ -4601,7 +4601,7 @@ functions. Given a function like:
if (b == 0) { ... } if (b == 0) { ... }
} }
Then if the same variable must not be passed to ``func()``. This is Then the same variable must not be passed to ``func()``. This is
another case of aliasing, and if the caller calls the function as ``func(x, another case of aliasing, and if the caller calls the function as ``func(x,
x)``, it's not guaranteed that the ``if`` test will evaluate to true, due x)``, it's not guaranteed that the ``if`` test will evaluate to true, due
to the compiler's requirement of no aliasing. to the compiler's requirement of no aliasing.