| This is libgomp.info, produced by makeinfo version 4.8 from |
| ../../../gcc-4.4.0/libgomp/libgomp.texi. |
| |
| Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being "Funding Free Software", the Front-Cover texts |
| being (a) (see below), and with the Back-Cover Texts being (b) (see |
| below). A copy of the license is included in the section entitled "GNU |
| Free Documentation License". |
| |
| (a) The FSF's Front-Cover Text is: |
| |
| A GNU Manual |
| |
| (b) The FSF's Back-Cover Text is: |
| |
| You have freedom to copy and modify this GNU Manual, like GNU |
| software. Copies published by the Free Software Foundation raise |
| funds for GNU development. |
| |
| INFO-DIR-SECTION GNU Libraries |
| START-INFO-DIR-ENTRY |
| * libgomp: (libgomp). GNU OpenMP runtime library |
| END-INFO-DIR-ENTRY |
| |
| This manual documents the GNU implementation of the OpenMP API for |
| multi-platform shared-memory parallel programming in C/C++ and Fortran. |
| |
| Published by the Free Software Foundation 51 Franklin Street, Fifth |
| Floor Boston, MA 02110-1301 USA |
| |
| Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being "Funding Free Software", the Front-Cover texts |
| being (a) (see below), and with the Back-Cover Texts being (b) (see |
| below). A copy of the license is included in the section entitled "GNU |
| Free Documentation License". |
| |
| (a) The FSF's Front-Cover Text is: |
| |
| A GNU Manual |
| |
| (b) The FSF's Back-Cover Text is: |
| |
| You have freedom to copy and modify this GNU Manual, like GNU |
| software. Copies published by the Free Software Foundation raise |
| funds for GNU development. |
| |
| |
| File: libgomp.info, Node: Top, Next: Enabling OpenMP, Up: (dir) |
| |
| Introduction |
| ************ |
| |
| This manual documents the usage of libgomp, the GNU implementation of |
| the OpenMP (http://www.openmp.org) Application Programming Interface |
| (API) for multi-platform shared-memory parallel programming in C/C++ |
| and Fortran. |
| |
| * Menu: |
| |
| * Enabling OpenMP:: How to enable OpenMP for your applications. |
| * Runtime Library Routines:: The OpenMP runtime application programming |
| interface. |
| * Environment Variables:: Influencing runtime behavior with environment |
| variables. |
| * The libgomp ABI:: Notes on the external ABI presented by libgomp. |
| * Reporting Bugs:: How to report bugs in GNU OpenMP. |
| * Copying:: GNU general public license says |
| how you can copy and share libgomp. |
| * GNU Free Documentation License:: |
| How you can copy and share this manual. |
| * Funding:: How to help assure continued work for free |
| software. |
| * Index:: Index of this documentation. |
| |
| |
| File: libgomp.info, Node: Enabling OpenMP, Next: Runtime Library Routines, Prev: Top, Up: Top |
| |
| 1 Enabling OpenMP |
| ***************** |
| |
| To activate the OpenMP extensions for C/C++ and Fortran, the |
| compile-time flag `-fopenmp' must be specified. This enables the OpenMP |
| directive `#pragma omp' in C/C++ and `!$omp' directives in free form, |
| `c$omp', `*$omp' and `!$omp' directives in fixed form, `!$' conditional |
| compilation sentinels in free form and `c$', `*$' and `!$' sentinels in |
| fixed form, for Fortran. The flag also arranges for automatic linking |
| of the OpenMP runtime library (*Note Runtime Library Routines::). |
| |
| A complete description of all OpenMP directives accepted may be |
| found in the OpenMP Application Program Interface |
| (http://www.openmp.org) manual, version 3.0. |
| |
| |
| File: libgomp.info, Node: Runtime Library Routines, Next: Environment Variables, Prev: Enabling OpenMP, Up: Top |
| |
| 2 Runtime Library Routines |
| ************************** |
| |
| The runtime routines described here are defined by section 3 of the |
| OpenMP specifications in version 3.0. The routines are structured in |
| following three parts: |
| |
| Control threads, processors and the parallel environment. |
| |
| * Menu: |
| |
| * omp_get_active_level:: Number of active parallel regions |
| * omp_get_ancestor_thread_num:: Ancestor thread ID |
| * omp_get_dynamic:: Dynamic teams setting |
| * omp_get_level:: Number of parallel regions |
| * omp_get_max_active_levels:: Maximal number of active regions |
| * omp_get_max_threads:: Maximal number of threads of parallel region |
| * omp_get_nested:: Nested parallel regions |
| * omp_get_num_procs:: Number of processors online |
| * omp_get_num_threads:: Size of the active team |
| * omp_get_schedule:: Obtain the runtime scheduling method |
| * omp_get_team_size:: Number of threads in a team |
| * omp_get_thread_limit:: Maximal number of threads |
| * omp_get_thread_num:: Current thread ID |
| * omp_in_parallel:: Whether a parallel region is active |
| * omp_set_dynamic:: Enable/disable dynamic teams |
| * omp_set_max_active_levels:: Limits the number of active parallel regions |
| * omp_set_nested:: Enable/disable nested parallel regions |
| * omp_set_num_threads:: Set upper team size limit |
| * omp_set_schedule:: Set the runtime scheduling method |
| |
| Initialize, set, test, unset and destroy simple and nested locks. |
| |
| * Menu: |
| |
| * omp_init_lock:: Initialize simple lock |
| * omp_set_lock:: Wait for and set simple lock |
| * omp_test_lock:: Test and set simple lock if available |
| * omp_unset_lock:: Unset simple lock |
| * omp_destroy_lock:: Destroy simple lock |
| * omp_init_nest_lock:: Initialize nested lock |
| * omp_set_nest_lock:: Wait for and set simple lock |
| * omp_test_nest_lock:: Test and set nested lock if available |
| * omp_unset_nest_lock:: Unset nested lock |
| * omp_destroy_nest_lock:: Destroy nested lock |
| |
| Portable, thread-based, wall clock timer. |
| |
| * Menu: |
| |
| * omp_get_wtick:: Get timer precision. |
| * omp_get_wtime:: Elapsed wall clock time. |
| |
| |
| File: libgomp.info, Node: omp_get_active_level, Next: omp_get_ancestor_thread_num, Up: Runtime Library Routines |
| |
| 2.1 `omp_get_active_level' - Number of parallel regions |
| ======================================================= |
| |
| _Description_: |
| This function returns the nesting level for the active parallel |
| blocks, which enclose the calling call. |
| |
| _C/C++_ |
| _Prototype_: `int omp_get_active_level();' |
| |
| _Fortran_: |
| _Interface_: `integer omp_get_active_level()' |
| |
| _See also_: |
| *Note omp_get_level::, *Note omp_get_max_active_levels::, *Note |
| omp_set_max_active_levels:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.19. |
| |
| |
| File: libgomp.info, Node: omp_get_ancestor_thread_num, Next: omp_get_dynamic, Prev: omp_get_active_level, Up: Runtime Library Routines |
| |
| 2.2 `omp_get_ancestor_thread_num' - Ancestor thread ID |
| ====================================================== |
| |
| _Description_: |
| This function returns the thread identification number for the |
| given nesting level of the current thread. For values of LEVEL |
| outside zero to `omp_get_level' -1 is returned; if LEVEL is |
| `omp_get_level' the result is identical to `omp_get_thread_num'. |
| |
| _C/C++_ |
| _Prototype_: `int omp_get_ancestor_thread_num(int level);' |
| |
| _Fortran_: |
| _Interface_: `integer omp_ancestor_thread_num(level)' |
| `integer level' |
| |
| _See also_: |
| *Note omp_get_level::, *Note omp_get_thread_num::, *Note |
| omp_get_team_size:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.17. |
| |
| |
| File: libgomp.info, Node: omp_get_dynamic, Next: omp_get_level, Prev: omp_get_ancestor_thread_num, Up: Runtime Library Routines |
| |
| 2.3 `omp_get_dynamic' - Dynamic teams setting |
| ============================================= |
| |
| _Description_: |
| This function returns `true' if enabled, `false' otherwise. Here, |
| `true' and `false' represent their language-specific counterparts. |
| |
| The dynamic team setting may be initialized at startup by the |
| `OMP_DYNAMIC' environment variable or at runtime using |
| `omp_set_dynamic'. If undefined, dynamic adjustment is disabled by |
| default. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_dynamic();' |
| |
| _Fortran_: |
| _Interface_: `logical function omp_get_dynamic()' |
| |
| _See also_: |
| *Note omp_set_dynamic::, *Note OMP_DYNAMIC:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.8. |
| |
| |
| File: libgomp.info, Node: omp_get_level, Next: omp_get_max_active_levels, Prev: omp_get_dynamic, Up: Runtime Library Routines |
| |
| 2.4 `omp_get_level' - Obtain the current nesting level |
| ====================================================== |
| |
| _Description_: |
| This function returns the nesting level for the parallel blocks, |
| which enclose the calling call. |
| |
| _C/C++_ |
| _Prototype_: `int omp_get level();' |
| |
| _Fortran_: |
| _Interface_: `integer omp_level()' |
| |
| _See also_: |
| *Note omp_get_active_level:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.16. |
| |
| |
| File: libgomp.info, Node: omp_get_max_active_levels, Next: omp_get_max_threads, Prev: omp_get_level, Up: Runtime Library Routines |
| |
| 2.5 `omp_set_max_active_levels' - Maximal number of active regions |
| ================================================================== |
| |
| _Description_: |
| This function obtains the maximally allowed number of nested, |
| active parallel regions. |
| |
| _C/C++_ |
| _Prototype_: `int omp_get_max_active_levels();' |
| |
| _Fortran_: |
| _Interface_: `int omp_get_max_active_levels()' |
| |
| _See also_: |
| *Note omp_set_max_active_levels::, *Note omp_get_active_level:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.14. |
| |
| |
| File: libgomp.info, Node: omp_get_max_threads, Next: omp_get_nested, Prev: omp_get_max_active_levels, Up: Runtime Library Routines |
| |
| 2.6 `omp_get_max_threads' - Maximal number of threads of parallel region |
| ======================================================================== |
| |
| _Description_: |
| Return the maximal number of threads used for the current parallel |
| region that does not use the clause `num_threads'. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_max_threads();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_max_threads()' |
| |
| _See also_: |
| *Note omp_set_num_threads::, *Note omp_set_dynamic::, *Note |
| omp_get_thread_limit:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.3. |
| |
| |
| File: libgomp.info, Node: omp_get_nested, Next: omp_get_num_procs, Prev: omp_get_max_threads, Up: Runtime Library Routines |
| |
| 2.7 `omp_get_nested' - Nested parallel regions |
| ============================================== |
| |
| _Description_: |
| This function returns `true' if nested parallel regions are |
| enabled, `false' otherwise. Here, `true' and `false' represent |
| their language-specific counterparts. |
| |
| Nested parallel regions may be initialized at startup by the |
| `OMP_NESTED' environment variable or at runtime using |
| `omp_set_nested'. If undefined, nested parallel regions are |
| disabled by default. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_nested();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_nested()' |
| |
| _See also_: |
| *Note omp_set_nested::, *Note OMP_NESTED:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.10. |
| |
| |
| File: libgomp.info, Node: omp_get_num_procs, Next: omp_get_num_threads, Prev: omp_get_nested, Up: Runtime Library Routines |
| |
| 2.8 `omp_get_num_procs' - Number of processors online |
| ===================================================== |
| |
| _Description_: |
| Returns the number of processors online. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_num_procs();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_num_procs()' |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.5. |
| |
| |
| File: libgomp.info, Node: omp_get_num_threads, Next: omp_get_schedule, Prev: omp_get_num_procs, Up: Runtime Library Routines |
| |
| 2.9 `omp_get_num_threads' - Size of the active team |
| =================================================== |
| |
| _Description_: |
| The number of threads in the current team. In a sequential section |
| of the program `omp_get_num_threads' returns 1. |
| |
| The default team size may be initialized at startup by the |
| `OMP_NUM_THREADS' environment variable. At runtime, the size of |
| the current team may be set either by the `NUM_THREADS' clause or |
| by `omp_set_num_threads'. If none of the above were used to define |
| a specific value and `OMP_DYNAMIC' is disabled, one thread per CPU |
| online is used. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_num_threads();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_num_threads()' |
| |
| _See also_: |
| *Note omp_get_max_threads::, *Note omp_set_num_threads::, *Note |
| OMP_NUM_THREADS:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.2. |
| |
| |
| File: libgomp.info, Node: omp_get_schedule, Next: omp_get_team_size, Prev: omp_get_num_threads, Up: Runtime Library Routines |
| |
| 2.10 `omp_get_schedule' - Obtain the runtime scheduling method |
| ============================================================== |
| |
| _Description_: |
| Obtain runtime the scheduling method. The KIND argument will be |
| set to the value `omp_sched_static', `omp_sched_dynamic', |
| `opm_sched_guided' or `auto'. The second argument, MODIFIER, is |
| set to the chunk size. |
| |
| _C/C++_ |
| _Prototype_: `omp_schedule(omp_sched_t * kind, int *modifier);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_schedule(kind, modifier)' |
| `integer(kind=omp_sched_kind) kind' |
| `integer modifier' |
| |
| _See also_: |
| *Note omp_set_schedule::, *Note OMP_SCHEDULE:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.12. |
| |
| |
| File: libgomp.info, Node: omp_get_team_size, Next: omp_get_thread_limit, Prev: omp_get_schedule, Up: Runtime Library Routines |
| |
| 2.11 `omp_get_team_size' - Number of threads in a team |
| ====================================================== |
| |
| _Description_: |
| This function returns the number of threads in a thread team to |
| which either the current thread or its ancestor belongs. For |
| values of LEVEL outside zero to `omp_get_level' -1 is returned; if |
| LEVEL is zero 1 is returned and for `omp_get_level' the result is |
| identical to `omp_get_num_threads'. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_time_size(int level);' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_team_size(level)' |
| `integer level' |
| |
| _See also_: |
| *Note omp_get_num_threads::, *Note omp_get_level::, *Note |
| omp_get_ancestor_thread_num:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.18. |
| |
| |
| File: libgomp.info, Node: omp_get_thread_limit, Next: omp_get_thread_num, Prev: omp_get_team_size, Up: Runtime Library Routines |
| |
| 2.12 `omp_get_thread_limit' - Maximal number of threads |
| ======================================================= |
| |
| _Description_: |
| Return the maximal number of threads of the program. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_thread_limit();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_thread_limit()' |
| |
| _See also_: |
| *Note omp_get_max_threads::, *Note OMP_THREAD_LIMIT:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.13. |
| |
| |
| File: libgomp.info, Node: omp_get_thread_num, Next: omp_in_parallel, Prev: omp_get_thread_limit, Up: Runtime Library Routines |
| |
| 2.13 `omp_get_thread_num' - Current thread ID |
| ============================================= |
| |
| _Description_: |
| Unique thread identification number within the current team. In a |
| sequential parts of the program, `omp_get_thread_num' always |
| returns 0. In parallel regions the return value varies from 0 to |
| `omp_get_num_threads'-1 inclusive. The return value of the master |
| thread of a team is always 0. |
| |
| _C/C++_: |
| _Prototype_: `int omp_get_thread_num();' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_get_thread_num()' |
| |
| _See also_: |
| *Note omp_get_num_threads::, *Note omp_get_ancestor_thread_num:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.4. |
| |
| |
| File: libgomp.info, Node: omp_in_parallel, Next: omp_set_dynamic, Prev: omp_get_thread_num, Up: Runtime Library Routines |
| |
| 2.14 `omp_in_parallel' - Whether a parallel region is active |
| ============================================================ |
| |
| _Description_: |
| This function returns `true' if currently running in parallel, |
| `false' otherwise. Here, `true' and `false' represent their |
| language-specific counterparts. |
| |
| _C/C++_: |
| _Prototype_: `int omp_in_parallel();' |
| |
| _Fortran_: |
| _Interface_: `logical function omp_in_parallel()' |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.6. |
| |
| |
| File: libgomp.info, Node: omp_set_dynamic, Next: omp_set_max_active_levels, Prev: omp_in_parallel, Up: Runtime Library Routines |
| |
| 2.15 `omp_set_dynamic' - Enable/disable dynamic teams |
| ===================================================== |
| |
| _Description_: |
| Enable or disable the dynamic adjustment of the number of threads |
| within a team. The function takes the language-specific equivalent |
| of `true' and `false', where `true' enables dynamic adjustment of |
| team sizes and `false' disables it. |
| |
| _C/C++_: |
| _Prototype_: `void omp_set_dynamic(int);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_set_dynamic(set)' |
| `integer, intent(in) :: set' |
| |
| _See also_: |
| *Note OMP_DYNAMIC::, *Note omp_get_dynamic:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.7. |
| |
| |
| File: libgomp.info, Node: omp_set_max_active_levels, Next: omp_set_nested, Prev: omp_set_dynamic, Up: Runtime Library Routines |
| |
| 2.16 `omp_set_max_active_levels' - Limits the number of active parallel regions |
| =============================================================================== |
| |
| _Description_: |
| This function limits the maximally allowed number of nested, |
| active parallel regions. |
| |
| _C/C++_ |
| _Prototype_: `omp_set_max_active_levels(int max_levels);' |
| |
| _Fortran_: |
| _Interface_: `omp_max_active_levels(max_levels)' |
| `integer max_levels' |
| |
| _See also_: |
| *Note omp_get_max_active_levels::, *Note omp_get_active_level:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.14. |
| |
| |
| File: libgomp.info, Node: omp_set_nested, Next: omp_set_num_threads, Prev: omp_set_max_active_levels, Up: Runtime Library Routines |
| |
| 2.17 `omp_set_nested' - Enable/disable nested parallel regions |
| ============================================================== |
| |
| _Description_: |
| Enable or disable nested parallel regions, i.e., whether team |
| members are allowed to create new teams. The function takes the |
| language-specific equivalent of `true' and `false', where `true' |
| enables dynamic adjustment of team sizes and `false' disables it. |
| |
| _C/C++_: |
| _Prototype_: `void omp_set_dynamic(int);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_set_dynamic(set)' |
| `integer, intent(in) :: set' |
| |
| _See also_: |
| *Note OMP_NESTED::, *Note omp_get_nested:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.9. |
| |
| |
| File: libgomp.info, Node: omp_set_num_threads, Next: omp_set_schedule, Prev: omp_set_nested, Up: Runtime Library Routines |
| |
| 2.18 `omp_set_num_threads' - Set upper team size limit |
| ====================================================== |
| |
| _Description_: |
| Specifies the number of threads used by default in subsequent |
| parallel sections, if those do not specify a `num_threads' clause. |
| The argument of `omp_set_num_threads' shall be a positive integer. |
| |
| _C/C++_: |
| _Prototype_: `void omp_set_num_threads(int);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_set_num_threads(set)' |
| `integer, intent(in) :: set' |
| |
| _See also_: |
| *Note OMP_NUM_THREADS::, *Note omp_get_num_threads::, *Note |
| omp_get_max_threads:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.2.1. |
| |
| |
| File: libgomp.info, Node: omp_set_schedule, Next: omp_init_lock, Prev: omp_set_num_threads, Up: Runtime Library Routines |
| |
| 2.19 `omp_set_schedule' - Set the runtime scheduling method |
| =========================================================== |
| |
| _Description_: |
| Sets the runtime scheduling method. The KIND argument can have the |
| value `omp_sched_static', `omp_sched_dynamic', `opm_sched_guided' |
| or `omp_sched_auto'. Except for `omp_sched_auto', the chunk size |
| is set to the value of MODIFIER if positive or to the default |
| value if zero or negative. For `omp_sched_auto' the MODIFIER |
| argument is ignored. |
| |
| _C/C++_ |
| _Prototype_: `int omp_schedule(omp_sched_t * kind, int *modifier);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_schedule(kind, modifier)' |
| `integer(kind=omp_sched_kind) kind' |
| `integer modifier' |
| |
| _See also_: |
| *Note omp_get_schedule:: *Note OMP_SCHEDULE:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section |
| 3.2.11. |
| |
| |
| File: libgomp.info, Node: omp_init_lock, Next: omp_set_lock, Prev: omp_set_schedule, Up: Runtime Library Routines |
| |
| 2.20 `omp_init_lock' - Initialize simple lock |
| ============================================= |
| |
| _Description_: |
| Initialize a simple lock. After initialization, the lock is in an |
| unlocked state. |
| |
| _C/C++_: |
| _Prototype_: `void omp_init_lock(omp_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_init_lock(lock)' |
| `integer(omp_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_destroy_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.1. |
| |
| |
| File: libgomp.info, Node: omp_set_lock, Next: omp_test_lock, Prev: omp_init_lock, Up: Runtime Library Routines |
| |
| 2.21 `omp_set_lock' - Wait for and set simple lock |
| ================================================== |
| |
| _Description_: |
| Before setting a simple lock, the lock variable must be |
| initialized by `omp_init_lock'. The calling thread is blocked |
| until the lock is available. If the lock is already held by the |
| current thread, a deadlock occurs. |
| |
| _C/C++_: |
| _Prototype_: `void omp_set_lock(omp_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_set_lock(lock)' |
| `integer(omp_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_init_lock::, *Note omp_test_lock::, *Note |
| omp_unset_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.3. |
| |
| |
| File: libgomp.info, Node: omp_test_lock, Next: omp_unset_lock, Prev: omp_set_lock, Up: Runtime Library Routines |
| |
| 2.22 `omp_test_lock' - Test and set simple lock if available |
| ============================================================ |
| |
| _Description_: |
| Before setting a simple lock, the lock variable must be |
| initialized by `omp_init_lock'. Contrary to `omp_set_lock', |
| `omp_test_lock' does not block if the lock is not available. This |
| function returns `true' upon success, `false' otherwise. Here, |
| `true' and `false' represent their language-specific counterparts. |
| |
| _C/C++_: |
| _Prototype_: `int omp_test_lock(omp_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_test_lock(lock)' |
| `logical(omp_logical_kind) :: omp_test_lock' |
| `integer(omp_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_init_lock::, *Note omp_set_lock::, *Note omp_set_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.5. |
| |
| |
| File: libgomp.info, Node: omp_unset_lock, Next: omp_destroy_lock, Prev: omp_test_lock, Up: Runtime Library Routines |
| |
| 2.23 `omp_unset_lock' - Unset simple lock |
| ========================================= |
| |
| _Description_: |
| A simple lock about to be unset must have been locked by |
| `omp_set_lock' or `omp_test_lock' before. In addition, the lock |
| must be held by the thread calling `omp_unset_lock'. Then, the |
| lock becomes unlocked. If one ore more threads attempted to set |
| the lock before, one of them is chosen to, again, set the lock for |
| itself. |
| |
| _C/C++_: |
| _Prototype_: `void omp_unset_lock(omp_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_unset_lock(lock)' |
| `integer(omp_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_set_lock::, *Note omp_test_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.4. |
| |
| |
| File: libgomp.info, Node: omp_destroy_lock, Next: omp_init_nest_lock, Prev: omp_unset_lock, Up: Runtime Library Routines |
| |
| 2.24 `omp_destroy_lock' - Destroy simple lock |
| ============================================= |
| |
| _Description_: |
| Destroy a simple lock. In order to be destroyed, a simple lock |
| must be in the unlocked state. |
| |
| _C/C++_: |
| _Prototype_: `void omp_destroy_lock(omp_lock_t *);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_destroy_lock(lock)' |
| `integer(omp_lock_kind), intent(inout) :: lock' |
| |
| _See also_: |
| *Note omp_init_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.2. |
| |
| |
| File: libgomp.info, Node: omp_init_nest_lock, Next: omp_set_nest_lock, Prev: omp_destroy_lock, Up: Runtime Library Routines |
| |
| 2.25 `omp_init_nest_lock' - Initialize nested lock |
| ================================================== |
| |
| _Description_: |
| Initialize a nested lock. After initialization, the lock is in an |
| unlocked state and the nesting count is set to zero. |
| |
| _C/C++_: |
| _Prototype_: `void omp_init_nest_lock(omp_nest_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_init_nest_lock(lock)' |
| `integer(omp_nest_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_destroy_nest_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.1. |
| |
| |
| File: libgomp.info, Node: omp_set_nest_lock, Next: omp_test_nest_lock, Prev: omp_init_nest_lock, Up: Runtime Library Routines |
| |
| 2.26 `omp_set_nest_lock' - Wait for and set simple lock |
| ======================================================= |
| |
| _Description_: |
| Before setting a nested lock, the lock variable must be |
| initialized by `omp_init_nest_lock'. The calling thread is blocked |
| until the lock is available. If the lock is already held by the |
| current thread, the nesting count for the lock in incremented. |
| |
| _C/C++_: |
| _Prototype_: `void omp_set_nest_lock(omp_nest_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_set_nest_lock(lock)' |
| `integer(omp_nest_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_init_nest_lock::, *Note omp_unset_nest_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.3. |
| |
| |
| File: libgomp.info, Node: omp_test_nest_lock, Next: omp_unset_nest_lock, Prev: omp_set_nest_lock, Up: Runtime Library Routines |
| |
| 2.27 `omp_test_nest_lock' - Test and set nested lock if available |
| ================================================================= |
| |
| _Description_: |
| Before setting a nested lock, the lock variable must be |
| initialized by `omp_init_nest_lock'. Contrary to |
| `omp_set_nest_lock', `omp_test_nest_lock' does not block if the |
| lock is not available. If the lock is already held by the current |
| thread, the new nesting count is returned. Otherwise, the return |
| value equals zero. |
| |
| _C/C++_: |
| _Prototype_: `int omp_test_nest_lock(omp_nest_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `integer function omp_test_nest_lock(lock)' |
| `integer(omp_integer_kind) :: omp_test_nest_lock' |
| `integer(omp_nest_lock_kind), intent(inout) :: lock' |
| |
| _See also_: |
| *Note omp_init_lock::, *Note omp_set_lock::, *Note omp_set_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.5. |
| |
| |
| File: libgomp.info, Node: omp_unset_nest_lock, Next: omp_destroy_nest_lock, Prev: omp_test_nest_lock, Up: Runtime Library Routines |
| |
| 2.28 `omp_unset_nest_lock' - Unset nested lock |
| ============================================== |
| |
| _Description_: |
| A nested lock about to be unset must have been locked by |
| `omp_set_nested_lock' or `omp_test_nested_lock' before. In |
| addition, the lock must be held by the thread calling |
| `omp_unset_nested_lock'. If the nesting count drops to zero, the |
| lock becomes unlocked. If one ore more threads attempted to set |
| the lock before, one of them is chosen to, again, set the lock for |
| itself. |
| |
| _C/C++_: |
| _Prototype_: `void omp_unset_nest_lock(omp_nest_lock_t *lock);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_unset_nest_lock(lock)' |
| `integer(omp_nest_lock_kind), intent(out) :: lock' |
| |
| _See also_: |
| *Note omp_set_nest_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.4. |
| |
| |
| File: libgomp.info, Node: omp_destroy_nest_lock, Next: omp_get_wtick, Prev: omp_unset_nest_lock, Up: Runtime Library Routines |
| |
| 2.29 `omp_destroy_nest_lock' - Destroy nested lock |
| ================================================== |
| |
| _Description_: |
| Destroy a nested lock. In order to be destroyed, a nested lock |
| must be in the unlocked state and its nesting count must equal |
| zero. |
| |
| _C/C++_: |
| _Prototype_: `void omp_destroy_nest_lock(omp_nest_lock_t *);' |
| |
| _Fortran_: |
| _Interface_: `subroutine omp_destroy_nest_lock(lock)' |
| `integer(omp_nest_lock_kind), intent(inout) :: lock' |
| |
| _See also_: |
| *Note omp_init_lock:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.3.2. |
| |
| |
| File: libgomp.info, Node: omp_get_wtick, Next: omp_get_wtime, Prev: omp_destroy_nest_lock, Up: Runtime Library Routines |
| |
| 2.30 `omp_get_wtick' - Get timer precision |
| ========================================== |
| |
| _Description_: |
| Gets the timer precision, i.e., the number of seconds between two |
| successive clock ticks. |
| |
| _C/C++_: |
| _Prototype_: `double omp_get_wtick();' |
| |
| _Fortran_: |
| _Interface_: `double precision function omp_get_wtick()' |
| |
| _See also_: |
| *Note omp_get_wtime:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.4.2. |
| |
| |
| File: libgomp.info, Node: omp_get_wtime, Prev: omp_get_wtick, Up: Runtime Library Routines |
| |
| 2.31 `omp_get_wtime' - Elapsed wall clock time |
| ============================================== |
| |
| _Description_: |
| Elapsed wall clock time in seconds. The time is measured per |
| thread, no guarantee can bee made that two distinct threads |
| measure the same time. Time is measured from some "time in the |
| past". On POSIX compliant systems the seconds since the Epoch |
| (00:00:00 UTC, January 1, 1970) are returned. |
| |
| _C/C++_: |
| _Prototype_: `double omp_get_wtime();' |
| |
| _Fortran_: |
| _Interface_: `double precision function omp_get_wtime()' |
| |
| _See also_: |
| *Note omp_get_wtick:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 3.4.1. |
| |
| |
| File: libgomp.info, Node: Environment Variables, Next: The libgomp ABI, Prev: Runtime Library Routines, Up: Top |
| |
| 3 Environment Variables |
| *********************** |
| |
| The variables `OMP_DYNAMIC', `OMP_MAX_ACTIVE_LEVELS', `OMP_NESTED', |
| `OMP_NUM_THREADS', `OMP_SCHEDULE', `OMP_STACKSIZE',`OMP_THREAD_LIMIT' |
| and `OMP_WAIT_POLICY' are defined by section 4 of the OpenMP |
| specifications in version 3.0, while `GOMP_CPU_AFFINITY' and |
| `GOMP_STACKSIZE' are GNU extensions. |
| |
| * Menu: |
| |
| * OMP_DYNAMIC:: Dynamic adjustment of threads |
| * OMP_MAX_ACTIVE_LEVELS:: Set the maximal number of nested parallel regions |
| * OMP_NESTED:: Nested parallel regions |
| * OMP_NUM_THREADS:: Specifies the number of threads to use |
| * OMP_STACKSIZE:: Set default thread stack size |
| * OMP_SCHEDULE:: How threads are scheduled |
| * OMP_THREAD_LIMIT:: Set the maximal number of threads |
| * OMP_WAIT_POLICY:: How waiting threads are handled |
| * GOMP_CPU_AFFINITY:: Bind threads to specific CPUs |
| * GOMP_STACKSIZE:: Set default thread stack size |
| |
| |
| File: libgomp.info, Node: OMP_DYNAMIC, Next: OMP_MAX_ACTIVE_LEVELS, Up: Environment Variables |
| |
| 3.1 `OMP_DYNAMIC' - Dynamic adjustment of threads |
| ================================================= |
| |
| _Description_: |
| Enable or disable the dynamic adjustment of the number of threads |
| within a team. The value of this environment variable shall be |
| `TRUE' or `FALSE'. If undefined, dynamic adjustment is disabled by |
| default. |
| |
| _See also_: |
| *Note omp_set_dynamic:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 4.3 |
| |
| |
| File: libgomp.info, Node: OMP_MAX_ACTIVE_LEVELS, Next: OMP_NESTED, Prev: OMP_DYNAMIC, Up: Environment Variables |
| |
| 3.2 `OMP_MAX_ACTIVE_LEVELS' - Set the maximal number of nested parallel regions |
| =============================================================================== |
| |
| _Description_: |
| Specifies the initial value for the maximal number of nested |
| parallel regions. The value of this variable shall be positive |
| integer. If undefined, the number of active levels is unlimited. |
| |
| _See also_: |
| *Note omp_set_max_active_levels:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 4.7 |
| |
| |
| File: libgomp.info, Node: OMP_NESTED, Next: OMP_NUM_THREADS, Prev: OMP_MAX_ACTIVE_LEVELS, Up: Environment Variables |
| |
| 3.3 `OMP_NESTED' - Nested parallel regions |
| ========================================== |
| |
| _Description_: |
| Enable or disable nested parallel regions, i.e., whether team |
| members are allowed to create new teams. The value of this |
| environment variable shall be `TRUE' or `FALSE'. If undefined, |
| nested parallel regions are disabled by default. |
| |
| _See also_: |
| *Note omp_set_nested:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 4.4 |
| |
| |
| File: libgomp.info, Node: OMP_NUM_THREADS, Next: OMP_STACKSIZE, Prev: OMP_NESTED, Up: Environment Variables |
| |
| 3.4 `OMP_NUM_THREADS' - Specifies the number of threads to use |
| ============================================================== |
| |
| _Description_: |
| Specifies the default number of threads to use in parallel |
| regions. The value of this variable shall be positive integer. If |
| undefined one thread per CPU online is used. |
| |
| _See also_: |
| *Note omp_set_num_threads:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 4.2 |
| |
| |
| File: libgomp.info, Node: OMP_SCHEDULE, Next: OMP_THREAD_LIMIT, Prev: OMP_STACKSIZE, Up: Environment Variables |
| |
| 3.5 `OMP_SCHEDULE' - How threads are scheduled |
| ============================================== |
| |
| _Description_: |
| Allows to specify `schedule type' and `chunk size'. The value of |
| the variable shall have the form: `type[,chunk]' where `type' is |
| one of `static', `dynamic', `guided' or `auto' The optional |
| `chunk' size shall be a positive integer. If undefined, dynamic |
| scheduling and a chunk size of 1 is used. |
| |
| _See also_: |
| *Note omp_set_schedule:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), sections |
| 2.5.1 and 4.1 |
| |
| |
| File: libgomp.info, Node: OMP_STACKSIZE, Next: OMP_SCHEDULE, Prev: OMP_NUM_THREADS, Up: Environment Variables |
| |
| 3.6 `OMP_STACKSIZE' - Set default thread stack size |
| =================================================== |
| |
| _Description_: |
| Set the default thread stack size in kilobytes, unless the number |
| is suffixed by `B', `K', `M' or `G', in which case the size is, |
| respectively, in bytes, kilobytes, megabytes or gigabytes. This is |
| different from `pthread_attr_setstacksize' which gets the number |
| of bytes as an argument. If the stacksize can not be set due to |
| system constraints, an error is reported and the initial stacksize |
| is left unchanged. If undefined, the stack size is system |
| dependent. |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), sections 4.5 |
| |
| |
| File: libgomp.info, Node: OMP_THREAD_LIMIT, Next: OMP_WAIT_POLICY, Prev: OMP_SCHEDULE, Up: Environment Variables |
| |
| 3.7 `OMP_THREAD_LIMIT' - Set the maximal number of threads |
| ========================================================== |
| |
| _Description_: |
| Specifies the number of threads to use for the whole program. The |
| value of this variable shall be positive integer. If undefined, |
| the number of threads is not limited. |
| |
| _See also_: |
| *Note OMP_NUM_THREADS:: *Note omp_get_thread_limit:: |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), section 4.8 |
| |
| |
| File: libgomp.info, Node: OMP_WAIT_POLICY, Next: GOMP_CPU_AFFINITY, Prev: OMP_THREAD_LIMIT, Up: Environment Variables |
| |
| 3.8 `OMP_WAIT_POLICY' - How waiting threads are handled |
| ======================================================= |
| |
| _Description_: |
| Specifies whether waiting threads should be active or passive. If |
| the value is `PASSIVE', waiting threads should not consume CPU |
| power while waiting; while the value is `ACTIVE' specifies that |
| they should. |
| |
| _Reference_: |
| OpenMP specifications v3.0 (http://www.openmp.org/), sections 4.6 |
| |
| |
| File: libgomp.info, Node: GOMP_CPU_AFFINITY, Next: GOMP_STACKSIZE, Prev: OMP_WAIT_POLICY, Up: Environment Variables |
| |
| 3.9 `GOMP_CPU_AFFINITY' - Bind threads to specific CPUs |
| ======================================================= |
| |
| _Description_: |
| Binds threads to specific CPUs. The variable should contain a |
| space- or comma-separated list of CPUs. This list may contain |
| different kind of entries: either single CPU numbers in any order, |
| a range of CPUs (M-N) or a range with some stride (M-N:S). CPU |
| numbers are zero based. For example, `GOMP_CPU_AFFINITY="0 3 1-2 |
| 4-15:2"' will bind the initial thread to CPU 0, the second to CPU |
| 3, the third to CPU 1, the fourth to CPU 2, the fifth to CPU 4, |
| the sixth through tenth to CPUs 6, 8, 10, 12, and 14 respectively |
| and then start assigning back from the beginning of the list. |
| `GOMP_CPU_AFFINITY=0' binds all threads to CPU 0. |
| |
| There is no GNU OpenMP library routine to determine whether a CPU |
| affinity specification is in effect. As a workaround, |
| language-specific library functions, e.g., `getenv' in C or |
| `GET_ENVIRONMENT_VARIABLE' in Fortran, may be used to query the |
| setting of the `GOMP_CPU_AFFINITY' environment variable. A defined |
| CPU affinity on startup cannot be changed or disabled during the |
| runtime of the application. |
| |
| If this environment variable is omitted, the host system will |
| handle the assignment of threads to CPUs. |
| |
| |
| File: libgomp.info, Node: GOMP_STACKSIZE, Prev: GOMP_CPU_AFFINITY, Up: Environment Variables |
| |
| 3.10 `GOMP_STACKSIZE' - Set default thread stack size |
| ===================================================== |
| |
| _Description_: |
| Set the default thread stack size in kilobytes. This is different |
| from `pthread_attr_setstacksize' which gets the number of bytes as |
| an argument. If the stacksize can not be set due to system |
| constraints, an error is reported and the initial stacksize is |
| left unchanged. If undefined, the stack size is system dependent. |
| |
| _See also_: |
| *Note GOMP_STACKSIZE:: |
| |
| _Reference_: |
| GCC Patches Mailinglist |
| (http://gcc.gnu.org/ml/gcc-patches/2006-06/msg00493.html), GCC |
| Patches Mailinglist |
| (http://gcc.gnu.org/ml/gcc-patches/2006-06/msg00496.html) |
| |
| |
| File: libgomp.info, Node: The libgomp ABI, Next: Reporting Bugs, Prev: Environment Variables, Up: Top |
| |
| 4 The libgomp ABI |
| ***************** |
| |
| The following sections present notes on the external ABI as presented |
| by libgomp. Only maintainers should need them. |
| |
| * Menu: |
| |
| * Implementing MASTER construct:: |
| * Implementing CRITICAL construct:: |
| * Implementing ATOMIC construct:: |
| * Implementing FLUSH construct:: |
| * Implementing BARRIER construct:: |
| * Implementing THREADPRIVATE construct:: |
| * Implementing PRIVATE clause:: |
| * Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses:: |
| * Implementing REDUCTION clause:: |
| * Implementing PARALLEL construct:: |
| * Implementing FOR construct:: |
| * Implementing ORDERED construct:: |
| * Implementing SECTIONS construct:: |
| * Implementing SINGLE construct:: |
| |
| |
| File: libgomp.info, Node: Implementing MASTER construct, Next: Implementing CRITICAL construct, Up: The libgomp ABI |
| |
| 4.1 Implementing MASTER construct |
| ================================= |
| |
| if (omp_get_thread_num () == 0) |
| block |
| |
| Alternately, we generate two copies of the parallel subfunction and |
| only include this in the version run by the master thread. Surely |
| that's not worthwhile though... |
| |
| |
| File: libgomp.info, Node: Implementing CRITICAL construct, Next: Implementing ATOMIC construct, Prev: Implementing MASTER construct, Up: The libgomp ABI |
| |
| 4.2 Implementing CRITICAL construct |
| =================================== |
| |
| Without a specified name, |
| |
| void GOMP_critical_start (void); |
| void GOMP_critical_end (void); |
| |
| so that we don't get COPY relocations from libgomp to the main |
| application. |
| |
| With a specified name, use omp_set_lock and omp_unset_lock with name |
| being transformed into a variable declared like |
| |
| omp_lock_t gomp_critical_user_<name> __attribute__((common)) |
| |
| Ideally the ABI would specify that all zero is a valid unlocked |
| state, and so we wouldn't actually need to initialize this at startup. |
| |
| |
| File: libgomp.info, Node: Implementing ATOMIC construct, Next: Implementing FLUSH construct, Prev: Implementing CRITICAL construct, Up: The libgomp ABI |
| |
| 4.3 Implementing ATOMIC construct |
| ================================= |
| |
| The target should implement the `__sync' builtins. |
| |
| Failing that we could add |
| |
| void GOMP_atomic_enter (void) |
| void GOMP_atomic_exit (void) |
| |
| which reuses the regular lock code, but with yet another lock object |
| private to the library. |
| |
| |
| File: libgomp.info, Node: Implementing FLUSH construct, Next: Implementing BARRIER construct, Prev: Implementing ATOMIC construct, Up: The libgomp ABI |
| |
| 4.4 Implementing FLUSH construct |
| ================================ |
| |
| Expands to the `__sync_synchronize' builtin. |
| |
| |
| File: libgomp.info, Node: Implementing BARRIER construct, Next: Implementing THREADPRIVATE construct, Prev: Implementing FLUSH construct, Up: The libgomp ABI |
| |
| 4.5 Implementing BARRIER construct |
| ================================== |
| |
| void GOMP_barrier (void) |
| |
| |
| File: libgomp.info, Node: Implementing THREADPRIVATE construct, Next: Implementing PRIVATE clause, Prev: Implementing BARRIER construct, Up: The libgomp ABI |
| |
| 4.6 Implementing THREADPRIVATE construct |
| ======================================== |
| |
| In _most_ cases we can map this directly to `__thread'. Except that |
| OMP allows constructors for C++ objects. We can either refuse to |
| support this (how often is it used?) or we can implement something akin |
| to .ctors. |
| |
| Even more ideally, this ctor feature is handled by extensions to the |
| main pthreads library. Failing that, we can have a set of entry points |
| to register ctor functions to be called. |
| |
| |
| File: libgomp.info, Node: Implementing PRIVATE clause, Next: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses, Prev: Implementing THREADPRIVATE construct, Up: The libgomp ABI |
| |
| 4.7 Implementing PRIVATE clause |
| =============================== |
| |
| In association with a PARALLEL, or within the lexical extent of a |
| PARALLEL block, the variable becomes a local variable in the parallel |
| subfunction. |
| |
| In association with FOR or SECTIONS blocks, create a new automatic |
| variable within the current function. This preserves the semantic of |
| new variable creation. |
| |
| |
| File: libgomp.info, Node: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses, Next: Implementing REDUCTION clause, Prev: Implementing PRIVATE clause, Up: The libgomp ABI |
| |
| 4.8 Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses |
| ======================================================================== |
| |
| Seems simple enough for PARALLEL blocks. Create a private struct for |
| communicating between parent and subfunction. In the parent, copy in |
| values for scalar and "small" structs; copy in addresses for others |
| TREE_ADDRESSABLE types. In the subfunction, copy the value into the |
| local variable. |
| |
| Not clear at all what to do with bare FOR or SECTION blocks. The |
| only thing I can figure is that we do something like |
| |
| #pragma omp for firstprivate(x) lastprivate(y) |
| for (int i = 0; i < n; ++i) |
| body; |
| |
| which becomes |
| |
| { |
| int x = x, y; |
| |
| // for stuff |
| |
| if (i == n) |
| y = y; |
| } |
| |
| where the "x=x" and "y=y" assignments actually have different uids |
| for the two variables, i.e. not something you could write directly in |
| C. Presumably this only makes sense if the "outer" x and y are global |
| variables. |
| |
| COPYPRIVATE would work the same way, except the structure broadcast |
| would have to happen via SINGLE machinery instead. |
| |
| |
| File: libgomp.info, Node: Implementing REDUCTION clause, Next: Implementing PARALLEL construct, Prev: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses, Up: The libgomp ABI |
| |
| 4.9 Implementing REDUCTION clause |
| ================================= |
| |
| The private struct mentioned in the previous section should have a |
| pointer to an array of the type of the variable, indexed by the |
| thread's TEAM_ID. The thread stores its final value into the array, |
| and after the barrier the master thread iterates over the array to |
| collect the values. |
| |
| |
| File: libgomp.info, Node: Implementing PARALLEL construct, Next: Implementing FOR construct, Prev: Implementing REDUCTION clause, Up: The libgomp ABI |
| |
| 4.10 Implementing PARALLEL construct |
| ==================================== |
| |
| #pragma omp parallel |
| { |
| body; |
| } |
| |
| becomes |
| |
| void subfunction (void *data) |
| { |
| use data; |
| body; |
| } |
| |
| setup data; |
| GOMP_parallel_start (subfunction, &data, num_threads); |
| subfunction (&data); |
| GOMP_parallel_end (); |
| |
| void GOMP_parallel_start (void (*fn)(void *), void *data, unsigned num_threads) |
| |
| The FN argument is the subfunction to be run in parallel. |
| |
| The DATA argument is a pointer to a structure used to communicate |
| data in and out of the subfunction, as discussed above with respect to |
| FIRSTPRIVATE et al. |
| |
| The NUM_THREADS argument is 1 if an IF clause is present and false, |
| or the value of the NUM_THREADS clause, if present, or 0. |
| |
| The function needs to create the appropriate number of threads |
| and/or launch them from the dock. It needs to create the team |
| structure and assign team ids. |
| |
| void GOMP_parallel_end (void) |
| |
| Tears down the team and returns us to the previous |
| `omp_in_parallel()' state. |
| |
| |
| File: libgomp.info, Node: Implementing FOR construct, Next: Implementing ORDERED construct, Prev: Implementing PARALLEL construct, Up: The libgomp ABI |
| |
| 4.11 Implementing FOR construct |
| =============================== |
| |
| #pragma omp parallel for |
| for (i = lb; i <= ub; i++) |
| body; |
| |
| becomes |
| |
| void subfunction (void *data) |
| { |
| long _s0, _e0; |
| while (GOMP_loop_static_next (&_s0, &_e0)) |
| { |
| long _e1 = _e0, i; |
| for (i = _s0; i < _e1; i++) |
| body; |
| } |
| GOMP_loop_end_nowait (); |
| } |
| |
| GOMP_parallel_loop_static (subfunction, NULL, 0, lb, ub+1, 1, 0); |
| subfunction (NULL); |
| GOMP_parallel_end (); |
| |
| #pragma omp for schedule(runtime) |
| for (i = 0; i < n; i++) |
| body; |
| |
| becomes |
| |
| { |
| long i, _s0, _e0; |
| if (GOMP_loop_runtime_start (0, n, 1, &_s0, &_e0)) |
| do { |
| long _e1 = _e0; |
| for (i = _s0, i < _e0; i++) |
| body; |
| } while (GOMP_loop_runtime_next (&_s0, _&e0)); |
| GOMP_loop_end (); |
| } |
| |
| Note that while it looks like there is trickyness to propagating a |
| non-constant STEP, there isn't really. We're explicitly allowed to |
| evaluate it as many times as we want, and any variables involved should |
| automatically be handled as PRIVATE or SHARED like any other variables. |
| So the expression should remain evaluable in the subfunction. We can |
| also pull it into a local variable if we like, but since its supposed |
| to remain unchanged, we can also not if we like. |
| |
| If we have SCHEDULE(STATIC), and no ORDERED, then we ought to be |
| able to get away with no work-sharing context at all, since we can |
| simply perform the arithmetic directly in each thread to divide up the |
| iterations. Which would mean that we wouldn't need to call any of |
| these routines. |
| |
| There are separate routines for handling loops with an ORDERED |
| clause. Bookkeeping for that is non-trivial... |
| |
| |
| File: libgomp.info, Node: Implementing ORDERED construct, Next: Implementing SECTIONS construct, Prev: Implementing FOR construct, Up: The libgomp ABI |
| |
| 4.12 Implementing ORDERED construct |
| =================================== |
| |
| void GOMP_ordered_start (void) |
| void GOMP_ordered_end (void) |
| |
| |
| File: libgomp.info, Node: Implementing SECTIONS construct, Next: Implementing SINGLE construct, Prev: Implementing ORDERED construct, Up: The libgomp ABI |
| |
| 4.13 Implementing SECTIONS construct |
| ==================================== |
| |
| A block as |
| |
| #pragma omp sections |
| { |
| #pragma omp section |
| stmt1; |
| #pragma omp section |
| stmt2; |
| #pragma omp section |
| stmt3; |
| } |
| |
| becomes |
| |
| for (i = GOMP_sections_start (3); i != 0; i = GOMP_sections_next ()) |
| switch (i) |
| { |
| case 1: |
| stmt1; |
| break; |
| case 2: |
| stmt2; |
| break; |
| case 3: |
| stmt3; |
| break; |
| } |
| GOMP_barrier (); |
| |
| |
| File: libgomp.info, Node: Implementing SINGLE construct, Prev: Implementing SECTIONS construct, Up: The libgomp ABI |
| |
| 4.14 Implementing SINGLE construct |
| ================================== |
| |
| A block like |
| |
| #pragma omp single |
| { |
| body; |
| } |
| |
| becomes |
| |
| if (GOMP_single_start ()) |
| body; |
| GOMP_barrier (); |
| |
| while |
| |
| #pragma omp single copyprivate(x) |
| body; |
| |
| becomes |
| |
| datap = GOMP_single_copy_start (); |
| if (datap == NULL) |
| { |
| body; |
| data.x = x; |
| GOMP_single_copy_end (&data); |
| } |
| else |
| x = datap->x; |
| GOMP_barrier (); |
| |
| |
| File: libgomp.info, Node: Reporting Bugs, Next: Copying, Prev: The libgomp ABI, Up: Top |
| |
| 5 Reporting Bugs |
| **************** |
| |
| Bugs in the GNU OpenMP implementation should be reported via bugzilla |
| (http://gcc.gnu.org/bugzilla/). In all cases, please add "openmp" to |
| the keywords field in the bug report. |
| |
| |
| File: libgomp.info, Node: Copying, Next: GNU Free Documentation License, Prev: Reporting Bugs, Up: Top |
| |
| GNU GENERAL PUBLIC LICENSE |
| ************************** |
| |
| Version 2, June 1991 |
| |
| Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
| |
| Everyone is permitted to copy and distribute verbatim copies |
| of this license document, but changing it is not allowed. |
| |
| Preamble |
| ======== |
| |
| The licenses for most software are designed to take away your freedom |
| to share and change it. By contrast, the GNU General Public License is |
| intended to guarantee your freedom to share and change free |
| software--to make sure the software is free for all its users. This |
| General Public License applies to most of the Free Software |
| Foundation's software and to any other program whose authors commit to |
| using it. (Some other Free Software Foundation software is covered by |
| the GNU Library General Public License instead.) You can apply it to |
| your programs, too. |
| |
| When we speak of free software, we are referring to freedom, not |
| price. Our General Public Licenses are designed to make sure that you |
| have the freedom to distribute copies of free software (and charge for |
| this service if you wish), that you receive source code or can get it |
| if you want it, that you can change the software or use pieces of it in |
| new free programs; and that you know you can do these things. |
| |
| To protect your rights, we need to make restrictions that forbid |
| anyone to deny you these rights or to ask you to surrender the rights. |
| These restrictions translate to certain responsibilities for you if you |
| distribute copies of the software, or if you modify it. |
| |
| For example, if you distribute copies of such a program, whether |
| gratis or for a fee, you must give the recipients all the rights that |
| you have. You must make sure that they, too, receive or can get the |
| source code. And you must show them these terms so they know their |
| rights. |
| |
| We protect your rights with two steps: (1) copyright the software, |
| and (2) offer you this license which gives you legal permission to copy, |
| distribute and/or modify the software. |
| |
| Also, for each author's protection and ours, we want to make certain |
| that everyone understands that there is no warranty for this free |
| software. If the software is modified by someone else and passed on, we |
| want its recipients to know that what they have is not the original, so |
| that any problems introduced by others will not reflect on the original |
| authors' reputations. |
| |
| Finally, any free program is threatened constantly by software |
| patents. We wish to avoid the danger that redistributors of a free |
| program will individually obtain patent licenses, in effect making the |
| program proprietary. To prevent this, we have made it clear that any |
| patent must be licensed for everyone's free use or not licensed at all. |
| |
| The precise terms and conditions for copying, distribution and |
| modification follow. |
| |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
| 0. This License applies to any program or other work which contains a |
| notice placed by the copyright holder saying it may be distributed |
| under the terms of this General Public License. The "Program", |
| below, refers to any such program or work, and a "work based on |
| the Program" means either the Program or any derivative work under |
| copyright law: that is to say, a work containing the Program or a |
| portion of it, either verbatim or with modifications and/or |
| translated into another language. (Hereinafter, translation is |
| included without limitation in the term "modification".) Each |
| licensee is addressed as "you". |
| |
| Activities other than copying, distribution and modification are |
| not covered by this License; they are outside its scope. The act |
| of running the Program is not restricted, and the output from the |
| Program is covered only if its contents constitute a work based on |
| the Program (independent of having been made by running the |
| Program). Whether that is true depends on what the Program does. |
| |
| 1. You may copy and distribute verbatim copies of the Program's |
| source code as you receive it, in any medium, provided that you |
| conspicuously and appropriately publish on each copy an appropriate |
| copyright notice and disclaimer of warranty; keep intact all the |
| notices that refer to this License and to the absence of any |
| warranty; and give any other recipients of the Program a copy of |
| this License along with the Program. |
| |
| You may charge a fee for the physical act of transferring a copy, |
| and you may at your option offer warranty protection in exchange |
| for a fee. |
| |
| 2. You may modify your copy or copies of the Program or any portion |
| of it, thus forming a work based on the Program, and copy and |
| distribute such modifications or work under the terms of Section 1 |
| above, provided that you also meet all of these conditions: |
| |
| a. You must cause the modified files to carry prominent notices |
| stating that you changed the files and the date of any change. |
| |
| b. You must cause any work that you distribute or publish, that |
| in whole or in part contains or is derived from the Program |
| or any part thereof, to be licensed as a whole at no charge |
| to all third parties under the terms of this License. |
| |
| c. If the modified program normally reads commands interactively |
| when run, you must cause it, when started running for such |
| interactive use in the most ordinary way, to print or display |
| an announcement including an appropriate copyright notice and |
| a notice that there is no warranty (or else, saying that you |
| provide a warranty) and that users may redistribute the |
| program under these conditions, and telling the user how to |
| view a copy of this License. (Exception: if the Program |
| itself is interactive but does not normally print such an |
| announcement, your work based on the Program is not required |
| to print an announcement.) |
| |
| These requirements apply to the modified work as a whole. If |
| identifiable sections of that work are not derived from the |
| Program, and can be reasonably considered independent and separate |
| works in themselves, then this License, and its terms, do not |
| apply to those sections when you distribute them as separate |
| works. But when you distribute the same sections as part of a |
| whole which is a work based on the Program, the distribution of |
| the whole must be on the terms of this License, whose permissions |
| for other licensees extend to the entire whole, and thus to each |
| and every part regardless of who wrote it. |
| |
| Thus, it is not the intent of this section to claim rights or |
| contest your rights to work written entirely by you; rather, the |
| intent is to exercise the right to control the distribution of |
| derivative or collective works based on the Program. |
| |
| In addition, mere aggregation of another work not based on the |
| Program with the Program (or with a work based on the Program) on |
| a volume of a storage or distribution medium does not bring the |
| other work under the scope of this License. |
| |
| 3. You may copy and distribute the Program (or a work based on it, |
| under Section 2) in object code or executable form under the terms |
| of Sections 1 and 2 above provided that you also do one of the |
| following: |
| |
| a. Accompany it with the complete corresponding machine-readable |
| source code, which must be distributed under the terms of |
| Sections 1 and 2 above on a medium customarily used for |
| software interchange; or, |
| |
| b. Accompany it with a written offer, valid for at least three |
| years, to give any third party, for a charge no more than your |
| cost of physically performing source distribution, a complete |
| machine-readable copy of the corresponding source code, to be |
| distributed under the terms of Sections 1 and 2 above on a |
| medium customarily used for software interchange; or, |
| |
| c. Accompany it with the information you received as to the offer |
| to distribute corresponding source code. (This alternative is |
| allowed only for noncommercial distribution and only if you |
| received the program in object code or executable form with |
| such an offer, in accord with Subsection b above.) |
| |
| The source code for a work means the preferred form of the work for |
| making modifications to it. For an executable work, complete |
| source code means all the source code for all modules it contains, |
| plus any associated interface definition files, plus the scripts |
| used to control compilation and installation of the executable. |
| However, as a special exception, the source code distributed need |
| not include anything that is normally distributed (in either |
| source or binary form) with the major components (compiler, |
| kernel, and so on) of the operating system on which the executable |
| runs, unless that component itself accompanies the executable. |
| |
| If distribution of executable or object code is made by offering |
| access to copy from a designated place, then offering equivalent |
| access to copy the source code from the same place counts as |
| distribution of the source code, even though third parties are not |
| compelled to copy the source along with the object code. |
| |
| 4. You may not copy, modify, sublicense, or distribute the Program |
| except as expressly provided under this License. Any attempt |
| otherwise to copy, modify, sublicense or distribute the Program is |
| void, and will automatically terminate your rights under this |
| License. However, parties who have received copies, or rights, |
| from you under this License will not have their licenses |
| terminated so long as such parties remain in full compliance. |
| |
| 5. You are not required to accept this License, since you have not |
| signed it. However, nothing else grants you permission to modify |
| or distribute the Program or its derivative works. These actions |
| are prohibited by law if you do not accept this License. |
| Therefore, by modifying or distributing the Program (or any work |
| based on the Program), you indicate your acceptance of this |
| License to do so, and all its terms and conditions for copying, |
| distributing or modifying the Program or works based on it. |
| |
| 6. Each time you redistribute the Program (or any work based on the |
| Program), the recipient automatically receives a license from the |
| original licensor to copy, distribute or modify the Program |
| subject to these terms and conditions. You may not impose any |
| further restrictions on the recipients' exercise of the rights |
| granted herein. You are not responsible for enforcing compliance |
| by third parties to this License. |
| |
| 7. If, as a consequence of a court judgment or allegation of patent |
| infringement or for any other reason (not limited to patent |
| issues), conditions are imposed on you (whether by court order, |
| agreement or otherwise) that contradict the conditions of this |
| License, they do not excuse you from the conditions of this |
| License. If you cannot distribute so as to satisfy simultaneously |
| your obligations under this License and any other pertinent |
| obligations, then as a consequence you may not distribute the |
| Program at all. For example, if a patent license would not permit |
| royalty-free redistribution of the Program by all those who |
| receive copies directly or indirectly through you, then the only |
| way you could satisfy both it and this License would be to refrain |
| entirely from distribution of the Program. |
| |
| If any portion of this section is held invalid or unenforceable |
| under any particular circumstance, the balance of the section is |
| intended to apply and the section as a whole is intended to apply |
| in other circumstances. |
| |
| It is not the purpose of this section to induce you to infringe any |
| patents or other property right claims or to contest validity of |
| any such claims; this section has the sole purpose of protecting |
| the integrity of the free software distribution system, which is |
| implemented by public license practices. Many people have made |
| generous contributions to the wide range of software distributed |
| through that system in reliance on consistent application of that |
| system; it is up to the author/donor to decide if he or she is |
| willing to distribute software through any other system and a |
| licensee cannot impose that choice. |
| |
| This section is intended to make thoroughly clear what is believed |
| to be a consequence of the rest of this License. |
| |
| 8. If the distribution and/or use of the Program is restricted in |
| certain countries either by patents or by copyrighted interfaces, |
| the original copyright holder who places the Program under this |
| License may add an explicit geographical distribution limitation |
| excluding those countries, so that distribution is permitted only |
| in or among countries not thus excluded. In such case, this |
| License incorporates the limitation as if written in the body of |
| this License. |
| |
| 9. The Free Software Foundation may publish revised and/or new |
| versions of the General Public License from time to time. Such |
| new versions will be similar in spirit to the present version, but |
| may differ in detail to address new problems or concerns. |
| |
| Each version is given a distinguishing version number. If the |
| Program specifies a version number of this License which applies |
| to it and "any later version", you have the option of following |
| the terms and conditions either of that version or of any later |
| version published by the Free Software Foundation. If the Program |
| does not specify a version number of this License, you may choose |
| any version ever published by the Free Software Foundation. |
| |
| 10. If you wish to incorporate parts of the Program into other free |
| programs whose distribution conditions are different, write to the |
| author to ask for permission. For software which is copyrighted |
| by the Free Software Foundation, write to the Free Software |
| Foundation; we sometimes make exceptions for this. Our decision |
| will be guided by the two goals of preserving the free status of |
| all derivatives of our free software and of promoting the sharing |
| and reuse of software generally. |
| |
| NO WARRANTY |
| 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO |
| WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE |
| LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT |
| WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT |
| NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE |
| QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY |
| SERVICING, REPAIR OR CORRECTION. |
| |
| 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN |
| WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY |
| MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE |
| LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, |
| INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR |
| INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU |
| OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY |
| OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN |
| ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
| |
| END OF TERMS AND CONDITIONS |
| Appendix: How to Apply These Terms to Your New Programs |
| ======================================================= |
| |
| If you develop a new program, and you want it to be of the greatest |
| possible use to the public, the best way to achieve this is to make it |
| free software which everyone can redistribute and change under these |
| terms. |
| |
| To do so, attach the following notices to the program. It is safest |
| to attach them to the start of each source file to most effectively |
| convey the exclusion of warranty; and each file should have at least |
| the "copyright" line and a pointer to where the full notice is found. |
| |
| ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. |
| Copyright (C) YEAR NAME OF AUTHOR |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
| |
| Also add information on how to contact you by electronic and paper |
| mail. |
| |
| If the program is interactive, make it output a short notice like |
| this when it starts in an interactive mode: |
| |
| Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR |
| Gnomovision comes with ABSOLUTELY NO WARRANTY; for details |
| type `show w'. |
| This is free software, and you are welcome to redistribute it |
| under certain conditions; type `show c' for details. |
| |
| The hypothetical commands `show w' and `show c' should show the |
| appropriate parts of the General Public License. Of course, the |
| commands you use may be called something other than `show w' and `show |
| c'; they could even be mouse-clicks or menu items--whatever suits your |
| program. |
| |
| You should also get your employer (if you work as a programmer) or |
| your school, if any, to sign a "copyright disclaimer" for the program, |
| if necessary. Here is a sample; alter the names: |
| |
| Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
| `Gnomovision' (which makes passes at compilers) written by James Hacker. |
| |
| SIGNATURE OF TY COON, 1 April 1989 |
| Ty Coon, President of Vice |
| |
| This General Public License does not permit incorporating your |
| program into proprietary programs. If your program is a subroutine |
| library, you may consider it more useful to permit linking proprietary |
| applications with the library. If this is what you want to do, use the |
| GNU Library General Public License instead of this License. |
| |
| |
| File: libgomp.info, Node: GNU Free Documentation License, Next: Funding, Prev: Copying, Up: Top |
| |
| GNU Free Documentation License |
| ****************************** |
| |
| Version 1.2, November 2002 |
| |
| Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
| |
| Everyone is permitted to copy and distribute verbatim copies |
| of this license document, but changing it is not allowed. |
| |
| 0. PREAMBLE |
| |
| The purpose of this License is to make a manual, textbook, or other |
| functional and useful document "free" in the sense of freedom: to |
| assure everyone the effective freedom to copy and redistribute it, |
| with or without modifying it, either commercially or |
| noncommercially. Secondarily, this License preserves for the |
| author and publisher a way to get credit for their work, while not |
| being considered responsible for modifications made by others. |
| |
| This License is a kind of "copyleft", which means that derivative |
| works of the document must themselves be free in the same sense. |
| It complements the GNU General Public License, which is a copyleft |
| license designed for free software. |
| |
| We have designed this License in order to use it for manuals for |
| free software, because free software needs free documentation: a |
| free program should come with manuals providing the same freedoms |
| that the software does. But this License is not limited to |
| software manuals; it can be used for any textual work, regardless |
| of subject matter or whether it is published as a printed book. |
| We recommend this License principally for works whose purpose is |
| instruction or reference. |
| |
| 1. APPLICABILITY AND DEFINITIONS |
| |
| This License applies to any manual or other work, in any medium, |
| that contains a notice placed by the copyright holder saying it |
| can be distributed under the terms of this License. Such a notice |
| grants a world-wide, royalty-free license, unlimited in duration, |
| to use that work under the conditions stated herein. The |
| "Document", below, refers to any such manual or work. Any member |
| of the public is a licensee, and is addressed as "you". You |
| accept the license if you copy, modify or distribute the work in a |
| way requiring permission under copyright law. |
| |
| A "Modified Version" of the Document means any work containing the |
| Document or a portion of it, either copied verbatim, or with |
| modifications and/or translated into another language. |
| |
| A "Secondary Section" is a named appendix or a front-matter section |
| of the Document that deals exclusively with the relationship of the |
| publishers or authors of the Document to the Document's overall |
| subject (or to related matters) and contains nothing that could |
| fall directly within that overall subject. (Thus, if the Document |
| is in part a textbook of mathematics, a Secondary Section may not |
| explain any mathematics.) The relationship could be a matter of |
| historical connection with the subject or with related matters, or |
| of legal, commercial, philosophical, ethical or political position |
| regarding them. |
| |
| The "Invariant Sections" are certain Secondary Sections whose |
| titles are designated, as being those of Invariant Sections, in |
| the notice that says that the Document is released under this |
| License. If a section does not fit the above definition of |
| Secondary then it is not allowed to be designated as Invariant. |
| The Document may contain zero Invariant Sections. If the Document |
| does not identify any Invariant Sections then there are none. |
| |
| The "Cover Texts" are certain short passages of text that are |
| listed, as Front-Cover Texts or Back-Cover Texts, in the notice |
| that says that the Document is released under this License. A |
| Front-Cover Text may be at most 5 words, and a Back-Cover Text may |
| be at most 25 words. |
| |
| A "Transparent" copy of the Document means a machine-readable copy, |
| represented in a format whose specification is available to the |
| general public, that is suitable for revising the document |
| straightforwardly with generic text editors or (for images |
| composed of pixels) generic paint programs or (for drawings) some |
| widely available drawing editor, and that is suitable for input to |
| text formatters or for automatic translation to a variety of |
| formats suitable for input to text formatters. A copy made in an |
| otherwise Transparent file format whose markup, or absence of |
| markup, has been arranged to thwart or discourage subsequent |
| modification by readers is not Transparent. An image format is |
| not Transparent if used for any substantial amount of text. A |
| copy that is not "Transparent" is called "Opaque". |
| |
| Examples of suitable formats for Transparent copies include plain |
| ASCII without markup, Texinfo input format, LaTeX input format, |
| SGML or XML using a publicly available DTD, and |
| standard-conforming simple HTML, PostScript or PDF designed for |
| human modification. Examples of transparent image formats include |
| PNG, XCF and JPG. Opaque formats include proprietary formats that |
| can be read and edited only by proprietary word processors, SGML or |
| XML for which the DTD and/or processing tools are not generally |
| available, and the machine-generated HTML, PostScript or PDF |
| produced by some word processors for output purposes only. |
| |
| The "Title Page" means, for a printed book, the title page itself, |
| plus such following pages as are needed to hold, legibly, the |
| material this License requires to appear in the title page. For |
| works in formats which do not have any title page as such, "Title |
| Page" means the text near the most prominent appearance of the |
| work's title, preceding the beginning of the body of the text. |
| |
| A section "Entitled XYZ" means a named subunit of the Document |
| whose title either is precisely XYZ or contains XYZ in parentheses |
| following text that translates XYZ in another language. (Here XYZ |
| stands for a specific section name mentioned below, such as |
| "Acknowledgements", "Dedications", "Endorsements", or "History".) |
| To "Preserve the Title" of such a section when you modify the |
| Document means that it remains a section "Entitled XYZ" according |
| to this definition. |
| |
| The Document may include Warranty Disclaimers next to the notice |
| which states that this License applies to the Document. These |
| Warranty Disclaimers are considered to be included by reference in |
| this License, but only as regards disclaiming warranties: any other |
| implication that these Warranty Disclaimers may have is void and |
| has no effect on the meaning of this License. |
| |
| 2. VERBATIM COPYING |
| |
| You may copy and distribute the Document in any medium, either |
| commercially or noncommercially, provided that this License, the |
| copyright notices, and the license notice saying this License |
| applies to the Document are reproduced in all copies, and that you |
| add no other conditions whatsoever to those of this License. You |
| may not use technical measures to obstruct or control the reading |
| or further copying of the copies you make or distribute. However, |
| you may accept compensation in exchange for copies. If you |
| distribute a large enough number of copies you must also follow |
| the conditions in section 3. |
| |
| You may also lend copies, under the same conditions stated above, |
| and you may publicly display copies. |
| |
| 3. COPYING IN QUANTITY |
| |
| If you publish printed copies (or copies in media that commonly |
| have printed covers) of the Document, numbering more than 100, and |
| the Document's license notice requires Cover Texts, you must |
| enclose the copies in covers that carry, clearly and legibly, all |
| these Cover Texts: Front-Cover Texts on the front cover, and |
| Back-Cover Texts on the back cover. Both covers must also clearly |
| and legibly identify you as the publisher of these copies. The |
| front cover must present the full title with all words of the |
| title equally prominent and visible. You may add other material |
| on the covers in addition. Copying with changes limited to the |
| covers, as long as they preserve the title of the Document and |
| satisfy these conditions, can be treated as verbatim copying in |
| other respects. |
| |
| If the required texts for either cover are too voluminous to fit |
| legibly, you should put the first ones listed (as many as fit |
| reasonably) on the actual cover, and continue the rest onto |
| adjacent pages. |
| |
| If you publish or distribute Opaque copies of the Document |
| numbering more than 100, you must either include a |
| machine-readable Transparent copy along with each Opaque copy, or |
| state in or with each Opaque copy a computer-network location from |
| which the general network-using public has access to download |
| using public-standard network protocols a complete Transparent |
| copy of the Document, free of added material. If you use the |
| latter option, you must take reasonably prudent steps, when you |
| begin distribution of Opaque copies in quantity, to ensure that |
| this Transparent copy will remain thus accessible at the stated |
| location until at least one year after the last time you |
| distribute an Opaque copy (directly or through your agents or |
| retailers) of that edition to the public. |
| |
| It is requested, but not required, that you contact the authors of |
| the Document well before redistributing any large number of |
| copies, to give them a chance to provide you with an updated |
| version of the Document. |
| |
| 4. MODIFICATIONS |
| |
| You may copy and distribute a Modified Version of the Document |
| under the conditions of sections 2 and 3 above, provided that you |
| release the Modified Version under precisely this License, with |
| the Modified Version filling the role of the Document, thus |
| licensing distribution and modification of the Modified Version to |
| whoever possesses a copy of it. In addition, you must do these |
| things in the Modified Version: |
| |
| A. Use in the Title Page (and on the covers, if any) a title |
| distinct from that of the Document, and from those of |
| previous versions (which should, if there were any, be listed |
| in the History section of the Document). You may use the |
| same title as a previous version if the original publisher of |
| that version gives permission. |
| |
| B. List on the Title Page, as authors, one or more persons or |
| entities responsible for authorship of the modifications in |
| the Modified Version, together with at least five of the |
| principal authors of the Document (all of its principal |
| authors, if it has fewer than five), unless they release you |
| from this requirement. |
| |
| C. State on the Title page the name of the publisher of the |
| Modified Version, as the publisher. |
| |
| D. Preserve all the copyright notices of the Document. |
| |
| E. Add an appropriate copyright notice for your modifications |
| adjacent to the other copyright notices. |
| |
| F. Include, immediately after the copyright notices, a license |
| notice giving the public permission to use the Modified |
| Version under the terms of this License, in the form shown in |
| the Addendum below. |
| |
| G. Preserve in that license notice the full lists of Invariant |
| Sections and required Cover Texts given in the Document's |
| license notice. |
| |
| H. Include an unaltered copy of this License. |
| |
| I. Preserve the section Entitled "History", Preserve its Title, |
| and add to it an item stating at least the title, year, new |
| authors, and publisher of the Modified Version as given on |
| the Title Page. If there is no section Entitled "History" in |
| the Document, create one stating the title, year, authors, |
| and publisher of the Document as given on its Title Page, |
| then add an item describing the Modified Version as stated in |
| the previous sentence. |
| |
| J. Preserve the network location, if any, given in the Document |
| for public access to a Transparent copy of the Document, and |
| likewise the network locations given in the Document for |
| previous versions it was based on. These may be placed in |
| the "History" section. You may omit a network location for a |
| work that was published at least four years before the |
| Document itself, or if the original publisher of the version |
| it refers to gives permission. |
| |
| K. For any section Entitled "Acknowledgements" or "Dedications", |
| Preserve the Title of the section, and preserve in the |
| section all the substance and tone of each of the contributor |
| acknowledgements and/or dedications given therein. |
| |
| L. Preserve all the Invariant Sections of the Document, |
| unaltered in their text and in their titles. Section numbers |
| or the equivalent are not considered part of the section |
| titles. |
| |
| M. Delete any section Entitled "Endorsements". Such a section |
| may not be included in the Modified Version. |
| |
| N. Do not retitle any existing section to be Entitled |
| "Endorsements" or to conflict in title with any Invariant |
| Section. |
| |
| O. Preserve any Warranty Disclaimers. |
| |
| If the Modified Version includes new front-matter sections or |
| appendices that qualify as Secondary Sections and contain no |
| material copied from the Document, you may at your option |
| designate some or all of these sections as invariant. To do this, |
| add their titles to the list of Invariant Sections in the Modified |
| Version's license notice. These titles must be distinct from any |
| other section titles. |
| |
| You may add a section Entitled "Endorsements", provided it contains |
| nothing but endorsements of your Modified Version by various |
| parties--for example, statements of peer review or that the text |
| has been approved by an organization as the authoritative |
| definition of a standard. |
| |
| You may add a passage of up to five words as a Front-Cover Text, |
| and a passage of up to 25 words as a Back-Cover Text, to the end |
| of the list of Cover Texts in the Modified Version. Only one |
| passage of Front-Cover Text and one of Back-Cover Text may be |
| added by (or through arrangements made by) any one entity. If the |
| Document already includes a cover text for the same cover, |
| previously added by you or by arrangement made by the same entity |
| you are acting on behalf of, you may not add another; but you may |
| replace the old one, on explicit permission from the previous |
| publisher that added the old one. |
| |
| The author(s) and publisher(s) of the Document do not by this |
| License give permission to use their names for publicity for or to |
| assert or imply endorsement of any Modified Version. |
| |
| 5. COMBINING DOCUMENTS |
| |
| You may combine the Document with other documents released under |
| this License, under the terms defined in section 4 above for |
| modified versions, provided that you include in the combination |
| all of the Invariant Sections of all of the original documents, |
| unmodified, and list them all as Invariant Sections of your |
| combined work in its license notice, and that you preserve all |
| their Warranty Disclaimers. |
| |
| The combined work need only contain one copy of this License, and |
| multiple identical Invariant Sections may be replaced with a single |
| copy. If there are multiple Invariant Sections with the same name |
| but different contents, make the title of each such section unique |
| by adding at the end of it, in parentheses, the name of the |
| original author or publisher of that section if known, or else a |
| unique number. Make the same adjustment to the section titles in |
| the list of Invariant Sections in the license notice of the |
| combined work. |
| |
| In the combination, you must combine any sections Entitled |
| "History" in the various original documents, forming one section |
| Entitled "History"; likewise combine any sections Entitled |
| "Acknowledgements", and any sections Entitled "Dedications". You |
| must delete all sections Entitled "Endorsements." |
| |
| 6. COLLECTIONS OF DOCUMENTS |
| |
| You may make a collection consisting of the Document and other |
| documents released under this License, and replace the individual |
| copies of this License in the various documents with a single copy |
| that is included in the collection, provided that you follow the |
| rules of this License for verbatim copying of each of the |
| documents in all other respects. |
| |
| You may extract a single document from such a collection, and |
| distribute it individually under this License, provided you insert |
| a copy of this License into the extracted document, and follow |
| this License in all other respects regarding verbatim copying of |
| that document. |
| |
| 7. AGGREGATION WITH INDEPENDENT WORKS |
| |
| A compilation of the Document or its derivatives with other |
| separate and independent documents or works, in or on a volume of |
| a storage or distribution medium, is called an "aggregate" if the |
| copyright resulting from the compilation is not used to limit the |
| legal rights of the compilation's users beyond what the individual |
| works permit. When the Document is included in an aggregate, this |
| License does not apply to the other works in the aggregate which |
| are not themselves derivative works of the Document. |
| |
| If the Cover Text requirement of section 3 is applicable to these |
| copies of the Document, then if the Document is less than one half |
| of the entire aggregate, the Document's Cover Texts may be placed |
| on covers that bracket the Document within the aggregate, or the |
| electronic equivalent of covers if the Document is in electronic |
| form. Otherwise they must appear on printed covers that bracket |
| the whole aggregate. |
| |
| 8. TRANSLATION |
| |
| Translation is considered a kind of modification, so you may |
| distribute translations of the Document under the terms of section |
| 4. Replacing Invariant Sections with translations requires special |
| permission from their copyright holders, but you may include |
| translations of some or all Invariant Sections in addition to the |
| original versions of these Invariant Sections. You may include a |
| translation of this License, and all the license notices in the |
| Document, and any Warranty Disclaimers, provided that you also |
| include the original English version of this License and the |
| original versions of those notices and disclaimers. In case of a |
| disagreement between the translation and the original version of |
| this License or a notice or disclaimer, the original version will |
| prevail. |
| |
| If a section in the Document is Entitled "Acknowledgements", |
| "Dedications", or "History", the requirement (section 4) to |
| Preserve its Title (section 1) will typically require changing the |
| actual title. |
| |
| 9. TERMINATION |
| |
| You may not copy, modify, sublicense, or distribute the Document |
| except as expressly provided for under this License. Any other |
| attempt to copy, modify, sublicense or distribute the Document is |
| void, and will automatically terminate your rights under this |
| License. However, parties who have received copies, or rights, |
| from you under this License will not have their licenses |
| terminated so long as such parties remain in full compliance. |
| |
| 10. FUTURE REVISIONS OF THIS LICENSE |
| |
| The Free Software Foundation may publish new, revised versions of |
| the GNU Free Documentation License from time to time. Such new |
| versions will be similar in spirit to the present version, but may |
| differ in detail to address new problems or concerns. See |
| `http://www.gnu.org/copyleft/'. |
| |
| Each version of the License is given a distinguishing version |
| number. If the Document specifies that a particular numbered |
| version of this License "or any later version" applies to it, you |
| have the option of following the terms and conditions either of |
| that specified version or of any later version that has been |
| published (not as a draft) by the Free Software Foundation. If |
| the Document does not specify a version number of this License, |
| you may choose any version ever published (not as a draft) by the |
| Free Software Foundation. |
| |
| ADDENDUM: How to use this License for your documents |
| ==================================================== |
| |
| To use this License in a document you have written, include a copy of |
| the License in the document and put the following copyright and license |
| notices just after the title page: |
| |
| Copyright (C) YEAR YOUR NAME. |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 |
| or any later version published by the Free Software Foundation; |
| with no Invariant Sections, no Front-Cover Texts, and no Back-Cover |
| Texts. A copy of the license is included in the section entitled ``GNU |
| Free Documentation License''. |
| |
| If you have Invariant Sections, Front-Cover Texts and Back-Cover |
| Texts, replace the "with...Texts." line with this: |
| |
| with the Invariant Sections being LIST THEIR TITLES, with |
| the Front-Cover Texts being LIST, and with the Back-Cover Texts |
| being LIST. |
| |
| If you have Invariant Sections without Cover Texts, or some other |
| combination of the three, merge those two alternatives to suit the |
| situation. |
| |
| If your document contains nontrivial examples of program code, we |
| recommend releasing these examples in parallel under your choice of |
| free software license, such as the GNU General Public License, to |
| permit their use in free software. |
| |
| |
| File: libgomp.info, Node: Funding, Next: Index, Prev: GNU Free Documentation License, Up: Top |
| |
| Funding Free Software |
| ********************* |
| |
| If you want to have more free software a few years from now, it makes |
| sense for you to help encourage people to contribute funds for its |
| development. The most effective approach known is to encourage |
| commercial redistributors to donate. |
| |
| Users of free software systems can boost the pace of development by |
| encouraging for-a-fee distributors to donate part of their selling price |
| to free software developers--the Free Software Foundation, and others. |
| |
| The way to convince distributors to do this is to demand it and |
| expect it from them. So when you compare distributors, judge them |
| partly by how much they give to free software development. Show |
| distributors they must compete to be the one who gives the most. |
| |
| To make this approach work, you must insist on numbers that you can |
| compare, such as, "We will donate ten dollars to the Frobnitz project |
| for each disk sold." Don't be satisfied with a vague promise, such as |
| "A portion of the profits are donated," since it doesn't give a basis |
| for comparison. |
| |
| Even a precise fraction "of the profits from this disk" is not very |
| meaningful, since creative accounting and unrelated business decisions |
| can greatly alter what fraction of the sales price counts as profit. |
| If the price you pay is $50, ten percent of the profit is probably less |
| than a dollar; it might be a few cents, or nothing at all. |
| |
| Some redistributors do development work themselves. This is useful |
| too; but to keep everyone honest, you need to inquire how much they do, |
| and what kind. Some kinds of development make much more long-term |
| difference than others. For example, maintaining a separate version of |
| a program contributes very little; maintaining the standard version of a |
| program for the whole community contributes much. Easy new ports |
| contribute little, since someone else would surely do them; difficult |
| ports such as adding a new CPU to the GNU Compiler Collection |
| contribute more; major new features or packages contribute the most. |
| |
| By establishing the idea that supporting further development is "the |
| proper thing to do" when distributing free software for a fee, we can |
| assure a steady flow of resources into making more free software. |
| |
| Copyright (C) 1994 Free Software Foundation, Inc. |
| Verbatim copying and redistribution of this section is permitted |
| without royalty; alteration is not permitted. |
| |
| |
| File: libgomp.info, Node: Index, Prev: Funding, Up: Top |
| |
| Index |
| ***** |
| |
| [index] |
| * Menu: |
| |
| * Environment Variable <1>: OMP_NESTED. (line 6) |
| * Environment Variable <2>: OMP_DYNAMIC. (line 6) |
| * Environment Variable <3>: GOMP_STACKSIZE. (line 6) |
| * Environment Variable <4>: GOMP_CPU_AFFINITY. (line 6) |
| * Environment Variable <5>: OMP_WAIT_POLICY. (line 6) |
| * Environment Variable <6>: OMP_THREAD_LIMIT. (line 6) |
| * Environment Variable <7>: OMP_STACKSIZE. (line 6) |
| * Environment Variable <8>: OMP_MAX_ACTIVE_LEVELS. (line 6) |
| * Environment Variable <9>: OMP_SCHEDULE. (line 6) |
| * Environment Variable: OMP_NUM_THREADS. (line 6) |
| * FDL, GNU Free Documentation License: GNU Free Documentation License. |
| (line 6) |
| * Implementation specific setting <1>: OMP_NESTED. (line 6) |
| * Implementation specific setting <2>: OMP_NUM_THREADS. (line 6) |
| * Implementation specific setting <3>: OMP_SCHEDULE. (line 6) |
| * Implementation specific setting: GOMP_STACKSIZE. (line 6) |
| * Introduction: Top. (line 6) |
| |
| |
| |
| Tag Table: |
| Node: Top2037 |
| Node: Enabling OpenMP3231 |
| Node: Runtime Library Routines4016 |
| Node: omp_get_active_level6391 |
| Node: omp_get_ancestor_thread_num7082 |
| Node: omp_get_dynamic7996 |
| Node: omp_get_level8870 |
| Node: omp_get_max_active_levels9481 |
| Node: omp_get_max_threads10169 |
| Node: omp_get_nested10921 |
| Node: omp_get_num_procs11829 |
| Node: omp_get_num_threads12343 |
| Node: omp_get_schedule13413 |
| Node: omp_get_team_size14320 |
| Node: omp_get_thread_limit15278 |
| Node: omp_get_thread_num15897 |
| Node: omp_in_parallel16751 |
| Node: omp_set_dynamic17397 |
| Node: omp_set_max_active_levels18233 |
| Node: omp_set_nested18995 |
| Node: omp_set_num_threads19872 |
| Node: omp_set_schedule20710 |
| Node: omp_init_lock21754 |
| Node: omp_set_lock22404 |
| Node: omp_test_lock23253 |
| Node: omp_unset_lock24280 |
| Node: omp_destroy_lock25206 |
| Node: omp_init_nest_lock25876 |
| Node: omp_set_nest_lock26608 |
| Node: omp_test_nest_lock27517 |
| Node: omp_unset_nest_lock28615 |
| Node: omp_destroy_nest_lock29624 |
| Node: omp_get_wtick30372 |
| Node: omp_get_wtime30959 |
| Node: Environment Variables31742 |
| Node: OMP_DYNAMIC32803 |
| Node: OMP_MAX_ACTIVE_LEVELS33371 |
| Node: OMP_NESTED34008 |
| Node: OMP_NUM_THREADS34612 |
| Node: OMP_SCHEDULE35185 |
| Node: OMP_STACKSIZE35879 |
| Node: OMP_THREAD_LIMIT36704 |
| Node: OMP_WAIT_POLICY37297 |
| Node: GOMP_CPU_AFFINITY37862 |
| Node: GOMP_STACKSIZE39346 |
| Node: The libgomp ABI40156 |
| Node: Implementing MASTER construct40954 |
| Node: Implementing CRITICAL construct41367 |
| Node: Implementing ATOMIC construct42115 |
| Node: Implementing FLUSH construct42596 |
| Node: Implementing BARRIER construct42867 |
| Node: Implementing THREADPRIVATE construct43136 |
| Node: Implementing PRIVATE clause43788 |
| Node: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses44369 |
| Node: Implementing REDUCTION clause45684 |
| Node: Implementing PARALLEL construct46240 |
| Node: Implementing FOR construct47497 |
| Node: Implementing ORDERED construct49495 |
| Node: Implementing SECTIONS construct49801 |
| Node: Implementing SINGLE construct50567 |
| Node: Reporting Bugs51229 |
| Node: Copying51537 |
| Node: GNU Free Documentation License70747 |
| Node: Funding93158 |
| Node: Index95675 |
| |
| End Tag Table |