From 6fa0f98622376247dfcfcc13c909af9e74bede2d Mon Sep 17 00:00:00 2001 From: Pophale Date: Thu, 31 Mar 2016 18:07:55 -0400 Subject: [PATCH 001/583] Changing version from 1.3 to 1.5, adding DRAFT watermark. --- content/frontmatter.tex | 6 +++--- utils/defs.tex | 2 +- utils/packages.tex | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/frontmatter.tex b/content/frontmatter.tex index a25d056e7..3cca04d82 100644 --- a/content/frontmatter.tex +++ b/content/frontmatter.tex @@ -4,9 +4,9 @@ \pagestyle{fancy} \fancyhead{} \fancyhead[LE,LO]{\insertDocVersion} -%\fancyhead[CO,CE]{--- DRAFT ---} -%\SetWatermarkText{DRAFT} -%\SetWatermarkScale{1} +\fancyhead[CO,CE]{--- DRAFT ---} +\SetWatermarkText{DRAFT} +\SetWatermarkScale{1} \fancyfoot[CE,CO]{\thepage} %affects page numbering for the first pages, %except the first ToC page diff --git a/utils/defs.tex b/utils/defs.tex index 6fb14c151..1c381d397 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -29,7 +29,7 @@ \newcommand{\newtext}[1]{\textcolor{ForestGreen}{#1}} \newcommand{\oldtext}[1]{\textcolor{magenta}{\sout{#1}}} -\newcommand{\insertDocVersion}{1.3} +\newcommand{\insertDocVersion}{1.5} \newcommand{\OSH}{\emph{OpenSHMEM}} \newcommand{\openshmem}{{Open\-SHMEM}\xspace} \newcommand{\FUNC}[1]{\textit{#1}} diff --git a/utils/packages.tex b/utils/packages.tex index e7d591490..be96eff39 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -44,8 +44,8 @@ \usepackage{enumitem} \usepackage{framed} \usepackage{pbox} -%\usepackage{draftcopy} -%\usepackage{draftwatermark} +\usepackage{draftcopy} +\usepackage{draftwatermark} \usepackage{wrapfig} \usepackage{caption} \usepackage{subcaption} From 17575ce731761d3b222ff7815eeed7e9dc7f54ab Mon Sep 17 00:00:00 2001 From: Pophale Date: Mon, 4 Apr 2016 16:13:25 -0400 Subject: [PATCH 002/583] Addressing Issue #212, Draft Spec 1.5. --- content/backmatter.tex | 4 ++-- content/shmem_alltoall.tex | 6 +++--- content/shmem_alltoalls.tex | 4 ++-- content/shmem_reductions.tex | 22 +++++++++++----------- content/shmem_wait.tex | 4 ++-- utils/defs.tex | 2 ++ utils/packages.tex | 1 + 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 780464afb..ad52fff43 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -339,7 +339,7 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \FUNC{start\_pes} & 1.2 & Yes & \FUNC{shmem\_init} \\ \hline \FUNC{SHMEM\_PUT} & 1.2 & Yes & \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} \\ \hline \FUNC{SHMEM\_CACHE} & 1.3 & Yes & (none) \\ \hline - \_SHMEM\_* constants & 1.3 & Yes & (none) \\ \hline + \_SHMEM\_* constants & 1.3 & Yes & SHMEM\_* \\ \hline \hline \end{tabular} \end{center} @@ -354,7 +354,7 @@ \chapter{Changes to this Document}\label{sec:changelog} \section{Version 1.3} This section summarizes the changes from the \openshmem specification Version -1.2 to Version 1.3. Many major changes to the specification was introduced in Version 1.3. This includes non-blocking RMA operations, +1.2 to Version 1.3. Many major changes to the specification were introduced in Version 1.3. This includes non-blocking RMA operations, generic interfaces for various OpenSHMEM interfaces, atomic \FUNC{Put} and \FUNC{Get} operations, and Alltoall interfaces. diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index 19bc3213f..ad089db24 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -57,8 +57,8 @@ an element (32 bits or 64 bits) times \VAR{PE\_size}. The \VAR{source} object contains \VAR{PE\_size} blocks of data (the size of each block defined by \VAR{nelems}) and each block of data is sent to a different \ac{PE}. - \ac{PE} \VAR{i} sends the \VAR{j}th block of its \VAR{source} object to - \ac{PE} \VAR{j} and that block of data is placed in the \VAR{i}th block of + \ac{PE} \VAR{i} sends the \jth block of its \VAR{source} object to + \ac{PE} \VAR{j} and that block of data is placed in the \ith block of the \VAR{dest} object of \ac{PE} \VAR{j}. As with all \openshmem collective routines, this routine assumes @@ -101,7 +101,7 @@ This routine restores \VAR{pSync} to its original contents. Multiple calls to \openshmem\ routines that use the same \VAR{pSync} array do not require that \VAR{pSync} be reinitialized after the first call. - You must ensure the that the \VAR{pSync} array is not being updated by any + You must ensure that the \VAR{pSync} array is not being updated by any \ac{PE} in the \activeset{} while any of the \acp{PE} participates in processing of an \openshmem\ \FUNC{shmem\_alltoall} routine. Be careful to avoid these situations: If the \VAR{pSync} array is initialized at run time, diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index a23780ed9..500924456 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -63,8 +63,8 @@ in the \activeset{} exchanges \VAR{nelems} strided data elements of size 32 bits (for \FUNC{shmem\_alltoalls32}) or 64 bits (for \FUNC{shmem\_alltoalls64}) with all other \acp{PE} in the set. Both strides, \VAR{dst} and \VAR{sst}, must be greater - than or equal to \CONST{1}. The \VAR{sst}*\VAR{j}th block sent from \ac{PE} \VAR{i} to - \ac{PE} \VAR{j} is placed in the \VAR{dst}*\VAR{i}th block of the \VAR{dest} data object on + than or equal to \CONST{1}. The \VAR{sst}*\jth block sent from \ac{PE} \VAR{i} to + \ac{PE} \VAR{j} is placed in the \VAR{dst}*\ith block of the \VAR{dest} data object on \ac{PE} \VAR{j}. As with all \openshmem collective routines, these routines assume diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index fe05567ef..c9ed53875 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -7,10 +7,10 @@ \textbf{AND} \newline Performs a bitwise AND function across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} +void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_and_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_and_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longlong_and_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -22,13 +22,13 @@ \textbf{MAX} \newline Performs a maximum function reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} +void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_max_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); void shmem_float_max_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_max_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longdouble_max_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); void shmem_longlong_max_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -43,13 +43,13 @@ \textbf{MIN} \newline Performs a minimum function reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} +void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_min_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); void shmem_float_min_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_min_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longdouble_min_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); void shmem_longlong_min_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -66,13 +66,13 @@ \begin{Csynopsis} void shmem_complexd_sum_to_all(double complex *dest, const double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long |\mbox{*pSync);}| void shmem_complexf_sum_to_all(float complex *dest, const float complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); +void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_sum_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); void shmem_float_sum_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_sum_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride,int PE_size, long *pWrk, long *pSync); void shmem_longdouble_sum_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); void shmem_longlong_sum_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -91,13 +91,13 @@ \begin{Csynopsis} void shmem_complexd_prod_to_all(double complex *dest, const double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long |\mbox{*pSync);}| void shmem_complexf_prod_to_all(float complex *dest, const float complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); +void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_prod_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); void shmem_float_prod_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_prod_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longdouble_prod_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); void shmem_longlong_prod_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -114,10 +114,10 @@ \textbf{OR} \newline Performs a bitwise OR function reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} +void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_or_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_or_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longlong_or_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} @@ -129,10 +129,10 @@ \textbf{XOR}\newline Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} +void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_xor_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_long_xor_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); void shmem_longlong_xor_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 7985e5a85..afe631c1e 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{Csynopsis} +void shmem_short_wait(volatile short *ivar, short cmp_value); +void shmem_short_wait_until(volatile short *ivar, int cmp, short cmp_value); void shmem_int_wait(volatile int *ivar, int cmp_value); void shmem_int_wait_until(volatile int *ivar, int cmp, int cmp_value); void shmem_long_wait(volatile long *ivar, long cmp_value); void shmem_long_wait_until(volatile long *ivar, int cmp, long cmp_value); void shmem_longlong_wait(volatile long long *ivar, long long cmp_value); void shmem_longlong_wait_until(volatile long long *ivar, int cmp, long long cmp_value); -void shmem_short_wait(volatile short *ivar, short cmp_value); -void shmem_short_wait_until(volatile short *ivar, int cmp, short cmp_value); void shmem_wait(volatile long *ivar, long cmp_value); void shmem_wait_until(volatile long *ivar, int cmp, long cmp_value); \end{Csynopsis} diff --git a/utils/defs.tex b/utils/defs.tex index 1c381d397..fac87a40a 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -63,6 +63,8 @@ \newcommand{\activeset}{\textit{Active~set}\xspace} % why here and not others? \newcommand{\shmemprefix}{\textit{SHMEM\_}} \newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} +\newcommand{\ith}{${\textit{i}^{\text{\tiny th}}}$} +\newcommand{\jth}{${\textit{j}^{\text{\tiny th}}}$} \begin{acronym} \acro{RMA}{\emph{Remote Memory Access}} diff --git a/utils/packages.tex b/utils/packages.tex index be96eff39..7a7fa8907 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -13,6 +13,7 @@ \usepackage{listings} % note sure after here \usepackage{makeidx} +\usepackage{amsmath} \usepackage[UKenglish]{isodate} \usepackage{ifthen} \usepackage{textcomp} From 6638264fe2dca52df6f286ceb0e5ad1a04a95bbe Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 2 Jun 2016 08:39:29 -0700 Subject: [PATCH 003/583] Add SHMEM_SYNC_SIZE constant --- content/library_constants.tex | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/library_constants.tex b/content/library_constants.tex index b3ad2993e..738c7fbfd 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -9,6 +9,18 @@ \textbf{Constant} & \textbf{Description} \tabularnewline \hline +\hline +%new +\vtop{\hbox{\CorCpp:} +\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}} +\hbox{\strut \Fortran:} +\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} +& Length of a work array that can be used with any SHMEM collective +communication operation. The value of this constant is implementation +specific. Refer to the individual collective operations for more information +about the usage of this constant. Work arrays sized for specific operations may +consume less memory.\tabularnewline +%new \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} From 0f00043c941d5df8344637ecf752ab23d093aa8b Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 18 Jul 2016 14:45:52 -0400 Subject: [PATCH 004/583] Add changelog entry for SHMEM_SYNC_SIZE --- content/backmatter.tex | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index ad52fff43..8efcd64cf 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -351,6 +351,13 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \chapter{Changes to this Document}\label{sec:changelog} +\section{Version 1.4} + +\begin{itemize} + +\item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. + +\end{itemize} \section{Version 1.3} This section summarizes the changes from the \openshmem specification Version From e5e6b977f1fa3b965d5c5dd0c3243bbf3907db8b Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 1 Jun 2016 14:25:11 -0400 Subject: [PATCH 005/583] Remove volatile qualifiers in wait and lock API --- content/backmatter.tex | 10 ++++++++++ content/shmem_lock.tex | 6 +++--- content/shmem_wait.tex | 20 ++++++++++---------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index ad52fff43..e52f425f4 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -351,6 +351,16 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \chapter{Changes to this Document}\label{sec:changelog} +\section{Version 1.4} + +\begin{itemize} + +\item Volatile qualifiers were added to several API routines in version 1.3 of +the OpenSHMEM specification; however, they were later found to be unnecessary. +Thus, the \VAR{volatile} qualifier was removed from the \VAR{ivar} arguments to +\FUNC{shmem\_wait} routines and the \VAR{lock} arguments in the lock API. + +\end{itemize} \section{Version 1.3} This section summarizes the changes from the \openshmem specification Version diff --git a/content/shmem_lock.tex b/content/shmem_lock.tex index 07073645d..6bd462957 100644 --- a/content/shmem_lock.tex +++ b/content/shmem_lock.tex @@ -4,9 +4,9 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_clear_lock(volatile long *lock); -void shmem_set_lock(volatile long *lock); -int shmem_test_lock(volatile long *lock); +void shmem_clear_lock(long *lock); +void shmem_set_lock(long *lock); +int shmem_test_lock(long *lock); \end{Csynopsis} \begin{Fsynopsis} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index afe631c1e..831875600 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,16 +5,16 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_short_wait(volatile short *ivar, short cmp_value); -void shmem_short_wait_until(volatile short *ivar, int cmp, short cmp_value); -void shmem_int_wait(volatile int *ivar, int cmp_value); -void shmem_int_wait_until(volatile int *ivar, int cmp, int cmp_value); -void shmem_long_wait(volatile long *ivar, long cmp_value); -void shmem_long_wait_until(volatile long *ivar, int cmp, long cmp_value); -void shmem_longlong_wait(volatile long long *ivar, long long cmp_value); -void shmem_longlong_wait_until(volatile long long *ivar, int cmp, long long cmp_value); -void shmem_wait(volatile long *ivar, long cmp_value); -void shmem_wait_until(volatile long *ivar, int cmp, long cmp_value); +void shmem_short_wait(short *ivar, short cmp_value); +void shmem_short_wait_until(short *ivar, int cmp, short cmp_value); +void shmem_int_wait(int *ivar, int cmp_value); +void shmem_int_wait_until(int *ivar, int cmp, int cmp_value); +void shmem_long_wait(long *ivar, long cmp_value); +void shmem_long_wait_until(long *ivar, int cmp, long cmp_value); +void shmem_longlong_wait(long long *ivar, long long cmp_value); +void shmem_longlong_wait_until(long long *ivar, int cmp, long long cmp_value); +void shmem_wait(long *ivar, long cmp_value); +void shmem_wait_until(long *ivar, int cmp, long cmp_value); \end{Csynopsis} \begin{Fsynopsis} From c3c402d803859e64d518be2b88b6031d75994a21 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 15 Aug 2016 18:08:27 -0400 Subject: [PATCH 006/583] makefile: halt on error to support CI testing --- makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/makefile b/makefile index b19f46981..abbd9c385 100644 --- a/makefile +++ b/makefile @@ -5,21 +5,21 @@ all: ${TARGET}.pdf # it doesn't really need the .dvi, but this way all the refs are right %.pdf : %.dvi - pdflatex $* + pdflatex $(LATEXOPT) $* ${TARGET}.bbl: ${TARGET}.bib # in case we don't already have a .aux file listing citations # this should probably be a separate makefile target/dependency instead # of doing it every time... but *shrug* - pdflatex ${TARGET}.tex + pdflatex $(LATEXOPT) ${TARGET}.tex # get the citations out of the bibliography - bibtex ${TARGET} + bibtex $(TARGET) # do it again in case there are out-of-order cross-references - @pdflatex ${TARGET}.tex + @pdflatex $(LATEXOPT) ${TARGET}.tex #${TARGET}.dvi: ${TARGET}.bbl ${TARGET}.tex ${TARGET}.dvi: ${TARGET}.tex - @pdflatex ${TARGET}.tex + @pdflatex $(LATEXOPT) ${TARGET}.tex # shortcut, so we can say "make ps" ps: ${TARGET}.ps From 4066482ff702d266cd1a690a9b5011834c9b69f7 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 15 Aug 2016 17:58:59 -0400 Subject: [PATCH 007/583] Add Travis CI testing --- .travis.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..9948118dd --- /dev/null +++ b/.travis.yml @@ -0,0 +1,19 @@ +sudo: required +dist: trusty + +addons: + apt: + packages: + - texlive-latex-base + - texlive-latex-recommended + - texlive-latex-extra + - texlive-generic-recommended + - latex-xcolor + - texlive-fonts-recommended + - texlive-fonts-extra + +before_install: +install: +script: + - make LATEXOPT=-halt-on-error + - make clean From ea28d9f2af15513364a0dbabde91ef6e6a626989 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 15 Aug 2016 19:22:07 -0400 Subject: [PATCH 008/583] Update changelog to include ref to new constant --- content/backmatter.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 8efcd64cf..b8ef8962d 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -356,6 +356,7 @@ \section{Version 1.4} \begin{itemize} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. +\\See Section \ref{subsec:library_constants}. \end{itemize} From 6cc027af6df4ef1f64b98f72d2a2480b60f806fe Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 15 Aug 2016 20:27:42 -0400 Subject: [PATCH 009/583] Update changelog from 1.4 to 1.5 --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index b8ef8962d..0d1b258bb 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -351,7 +351,7 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \chapter{Changes to this Document}\label{sec:changelog} -\section{Version 1.4} +\section{Version 1.5} \begin{itemize} From c186bb8372a97382b5b318f7df88254b5f93f2b2 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 15 Aug 2016 20:47:38 -0400 Subject: [PATCH 010/583] Update collective routines ref in sync_size definition --- content/library_constants.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 738c7fbfd..7f7fda272 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -17,7 +17,7 @@ \hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} & Length of a work array that can be used with any SHMEM collective communication operation. The value of this constant is implementation -specific. Refer to the individual collective operations for more information +specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information about the usage of this constant. Work arrays sized for specific operations may consume less memory.\tabularnewline %new From ff0cec988c796f1594057b6b6ce8ad362a68dcdb Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 08:30:02 -0400 Subject: [PATCH 011/583] Fix duplicate ref and add reference from text --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..39b541492 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -53,7 +53,7 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} \vspace{0.1in} \end{minipage} -The following example shows a more complex \openshmem program that illustrates +The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex \openshmem program that illustrates the use of symmetric data objects. Note the declaration of the \VAR{static short dest} array and its use as the remote destination in \openshmem short \PUT. The use of the \VAR{static} keyword results in the \VAR{dest} array being @@ -68,7 +68,7 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{label=openshmem-hello,language=OSH2+C} +\numberedlisting{label=openshmem-hello-symmetric,language=OSH2+C} {example_code/writing_shmem_example.c} \outputlisting{language=bash,caption={Expected Output (4 processors)}} {example_code/writing_shmem_example.output} From 26653f0e76362716631cf7d2bcf750cb0eae0e13 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 09:58:52 -0400 Subject: [PATCH 012/583] Add/update captions and Listing refs in Annex A --- content/backmatter.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 39b541492..19cd8d4dd 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -34,9 +34,9 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{label=openshmem-hello,language=OSH2+C} +\numberedlisting{caption={``Hello World'' example program (C)},label=openshmem-hello,language=OSH2+C} {example_code/hello-openshmem.c} -\outputlisting{language=bash,caption={Expected Output (4 processors)}} +\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello} (4 processors)}} {example_code/hello-openshmem-c.output} \vspace{0.1in} \end{minipage} @@ -46,9 +46,9 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{label=openshmem-hello-f90,language=OSH2+F} +\numberedlisting{caption={``Hello World'' example program (Fortran)},label=openshmem-hello-f90,language=OSH2+F} {example_code/hello-openshmem.f90} -\outputlisting{language=bash,caption={Expected Output (4 processors)}} +\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello-f90} (4 processors)}} {example_code/hello-openshmem-f90.output} \vspace{0.1in} \end{minipage} @@ -68,9 +68,9 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{label=openshmem-hello-symmetric,language=OSH2+C} +\numberedlisting{caption={Symmetric data objects example program},label=openshmem-hello-symmetric,language=OSH2+C} {example_code/writing_shmem_example.c} -\outputlisting{language=bash,caption={Expected Output (4 processors)}} +\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello-symmetric} (4 processors)}} {example_code/writing_shmem_example.output} \vspace{0.1in} \end{minipage} From 11047b5ad37d680dd3a0d3d96050865b23be6c10 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 16:19:39 -0400 Subject: [PATCH 013/583] Added .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..13d85ac1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +chappage.txt +main_spec.aux +main_spec.idx +main_spec.log +main_spec.out +main_spec.pdf +main_spec.toc From 55784cd3315a360a693ed9a4d500176bc6173a93 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 17:21:23 -0400 Subject: [PATCH 014/583] Expanded RMA and AMO generic types; minor table reformatting for read/edit-ability --- content/atomics_intro.tex | 40 +++++++++++++-------------- content/rma_intro.tex | 58 ++++++++++++++++++++++++++------------- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 911fe3adb..9770e1919 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -29,19 +29,16 @@ \ac{AMO} routines each support the ``standard \ac{AMO} types’’ listed in Table \ref{stdamotypes}, except for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, and \FUNC{shmem\_swap}, which supports the ``extended \ac{AMO} types’’ listed in Table \ref{extamotypes}. +\newtext{Implementations may optionally support additional types.} \begin{table}[h] \begin{center} \begin{tabular}{|l|l|} \hline - \TYPE & \TYPENAME\\ - \hline - int & int\\ - \hline - long & long\\ - \hline - long long & longlong\\ - \hline + \TYPE & \TYPENAME \\ \hline + int & int \\ \hline + long & long \\ \hline + long long & longlong \\ \hline \end{tabular} \caption{Standard \ac{AMO} Types and Names} \label{stdamotypes} @@ -52,18 +49,21 @@ \begin{center} \begin{tabular}{|l|l|} \hline - \TYPE & \TYPENAME\\ - \hline - float & float\\ - \hline - double & double\\ - \hline - int & int\\ - \hline - long & long\\ - \hline - long long & longlong\\ - \hline + \TYPE & \TYPENAME \\ \hline + float & float \\ \hline + double & double \\ \hline + int & int \\ \hline + long & long \\ \hline + long long & longlong \\ \hline +%\newtext { + unsigned int & uint \\ \hline + unsigned long & ulong \\ \hline + unsigned long long & ulonglong \\ \hline + int32\_t & int32 \\ \hline + int64\_t & int64 \\ \hline + uint32\_t & uint32 \\ \hline + uint64\_t & uint64 \\ \hline +%} \end{tabular} \caption{Extended \ac{AMO} Types and Names} \label{extamotypes} diff --git a/content/rma_intro.tex b/content/rma_intro.tex index c06a23f93..97ba11c8b 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -16,33 +16,53 @@ one-sided communication interfaces via \Celev{} generic selection (\Celev{} \S6.5.1.1\footnote{Formally, the \Celev{} specification is ISO/IEC 9899:2011(E).}) for block, scalar, and block-strided put and get communication. -Such type-generic routines are supported for the ``standard \ac{RMA} types’’ +Such type-generic routines are supported for the +\newtext{% +C11 ``standard integer types'' (C11 \S6.2.5.7), +``real floating types'' (C11 \S6.2.5.10), and +``exact-width integer types'' (C11 \S7.20.1.1). +The C11 standard integer types, real floating types, and exact-width integer +types are collectively called the} ``standard \ac{RMA} types’’ identified in Table \ref{stdrmatypes}. +\newtext{Implementations may optionally support additional types.} \begin{table}[h] \begin{center} \begin{tabular}{|l|l|} \hline - \TYPE & \TYPENAME\\ - \hline - float & float\\ - \hline - double & double\\ - \hline - long double & longdouble\\ - \hline - char & char\\ - \hline - short & short\\ - \hline - int & int\\ - \hline - long & long\\ - \hline - long long & longlong\\ - \hline + \TYPE & \TYPENAME \\ \hline + float & float \\ \hline + double & double \\ \hline + long double & longdouble \\ \hline + char & char \\ \hline +%\newtext { + signed char & schar \\ \hline +%} + short & short \\ \hline + int & int \\ \hline + long & long \\ \hline + long long & longlong \\ \hline +%\newtext { + bool \footnotemark & bool \\ \hline + unsigned char & uchar \\ \hline + unsigned short & ushort \\ \hline + unsigned int & uint \\ \hline + unsigned long & ulong \\ \hline + unsigned long long & ulonglong \\ \hline + int8\_t & int8 \\ \hline + int16\_t & int16 \\ \hline + int32\_t & int32 \\ \hline + int64\_t & int64 \\ \hline + uint8\_t & uint8 \\ \hline + uint16\_t & uint16 \\ \hline + uint32\_t & uint32 \\ \hline + uint64\_t & uint64 \\ \hline +%} \end{tabular} \caption{Standard \ac{RMA} Types and Names} \label{stdrmatypes} \end{center} \end{table} + +\footnotetext{\newtext{In order to maintain compatibility between C and C++, +the C interface requires the \VAR{bool} macro as defined in stdbool.h.}} From 1c059a4c8b7b9cfb288f097d1f4cb7c38ccc1fcd Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 17:46:21 -0400 Subject: [PATCH 015/583] Ticket #222: Update SMA_* env-vars to SHMEM_* env-vars --- content/environment_variables.tex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/environment_variables.tex b/content/environment_variables.tex index 2463a5415..a073dfe51 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -3,6 +3,8 @@ the implementation. The implementations of the specification are free to define additional variables. Currently, the specification defines four environment variables. +\newtext{All environment variables that start with SMA\_* are deprecated, but +currently supported for backwards compatibility.} \medskip{} @@ -11,16 +13,16 @@ Variable & Value & Purpose\tabularnewline \hline \hline -\texttt{SMA\_VERSION} & any & print the library version at +\texttt{\oldtext{SMA}\newtext{SHMEM}\_VERSION} & any & print the library version at start-up\tabularnewline \hline -\texttt{SMA\_INFO} & any & print helpful text about all these environment +\texttt{\oldtext{SMA}\newtext{SHMEM}\_INFO} & any & print helpful text about all these environment variables\tabularnewline \hline -\texttt{SMA\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to +\texttt{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to allocate for symmetric heap\tabularnewline \hline -\texttt{SMA\_DEBUG} & any & enable debugging messages\tabularnewline +\texttt{\oldtext{SMA}\newtext{SHMEM}\_DEBUG} & any & enable debugging messages\tabularnewline \hline \end{tabular} From 55734c4b5236bcbc6878453b6af91ad907aa560d Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 17:47:01 -0400 Subject: [PATCH 016/583] Ticket #222: Update deprecation and change-log annex --- content/backmatter.tex | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..52a559963 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -340,7 +340,9 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \FUNC{SHMEM\_PUT} & 1.2 & Yes & \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} \\ \hline \FUNC{SHMEM\_CACHE} & 1.3 & Yes & (none) \\ \hline \_SHMEM\_* constants & 1.3 & Yes & SHMEM\_* \\ \hline - \hline +%\newtext{ + SMA\_* environment variables & 1.4 & Yes & SHMEM\_* \\ \hline +%} \end{tabular} \end{center} @@ -357,6 +359,10 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +% +\item \newtext{The \texttt{SMA\_}* environment variables were deprecated +and replaced with \texttt{SHMEM\_}* environment variables. +\\ See Section \ref{subsec:environment_variables}.} \end{itemize} From fcbeff8eea8f32051768b26417f75726435a8097 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 17:52:18 -0400 Subject: [PATCH 017/583] Issue #189: Update change-log annex --- content/backmatter.tex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..ed9366bc0 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -357,6 +357,9 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +% +\item \newtext{Expanded the type support for RMA and AMO operations. +\\ See Sections \ref{sec:rma} and \ref{sec:amo}.} \end{itemize} From 4b7a21f68dc3ace23f4a72bd6c05cf8183ce584a Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 18:12:09 -0400 Subject: [PATCH 018/583] Ticket #223: Add _Noreturn and [[noreturn]] to shmem_global_exit --- content/shmem_global_exit.tex | 8 ++++++++ utils/defs.tex | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 7ed12f9cc..69d601af3 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -4,6 +4,14 @@ \begin{apidefinition} +\begin{Cpp11synopsis} +[[noreturn]] void shmem_global_exit(int status); +\end{Cpp11synopsis} + +\begin{C11synopsis} +_Noreturn void shmem_global_exit(int status); +\end{C11synopsis} + \begin{Csynopsis} void shmem_global_exit(int status); \end{Csynopsis} diff --git a/utils/defs.tex b/utils/defs.tex index fac87a40a..cfb27e5b4 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -320,11 +320,17 @@ \end{description} } +\lstnewenvironment{Cpp11synopsis} +{ + \textbf{C++11:} + \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, + morekeywords={size_t, TYPE, noreturn}, aboveskip=0pt, belowskip=0pt}}{} + \lstnewenvironment{C11synopsis} { \textbf{C11:} - \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE}, aboveskip=0pt, belowskip=0pt,}}{} + \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, + morekeywords={size_t, TYPE, _Noreturn}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { From 5ce040d0d2b47cc25b95a70ee2a2b6c40ed693c1 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Thu, 18 Aug 2016 18:12:34 -0400 Subject: [PATCH 019/583] Ticket #223: Update change-log annex --- content/backmatter.tex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..e8d3cb94d 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -357,6 +357,10 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +% +\item \newtext{The C11 \textbf{\_Noreturn} function specifier and the C++11 +\textbf{noreturn} attribute were added to \FUNC{shmem\_global\_exit}. +\\ See Section \ref{subsec:shmem_global_exit}.} \end{itemize} From 4952addc6da27c300367079fcf7586d84b24f345 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 19 Aug 2016 12:35:59 -0400 Subject: [PATCH 020/583] Ticket 216: Add generic shmem_wait() text --- content/shmem_wait.tex | 21 +++++++++++---------- main_spec.tex | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index afe631c1e..58527f9a8 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -4,18 +4,19 @@ \begin{apidefinition} +\begin{C11synopsis} +void shmem_wait(volatile TYPE *ivar, TYPE cmp_value); +void shmem_wait_until(volatile TYPE *ivar, int cmp, TYPE cmp_value); +\end{C11synopsis} +where \TYPE{} is one of the point-to-point synchronization types specified by +Table \ref{p2psynctypes}. + \begin{Csynopsis} -void shmem_short_wait(volatile short *ivar, short cmp_value); -void shmem_short_wait_until(volatile short *ivar, int cmp, short cmp_value); -void shmem_int_wait(volatile int *ivar, int cmp_value); -void shmem_int_wait_until(volatile int *ivar, int cmp, int cmp_value); -void shmem_long_wait(volatile long *ivar, long cmp_value); -void shmem_long_wait_until(volatile long *ivar, int cmp, long cmp_value); -void shmem_longlong_wait(volatile long long *ivar, long long cmp_value); -void shmem_longlong_wait_until(volatile long long *ivar, int cmp, long long cmp_value); -void shmem_wait(volatile long *ivar, long cmp_value); -void shmem_wait_until(volatile long *ivar, int cmp, long cmp_value); +void shmem__wait(volatile TYPE *ivar, TYPE cmp_value); +void shmem__wait_until(volatile TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} +where \TYPE{} is one of the point-to-point synchronization types and has a +corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. \begin{Fsynopsis} CALL SHMEM_INT4_WAIT(ivar, cmp_value) diff --git a/main_spec.tex b/main_spec.tex index 60026e7a9..dd6a899c1 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -200,6 +200,31 @@ \subsection{Point-To-Point Synchronization Routines} for synchronization between two \ac{PE}s based on the value of a symmetric data object. +\newtext{% +Where appropriate compiler support is available, \openshmem provides +type-generic point-to-point synchronization interfaces via \Celev{} generic +selection. Such type-generic routines are supported for the +``point-to-point synchronization types'' identified in +Table~\ref{p2psynctypes}. Implementations may optionally support additional +types.% +} + +\begin{table}[h] + \begin{center} + \begin{tabular}{|l|l|} + \hline + \TYPE & \TYPENAME \\ \hline + short & short \\ \hline + int & int \\ \hline + long & long \\ \hline + long long & longlong \\ \hline + \end{tabular} + \caption{Point-to-Point Synchronization Types and Names} + \label{p2psynctypes} + \end{center} +\end{table} + + \subsubsection{\textbf{SHMEM\_WAIT}}\label{subsec:shmem_wait} \input{content/shmem_wait.tex} From 1ed9c38d6227b234d3415733fd8905e8f8d4f172 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 19 Aug 2016 12:36:49 -0400 Subject: [PATCH 021/583] Ticket #216: Update shmem_wait() examples --- content/shmem_wait.tex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 58527f9a8..af345eba1 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -108,7 +108,7 @@ \begin{apiexamples} \apifexample -{ The following call returns when variable ivar is not equal to 100:} +{ The following call returns when variable \VAR{ivar} is not equal to 100:} {./example_code/shmem_wait1_example.f90} {} @@ -119,7 +119,8 @@ {} \apicexample -{The following \CorCpp{} call waits until the sign bit in ivar is set by a +{The following \CorCpp{} call waits until the \oldtext{sign bit} +\newtext{value} in \VAR{ivar} is set \newtext{to be less than zero} by a transfer from a remote PE:} {./example_code/shmem_wait3_example.f90} {} From c524f76db84ae901cd19bbed07396fd621cc7311 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 19 Aug 2016 12:37:18 -0400 Subject: [PATCH 022/583] Ticket #216: Condense redundant table description --- content/shmem_wait.tex | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index af345eba1..99afc5633 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -73,15 +73,7 @@ The following \VAR{cmp} values are supported: }{CMP Value}{Comparison} -\CorCpp:\\ -\apitablerow{SHMEM\_CMP\_EQ }{ Equal} -\apitablerow{SHMEM\_CMP\_NE}{Not equal} -\apitablerow{SHMEM\_CMP\_GT}{Greater than} -\apitablerow{SHMEM\_CMP\_LE}{Less than or equal to} -\apitablerow{SHMEM\_CMP\_LT}{Less than} -\apitablerow{SHMEM\_CMP\_GE}{Greater than or equal to} -\\ -\Fortran:\\ +\CorCppFor:\\ \apitablerow{SHMEM\_CMP\_EQ }{ Equal} \apitablerow{SHMEM\_CMP\_NE}{Not equal} \apitablerow{SHMEM\_CMP\_GT}{Greater than} From 9d9421ce6fd75d4600d27e39b86c6d643b3946a7 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 19 Aug 2016 12:39:45 -0400 Subject: [PATCH 023/583] Ticket #216: Update change-log annex --- content/backmatter.tex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..377ff9856 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -357,6 +357,11 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +% +\newtext{% +\item Added type-generic interfaces for \FUNC{SHMEM\_WAIT}. +\\See Section \ref{subsec:shmem_wait}. +} \end{itemize} From f8beaf91f4d713e174f3483175de25c44b92bd7d Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 19 Aug 2016 14:36:19 -0400 Subject: [PATCH 024/583] Ticket #189: Added type-generic support for {size,ptrdiff,wchar,intptr,uintptr}_t. --- content/atomics_intro.tex | 5 +++++ content/rma_intro.tex | 20 +++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 9770e1919..48c214c21 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -63,6 +63,11 @@ int64\_t & int64 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline + wchar\_t & wchar \\ \hline + intptr\_t & intptr \\ \hline + uintptr\_t & uintptr \\ \hline %} \end{tabular} \caption{Extended \ac{AMO} Types and Names} diff --git a/content/rma_intro.tex b/content/rma_intro.tex index 97ba11c8b..96dda4a58 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -17,13 +17,14 @@ (\Celev{} \S6.5.1.1\footnote{Formally, the \Celev{} specification is ISO/IEC 9899:2011(E).}) for block, scalar, and block-strided put and get communication. Such type-generic routines are supported for the -\newtext{% -C11 ``standard integer types'' (C11 \S6.2.5.7), -``real floating types'' (C11 \S6.2.5.10), and -``exact-width integer types'' (C11 \S7.20.1.1). -The C11 standard integer types, real floating types, and exact-width integer -types are collectively called the} ``standard \ac{RMA} types’’ -identified in Table \ref{stdrmatypes}. +\newtext{\Celev{} +``standard integer types'' (\Celev{} \S6.2.5.7), +``real floating types'' (\Celev{} \S6.2.5.10), +``exact-width integer types'' (\Celev{} \S7.20.1.1), +``integer types capable of holding object pointers'' (\Celev{} \S7.20.1.4), +and the integer types defined in stddef.h (\Celev{} \S7.19), +which are collectively called the} ``standard \ac{RMA} types'' +\newtext{and are listed} \oldtext{identified} in Table \ref{stdrmatypes}. \newtext{Implementations may optionally support additional types.} \begin{table}[h] @@ -57,6 +58,11 @@ uint16\_t & uint16 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline + wchar\_t & wchar \\ \hline + intptr\_t & intptr \\ \hline + uintptr\_t & uintptr \\ \hline %} \end{tabular} \caption{Standard \ac{RMA} Types and Names} From f4535285c09dffd8e0accdf6eebbbb7f7af1acbf Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 5 Oct 2016 11:23:15 -0400 Subject: [PATCH 025/583] Correct active set indexing error in a2a Buffer indexing in all-to-all collectives was incorrect for active sets that contain a subset of PEs. --- content/shmem_alltoall.tex | 6 ++++-- content/shmem_alltoalls.tex | 7 +++++-- utils/defs.tex | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index ad089db24..72eb24b7c 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -57,8 +57,10 @@ an element (32 bits or 64 bits) times \VAR{PE\_size}. The \VAR{source} object contains \VAR{PE\_size} blocks of data (the size of each block defined by \VAR{nelems}) and each block of data is sent to a different \ac{PE}. - \ac{PE} \VAR{i} sends the \jth block of its \VAR{source} object to - \ac{PE} \VAR{j} and that block of data is placed in the \ith block of + Given a \ac{PE} \VAR{i} that is the \kth PE in the active set and a \ac{PE} + \VAR{j} that is the \lth \ac{PE} in the active set, + \ac{PE} \VAR{i} sends the \lth block of its \VAR{source} object to + \ac{PE} \VAR{j} and that block of data is placed in the \kth block of the \VAR{dest} object of \ac{PE} \VAR{j}. As with all \openshmem collective routines, this routine assumes diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index 500924456..0d279f3e2 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -63,8 +63,11 @@ in the \activeset{} exchanges \VAR{nelems} strided data elements of size 32 bits (for \FUNC{shmem\_alltoalls32}) or 64 bits (for \FUNC{shmem\_alltoalls64}) with all other \acp{PE} in the set. Both strides, \VAR{dst} and \VAR{sst}, must be greater - than or equal to \CONST{1}. The \VAR{sst}*\jth block sent from \ac{PE} \VAR{i} to - \ac{PE} \VAR{j} is placed in the \VAR{dst}*\ith block of the \VAR{dest} data object on + than or equal to \CONST{1}. + Given a \ac{PE} \VAR{i} that is the \kth PE in the active set and a \ac{PE} + \VAR{j} that is the \lth \ac{PE} in the active set, + the \VAR{sst}*\lth block sent from \ac{PE} \VAR{i} to + \ac{PE} \VAR{j} is placed in the \VAR{dst}*\kth block of the \VAR{dest} data object on \ac{PE} \VAR{j}. As with all \openshmem collective routines, these routines assume diff --git a/utils/defs.tex b/utils/defs.tex index fac87a40a..7fdb8e8d8 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -65,6 +65,8 @@ \newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} \newcommand{\ith}{${\textit{i}^{\text{\tiny th}}}$} \newcommand{\jth}{${\textit{j}^{\text{\tiny th}}}$} +\newcommand{\kth}{${\textit{k}^{\text{\tiny th}}}$} +\newcommand{\lth}{${\textit{l}^{\text{\tiny th}}}$} \begin{acronym} \acro{RMA}{\emph{Remote Memory Access}} From 572fd5fbfda9e26ad14f54004d16d8c2a3934c20 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 12:36:15 -0400 Subject: [PATCH 026/583] Fix shmem_add_example.c --- example_code/shmem_add_example.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/shmem_add_example.c b/example_code/shmem_add_example.c index a94f0c5b6..d7c02c2c1 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_add_example.c @@ -14,7 +14,7 @@ int main(void) shmem_barrier_all(); if (me == 1){ - old = shmem_add(&dst, 44, 0); + old = shmem_int_fadd(&dst, 44, 0); } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); From 43c95f2ad8e080fe3d9171aebaf5de8008202cbc Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 15:13:08 -0400 Subject: [PATCH 027/583] Update shmem_add_example to use generic shmem_fadd --- example_code/shmem_add_example.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/shmem_add_example.c b/example_code/shmem_add_example.c index d7c02c2c1..f218c27ce 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_add_example.c @@ -14,7 +14,7 @@ int main(void) shmem_barrier_all(); if (me == 1){ - old = shmem_int_fadd(&dst, 44, 0); + old = shmem_fadd(&dst, 44, 0); } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); From eb2bac32d345d0af3aaa0b85e419db48d1ad249a Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 15:28:11 -0400 Subject: [PATCH 028/583] Fix missing finalize in cswap example --- example_code/shmem_cswap_example.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/shmem_cswap_example.c b/example_code/shmem_cswap_example.c index 54012fc46..8f1f88736 100644 --- a/example_code/shmem_cswap_example.c +++ b/example_code/shmem_cswap_example.c @@ -8,5 +8,5 @@ int main(void) shmem_init(); oldval = shmem_cswap(&race_winner, -1, shmem_my_pe(), 0); if(oldval == -1) printf("pe %d was first\n",shmem_my_pe()); - return 1; + shmem_finalize(); } From fc823e58c617287cd908fdfe040c9a1400f7bd98 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 16:13:01 -0400 Subject: [PATCH 029/583] Add missing calls to finalize, fix exit codes Update C examples to add missing calls to shmem_finalize, exit with status 0 on success and remove unnecessary barriers prior to exiting (these were required when exiting without calling finalize and are no longer needed). --- example_code/hello-openshmem.c | 1 + example_code/shmem_add_example.c | 1 + example_code/shmem_barrier_example.c | 1 + example_code/shmem_barrierall_example.c | 1 + example_code/shmem_broadcast_example.c | 1 + example_code/shmem_collect_example.c | 1 + example_code/shmem_cswap_example.c | 1 + example_code/shmem_fadd_example.c | 1 + example_code/shmem_fence_example.c | 3 ++- example_code/shmem_finc_example.c | 1 + example_code/shmem_g_example.c | 1 + example_code/shmem_global_exit_example.c | 1 + example_code/shmem_inc_example.c | 1 + example_code/shmem_iput_example.c | 2 +- example_code/shmem_lock_example.c | 2 +- example_code/shmem_mype_example.c | 1 + example_code/shmem_npes_example.c | 1 + example_code/shmem_p_example.c | 1 + example_code/shmem_ptr_example.c | 3 ++- example_code/shmem_put_example.c | 1 + example_code/shmem_quiet_example.c | 1 + example_code/shmem_swap_example.c | 1 + 22 files changed, 24 insertions(+), 4 deletions(-) diff --git a/example_code/hello-openshmem.c b/example_code/hello-openshmem.c index 8102cee6d..4d38a6699 100644 --- a/example_code/hello-openshmem.c +++ b/example_code/hello-openshmem.c @@ -10,5 +10,6 @@ main (int argc, char *argv[]) nprocs = shmem_n_pes (); me = shmem_my_pe (); printf ("Hello from %d of %d\n", me, nprocs); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_add_example.c b/example_code/shmem_add_example.c index f218c27ce..5395a748c 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_add_example.c @@ -18,5 +18,6 @@ int main(void) } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_barrier_example.c b/example_code/shmem_barrier_example.c index fb5d0eeb3..2ae3a2667 100644 --- a/example_code/shmem_barrier_example.c +++ b/example_code/shmem_barrier_example.c @@ -24,5 +24,6 @@ int main(void) shmem_barrier(0, 1, (npes/2 + npes%2), pSync); } printf("%d: x = %d\n", me, x); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_barrierall_example.c b/example_code/shmem_barrierall_example.c index 5e4f430a9..a27219021 100644 --- a/example_code/shmem_barrierall_example.c +++ b/example_code/shmem_barrierall_example.c @@ -17,5 +17,6 @@ int main(void) shmem_barrier_all(); printf("%d: x = %d\n", me, x); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_broadcast_example.c b/example_code/shmem_broadcast_example.c index 7fe7f7335..202ebc89b 100644 --- a/example_code/shmem_broadcast_example.c +++ b/example_code/shmem_broadcast_example.c @@ -27,5 +27,6 @@ int main(void) for (i = 1; i < NUM_ELEMS; i++) printf(", %ld", dest[i]); printf("\n"); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_collect_example.c b/example_code/shmem_collect_example.c index 219f65daa..05b3f05d3 100644 --- a/example_code/shmem_collect_example.c +++ b/example_code/shmem_collect_example.c @@ -27,5 +27,6 @@ int main(void) for (i = 1; i < npes * 2; i++) printf(", %d", dest[i]); printf("\n"); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_cswap_example.c b/example_code/shmem_cswap_example.c index 8f1f88736..6e49404a8 100644 --- a/example_code/shmem_cswap_example.c +++ b/example_code/shmem_cswap_example.c @@ -9,4 +9,5 @@ int main(void) oldval = shmem_cswap(&race_winner, -1, shmem_my_pe(), 0); if(oldval == -1) printf("pe %d was first\n",shmem_my_pe()); shmem_finalize(); + return 0; } diff --git a/example_code/shmem_fadd_example.c b/example_code/shmem_fadd_example.c index f218c27ce..5395a748c 100644 --- a/example_code/shmem_fadd_example.c +++ b/example_code/shmem_fadd_example.c @@ -18,5 +18,6 @@ int main(void) } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_fence_example.c b/example_code/shmem_fence_example.c index b5ddbaa88..cf6a5c513 100644 --- a/example_code/shmem_fence_example.c +++ b/example_code/shmem_fence_example.c @@ -18,5 +18,6 @@ int main(void) } shmem_barrier_all(); /* sync sender and receiver */ printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); - return 1; + shmem_finalize(); + return 0; } diff --git a/example_code/shmem_finc_example.c b/example_code/shmem_finc_example.c index b1cd94552..490378857 100644 --- a/example_code/shmem_finc_example.c +++ b/example_code/shmem_finc_example.c @@ -20,5 +20,6 @@ int main(void) shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_g_example.c b/example_code/shmem_g_example.c index fd31d98ff..905366714 100644 --- a/example_code/shmem_g_example.c +++ b/example_code/shmem_g_example.c @@ -17,5 +17,6 @@ int main(void) printf("%d: y = %ld\n", me, y); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_global_exit_example.c b/example_code/shmem_global_exit_example.c index 71c5f9fef..9432c34bf 100644 --- a/example_code/shmem_global_exit_example.c +++ b/example_code/shmem_global_exit_example.c @@ -24,5 +24,6 @@ main(void) fclose(fp); } + shmem_finalize(); return 0; } diff --git a/example_code/shmem_inc_example.c b/example_code/shmem_inc_example.c index f67243eaa..79272e23f 100644 --- a/example_code/shmem_inc_example.c +++ b/example_code/shmem_inc_example.c @@ -18,5 +18,6 @@ int main(void) shmem_barrier_all(); printf("%d: dst = %d\n", me, dst); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_iput_example.c b/example_code/shmem_iput_example.c index d5ce61fa1..109f391b7 100644 --- a/example_code/shmem_iput_example.c +++ b/example_code/shmem_iput_example.c @@ -17,6 +17,6 @@ int main(void) (int)dest[0], (int)dest[1], (int)dest[2], (int)dest[3], (int)dest[4] ); } - shmem_barrier_all(); /* sync before exiting */ + shmem_finalize(); /* sync before exiting */ return 0; } diff --git a/example_code/shmem_lock_example.c b/example_code/shmem_lock_example.c index 838e43ecf..c3dc773e3 100644 --- a/example_code/shmem_lock_example.c +++ b/example_code/shmem_lock_example.c @@ -17,6 +17,6 @@ int main(int argc, char **argv) sleep(slp); printf("%d: sleeping...done\n", me); shmem_clear_lock(&L); - shmem_barrier_all(); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_mype_example.c b/example_code/shmem_mype_example.c index 762d56a43..a3a53d1dc 100644 --- a/example_code/shmem_mype_example.c +++ b/example_code/shmem_mype_example.c @@ -9,5 +9,6 @@ int main(void) me = shmem_my_pe(); printf("My PE id is: %d\n", me); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_npes_example.c b/example_code/shmem_npes_example.c index 788abda7d..506d3b7c8 100644 --- a/example_code/shmem_npes_example.c +++ b/example_code/shmem_npes_example.c @@ -13,5 +13,6 @@ int main(void) printf("Number of PEs executing this program is: %d\n", npes); } + shmem_finalize(); return 0; } diff --git a/example_code/shmem_p_example.c b/example_code/shmem_p_example.c index 58be8331b..b9738d12d 100644 --- a/example_code/shmem_p_example.c +++ b/example_code/shmem_p_example.c @@ -23,5 +23,6 @@ int main(void) if (me == 1) printf("%s\n", (fabs (*f - e) < epsilon) ? "OK" : "FAIL"); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_ptr_example.c b/example_code/shmem_ptr_example.c index 217b26b61..54cc4ce46 100644 --- a/example_code/shmem_ptr_example.c +++ b/example_code/shmem_ptr_example.c @@ -27,5 +27,6 @@ int main(void) printf(" %d\n",bigd[i]); printf("\n"); } - return 1; + shmem_finalize(); + return 0; } diff --git a/example_code/shmem_put_example.c b/example_code/shmem_put_example.c index a61b56f63..43df0afd1 100644 --- a/example_code/shmem_put_example.c +++ b/example_code/shmem_put_example.c @@ -13,6 +13,7 @@ int main(void) } shmem_barrier_all(); /* sync sender and receiver */ printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); + shmem_finalize(); return 0; } diff --git a/example_code/shmem_quiet_example.c b/example_code/shmem_quiet_example.c index fb258a675..d65eb0669 100644 --- a/example_code/shmem_quiet_example.c +++ b/example_code/shmem_quiet_example.c @@ -27,6 +27,7 @@ int main(void) shmem_int_put(&targ, &src, 1, 2); /*put4*/ } shmem_barrier_all(); /* sync sender and receiver */ + shmem_finalize(); return 0; } diff --git a/example_code/shmem_swap_example.c b/example_code/shmem_swap_example.c index f47a35cd3..b78f64d16 100644 --- a/example_code/shmem_swap_example.c +++ b/example_code/shmem_swap_example.c @@ -19,5 +19,6 @@ int main(void) printf("%d: dest = %ld, swapped = %ld\n", me, *dest, swapped_val); } shmem_free(dest); + shmem_finalize(); return 0; } From 024181178bb71a7ce99222f00d1b199237c5f251 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 11:44:13 -0400 Subject: [PATCH 030/583] Add Makeile for examples --- example_code/Makefile | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 example_code/Makefile diff --git a/example_code/Makefile b/example_code/Makefile new file mode 100644 index 000000000..622090c79 --- /dev/null +++ b/example_code/Makefile @@ -0,0 +1,30 @@ +CC = oshcc +CFLAGS = -Wall -O3 + +FC = oshfort +FFLAGS = -Wall -O3 + +RUNCMD = oshrun +RUNOPT = -np 2 + +C_TESTS = $(wildcard *.c) +C_BINS = $(C_TESTS:.c=.cx) + +F_TESTS = $(wildcard *.f90) +F_BINS = $(F_TESTS:.f90=.fx) + +.PHONY: all run clean + +all: $(C_BINS) $(F_BINS) + +%.cx: %.c + $(CC) $(CFLAGS) -o $@ $+ + +%.fx: %.f90 + $(FC) $(FFLAGS) -o $@ $+ + +run: $(C_BINS) $(F_BINS) + for bin in $+; do $(RUNCMD) $(RUNOPT) ./$$bin; done + +clean: + rm -f $(C_BINS) $(F_BINS) From 81dc9e1904c1f4b122e109dd8064fe2b8bc80dc2 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 15:16:08 -0400 Subject: [PATCH 031/583] Update examples testing to break on error Update the Makefile used to test the examples to break when an example fails during 'make run'. --- example_code/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/Makefile b/example_code/Makefile index 622090c79..73b952d57 100644 --- a/example_code/Makefile +++ b/example_code/Makefile @@ -24,7 +24,7 @@ all: $(C_BINS) $(F_BINS) $(FC) $(FFLAGS) -o $@ $+ run: $(C_BINS) $(F_BINS) - for bin in $+; do $(RUNCMD) $(RUNOPT) ./$$bin; done + for bin in $+; do $(RUNCMD) $(RUNOPT) ./$$bin || exit $$?; done clean: rm -f $(C_BINS) $(F_BINS) From e1f96604b3bc585efca9ccc49a36e251176faa03 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 15:27:49 -0400 Subject: [PATCH 032/583] Improve output from 'make run' --- example_code/Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/example_code/Makefile b/example_code/Makefile index 73b952d57..3b82b9aff 100644 --- a/example_code/Makefile +++ b/example_code/Makefile @@ -23,8 +23,11 @@ all: $(C_BINS) $(F_BINS) %.fx: %.f90 $(FC) $(FFLAGS) -o $@ $+ -run: $(C_BINS) $(F_BINS) - for bin in $+; do $(RUNCMD) $(RUNOPT) ./$$bin || exit $$?; done +run: $(C_BINS) + @for bin in $+; do \ + echo --$$bin------------------------------; \ + $(RUNCMD) $(RUNOPT) ./$$bin || exit $$?; \ + done clean: rm -f $(C_BINS) $(F_BINS) From fb26f01c68805eacf499aed7cc1e587a92f3b50c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 16 Aug 2016 16:09:23 -0400 Subject: [PATCH 033/583] Update Makefile to run examples on 4 PEs Example shmem_fence_example.c requires at least 3 PEs. --- example_code/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/Makefile b/example_code/Makefile index 3b82b9aff..299f64dc9 100644 --- a/example_code/Makefile +++ b/example_code/Makefile @@ -5,7 +5,7 @@ FC = oshfort FFLAGS = -Wall -O3 RUNCMD = oshrun -RUNOPT = -np 2 +RUNOPT = -np 4 C_TESTS = $(wildcard *.c) C_BINS = $(C_TESTS:.c=.cx) From f6ec06fb40d1c96b012a0cc86a18c1850d5cc9ff Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 5 Oct 2016 20:20:48 -0400 Subject: [PATCH 034/583] Remove unused variable from global exit example --- example_code/shmem_global_exit_example.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example_code/shmem_global_exit_example.c b/example_code/shmem_global_exit_example.c index 9432c34bf..0f9847a75 100644 --- a/example_code/shmem_global_exit_example.c +++ b/example_code/shmem_global_exit_example.c @@ -5,12 +5,11 @@ int main(void) { - int me, npes; + int me; shmem_init(); me = shmem_my_pe(); - npes = shmem_n_pes(); if (me == 0) { FILE *fp = fopen("input.txt", "r"); From bcf264d5f2cd93060576a1eec3fab5eb27db6d92 Mon Sep 17 00:00:00 2001 From: "Pavel Shamis (Pasha)" Date: Wed, 21 Sep 2016 15:12:23 -0500 Subject: [PATCH 035/583] Semantics clarification for visibility ordering guarantees. Redmine issue http://www.openshmem.org/redmine/issues/169 Signed-off-by: Pavel Shamis (Pasha) --- content/backmatter.tex | 3 +++ content/shmem_barrier.tex | 5 +++++ content/shmem_barrier_all.tex | 5 ++++- content/shmem_fence.tex | 10 ++++++++-- content/shmem_quiet.tex | 7 +++++++ content/shmem_wait.tex | 5 ++++- 6 files changed, 31 insertions(+), 4 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..3efb24ea3 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -358,6 +358,9 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +{\color{blue} +\item Clarified ordering semantics of memory ordering, point-to-point synchronization and collective +synchronization routines.} \end{itemize} \section{Version 1.3} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 5c088ddb8..69a311fd0 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -69,6 +69,11 @@ If the \activeset does not change, \FUNC{shmem\_barrier} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization beyond that implied by \FUNC{shmem\_barrier} itself is necessary in this case. + + {\color{blue} + The \FUNC{shmem\_barrier} routine can be used to + portably ensure that memory access operations observe remote updates in the order + enforced by initiator PEs.} } \begin{apiexamples} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index c1bf5c0a4..bd86ca500 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -39,7 +39,10 @@ } \apinotes{ - None. + {\color{blue} + The \FUNC{shmem\_barrier\_all} routine can be used to + portably ensure that memory access operations observe remote updates in the order + enforced by initiator PEs.} } \begin{apiexamples} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 967b730af..2a0637fcd 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -32,8 +32,14 @@ } \apinotes{ - \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does - not guarantee completion of delivery. There is a subtle difference between + \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does not + guarantee completion of delivery. + {\color{blue} + \FUNC{shmem\_fence} also does not have an effect on the ordering between memory + accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, + \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee + ordering of its memory accesses.} + There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} guarantees completion of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects which makes the updates visible to all other diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 83df95543..a011716da 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -44,6 +44,13 @@ routines wait for the completion of outstanding writes (\PUT{}, \ac{AMO}, memory stores, and nonblocking \PUT{} and \GET{} routines) to symmetric data objects on all \acp{PE}. + + {\color{blue} + \FUNC{shmem\_quiet} does not have an effect on the ordering between memory + accesses issued by the target PE. + \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, \FUNC{shmem\_barrier}, + \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee + ordering of its memory accesses.} } \begin{apiexamples} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index afe631c1e..125d80794 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -93,7 +93,10 @@ } \apinotes{ - None. + {\color{blue} + The \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} routines can be used to + portably ensure that memory access operations observe remote updates in the order + enforced by the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} routines.} } \apiimpnotes{ From 0bab7f83d4fa53862f0e794d519b8eeae9d0db1f Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 6 Oct 2016 14:51:40 -0400 Subject: [PATCH 036/583] Fix int64_t in printf format string Replace "%ld" with '"%" PRId64', which is the safe way to print this type (and silences compiler warnings). --- example_code/shmem_alltoall_example.c | 5 +++-- example_code/shmem_alltoalls_example.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/example_code/shmem_alltoall_example.c b/example_code/shmem_alltoall_example.c index b29222626..392be2f7d 100644 --- a/example_code/shmem_alltoall_example.c +++ b/example_code/shmem_alltoall_example.c @@ -1,5 +1,6 @@ -#include #include +#include +#include long pSync[SHMEM_ALLTOALL_SYNC_SIZE]; @@ -35,7 +36,7 @@ int main(void) for (pe=0; pe #include +#include +#include long pSync[SHMEM_ALLTOALLS_SYNC_SIZE]; @@ -35,7 +36,7 @@ int main(void) for (pe=0; pe Date: Thu, 6 Oct 2016 15:03:41 -0400 Subject: [PATCH 037/583] Remove unnecessary barrier from shmem_quiet example --- example_code/shmem_quiet_example.c | 1 - 1 file changed, 1 deletion(-) diff --git a/example_code/shmem_quiet_example.c b/example_code/shmem_quiet_example.c index d65eb0669..e4abfaafb 100644 --- a/example_code/shmem_quiet_example.c +++ b/example_code/shmem_quiet_example.c @@ -26,7 +26,6 @@ int main(void) shmem_int_put(&targ, &src, 1, 1); /*put3*/ shmem_int_put(&targ, &src, 1, 2); /*put4*/ } - shmem_barrier_all(); /* sync sender and receiver */ shmem_finalize(); return 0; } From e40a1c44a8fad75956f49344b243e0dcfd1a384d Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 6 Oct 2016 15:09:44 -0400 Subject: [PATCH 038/583] Update shmem_add example to use shmem_add() --- example_code/shmem_add_example.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/example_code/shmem_add_example.c b/example_code/shmem_add_example.c index 5395a748c..b24da649e 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_add_example.c @@ -3,21 +3,20 @@ int main(void) { - int me, old; + int me; static int dst; shmem_init(); me = shmem_my_pe(); - old = -1; dst = 22; shmem_barrier_all(); if (me == 1){ - old = shmem_fadd(&dst, 44, 0); + shmem_add(&dst, 44, 0); } shmem_barrier_all(); - printf("%d: old = %d, dst = %d\n", me, old, dst); + printf("%d: dst = %d\n", me, dst); shmem_finalize(); return 0; } From 1907395c1dc1b9f187121da374a7b97f52316b83 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 6 Oct 2016 16:13:15 -0400 Subject: [PATCH 039/583] Update [CF]FLAGS defaults and allow override --- example_code/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_code/Makefile b/example_code/Makefile index 299f64dc9..c37cfc99f 100644 --- a/example_code/Makefile +++ b/example_code/Makefile @@ -1,8 +1,8 @@ CC = oshcc -CFLAGS = -Wall -O3 +CFLAGS ?= -Wall -Wextra FC = oshfort -FFLAGS = -Wall -O3 +FFLAGS ?= -Wall -Wextra RUNCMD = oshrun RUNOPT = -np 4 From ccac561f047b6b3faf95f1e4645941b37915a343 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 6 Oct 2016 18:57:21 -0400 Subject: [PATCH 040/583] Annex F: Clarified table and added deprecation rationale Credits to Tiffany Mintz for preparing these changes. --- content/backmatter.tex | 101 ++++++++++++++++++++++++++++++++++++----- utils/defs.tex | 1 + 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0d1b258bb..344ca94dd 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -316,6 +316,7 @@ \chapter{History of \openshmem}\label{sec:openshmem_history} \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} +\newtext{\section{Overview}} For the \openshmem Specification(s), deprecation is the process of identifying API that is supported but no longer recommended for use by program users. For \openshmem library users, said API \textbf{must} be supported until clearly @@ -325,25 +326,103 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} specification. \begin{center} +\scriptsize \begin{tabular}{|l|c|c|c|} \hline \textbf{Deprecated API} & \textbf{Deprecated Since} - & \textbf{Currently Supported(?)} & \textbf{Replaced By}\\ + & \shortstack{\textbf{\oldtext{Currently Supported(?)}} \\ \textbf{\newtext{Last Version Supported}}} + & \textbf{Replaced By}\\ \hline %There may be better table headings... - \FUNC{\_my\_pe} & 1.2 & Yes & \FUNC{shmem\_my\_pe} \\ \hline - \FUNC{\_num\_pes} & 1.2 & Yes & \FUNC{shmem\_n\_pes} \\ \hline - \FUNC{shmalloc} & 1.2 & Yes & \FUNC{shmem\_malloc} \\ \hline - \FUNC{shfree} & 1.2 & Yes & \FUNC{shmem\_free} \\ \hline - \FUNC{shrealloc} & 1.2 & Yes & \FUNC{shmem\_realloc} \\ \hline - \FUNC{shmemalign} & 1.2 & Yes & \FUNC{shmem\_align} \\ \hline - \FUNC{start\_pes} & 1.2 & Yes & \FUNC{shmem\_init} \\ \hline - \FUNC{SHMEM\_PUT} & 1.2 & Yes & \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} \\ \hline - \FUNC{SHMEM\_CACHE} & 1.3 & Yes & (none) \\ \hline - \_SHMEM\_* constants & 1.3 & Yes & SHMEM\_* \\ \hline + \FUNC{\_my\_pe} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \FUNC{\_num\_pes} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \FUNC{shmalloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \FUNC{shfree} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \FUNC{shrealloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \FUNC{shmemalign} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \FUNC{SHMEM\_PUT} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \oldtext{\FUNC{SHMEM\_CACHE}} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \oldtext{\_SHMEM\_* constants} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{SHMEM\_*} \\ \hline + \newtext{\_SHMEM\_SYNC\_VALUE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_SYNC\_VALUE}} \\ \hline + \newtext{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline + \newtext{\_SHMEM\_BCAST\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_BCAST\_SYNC\_SIZE}} \\ \hline + \newtext{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_COLLECT\_SYNC\_SIZE}} \\ \hline + \newtext{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_REDUCE\_SYNC\_SIZE}} \\ \hline + \newtext{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} \\ \hline + \newtext{\_SHMEM\_MAJOR\_VERSION} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MAJOR\_VERSION}} \\ \hline + \newtext{\_SHMEM\_MINOR\_VERSION} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MINOR\_VERSION}} \\ \hline + \newtext{\_SHMEM\_MAX\_NAME\_LEN} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MAX\_NAME\_LEN}} \\ \hline + \newtext{\_SHMEM\_VENDOR\_STRING} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_VENDOR\_STRING}} \\ \hline \hline \end{tabular} \end{center} +\color{ForestGreen} %% NEW TEXT :: START +\section{Deprecation Rationale} + +\subsection{\_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} The +\CorCpp functions \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, +\FUNC{shfree}, \FUNC{shrealloc} and \FUNC{shmemalign} were deprecated in order +to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard +prefix for all functions. + +\subsection{start\_pes} +The \CorCpp function \FUNC{start\_pes} includes an unnecessary initialization +argument that is remnant of historical \emph{SHMEM} implementations and no +longer reflects the requirements of modern \openshmem implementations. +Furthermore, the naming of \FUNC{start\_pes} does not include the standardized +\shmemprefixLC{} naming prefix. This function has been deprecated and +\openshmem users are encouraged to use +\hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} instead. + +\subsection{SHMEM\_PUT (Fortran API)} +The \Fortran{} function \FUNC{SHMEM\_PUT} is defined only for the \Fortran{} +\ac{API} and is semantically identical to \Fortran{} functions +\FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and +\FUNC{SHMEM\_PUT64} have defined equivalents in the \CorCpp interface, +\FUNC{SHMEM\_PUT} is ambiguous and has been deprecated. + +\subsection{SHMEM\_CACHE} +The \FUNC{SHMEM\_CACHE} \ac{API} +\begin{center} +\begin{tabular}{ll} + \CorCpp: & \Fortran: \\ + shmem\_clear\_cache\_inv & SHMEM\_CLEAR\_CACHE\_INV \\ + shmem\_set\_cache\_inv & SHMEM\_SET\_CACHE\_INV \\ + shmem\_set\_cache\_line\_inv & SHMEM\_SET\_CACHE\_LINE\_INV \\ + shmem\_udcflush & SHMEM\_UDCFLUSH \\ + shmem\_udcflush\_line & SHMEM\_UDCFLUSH\_LINE \\ + shmem\_clear\_cache\_line\_inv \\ +\end{tabular} +\end{center} +was originally implemented for systems with cache management instructions. +This API has largely gone unused as current system architectures are cache +coherent and do not require cache management instructions. Due to obsolete +functionality, \FUNC{SHMEM\_CACHE} has been deprecated. + +\subsection{\_SHMEM\_* constants} +The library constants +\begin{center} +\begin{tabular}{ll} + \_SHMEM\_SYNC\_VALUE & \_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE \\ + \_SHMEM\_BARRIER\_SYNC\_SIZE & \_SHMEM\_MAJOR\_VERSION \\ + \_SHMEM\_BCAST\_SYNC\_SIZE & \_SHMEM\_MINOR\_VERSION \\ + \_SHMEM\_COLLECT\_SYNC\_SIZE & \_SHMEM\_MAX\_NAME\_LEN \\ + \_SHMEM\_REDUCE\_SYNC\_SIZE & \_SHMEM\_VENDOR\_STRING \\ + \end{tabular} +\end{center} +do not adhere to the \Clang{} standard’s reserved identifiers and the \Cpp{} +standard’s reserved names. These constants have been deprecated and replaced +with corresponding constants that adhere to a naming convention that is +consistent for \CorCpp and \Fortran{} \openshmem library constants. +\color{black} %% NEW TEXT :: STOP + diff --git a/utils/defs.tex b/utils/defs.tex index fac87a40a..ce0b34e1d 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -62,6 +62,7 @@ \newcommand{\alltoalls}{\FUNC{SHMEM\_ALLTOALLS}} \newcommand{\activeset}{\textit{Active~set}\xspace} % why here and not others? \newcommand{\shmemprefix}{\textit{SHMEM\_}} +\newcommand{\shmemprefixLC}{\textit{shmem\_}} \newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} \newcommand{\ith}{${\textit{i}^{\text{\tiny th}}}$} \newcommand{\jth}{${\textit{j}^{\text{\tiny th}}}$} From cc8f4f12759542c1a60e0b4e56fb0e14fb381a40 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 6 Oct 2016 19:34:27 -0400 Subject: [PATCH 041/583] Annex F: Added \label --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 344ca94dd..ef0421d1a 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -316,7 +316,7 @@ \chapter{History of \openshmem}\label{sec:openshmem_history} \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} -\newtext{\section{Overview}} +\newtext{\section{Overview}\label{subsec:dep_overview}} For the \openshmem Specification(s), deprecation is the process of identifying API that is supported but no longer recommended for use by program users. For \openshmem library users, said API \textbf{must} be supported until clearly @@ -364,7 +364,7 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \end{center} \color{ForestGreen} %% NEW TEXT :: START -\section{Deprecation Rationale} +\section{Deprecation Rationale}\label{subsec:dep_rationale} \subsection{\_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} The \CorCpp functions \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, From 62697c8095074acf6adf5cdd1fc74021e3064c60 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 6 Oct 2016 19:57:38 -0400 Subject: [PATCH 042/583] Annex F: Added reference in changelog --- content/backmatter.tex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index ef0421d1a..0c732b0c8 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -436,6 +436,11 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. +% +\newtext{ +\item Clarified deprecation overview and added deprecation rationale in Annex F. +\\See Section \ref{sec:dep_api}. +} \end{itemize} From 2ee2604d7578ee9209405c38d4a0e04033d0d854 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 6 Oct 2016 21:17:34 -0400 Subject: [PATCH 043/583] Annex F: Text edits for Deprecation Rationale Includes feedback/changes from the OpenSHMEM Workshop 2016. --- content/backmatter.tex | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 0c732b0c8..b3478d6b1 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -402,9 +402,8 @@ \subsection{SHMEM\_CACHE} \end{tabular} \end{center} was originally implemented for systems with cache management instructions. -This API has largely gone unused as current system architectures are cache -coherent and do not require cache management instructions. Due to obsolete -functionality, \FUNC{SHMEM\_CACHE} has been deprecated. +This API has largely gone unused on cache-coherent system architectures. +\FUNC{SHMEM\_CACHE} has been deprecated. \subsection{\_SHMEM\_* constants} The library constants @@ -417,10 +416,10 @@ \subsection{\_SHMEM\_* constants} \_SHMEM\_REDUCE\_SYNC\_SIZE & \_SHMEM\_VENDOR\_STRING \\ \end{tabular} \end{center} -do not adhere to the \Clang{} standard’s reserved identifiers and the \Cpp{} -standard’s reserved names. These constants have been deprecated and replaced -with corresponding constants that adhere to a naming convention that is -consistent for \CorCpp and \Fortran{} \openshmem library constants. +do not adhere to the \Clang{} standard's reserved identifiers and the \Cpp{} +standard's reserved names. These constants have been deprecated and replaced +with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} +and \Fortran{} naming conventions. \color{black} %% NEW TEXT :: STOP @@ -572,7 +571,7 @@ \section{Version 1.1} This section summarizes the changes from the \openshmem specification Version 1.0 to the Version 1.1. A major change in this version is that it provides an accurate description of \openshmem interfaces so that they are in agreement with -the SGI specification. This version also explains \openshmem’s programming, +the SGI specification. This version also explains \openshmem's programming, memory, and execution model. The document was thoroughly changed to improve the readability of specification and usability of interfaces. The code examples were added to demonstrate the usability of API. Additionally, diagrams were From 4d0594014a8e045e637b0a0fdd2d0f5565a38a77 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 6 Oct 2016 21:29:37 -0400 Subject: [PATCH 044/583] Annex F: Added language identifiers; Reformat table whitespace --- content/backmatter.tex | 46 +++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index b3478d6b1..5f6e0f8db 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -329,25 +329,36 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \scriptsize \begin{tabular}{|l|c|c|c|} \hline - \textbf{Deprecated API} & \textbf{Deprecated Since} - & \shortstack{\textbf{\oldtext{Currently Supported(?)}} \\ \textbf{\newtext{Last Version Supported}}} - & \textbf{Replaced By}\\ - \hline %There may be better table headings... - \FUNC{\_my\_pe} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline - \FUNC{\_num\_pes} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline - \FUNC{shmalloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline - \FUNC{shfree} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline - \FUNC{shrealloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline - \FUNC{shmemalign} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline - \FUNC{SHMEM\_PUT} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \textbf{Deprecated API} + & \textbf{Deprecated Since} + & \shortstack{\textbf{\oldtext{Currently Supported(?)}} \\ \textbf{\newtext{Last Version Supported}}} + & \textbf{Replaced By} \\ + \hline + \newtext{\CorCpp:} \FUNC{\_my\_pe} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \newtext{\CorCpp:} \FUNC{\_num\_pes} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \newtext{\CorCpp:} \FUNC{shmalloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \newtext{\CorCpp:} \FUNC{shfree} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \newtext{\CorCpp:} \FUNC{shrealloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \newtext{\CorCpp:} \FUNC{shmemalign} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \newtext{\CorCpp:} \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \newtext{\Fortran:} \FUNC{SHMEM\_PUT} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline \oldtext{\FUNC{SHMEM\_CACHE}} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} + \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} + & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline \newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} + \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} + & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} + \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} + & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} + \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} + & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline + \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} + \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} + & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline \oldtext{\_SHMEM\_* constants} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{SHMEM\_*} \\ \hline \newtext{\_SHMEM\_SYNC\_VALUE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_SYNC\_VALUE}} \\ \hline \newtext{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline @@ -359,7 +370,6 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \newtext{\_SHMEM\_MINOR\_VERSION} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MINOR\_VERSION}} \\ \hline \newtext{\_SHMEM\_MAX\_NAME\_LEN} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \newtext{\_SHMEM\_VENDOR\_STRING} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_VENDOR\_STRING}} \\ \hline - \hline \end{tabular} \end{center} From 7e8aba66fb104f8b22e163254391ffebfdecb510 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 19 Oct 2016 20:04:17 -0400 Subject: [PATCH 045/583] Removed C++11 [[noreturn]] attribute for shmem_global_exit() --- content/backmatter.tex | 4 ++-- content/shmem_global_exit.tex | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index e8d3cb94d..19f63d8ff 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -358,8 +358,8 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % -\item \newtext{The C11 \textbf{\_Noreturn} function specifier and the C++11 -\textbf{noreturn} attribute were added to \FUNC{shmem\_global\_exit}. +\item \newtext{The C11 \textbf{\_Noreturn} function specifier was added to + \FUNC{shmem\_global\_exit}. \\ See Section \ref{subsec:shmem_global_exit}.} \end{itemize} diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 69d601af3..0b2b7b8bc 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -4,10 +4,6 @@ \begin{apidefinition} -\begin{Cpp11synopsis} -[[noreturn]] void shmem_global_exit(int status); -\end{Cpp11synopsis} - \begin{C11synopsis} _Noreturn void shmem_global_exit(int status); \end{C11synopsis} From 3d1da9363bceb9d0e0802a47fc264658b263dc6c Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 19 Oct 2016 20:07:39 -0400 Subject: [PATCH 046/583] Removed "volatile" type qualifier from generic shmem_wait() API --- content/shmem_wait.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 99afc5633..f191c6182 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_wait(volatile TYPE *ivar, TYPE cmp_value); -void shmem_wait_until(volatile TYPE *ivar, int cmp, TYPE cmp_value); +void shmem_wait(TYPE *ivar, TYPE cmp_value); +void shmem_wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem__wait(volatile TYPE *ivar, TYPE cmp_value); -void shmem__wait_until(volatile TYPE *ivar, int cmp, TYPE cmp_value); +void shmem__wait(TYPE *ivar, TYPE cmp_value); +void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. From 0879e7c97ae83c685e2cd578025eb89f613ad81e Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 19 Oct 2016 20:17:17 -0400 Subject: [PATCH 047/583] Ticket #222: Fixed missing changes for SMA->SHMEM_* env-vars --- content/shmem_malloc.tex | 2 +- content/shpalloc.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 35e845bfd..a17db4457 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -77,7 +77,7 @@ remains unchanged from the deprecated versions. The total size of the symmetric heap is determined at job startup. One can - adjust the size of the heap using the \CONST{SMA\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \CONST{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} environment variable (where available). The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines diff --git a/content/shpalloc.tex b/content/shpalloc.tex index beccfe774..b8c40af46 100644 --- a/content/shpalloc.tex +++ b/content/shpalloc.tex @@ -38,7 +38,7 @@ \apinotes{ The total size of the symmetric heap is determined at job startup. One may - adjust the size of the heap using the \CONST{SMA\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \CONST{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} environment variable (if available). } From fec3e55493b080507367f8506b3c898be12f2e11 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 19 Oct 2016 21:10:52 -0400 Subject: [PATCH 048/583] Ticket #189: Remove wchar_t support --- content/atomics_intro.tex | 5 ++--- content/rma_intro.tex | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 48c214c21..23767a0fb 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -63,11 +63,10 @@ int64\_t & int64 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline - size\_t & size \\ \hline - ptrdiff\_t & ptrdiff \\ \hline - wchar\_t & wchar \\ \hline intptr\_t & intptr \\ \hline uintptr\_t & uintptr \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline %} \end{tabular} \caption{Extended \ac{AMO} Types and Names} diff --git a/content/rma_intro.tex b/content/rma_intro.tex index 96dda4a58..a0fae3216 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -22,8 +22,9 @@ ``real floating types'' (\Celev{} \S6.2.5.10), ``exact-width integer types'' (\Celev{} \S7.20.1.1), ``integer types capable of holding object pointers'' (\Celev{} \S7.20.1.4), -and the integer types defined in stddef.h (\Celev{} \S7.19), -which are collectively called the} ``standard \ac{RMA} types'' +and the integer types \textit{size\_t} and \textit{ptrdiff\_t} defined in +stddef.h (\Celev{} \S7.19), which are collectively called the} +``standard \ac{RMA} types'' \newtext{and are listed} \oldtext{identified} in Table \ref{stdrmatypes}. \newtext{Implementations may optionally support additional types.} @@ -58,11 +59,10 @@ uint16\_t & uint16 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline - size\_t & size \\ \hline - ptrdiff\_t & ptrdiff \\ \hline - wchar\_t & wchar \\ \hline intptr\_t & intptr \\ \hline uintptr\_t & uintptr \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline %} \end{tabular} \caption{Standard \ac{RMA} Types and Names} From e395f77cbb88f905196121020ca7a11a8476b5e2 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 19 Oct 2016 21:17:56 -0400 Subject: [PATCH 049/583] Ticket #189: Add "note to implementers" for C/C++ and bool/_Bool --- content/rma_intro.tex | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/content/rma_intro.tex b/content/rma_intro.tex index a0fae3216..cd7f6a026 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -28,6 +28,17 @@ \newtext{and are listed} \oldtext{identified} in Table \ref{stdrmatypes}. \newtext{Implementations may optionally support additional types.} +\textbf{\newtext{Note to implementors:}} +\begin{itemize} +\item \newtext{% + In order to provide compatibility between C and C++, implementors may elect + to include a dependence on stdbool.h, which provides the macro \textit{bool}. + Alternatively, implementors may elect to avoid this dependence and use the + C99\footnote{Formally, the C99 specification is ISO/IEC 9899:1999(E), including amendments and corrections.} + \textit{\_Bool} type explicitly. + } +\end{itemize} + \begin{table}[h] \begin{center} \begin{tabular}{|l|l|} @@ -45,7 +56,7 @@ long & long \\ \hline long long & longlong \\ \hline %\newtext { - bool \footnotemark & bool \\ \hline + bool & bool \\ \hline unsigned char & uchar \\ \hline unsigned short & ushort \\ \hline unsigned int & uint \\ \hline @@ -69,6 +80,3 @@ \label{stdrmatypes} \end{center} \end{table} - -\footnotetext{\newtext{In order to maintain compatibility between C and C++, -the C interface requires the \VAR{bool} macro as defined in stdbool.h.}} From 95cab6e139f56be36c7026f128ca54cf5817d350 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 20 Oct 2016 17:31:51 -0400 Subject: [PATCH 050/583] Merge in wording improvement from RM212 --- content/shmem_alltoall.tex | 2 +- content/shmem_alltoalls.tex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index 72eb24b7c..153450c9b 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -60,7 +60,7 @@ Given a \ac{PE} \VAR{i} that is the \kth PE in the active set and a \ac{PE} \VAR{j} that is the \lth \ac{PE} in the active set, \ac{PE} \VAR{i} sends the \lth block of its \VAR{source} object to - \ac{PE} \VAR{j} and that block of data is placed in the \kth block of + the \kth block of the \VAR{dest} object of \ac{PE} \VAR{j}. As with all \openshmem collective routines, this routine assumes diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index 0d279f3e2..e24f02efb 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -66,8 +66,8 @@ than or equal to \CONST{1}. Given a \ac{PE} \VAR{i} that is the \kth PE in the active set and a \ac{PE} \VAR{j} that is the \lth \ac{PE} in the active set, - the \VAR{sst}*\lth block sent from \ac{PE} \VAR{i} to - \ac{PE} \VAR{j} is placed in the \VAR{dst}*\kth block of the \VAR{dest} data object on + \ac{PE} \VAR{i} sends the \VAR{sst}*\lth block of the \VAR{source} data object to + the \VAR{dst}*\kth block of the \VAR{dest} data object on \ac{PE} \VAR{j}. As with all \openshmem collective routines, these routines assume From 241fb5d104f8f789512c0a411572602576c30482 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 20 Oct 2016 17:36:40 -0400 Subject: [PATCH 051/583] Remove unnecessary comment in iput example --- example_code/shmem_iput_example.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/shmem_iput_example.c b/example_code/shmem_iput_example.c index 109f391b7..a37879c13 100644 --- a/example_code/shmem_iput_example.c +++ b/example_code/shmem_iput_example.c @@ -17,6 +17,6 @@ int main(void) (int)dest[0], (int)dest[1], (int)dest[2], (int)dest[3], (int)dest[4] ); } - shmem_finalize(); /* sync before exiting */ + shmem_finalize(); return 0; } From bf96ae140089f788128e56da051bf5a5120a0d8a Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 25 Oct 2016 20:32:06 -0400 Subject: [PATCH 052/583] Ticket #216: Removed \newtext and \oldtext highlighting --- content/backmatter.tex | 4 +--- content/shmem_wait.tex | 5 ++--- main_spec.tex | 4 +--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 377ff9856..b71fb57af 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -358,10 +358,8 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % -\newtext{% \item Added type-generic interfaces for \FUNC{SHMEM\_WAIT}. -\\See Section \ref{subsec:shmem_wait}. -} +\\ See Section \ref{subsec:shmem_wait}. \end{itemize} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index f191c6182..f500b8ce3 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -111,9 +111,8 @@ {} \apicexample -{The following \CorCpp{} call waits until the \oldtext{sign bit} -\newtext{value} in \VAR{ivar} is set \newtext{to be less than zero} by a -transfer from a remote PE:} +{The following \CorCpp{} call waits until the value in \VAR{ivar} is set to +be less than zero by a transfer from a remote PE:} {./example_code/shmem_wait3_example.f90} {} diff --git a/main_spec.tex b/main_spec.tex index dd6a899c1..996317c1c 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -200,14 +200,12 @@ \subsection{Point-To-Point Synchronization Routines} for synchronization between two \ac{PE}s based on the value of a symmetric data object. -\newtext{% Where appropriate compiler support is available, \openshmem provides type-generic point-to-point synchronization interfaces via \Celev{} generic selection. Such type-generic routines are supported for the ``point-to-point synchronization types'' identified in Table~\ref{p2psynctypes}. Implementations may optionally support additional -types.% -} +types. \begin{table}[h] \begin{center} From 5cad01eacd74a84e9ac029289cf95b6698b8b12c Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 25 Oct 2016 20:42:25 -0400 Subject: [PATCH 053/583] Ticket #222: Removed \newtext and \oldtext highlighting --- content/backmatter.tex | 8 +++----- content/environment_variables.tex | 13 ++++++------- content/shmem_malloc.tex | 2 +- content/shpalloc.tex | 2 +- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 52a559963..c2bd393d1 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -340,9 +340,7 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \FUNC{SHMEM\_PUT} & 1.2 & Yes & \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} \\ \hline \FUNC{SHMEM\_CACHE} & 1.3 & Yes & (none) \\ \hline \_SHMEM\_* constants & 1.3 & Yes & SHMEM\_* \\ \hline -%\newtext{ SMA\_* environment variables & 1.4 & Yes & SHMEM\_* \\ \hline -%} \end{tabular} \end{center} @@ -360,9 +358,9 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % -\item \newtext{The \texttt{SMA\_}* environment variables were deprecated -and replaced with \texttt{SHMEM\_}* environment variables. -\\ See Section \ref{subsec:environment_variables}.} +\item The \VAR{SMA\_}* environment variables were deprecated and replaced + with \VAR{SHMEM\_}* environment variables. +\\ See Section \ref{subsec:environment_variables}. \end{itemize} diff --git a/content/environment_variables.tex b/content/environment_variables.tex index a073dfe51..689c6ca3f 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -2,9 +2,8 @@ users to configure the \openshmem implementation, and receive information about the implementation. The implementations of the specification are free to define additional variables. Currently, the specification defines four environment -variables. -\newtext{All environment variables that start with SMA\_* are deprecated, but -currently supported for backwards compatibility.} +variables. All environment variables that start with \VAR{SMA\_*} are +deprecated, but currently supported for backwards compatibility. \medskip{} @@ -13,16 +12,16 @@ Variable & Value & Purpose\tabularnewline \hline \hline -\texttt{\oldtext{SMA}\newtext{SHMEM}\_VERSION} & any & print the library version at +\texttt{SHMEM\_VERSION} & any & print the library version at start-up\tabularnewline \hline -\texttt{\oldtext{SMA}\newtext{SHMEM}\_INFO} & any & print helpful text about all these environment +\texttt{SHMEM\_INFO} & any & print helpful text about all these environment variables\tabularnewline \hline -\texttt{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to +\texttt{SHMEM\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to allocate for symmetric heap\tabularnewline \hline -\texttt{\oldtext{SMA}\newtext{SHMEM}\_DEBUG} & any & enable debugging messages\tabularnewline +\texttt{SHMEM\_DEBUG} & any & enable debugging messages\tabularnewline \hline \end{tabular} diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index a17db4457..74df3fb1b 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -77,7 +77,7 @@ remains unchanged from the deprecated versions. The total size of the symmetric heap is determined at job startup. One can - adjust the size of the heap using the \CONST{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \CONST{SHMEM\_SYMMETRIC\_SIZE} environment variable (where available). The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines diff --git a/content/shpalloc.tex b/content/shpalloc.tex index b8c40af46..68f5b66d1 100644 --- a/content/shpalloc.tex +++ b/content/shpalloc.tex @@ -38,7 +38,7 @@ \apinotes{ The total size of the symmetric heap is determined at job startup. One may - adjust the size of the heap using the \CONST{\oldtext{SMA}\newtext{SHMEM}\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \CONST{SHMEM\_SYMMETRIC\_SIZE} environment variable (if available). } From a1aee8899a3aec9543e0491139590cc7420005be Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 25 Oct 2016 20:44:52 -0400 Subject: [PATCH 054/583] Ticket #223: Removed \newtext and \oldtext highlighting --- content/backmatter.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 19f63d8ff..ad4cb177e 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -358,9 +358,9 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % -\item \newtext{The C11 \textbf{\_Noreturn} function specifier was added to - \FUNC{shmem\_global\_exit}. -\\ See Section \ref{subsec:shmem_global_exit}.} +\item The C11 \textbf{\_Noreturn} function specifier was added to + \FUNC{shmem\_global\_exit}. +\\ See Section \ref{subsec:shmem_global_exit}. \end{itemize} From 91506fc40cfe7a2e7627b75060e8af4e3060fcc0 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 28 Nov 2016 10:14:40 -0500 Subject: [PATCH 055/583] Cleanup verbage in "changes" annex --- content/backmatter.tex | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 942632152..04c44d7e8 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -355,23 +355,25 @@ \section{Version 1.5} \begin{itemize} % -\item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. +\item Added the \VAR{SHMEM\_SYNC\_SIZE} constant. \\See Section \ref{subsec:library_constants}. % \item Added type-generic interfaces for \FUNC{SHMEM\_WAIT}. \\ See Section \ref{subsec:shmem_wait}. % -\item Volatile qualifiers were added to several API routines in version 1.3 of -the OpenSHMEM specification; however, they were later found to be unnecessary. -Thus, the \VAR{volatile} qualifier was removed from the \VAR{ivar} arguments to +\item Removed the \VAR{volatile} qualifiers from the \VAR{ivar} arguments to \FUNC{shmem\_wait} routines and the \VAR{lock} arguments in the lock API. +\emph{Rationale: Volatile qualifiers were added to several API routines in +version 1.3 of the OpenSHMEM specification; however, they were later found +to be unnecessary.} +\\ See Sections \ref{subsec:shmem_wait} and \ref{subsec:shmem_lock}. % -\item The \VAR{SMA\_}* environment variables were deprecated and replaced - with \VAR{SHMEM\_}* environment variables. +\item Deprecated the \VAR{SMA\_}* environment variables and added equivalent +\VAR{SHMEM\_}* environment variables. \\ See Section \ref{subsec:environment_variables}. % -\item The C11 \textbf{\_Noreturn} function specifier was added to - \FUNC{shmem\_global\_exit}. +\item Added the C11 \textbf{\_Noreturn} function specifier to +\FUNC{shmem\_global\_exit}. \\ See Section \ref{subsec:shmem_global_exit}. \end{itemize} From ac48d94e6db73b6bfbc89dbdf2433a9302c7fe48 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 28 Nov 2016 15:34:04 -0500 Subject: [PATCH 056/583] Update SHMEM_SYNC_SIZE constant listing List the constant once for all language bindings, instead of listing the same thing twice for C/C++ and Fortran. --- content/library_constants.tex | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 7f7fda272..4e2346f0d 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -11,10 +11,9 @@ \hline \hline %new -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} +\vspace{3mm} +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} & Length of a work array that can be used with any SHMEM collective communication operation. The value of this constant is implementation specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information From c2be71262c1a7e95b9c598ed71c35e232d758a4a Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 13 Dec 2016 13:38:01 -0500 Subject: [PATCH 057/583] Updated "complex" to "_Complex" --- content/backmatter.tex | 5 +++++ content/shmem_reductions.tex | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 942632152..f45ec6213 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -373,6 +373,11 @@ \section{Version 1.5} \item The C11 \textbf{\_Noreturn} function specifier was added to \FUNC{shmem\_global\_exit}. \\ See Section \ref{subsec:shmem_global_exit}. +% +\item Replaced the \textbf{complex} macro in complex-typed reductions with the + C99 (and later) type specifier \textbf{\_Complex} to remove an implicit + dependence on complex.h. +\\ See Section \ref{subsec:shmem_reductions}. \end{itemize} diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index c9ed53875..af4492d17 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -64,8 +64,8 @@ \textbf{SUM} \newline Performs a sum reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} -void shmem_complexd_sum_to_all(double complex *dest, const double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long |\mbox{*pSync);}| -void shmem_complexf_sum_to_all(float complex *dest, const float complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); +void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| +void shmem_complexf_sum_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_sum_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); @@ -89,8 +89,8 @@ \textbf{PROD} \newline Performs a product reduction across a set of processing elements (\ac{PE}s).\newline \begin{Csynopsis} -void shmem_complexd_prod_to_all(double complex *dest, const double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long |\mbox{*pSync);}| -void shmem_complexf_prod_to_all(float complex *dest, const float complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); +void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| +void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_prod_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); From f992b5449ebaba494255388b04506ef0b8c57582 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 13 Dec 2016 15:47:16 -0500 Subject: [PATCH 058/583] Ticket #189: Expanded standard AMO types, removed bool from RMA types --- content/atomics_intro.tex | 14 +++++++++++--- content/backmatter.tex | 3 +++ content/rma_intro.tex | 29 ++--------------------------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 23767a0fb..0c927b3a7 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -29,7 +29,6 @@ \ac{AMO} routines each support the ``standard \ac{AMO} types’’ listed in Table \ref{stdamotypes}, except for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, and \FUNC{shmem\_swap}, which supports the ``extended \ac{AMO} types’’ listed in Table \ref{extamotypes}. -\newtext{Implementations may optionally support additional types.} \begin{table}[h] \begin{center} @@ -39,6 +38,17 @@ int & int \\ \hline long & long \\ \hline long long & longlong \\ \hline + unsigned int & uint \\ \hline + unsigned long & ulong \\ \hline + unsigned long long & ulonglong \\ \hline + int32\_t & int32 \\ \hline + int64\_t & int64 \\ \hline + uint32\_t & uint32 \\ \hline + uint64\_t & uint64 \\ \hline + intptr\_t & intptr \\ \hline + uintptr\_t & uintptr \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline \end{tabular} \caption{Standard \ac{AMO} Types and Names} \label{stdamotypes} @@ -55,7 +65,6 @@ int & int \\ \hline long & long \\ \hline long long & longlong \\ \hline -%\newtext { unsigned int & uint \\ \hline unsigned long & ulong \\ \hline unsigned long long & ulonglong \\ \hline @@ -67,7 +76,6 @@ uintptr\_t & uintptr \\ \hline size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline -%} \end{tabular} \caption{Extended \ac{AMO} Types and Names} \label{extamotypes} diff --git a/content/backmatter.tex b/content/backmatter.tex index 942632152..de31b65c6 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -373,6 +373,9 @@ \section{Version 1.5} \item The C11 \textbf{\_Noreturn} function specifier was added to \FUNC{shmem\_global\_exit}. \\ See Section \ref{subsec:shmem_global_exit}. +% +\item Expanded the type support for RMA and AMO operations. +\\ See Sections \ref{sec:rma} and \ref{sec:amo}. \end{itemize} diff --git a/content/rma_intro.tex b/content/rma_intro.tex index cd7f6a026..573371a7b 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -16,28 +16,8 @@ one-sided communication interfaces via \Celev{} generic selection (\Celev{} \S6.5.1.1\footnote{Formally, the \Celev{} specification is ISO/IEC 9899:2011(E).}) for block, scalar, and block-strided put and get communication. -Such type-generic routines are supported for the -\newtext{\Celev{} -``standard integer types'' (\Celev{} \S6.2.5.7), -``real floating types'' (\Celev{} \S6.2.5.10), -``exact-width integer types'' (\Celev{} \S7.20.1.1), -``integer types capable of holding object pointers'' (\Celev{} \S7.20.1.4), -and the integer types \textit{size\_t} and \textit{ptrdiff\_t} defined in -stddef.h (\Celev{} \S7.19), which are collectively called the} -``standard \ac{RMA} types'' -\newtext{and are listed} \oldtext{identified} in Table \ref{stdrmatypes}. -\newtext{Implementations may optionally support additional types.} - -\textbf{\newtext{Note to implementors:}} -\begin{itemize} -\item \newtext{% - In order to provide compatibility between C and C++, implementors may elect - to include a dependence on stdbool.h, which provides the macro \textit{bool}. - Alternatively, implementors may elect to avoid this dependence and use the - C99\footnote{Formally, the C99 specification is ISO/IEC 9899:1999(E), including amendments and corrections.} - \textit{\_Bool} type explicitly. - } -\end{itemize} +Such type-generic routines are supported for the ``standard \ac{RMA} types'' +listed in Table \ref{stdrmatypes}. \begin{table}[h] \begin{center} @@ -48,15 +28,11 @@ double & double \\ \hline long double & longdouble \\ \hline char & char \\ \hline -%\newtext { signed char & schar \\ \hline -%} short & short \\ \hline int & int \\ \hline long & long \\ \hline long long & longlong \\ \hline -%\newtext { - bool & bool \\ \hline unsigned char & uchar \\ \hline unsigned short & ushort \\ \hline unsigned int & uint \\ \hline @@ -74,7 +50,6 @@ uintptr\_t & uintptr \\ \hline size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline -%} \end{tabular} \caption{Standard \ac{RMA} Types and Names} \label{stdrmatypes} From d81868d43a990c3533240256f093a92f27a8102c Mon Sep 17 00:00:00 2001 From: James A Ross Date: Thu, 15 Dec 2016 16:52:07 -0500 Subject: [PATCH 059/583] Update shmem_barrier_example.c The previous code has non-deterministic behavior. The local value of x may be set to "x = 1000 + me" after the remote PE had set the x value to 4. Removing line 20 brings the code more in line with the shmem_barrierall example. --- example_code/shmem_barrier_example.c | 1 - 1 file changed, 1 deletion(-) diff --git a/example_code/shmem_barrier_example.c b/example_code/shmem_barrier_example.c index fb5d0eeb3..2de5d7537 100644 --- a/example_code/shmem_barrier_example.c +++ b/example_code/shmem_barrier_example.c @@ -17,7 +17,6 @@ int main(void) npes = shmem_n_pes(); if(me % 2 == 0){ - x = 1000 + me; /*put to next even PE in a circular fashion*/ shmem_int_p(&x, 4, (me+2)%npes); /*synchronize all even pes*/ From 2607390595a7b45541942ee2d398358225eee925 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 16 Dec 2016 11:57:05 -0500 Subject: [PATCH 060/583] Annex F: #202 Ratified: Removing change markers --- content/backmatter.tex | 80 +++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 5f6e0f8db..f949455ee 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -316,7 +316,7 @@ \chapter{History of \openshmem}\label{sec:openshmem_history} \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} -\newtext{\section{Overview}\label{subsec:dep_overview}} +\section{Overview}\label{subsec:dep_overview} For the \openshmem Specification(s), deprecation is the process of identifying API that is supported but no longer recommended for use by program users. For \openshmem library users, said API \textbf{must} be supported until clearly @@ -331,49 +331,46 @@ \chapter{\openshmem Specification and Deprecated API}\label{sec:dep_api} \hline \textbf{Deprecated API} & \textbf{Deprecated Since} - & \shortstack{\textbf{\oldtext{Currently Supported(?)}} \\ \textbf{\newtext{Last Version Supported}}} + & \shortstack{\textbf{Last Version Supported}} & \textbf{Replaced By} \\ \hline - \newtext{\CorCpp:} \FUNC{\_my\_pe} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline - \newtext{\CorCpp:} \FUNC{\_num\_pes} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline - \newtext{\CorCpp:} \FUNC{shmalloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline - \newtext{\CorCpp:} \FUNC{shfree} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline - \newtext{\CorCpp:} \FUNC{shrealloc} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline - \newtext{\CorCpp:} \FUNC{shmemalign} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \newtext{\CorCpp:} \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline - \newtext{\Fortran:} \FUNC{SHMEM\_PUT} & 1.2 & \oldtext{Yes}\newtext{Current} & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline - \oldtext{\FUNC{SHMEM\_CACHE}} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} - \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} - & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} - \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} - & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} - \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} - & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} - \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} - & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \shortstack[l]{\newtext{\CorCpp:} \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} - \\ \newtext{\Fortran:} \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} - & \newtext{1.3} & \newtext{Current} & \newtext{(none)} \\ \hline - \oldtext{\_SHMEM\_* constants} & \oldtext{1.3} & \oldtext{Yes} & \oldtext{SHMEM\_*} \\ \hline - \newtext{\_SHMEM\_SYNC\_VALUE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_SYNC\_VALUE}} \\ \hline - \newtext{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline - \newtext{\_SHMEM\_BCAST\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_BCAST\_SYNC\_SIZE}} \\ \hline - \newtext{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_COLLECT\_SYNC\_SIZE}} \\ \hline - \newtext{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_REDUCE\_SYNC\_SIZE}} \\ \hline - \newtext{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} \\ \hline - \newtext{\_SHMEM\_MAJOR\_VERSION} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MAJOR\_VERSION}} \\ \hline - \newtext{\_SHMEM\_MINOR\_VERSION} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MINOR\_VERSION}} \\ \hline - \newtext{\_SHMEM\_MAX\_NAME\_LEN} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_MAX\_NAME\_LEN}} \\ \hline - \newtext{\_SHMEM\_VENDOR\_STRING} & \newtext{1.3} & \newtext{Current} & \hyperref[subsec:library_constants]{\newtext{SHMEM\_VENDOR\_STRING}} \\ \hline + \CorCpp: \FUNC{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \CorCpp: \FUNC{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \CorCpp: \FUNC{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \CorCpp: \FUNC{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \CorCpp: \FUNC{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \CorCpp: \FUNC{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \CorCpp: \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \Fortran: \FUNC{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} + & 1.3 & Current & (none) \\ \hline + \CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} + & 1.3 & Current & (none) \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} + & 1.3 & Current & (none) \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} + & 1.3 & Current & (none) \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} + & 1.3 & Current & (none) \\ \hline + \_SHMEM\_SYNC\_VALUE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_SYNC\_VALUE} \\ \hline + \_SHMEM\_BARRIER\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_BARRIER\_SYNC\_SIZE} \\ \hline + \_SHMEM\_BCAST\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_BCAST\_SYNC\_SIZE} \\ \hline + \_SHMEM\_COLLECT\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_COLLECT\_SYNC\_SIZE} \\ \hline + \_SHMEM\_REDUCE\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_REDUCE\_SYNC\_SIZE} \\ \hline + \_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} \\ \hline + \_SHMEM\_MAJOR\_VERSION & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAJOR\_VERSION} \\ \hline + \_SHMEM\_MINOR\_VERSION & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MINOR\_VERSION} \\ \hline + \_SHMEM\_MAX\_NAME\_LEN & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAX\_NAME\_LEN} \\ \hline + \_SHMEM\_VENDOR\_STRING & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_VENDOR\_STRING} \\ \hline \end{tabular} \end{center} -\color{ForestGreen} %% NEW TEXT :: START \section{Deprecation Rationale}\label{subsec:dep_rationale} \subsection{\_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} The @@ -430,7 +427,6 @@ \subsection{\_SHMEM\_* constants} standard's reserved names. These constants have been deprecated and replaced with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran{} naming conventions. -\color{black} %% NEW TEXT :: STOP @@ -446,11 +442,9 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % -\newtext{ \item Clarified deprecation overview and added deprecation rationale in Annex F. \\See Section \ref{sec:dep_api}. -} - +% \end{itemize} \section{Version 1.3} From 30172ab9fe13208a214693404d30d6b7bfc2edb7 Mon Sep 17 00:00:00 2001 From: "Pavel Shamis (Pasha)" Date: Fri, 16 Dec 2016 13:25:16 -0600 Subject: [PATCH 061/583] Removing blue color marks Redmine issue http://www.openshmem.org/redmine/issues/169 Signed-off-by: Pavel Shamis (Pasha) --- content/backmatter.tex | 3 +-- content/shmem_barrier.tex | 3 +-- content/shmem_barrier_all.tex | 3 +-- content/shmem_fence.tex | 3 +-- content/shmem_quiet.tex | 3 +-- content/shmem_wait.tex | 3 +-- 6 files changed, 6 insertions(+), 12 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3efb24ea3..0624647d7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -358,9 +358,8 @@ \section{Version 1.5} \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. -{\color{blue} \item Clarified ordering semantics of memory ordering, point-to-point synchronization and collective -synchronization routines.} +synchronization routines. \end{itemize} \section{Version 1.3} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 69a311fd0..3c9456fa6 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -70,10 +70,9 @@ repeatedly with the same \VAR{pSync} array. No additional synchronization beyond that implied by \FUNC{shmem\_barrier} itself is necessary in this case. - {\color{blue} The \FUNC{shmem\_barrier} routine can be used to portably ensure that memory access operations observe remote updates in the order - enforced by initiator PEs.} + enforced by initiator PEs. } \begin{apiexamples} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index bd86ca500..31392247b 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -39,10 +39,9 @@ } \apinotes{ - {\color{blue} The \FUNC{shmem\_barrier\_all} routine can be used to portably ensure that memory access operations observe remote updates in the order - enforced by initiator PEs.} + enforced by initiator PEs. } \begin{apiexamples} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 2a0637fcd..c357bdd33 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -34,11 +34,10 @@ \apinotes{ \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does not guarantee completion of delivery. - {\color{blue} \FUNC{shmem\_fence} also does not have an effect on the ordering between memory accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee - ordering of its memory accesses.} + ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} guarantees completion of \PUT{}, \acp{AMO}, and memory store routines to diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index a011716da..32b6282be 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -45,12 +45,11 @@ memory stores, and nonblocking \PUT{} and \GET{} routines) to symmetric data objects on all \acp{PE}. - {\color{blue} \FUNC{shmem\_quiet} does not have an effect on the ordering between memory accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee - ordering of its memory accesses.} + ordering of its memory accesses. } \begin{apiexamples} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 125d80794..194f7ca1a 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -93,10 +93,9 @@ } \apinotes{ - {\color{blue} The \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} routines can be used to portably ensure that memory access operations observe remote updates in the order - enforced by the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} routines.} + enforced by the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} routines. } \apiimpnotes{ From d0a6ecd0836dc927684c7898158bd9a70d9fb1ad Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 19:16:15 +0000 Subject: [PATCH 062/583] Bug fix for race condition, removed barrier This patch fixes a race condition bug where the remote PE could update the local value before the PE initializes it. Also, by setting the initial value before shmem_init(), there is no need for an explicit barrier. So that has also been removed. --- example_code/shmem_add_example.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/example_code/shmem_add_example.c b/example_code/shmem_add_example.c index b24da649e..3867084b4 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_add_example.c @@ -3,18 +3,11 @@ int main(void) { - int me; - static int dst; - + static int dst = 22; shmem_init(); - me = shmem_my_pe(); - - dst = 22; - shmem_barrier_all(); - - if (me == 1){ + int me = shmem_my_pe(); + if (me == 1) shmem_add(&dst, 44, 0); - } shmem_barrier_all(); printf("%d: dst = %d\n", me, dst); shmem_finalize(); From a2f6f867558105ec1f87e3d86598e265e5fef2e8 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 19:23:48 +0000 Subject: [PATCH 063/583] Bug fix in printf output, removed barrier There was a bug in the printf output. The value should have be 'pe+me' not 'npes+pe'. An unnecessary explicit barrier was also removed. The formatting of the code was made consistent with other (4 to 3 spaces for a tab). The global sync array was made to static and a barrier is only needed to for initialization of source and destination arrays. The sync array is now initialized before the implicit barier in shmem_init(). --- example_code/shmem_alltoall_example.c | 81 +++++++++++++-------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/example_code/shmem_alltoall_example.c b/example_code/shmem_alltoall_example.c index 392be2f7d..13d11b75e 100644 --- a/example_code/shmem_alltoall_example.c +++ b/example_code/shmem_alltoall_example.c @@ -2,50 +2,45 @@ #include #include -long pSync[SHMEM_ALLTOALL_SYNC_SIZE]; - int main(void) { - int64_t *source, *dest; - int i, count, pe; - - shmem_init(); - - count = 2; - dest = (int64_t*) shmem_malloc(count * shmem_n_pes() * sizeof(int64_t)); - source = (int64_t*) shmem_malloc(count * shmem_n_pes() * sizeof(int64_t)); - - /* assign source values */ - for (pe=0; pe Date: Wed, 4 Jan 2017 19:28:50 +0000 Subject: [PATCH 064/583] Bug fix in printf, now strides, removed barrier There was a bug in the printf output. The value should have be 'pe+me' not 'npes+pe'. The code also did not demonstrate the strided all-to-all capability and did not improve upon the non-strided example. So strides are now used and results are verified. An unnecessary explicit barrier was also removed. The formatting of the code was made consistent with other (4 to 3 spaces for a tab). The global sync array was made to static and a barrier is only needed to for initialization of source and destination arrays. The sync array is now initialized before the implicit barier in shmem_init(). --- example_code/shmem_alltoalls_example.c | 84 +++++++++++++------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/example_code/shmem_alltoalls_example.c b/example_code/shmem_alltoalls_example.c index 128066edf..f78ff5687 100644 --- a/example_code/shmem_alltoalls_example.c +++ b/example_code/shmem_alltoalls_example.c @@ -2,50 +2,48 @@ #include #include -long pSync[SHMEM_ALLTOALLS_SYNC_SIZE]; - int main(void) { - int64_t *source, *dest; - int i, count, pe; - - shmem_init(); - - count = 2; - dest = (int64_t*) shmem_malloc(count * shmem_n_pes() * sizeof(int64_t)); - source = (int64_t*) shmem_malloc(count * shmem_n_pes() * sizeof(int64_t)); - - /* assign source values */ - for (pe=0; pe Date: Wed, 4 Jan 2017 19:32:37 +0000 Subject: [PATCH 065/583] Bug fix for non-deterministic behavior The previous code had non-deterministic behavior. The local value of x may be set after the remote PE sets the local value. Removing 'x = 1000 + me' brings the code in line with barrierall example The global sync array was made to static and is now initialized before the implicit barier in shmem_init(). --- example_code/shmem_barrier_example.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/example_code/shmem_barrier_example.c b/example_code/shmem_barrier_example.c index 2ae3a2667..5fa27bec4 100644 --- a/example_code/shmem_barrier_example.c +++ b/example_code/shmem_barrier_example.c @@ -1,27 +1,22 @@ #include #include -long pSync[SHMEM_BARRIER_SYNC_SIZE]; -int x = 10101; - int main(void) { - int i, me, npes; - - for (i = 0; i < SHMEM_BARRIER_SYNC_SIZE; i += 1){ + static int x = 10101; + static long pSync[SHMEM_BARRIER_SYNC_SIZE]; + for (int i = 0; i < SHMEM_BARRIER_SYNC_SIZE; i++) pSync[i] = SHMEM_SYNC_VALUE; - } shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); - if(me % 2 == 0){ - x = 1000 + me; - /*put to next even PE in a circular fashion*/ - shmem_int_p(&x, 4, (me+2)%npes); - /*synchronize all even pes*/ - shmem_barrier(0, 1, (npes/2 + npes%2), pSync); + if (me % 2 == 0) { + /* put to next even PE in a circular fashion */ + shmem_p(&x, 4, (me + 2) % npes); + /* synchronize all even pes */ + shmem_barrier(0, 1, (npes / 2 + npes % 2), pSync); } printf("%d: x = %d\n", me, x); shmem_finalize(); From dcc7cf60b422079cb51f765464e89e117d036c72 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 19:43:39 +0000 Subject: [PATCH 066/583] Removed unnecessary barrier The barrier is not necessary with early initialization. The global sync array was made to static and is now initialized before the implicit barrier in shmem_init(). --- example_code/shmem_broadcast_example.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/example_code/shmem_broadcast_example.c b/example_code/shmem_broadcast_example.c index 202ebc89b..a829448ea 100644 --- a/example_code/shmem_broadcast_example.c +++ b/example_code/shmem_broadcast_example.c @@ -2,31 +2,23 @@ #include #include -#define NUM_ELEMS 4 -long pSync[SHMEM_BCAST_SYNC_SIZE]; -long source[NUM_ELEMS], dest[NUM_ELEMS]; - int main(void) { - int i, me, npes; + static long pSync[SHMEM_BCAST_SYNC_SIZE]; + for (int i = 0; i < SHMEM_BCAST_SYNC_SIZE; i++) + pSync[i] = SHMEM_SYNC_VALUE; + static long source[4], dest[4]; shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); if (me == 0) - for (i = 0; i < NUM_ELEMS; i++) + for (int i = 0; i < 4; i++) source[i] = i; - for (i=0; i < SHMEM_BCAST_SYNC_SIZE; i++) { - pSync[i] = SHMEM_SYNC_VALUE; - } - shmem_barrier_all(); /* Wait for all PEs to initialize pSync */ - shmem_broadcast64(dest, source, NUM_ELEMS, 0, 0, 0, npes, pSync); - printf("%d: %ld", me, dest[0]); - for (i = 1; i < NUM_ELEMS; i++) - printf(", %ld", dest[i]); - printf("\n"); + shmem_broadcast64(dest, source, 4, 0, 0, 0, npes, pSync); + printf("%d: %ld, %ld, %ld, %ld\n", me, dest[0], dest[1], dest[2], dest[3]); shmem_finalize(); return 0; } From d4328cc216e4a16c6e1a159aa4e6fa0e4383f58c Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 19:49:34 +0000 Subject: [PATCH 067/583] Added variable nelems for shmem_collect32() The previous code used a constant number of elements per PE which is more of a demonstration of the shmem_fcollect32() routine, not shmem_collect32(). This patch now has a variable number of elements from each PE source with a deterministic result. The final output was also unreadable so a locking scheme is used. The global sync array was made to static and is now initialized before the implicit barrier in shmem_init(). Other formatting improvements are made --- example_code/shmem_collect_example.c | 38 ++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/example_code/shmem_collect_example.c b/example_code/shmem_collect_example.c index 05b3f05d3..c9d546c07 100644 --- a/example_code/shmem_collect_example.c +++ b/example_code/shmem_collect_example.c @@ -2,31 +2,37 @@ #include #include -long pSync[SHMEM_COLLECT_SYNC_SIZE]; -int source[2]; - int main(void) { - int i, me, npes; - int *dest; + static long lock = 0; + static long pSync[SHMEM_COLLECT_SYNC_SIZE]; + for (int i = 0; i < SHMEM_COLLECT_SYNC_SIZE; i++) + pSync[i] = SHMEM_SYNC_VALUE; shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); + int my_nelem = me + 1; /* linearly increasing number of elements with PE */ + int total_nelem = (npes * (npes + 1)) / 2; - source[0] = me * 2; - source[1] = me * 2 + 1; - dest = (int *)shmem_malloc(sizeof(int) * npes * 2); - for (i=0; i < SHMEM_COLLECT_SYNC_SIZE; i++) { - pSync[i] = SHMEM_SYNC_VALUE; - } - shmem_barrier_all(); /* Wait for all PEs to initialize pSync */ + int* source = (int*) shmem_malloc(npes*sizeof(int)); /* symmetric alloc */ + int* dest = (int*) shmem_malloc(total_nelem*sizeof(int)); + + for (int i = 0; i < my_nelem; i++) + source[i] = (me * (me + 1)) / 2 + i; + for (int i = 0; i < total_nelem; i++) + dest[i] = -9999; + + shmem_barrier_all(); /* Wait for all PEs to update source/dest */ + + shmem_collect32(dest, source, my_nelem, 0, 0, npes, pSync); - shmem_collect32(dest, source, 2, 0, 0, npes, pSync); + shmem_set_lock(&lock); printf("%d: %d", me, dest[0]); - for (i = 1; i < npes * 2; i++) + for (int i = 1; i < total_nelem; i++) printf(", %d", dest[i]); printf("\n"); + shmem_clear_lock(&lock); shmem_finalize(); return 0; } From 2219024e6bb383823019c1abab0233a915aaaa1f Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 19:55:23 +0000 Subject: [PATCH 068/583] Removed unnecessary barrier The global dst value is now a static value and initialized before the implicit barrier in shmem_init(). The explicit barrier could then be removed and simplifies the code. Additional C99 declaration/initialization is used. --- example_code/shmem_inc_example.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/example_code/shmem_inc_example.c b/example_code/shmem_inc_example.c index 79272e23f..a34a1a591 100644 --- a/example_code/shmem_inc_example.c +++ b/example_code/shmem_inc_example.c @@ -1,22 +1,14 @@ #include #include -int dst; - int main(void) { - int me; - + static int dst = 74; shmem_init(); - me = shmem_my_pe(); - - dst = 74; - shmem_barrier_all(); - + int me = shmem_my_pe(); if (me == 0) shmem_inc(&dst, 1); shmem_barrier_all(); - printf("%d: dst = %d\n", me, dst); shmem_finalize(); return 0; From b9b87e5136440d09a1deaf75014ec535ce6c9bf9 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:01:14 +0000 Subject: [PATCH 069/583] Formatting improvements The code used two instead of three spaces for indenting. The main prototype was also updated to be consistent with the other examples. Additional C99 declaration/initialization is used for simplicity. --- example_code/hello-openshmem.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/example_code/hello-openshmem.c b/example_code/hello-openshmem.c index 4d38a6699..488b97651 100644 --- a/example_code/hello-openshmem.c +++ b/example_code/hello-openshmem.c @@ -1,15 +1,12 @@ #include -#include /* The shmem header file */ +#include /* The shmem header file */ -int -main (int argc, char *argv[]) +int main (void) { - int nprocs, me; - - shmem_init (); - nprocs = shmem_n_pes (); - me = shmem_my_pe (); - printf ("Hello from %d of %d\n", me, nprocs); - shmem_finalize(); - return 0; + shmem_init(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); + printf("Hello from %d of %d\n", me, npes); + shmem_finalize(); + return 0; } From a8f5e838db3ad44c78bd599d0ea3c1f8904bd62d Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:03:20 +0000 Subject: [PATCH 070/583] Formatting, variable name improvements The variable L is renamed to 'lock' as this is a example of locking. The lock is also moved from global to static scope and initialized before the implicit barrier in shmem_init(). Additional C99 declaration/initialization is used. --- example_code/shmem_lock_example.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/example_code/shmem_lock_example.c b/example_code/shmem_lock_example.c index c3dc773e3..41999f7e4 100644 --- a/example_code/shmem_lock_example.c +++ b/example_code/shmem_lock_example.c @@ -1,22 +1,20 @@ #include #include #include -long L = 0; -int main(int argc, char **argv) +int main(void) { - int me, slp; + static long lock = 0; + int slp = 1; shmem_init(); - me = shmem_my_pe(); - slp = 1; - shmem_barrier_all(); + int me = shmem_my_pe(); if (me == 1) - sleep (3); - shmem_set_lock(&L); - printf("%d: sleeping %d second%s...\n", me, slp, slp == 1 ? "" : "s"); + sleep(3); + shmem_set_lock(&lock); + printf("%d: sleeping %d second(s)...\n", me, slp); sleep(slp); printf("%d: sleeping...done\n", me); - shmem_clear_lock(&L); + shmem_clear_lock(&lock); shmem_finalize(); return 0; } From 1ebae0e23d5acce9301f09b6b613eaed4b7c7077 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:08:32 +0000 Subject: [PATCH 071/583] Formatting improvements Comment and code spacing is now consistent with the other examples. C99 declaration/initialization used and global variables are now static in scope. --- example_code/shmem_barrierall_example.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/example_code/shmem_barrierall_example.c b/example_code/shmem_barrierall_example.c index a27219021..bf23be573 100644 --- a/example_code/shmem_barrierall_example.c +++ b/example_code/shmem_barrierall_example.c @@ -1,21 +1,19 @@ #include #include -int x=1010; - int main(void) { - int me, npes; + static int x = 1010; shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); - /*put to next PE in a circular fashion*/ - shmem_int_p(&x, 4, (me+1)%npes); - /*synchronize all PEs*/ - shmem_barrier_all(); + /* put to next PE in a circular fashion */ + shmem_p(&x, 4, (me + 1) % npes); + /* synchronize all PEs */ + shmem_barrier_all(); printf("%d: x = %d\n", me, x); shmem_finalize(); return 0; From 46fe6492e558fa8f1913e6a2610f675bf28c82b1 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:10:54 +0000 Subject: [PATCH 072/583] Removed unnecessary barrier The code now uses C99 declaration/initialization before the implicit barrier in shmem_init(). The explicit barrier is no longer necessary. --- example_code/shmem_fadd_example.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/example_code/shmem_fadd_example.c b/example_code/shmem_fadd_example.c index 5395a748c..67e3a3114 100644 --- a/example_code/shmem_fadd_example.c +++ b/example_code/shmem_fadd_example.c @@ -3,19 +3,12 @@ int main(void) { - int me, old; - static int dst; - + int old = -1; + static int dst = 22; shmem_init(); - me = shmem_my_pe(); - - old = -1; - dst = 22; - shmem_barrier_all(); - - if (me == 1){ + int me = shmem_my_pe(); + if (me == 1) old = shmem_fadd(&dst, 44, 0); - } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); shmem_finalize(); From 739898b1a5b46e9738e231afed4e7018fc75e592 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:12:58 +0000 Subject: [PATCH 073/583] Formatting improvements The code is updated to be consistent with others. C99 declaration/initialization is used. --- example_code/shmem_cswap_example.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example_code/shmem_cswap_example.c b/example_code/shmem_cswap_example.c index 6e49404a8..b1b13a55a 100644 --- a/example_code/shmem_cswap_example.c +++ b/example_code/shmem_cswap_example.c @@ -3,11 +3,11 @@ int main(void) { - static int race_winner = -1; - int oldval; + static int race_winner = -1; shmem_init(); - oldval = shmem_cswap(&race_winner, -1, shmem_my_pe(), 0); - if(oldval == -1) printf("pe %d was first\n",shmem_my_pe()); + int me = shmem_my_pe(); + int oldval = shmem_cswap(&race_winner, -1, me, 0); + if (oldval == -1) printf("PE %d was first\n", me); shmem_finalize(); return 0; } From 9c69d97859fdff2a955feb9ae5606e5d016e6582 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:14:43 +0000 Subject: [PATCH 074/583] Formatting improvements, C99 decl/init Global values are moved to static scope and initialized. The spacing is changed from two to three spaces to be consistent with other examples. --- example_code/shmem_fence_example.c | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/example_code/shmem_fence_example.c b/example_code/shmem_fence_example.c index cf6a5c513..3f72c8fb1 100644 --- a/example_code/shmem_fence_example.c +++ b/example_code/shmem_fence_example.c @@ -1,23 +1,23 @@ #include #include -long dest[10] = {0}; -int targ = 0; - int main(void) { - long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - int src = 99; - shmem_init(); - if (shmem_my_pe() == 0) { - shmem_long_put(dest, source, 10, 1); /*put1*/ - shmem_long_put(dest, source, 10, 2); /*put2*/ - shmem_fence(); - shmem_int_put(&targ, &src, 1, 1); /*put3*/ - shmem_int_put(&targ, &src, 1, 2); /*put4*/ - } - shmem_barrier_all(); /* sync sender and receiver */ - printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); - shmem_finalize(); - return 0; + int src = 99; + long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + static long dest[10]; + static int targ; + shmem_init(); + int me = shmem_my_pe(); + if (me == 0) { + shmem_put(dest, source, 10, 1); /* put1 */ + shmem_put(dest, source, 10, 2); /* put2 */ + shmem_fence(); + shmem_put(&targ, &src, 1, 1); /* put3 */ + shmem_put(&targ, &src, 1, 2); /* put4 */ + } + shmem_barrier_all(); /* sync sender and receiver */ + printf("dest[0] on PE %d is %ld\n", me, dest[0]); + shmem_finalize(); + return 0; } From 943bbd91380e3106cb629b4fdce0596db786995f Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:17:06 +0000 Subject: [PATCH 075/583] C11 shmem_g used, formatting, C99 decl/init The C11 Generic shmem_g() is used in place of the shmem_long_g() routine to be consistent with the other examples and the OpenSHMEM 1.3 API. Global values are moved to static scope and initialized. C99 initialization/declaration is used and other minor formatting for consistency. --- example_code/shmem_finalize_example.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/example_code/shmem_finalize_example.c b/example_code/shmem_finalize_example.c index 0412810de..26d7860ea 100644 --- a/example_code/shmem_finalize_example.c +++ b/example_code/shmem_finalize_example.c @@ -1,18 +1,17 @@ #include #include -long x = 10101; - -int main(void) { - int me, npes; +int main(void) +{ + static long x = 10101; long y = -1; shmem_init(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); - me = shmem_my_pe(); - npes = shmem_n_pes(); if (me == 0) - y = shmem_long_g(&x, npes-1); + y = shmem_g(&x, npes-1); printf("%d: y = %ld\n", me, y); From 5da5798e0e8a9ecdb72ee4245bf3169f58cead20 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:23:14 +0000 Subject: [PATCH 076/583] Removed barrier, formatting, C99 decl/init This code moves the global variables to static scope. The values are initialized before the implicit barrier in shmem_init() so that the explicit barrier shmem_barrier_all() can be removed. --- example_code/shmem_finc_example.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/example_code/shmem_finc_example.c b/example_code/shmem_finc_example.c index 490378857..0c632a84f 100644 --- a/example_code/shmem_finc_example.c +++ b/example_code/shmem_finc_example.c @@ -1,23 +1,14 @@ #include #include -int dst; - int main(void) { - int me; - int old; - + int old = -1; + static int dst = 22; shmem_init(); - me = shmem_my_pe(); - - old = -1; - dst = 22; - shmem_barrier_all(); - + int me = shmem_my_pe(); if (me == 0) old = shmem_finc(&dst, 1); - shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); shmem_finalize(); From 6f55079b02bd9113b0c6d89ce6a6ac2f722cc0f3 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:26:24 +0000 Subject: [PATCH 077/583] C99 decl/init, global to static scope The global value has been moved to static scope and C99 declaration/initialization has been used to be consistent with the other example codes. --- example_code/shmem_g_example.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/example_code/shmem_g_example.c b/example_code/shmem_g_example.c index 905366714..f1f49ee38 100644 --- a/example_code/shmem_g_example.c +++ b/example_code/shmem_g_example.c @@ -1,22 +1,16 @@ #include #include -long x = 10101; - int main(void) { - int me, npes; long y = -1; - + static long x = 10101; shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - + int me = shmem_my_pe(); + int npes = shmem_n_pes(); if (me == 0) y = shmem_g(&x, npes-1); - printf("%d: y = %ld\n", me, y); - shmem_finalize(); return 0; } From 62824af55522f78d48123321a95f45cdb4eebe28 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:28:08 +0000 Subject: [PATCH 078/583] Formatting, C99 decl/init The code formatting has been updated to be consistent with the other example codes. Indents spacing has gone from two to three spaces. C99 declaration/initialization is used for simplicity. --- example_code/shmem_global_exit_example.c | 29 ++++++++---------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/example_code/shmem_global_exit_example.c b/example_code/shmem_global_exit_example.c index 0f9847a75..a3c21e379 100644 --- a/example_code/shmem_global_exit_example.c +++ b/example_code/shmem_global_exit_example.c @@ -2,27 +2,18 @@ #include #include -int -main(void) +int main(void) { - int me; - - shmem_init(); - - me = shmem_my_pe(); - - if (me == 0) { - FILE *fp = fopen("input.txt", "r"); - - if (fp == NULL) { /* Input file required by program is not available */ - shmem_global_exit(EXIT_FAILURE); - } - - /* do something with the file */ - - fclose(fp); + shmem_init(); + int me = shmem_my_pe(); + if (me == 0) { + FILE *fp = fopen("input.txt", "r"); + if (fp == NULL) { /* Input file required by program is not available */ + shmem_global_exit(EXIT_FAILURE); + } + /* do something with the file */ + fclose(fp); } - shmem_finalize(); return 0; } From 59b3c8d18408c4214a20989d6af15ea9b4b705bf Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:30:34 +0000 Subject: [PATCH 079/583] Formatting, C99 decl/init The initialization is now consistent with other example codes. The printf output has also been updated to output short integers rather than casting to integer (using %hd). --- example_code/shmem_iput_example.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/example_code/shmem_iput_example.c b/example_code/shmem_iput_example.c index a37879c13..4a7ca817d 100644 --- a/example_code/shmem_iput_example.c +++ b/example_code/shmem_iput_example.c @@ -3,19 +3,16 @@ int main(void) { - short source[10] = { 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10 }; + short source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; static short dest[10]; shmem_init(); - if (shmem_my_pe() == 0) { - /* put 5 words into dest on PE 1 */ + int me = shmem_my_pe(); + if (me == 0) /* put 5 words into dest on PE 1 */ shmem_iput(dest, source, 1, 2, 5, 1); - } - shmem_barrier_all(); /* sync sender and receiver */ - if (shmem_my_pe() == 1) { - printf("dest on PE %d is %d %d %d %d %d\n", shmem_my_pe(), - (int)dest[0], (int)dest[1], (int)dest[2], - (int)dest[3], (int)dest[4] ); + shmem_barrier_all(); /* sync sender and receiver */ + if (me == 1) { + printf("dest on PE %d is %hd %hd %hd %hd %hd\n", me, + dest[0], dest[1], dest[2], dest[3], dest[4]); } shmem_finalize(); return 0; From 12631b9df391aa2527aef80da97423c305e9646f Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:33:25 +0000 Subject: [PATCH 080/583] Formatting, C99 decl/init The indent spacing is updated from two to three spaces for consistency with other example codes. C99 declaration/initialization is used for simplicity. --- example_code/shmem_mype_example.c | 13 +++++-------- example_code/shmem_npes_example.c | 19 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/example_code/shmem_mype_example.c b/example_code/shmem_mype_example.c index a3a53d1dc..ad6498d09 100644 --- a/example_code/shmem_mype_example.c +++ b/example_code/shmem_mype_example.c @@ -3,12 +3,9 @@ int main(void) { - int me; - - shmem_init(); - me = shmem_my_pe(); - printf("My PE id is: %d\n", me); - - shmem_finalize(); - return 0; + shmem_init(); + int me = shmem_my_pe(); + printf("My PE id is: %d\n", me); + shmem_finalize(); + return 0; } diff --git a/example_code/shmem_npes_example.c b/example_code/shmem_npes_example.c index 506d3b7c8..88bf55229 100644 --- a/example_code/shmem_npes_example.c +++ b/example_code/shmem_npes_example.c @@ -3,16 +3,11 @@ int main(void) { - int npes; - - shmem_init(); - - npes = shmem_n_pes(); - - if (shmem_my_pe() == 0) { - printf("Number of PEs executing this program is: %d\n", npes); - } - - shmem_finalize(); - return 0; + shmem_init(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); + if (me == 0) + printf("Number of PEs executing this program is: %d\n", npes); + shmem_finalize(); + return 0; } From 48742e0c57d0305253ae1cb330abb6a08815e19b Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:34:53 +0000 Subject: [PATCH 081/583] Removed barrier, global to static scope, C99 decl The relevant variables have moved from global to static scope and use C99 declaration/initialization. They are set before the implicit barrier in shmem_init() so that the explicity shmem_barrier_all() barrier is no longer necessary. The shmem_malloc is removed for simplicity and a static variable is used instead. --- example_code/shmem_p_example.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/example_code/shmem_p_example.c b/example_code/shmem_p_example.c index b9738d12d..4d1c76e0f 100644 --- a/example_code/shmem_p_example.c +++ b/example_code/shmem_p_example.c @@ -1,28 +1,19 @@ #include #include #include -static const double e = 2.71828182; -static const double epsilon = 0.00000001; int main(void) { - double *f; - int me; - + static const double e = 2.71828182; + static const double epsilon = 0.00000001; + static double f = 3.1415927; shmem_init(); - me = shmem_my_pe(); - f = (double *) shmem_malloc(sizeof (*f)); - - *f = 3.1415927; - shmem_barrier_all(); - + int me = shmem_my_pe(); if (me == 0) - shmem_p(f, e, 1); - + shmem_p(&f, e, 1); shmem_barrier_all(); if (me == 1) - printf("%s\n", (fabs (*f - e) < epsilon) ? "OK" : "FAIL"); - + printf("%s\n", (fabs(f - e) < epsilon) ? "OK" : "FAIL"); shmem_finalize(); return 0; } From 9893f45a6c0466af1506f32802d6deca96629cc0 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:37:57 +0000 Subject: [PATCH 082/583] Simplified code, renamed variable The code has been simplified by reducing the size of the array to improve the printf output. The oddly named 'bigd' variable was renamed to 'dest' to beconsistent with the shmem_ptr() prototype. C99 declaration/initialization is also used for consistency with other example codes. --- example_code/shmem_ptr_example.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/example_code/shmem_ptr_example.c b/example_code/shmem_ptr_example.c index 54cc4ce46..9ac26ca4d 100644 --- a/example_code/shmem_ptr_example.c +++ b/example_code/shmem_ptr_example.c @@ -3,30 +3,21 @@ int main(void) { - static int bigd[100]; - int *ptr; - int i; - + static int dest[4]; shmem_init(); - - if (shmem_my_pe() == 0) { - /* initialize PE 1's bigd array */ - ptr = shmem_ptr(bigd, 1); + int me = shmem_my_pe(); + if (me == 0) { /* initialize PE 1's dest array */ + int* ptr = shmem_ptr(dest, 1); if (ptr == NULL) - printf("can't use pointer to directly access PE 1's array\n"); + printf("can't use pointer to directly access PE 1's dest array\n"); else - for (i=0; i<100; i++) - *ptr++ = i+1; + for (int i = 0; i < 4; i++) + *ptr++ = i + 1; } - shmem_barrier_all(); - - if (shmem_my_pe() == 1) { - printf("bigd on PE 1 is:\n"); - for (i=0; i<100; i++) - printf(" %d\n",bigd[i]); - printf("\n"); - } + if (me == 1) + printf("PE 1 dest: %d, %d, %d, %d\n", + dest[0], dest[1], dest[2], dest[3]); shmem_finalize(); return 0; } From c5a77853096cfc684034b4f55f176e4e3994e0ff Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:41:00 +0000 Subject: [PATCH 083/583] Minor formatting, C99 decl/init Minor formatting has been made for readability and code consistency. C99 declaration/initialization is used. --- example_code/shmem_put_example.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/example_code/shmem_put_example.c b/example_code/shmem_put_example.c index 43df0afd1..a5f6ffb44 100644 --- a/example_code/shmem_put_example.c +++ b/example_code/shmem_put_example.c @@ -3,17 +3,14 @@ int main(void) { - long source[10] = { 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10 }; + long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; static long dest[10]; shmem_init(); - if (shmem_my_pe() == 0) { - /* put 10 words into dest on PE 1 */ + int me = shmem_my_pe(); + if (me == 0) /* put 10 words into dest on PE 1 */ shmem_put(dest, source, 10, 1); - } - shmem_barrier_all(); /* sync sender and receiver */ - printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); + shmem_barrier_all(); /* sync sender and receiver */ + printf("dest[0] on PE %d is %ld\n", me, dest[0]); shmem_finalize(); return 0; } - From b18cd9985cf1b7ca593c10c195a8709921f16589 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:42:28 +0000 Subject: [PATCH 084/583] Formatting spacing, global to static scope, C99 Indent has been changed from two to three spaces for consistency. The global variables have been moved to static scope and C99 declaration/initialization is used for consistency with the other example codes. --- example_code/shmem_quiet_example.c | 47 +++++++++++++----------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/example_code/shmem_quiet_example.c b/example_code/shmem_quiet_example.c index e4abfaafb..a23163eb0 100644 --- a/example_code/shmem_quiet_example.c +++ b/example_code/shmem_quiet_example.c @@ -1,32 +1,27 @@ #include #include -long dest[3] = {0}; -int targ = 0; -long source[3] = {1, 2, 3}; -int src = 90; - int main(void) { - long x[3] = {0}; - int y = 0; - - shmem_init(); - if (shmem_my_pe() == 0) { - shmem_long_put(dest, source, 3, 1); /*put1*/ - shmem_int_put(&targ, &src, 1, 2); /*put2*/ - - shmem_quiet(); - - shmem_long_get(x, dest, 3, 1); /*gets updated value from dest on PE 1 to local array x */ - shmem_int_get(&y, &targ, 1, 2); /*gets updated value from targ on PE 2 to local variable y*/ - printf("x: {%ld,%ld,%ld}\n",x[0],x[1],x[2]); /*x: {1,2,3}*/ - printf("y: %d\n", y); /*y: 90*/ - - shmem_int_put(&targ, &src, 1, 1); /*put3*/ - shmem_int_put(&targ, &src, 1, 2); /*put4*/ - } - shmem_finalize(); - return 0; + static long dest[3]; + static long source[3] = { 1, 2, 3 }; + static int targ; + static int src = 90; + long x[3] = { 0 }; + int y = 0; + shmem_init(); + int me = shmem_my_pe(); + if (me == 0) { + shmem_put(dest, source, 3, 1); /* put1 */ + shmem_put(&targ, &src, 1, 2); /* put2 */ + shmem_quiet(); + shmem_get(x, dest, 3, 1); /* gets updated value from dest on PE 1 to local array x */ + shmem_get(&y, &targ, 1, 2); /* gets updated value from targ on PE 2 to local variable y */ + printf("x: { %ld, %ld, %ld }\n", x[0], x[1], x[2]); /* x: { 1, 2, 3 } */ + printf("y: %d\n", y); /* y: 90 */ + shmem_put(&targ, &src, 1, 1); /* put3 */ + shmem_put(&targ, &src, 1, 2); /* put4 */ + } + shmem_finalize(); + return 0; } - From e8e4fcef96d49afc77b9de3b7d838b53820f1c0c Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:44:05 +0000 Subject: [PATCH 085/583] Simplified code, C99 decl/init The shmem_malloc() call has been replaced with a statically defined destination variable for simplicity. The corresponding shmem_free() call is then removed as well. C99 declaration/initialization is also used for consistency with the other example codes. --- example_code/shmem_swap_example.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/example_code/shmem_swap_example.c b/example_code/shmem_swap_example.c index b78f64d16..150be41f4 100644 --- a/example_code/shmem_swap_example.c +++ b/example_code/shmem_swap_example.c @@ -3,22 +3,17 @@ int main(void) { - long *dest; - int me, npes; - long swapped_val, new_val; - + static long dest; shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - dest = (long *) shmem_malloc(sizeof (*dest)); - *dest = me; + int me = shmem_my_pe(); + int npes = shmem_n_pes(); + dest = me; shmem_barrier_all(); - new_val = me; - if (me & 1){ - swapped_val = shmem_swap(dest, new_val, (me + 1) % npes); - printf("%d: dest = %ld, swapped = %ld\n", me, *dest, swapped_val); + long new_val = me; + if (me & 1) { + long swapped_val = shmem_swap(&dest, new_val, (me + 1) % npes); + printf("%d: dest = %ld, swapped = %ld\n", me, dest, swapped_val); } - shmem_free(dest); shmem_finalize(); return 0; } From b5cca6918b15592bb78fec52247e31e45cec06f5 Mon Sep 17 00:00:00 2001 From: "James A. Ross" Date: Wed, 4 Jan 2017 20:46:21 +0000 Subject: [PATCH 086/583] Using C11 shmem_put, minor format, C99 decl/init The shmem_short_put is replaced with the C11 Generic shmem_put for consistency. The main() prototype is updated for simplicity/consistency. The code indent spacing was changed from a tab to three spaces. C99 declaration/initialization is used for consistency with the other examples. --- example_code/writing_shmem_example.c | 57 +++++++++++++++------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/example_code/writing_shmem_example.c b/example_code/writing_shmem_example.c index 6ee05d3f0..e04139e09 100644 --- a/example_code/writing_shmem_example.c +++ b/example_code/writing_shmem_example.c @@ -1,32 +1,35 @@ #include #include + #define SIZE 16 -int -main(int argc, char* argv[]) + +int main(void) { - short source[SIZE]; - static short dest[SIZE]; - int i, npes; - shmem_init(); - npes = shmem_n_pes(); - if (shmem_my_pe() == 0) { - /* initialize array */ - for(i = 0; i < SIZE; i++) - source[i] = i; - /* local, not symmetric */ - /* static makes it symmetric */ - /* put "size" words into dest on each PE */ - for(i = 1; i < npes; i++) - shmem_short_put(dest, source, SIZE, i); - } - shmem_barrier_all(); /* sync sender and receiver */ - if (shmem_my_pe() != 0) { - printf("dest on PE %d is \t", shmem_my_pe()); - for(i = 0; i < SIZE; i++) - printf("%hd \t", dest[i]); - printf("\n"); - } - shmem_finalize(); - return 0; + short source[SIZE]; + static short dest[SIZE]; + static long lock = 0; + shmem_init(); + int me = shmem_my_pe(); + int npes = shmem_n_pes(); + if (me == 0) { + /* initialize array */ + for (int i = 0; i < SIZE; i++) + source[i] = i; + /* local, not symmetric */ + /* static makes it symmetric */ + /* put "size" words into dest on each PE */ + for (int i = 1; i < npes; i++) + shmem_put(dest, source, SIZE, i); + } + shmem_barrier_all(); /* sync sender and receiver */ + if (me != 0) { + shmem_set_lock(&lock); + printf("dest on PE %d is \t", me); + for (int i = 0; i < SIZE; i++) + printf("%hd \t", dest[i]); + printf("\n"); + shmem_clear_lock(&lock); + } + shmem_finalize(); + return 0; } - From a623929542cdf7241b6c9bba14e3bf431ae2253d Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 10 Jan 2017 14:46:09 -0500 Subject: [PATCH 087/583] Added bitwise {and, or, xor} AMOs --- content/atomics_intro.tex | 12 +++++++---- content/backmatter.tex | 3 +++ content/shmem_and.tex | 44 ++++++++++++++++++++++++++++++++++++++ content/shmem_fand.tex | 45 +++++++++++++++++++++++++++++++++++++++ content/shmem_for.tex | 45 +++++++++++++++++++++++++++++++++++++++ content/shmem_fxor.tex | 45 +++++++++++++++++++++++++++++++++++++++ content/shmem_or.tex | 44 ++++++++++++++++++++++++++++++++++++++ content/shmem_xor.tex | 44 ++++++++++++++++++++++++++++++++++++++ main_spec.tex | 18 ++++++++++++++++ 9 files changed, 296 insertions(+), 4 deletions(-) create mode 100644 content/shmem_and.tex create mode 100644 content/shmem_fand.tex create mode 100644 content/shmem_for.tex create mode 100644 content/shmem_fxor.tex create mode 100644 content/shmem_or.tex create mode 100644 content/shmem_xor.tex diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 0c927b3a7..8e5411ca3 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -9,8 +9,11 @@ update, the remote data object in a single atomic operation. The routines return after the data has been fetched and delivered to the local \ac{PE}. -The \textit{fetching} operations include: \FUNC{SHMEM\_FETCH}, -\FUNC{SHMEM\_CSWAP}, \FUNC{SHMEM\_SWAP}, \FUNC{SHMEM\_FINC}, and \FUNC{SHMEM\_FADD}. +The \textit{fetching} operations include: \FUNC{shmem\_fetch}, +\FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, +\FUNC{shmem\_fadd}, \\ +\FUNC{shmem\_fand}, \FUNC{shmem\_for}, and \FUNC{shmem\_fxor}. + \item % Non-Blocking\\ The \textit{non-fetching} atomic routines update the remote memory in a single @@ -20,8 +23,9 @@ \FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can be used by an \openshmem{} program. -The \textit{non-fetching} operations include: \FUNC{SHMEM\_SET}, \FUNC{SHMEM\_INC} and -\FUNC{SHMEM\_ADD}. +The \textit{non-fetching} operations include: \FUNC{shmem\_set}, +\FUNC{shmem\_inc}, \FUNC{shmem\_add}, \FUNC{shmem\_and}, \FUNC{shmem\_or}, +and \FUNC{shmem\_xor}. \end{itemize} Where appropriate compiler support is available, \openshmem{} provides type-generic diff --git a/content/backmatter.tex b/content/backmatter.tex index de31b65c6..3d469373c 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -376,6 +376,9 @@ \section{Version 1.5} % \item Expanded the type support for RMA and AMO operations. \\ See Sections \ref{sec:rma} and \ref{sec:amo}. +% +\item Added fetching and non-fetching bitwise and, or, xor atomic operations. +\\ See Section \ref{sec:amo}. \end{itemize} diff --git a/content/shmem_and.tex b/content/shmem_and.tex new file mode 100644 index 000000000..12709017f --- /dev/null +++ b/content/shmem_and.tex @@ -0,0 +1,44 @@ +\apisummary{ + Atomically perform a bitwise and operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +void shmem_and(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +void shmem__and(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise anded with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_and} atomically performs a bitwise and on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/content/shmem_fand.tex b/content/shmem_fand.tex new file mode 100644 index 000000000..6c279233b --- /dev/null +++ b/content/shmem_fand.tex @@ -0,0 +1,45 @@ +\apisummary{ + Atomically perform a fetch-and-bitwise-and operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +TYPE shmem_fand(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +TYPE shmem__fand(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise anded with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_fand} atomically performs a fetch-and-bitwise-and on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + The value pointed to by \VAR{dest} on PE \VAR{pe} immediately before the + operation is performed. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/content/shmem_for.tex b/content/shmem_for.tex new file mode 100644 index 000000000..44cd361d1 --- /dev/null +++ b/content/shmem_for.tex @@ -0,0 +1,45 @@ +\apisummary{ + Atomically perform a fetch-and-bitwise-or operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +TYPE shmem_for(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +TYPE shmem__for(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise ored with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_for} atomically performs a fetch-and-bitwise-or on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + The value pointed to by \VAR{dest} on PE \VAR{pe} immediately before the + operation is performed. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/content/shmem_fxor.tex b/content/shmem_fxor.tex new file mode 100644 index 000000000..82ae615e7 --- /dev/null +++ b/content/shmem_fxor.tex @@ -0,0 +1,45 @@ +\apisummary{ + Atomically perform a fetch-and-bitwise-xor operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +TYPE shmem_fxor(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +TYPE shmem__fxor(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise xored with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_fxor} atomically performs a fetch-and-bitwise-xor on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + The value pointed to by \VAR{dest} on PE \VAR{pe} immediately before the + operation is performed. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/content/shmem_or.tex b/content/shmem_or.tex new file mode 100644 index 000000000..398ed655d --- /dev/null +++ b/content/shmem_or.tex @@ -0,0 +1,44 @@ +\apisummary{ + Atomically perform a bitwise or operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +void shmem_or(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +void shmem__or(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise ored with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_or} atomically performs a bitwise or on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/content/shmem_xor.tex b/content/shmem_xor.tex new file mode 100644 index 000000000..a99fe54b6 --- /dev/null +++ b/content/shmem_xor.tex @@ -0,0 +1,44 @@ +\apisummary{ + Atomically perform a bitwise xor operation on a remote data object. +} + +\begin{apidefinition} + +\begin{C11synopsis} +void shmem_xor(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. + +\begin{Csynopsis} +void shmem__xor(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table \ref{stdamotypes}. + +\begin{apiarguments} + + \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + be updated.} + \apiargument{IN}{value}{The operand to be bitwise xored with the object + pointed to by \VAR{dest}.} + \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} + is to be updated.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_xor} atomically performs a bitwise xor on the + remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + with the operand \VAR{value}. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/main_spec.tex b/main_spec.tex index 996317c1c..20370f40d 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -163,6 +163,24 @@ \subsubsection{\textbf{SHMEM\_FETCH}}\label{subsec:shmem_fetch} \subsubsection{\textbf{SHMEM\_SET}}\label{subsec:shmem_set} \input{content/shmem_set.tex} +\subsubsection{\textbf{SHMEM\_FAND}}\label{subsec:shmem_fand} +\input{content/shmem_fand.tex} + +\subsubsection{\textbf{SHMEM\_AND}}\label{subsec:shmem_and} +\input{content/shmem_and.tex} + +\subsubsection{\textbf{SHMEM\_FOR}}\label{subsec:shmem_for} +\input{content/shmem_for.tex} + +\subsubsection{\textbf{SHMEM\_OR}}\label{subsec:shmem_or} +\input{content/shmem_or.tex} + +\subsubsection{\textbf{SHMEM\_FXOR}}\label{subsec:shmem_fxor} +\input{content/shmem_fxor.tex} + +\subsubsection{\textbf{SHMEM\_XOR}}\label{subsec:shmem_xor} +\input{content/shmem_xor.tex} + From 66b63eaaec817ffcaecc8044f5e1f9553c2f73b5 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 10 Jan 2017 14:54:41 -0500 Subject: [PATCH 088/583] Added floating-point support for atomic (fetch-and-)add --- content/atomics_intro.tex | 12 +++++++----- content/backmatter.tex | 3 ++- content/shmem_add.tex | 6 ++++-- content/shmem_fadd.tex | 6 ++++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 0c927b3a7..923838c17 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -24,11 +24,13 @@ \FUNC{SHMEM\_ADD}. \end{itemize} -Where appropriate compiler support is available, \openshmem{} provides type-generic -atomic memory operation interfaces via \Celev{} generic selection. The type-generic -\ac{AMO} routines each support the ``standard \ac{AMO} types’’ listed in Table \ref{stdamotypes}, -except for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, and \FUNC{shmem\_swap}, which supports the ``extended \ac{AMO} types’’ listed -in Table \ref{extamotypes}. +Where appropriate compiler support is available, \openshmem{} provides +type-generic atomic memory operation interfaces via \Celev{} generic selection. +The type-generic \ac{AMO} routines each support the ``standard \ac{AMO} types'' +listed in Table~\ref{stdamotypes}, except for \FUNC{shmem\_fadd}, +\FUNC{shmem\_add}, \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, and +\FUNC{shmem\_swap}, which support the ``extended \ac{AMO} types'' listed in +Table~\ref{extamotypes}. \begin{table}[h] \begin{center} diff --git a/content/backmatter.tex b/content/backmatter.tex index de31b65c6..001876b1f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -374,7 +374,8 @@ \section{Version 1.5} \FUNC{shmem\_global\_exit}. \\ See Section \ref{subsec:shmem_global_exit}. % -\item Expanded the type support for RMA and AMO operations. +\item Expanded the type support for RMA and AMO operations, including support + for atomic add and fetch-and-add on floating-point types. \\ See Sections \ref{sec:rma} and \ref{sec:amo}. \end{itemize} diff --git a/content/shmem_add.tex b/content/shmem_add.tex index fb15fca2c..3e0728151 100644 --- a/content/shmem_add.tex +++ b/content/shmem_add.tex @@ -7,12 +7,14 @@ \begin{C11synopsis} void shmem_add(TYPE *dest, TYPE value, int pe); \end{C11synopsis} -where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types specified by +Table~\ref{extamotypes}. \begin{Csynopsis} void shmem__add(TYPE *dest, TYPE value, int pe); \end{Csynopsis} -where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. \begin{Fsynopsis} INTEGER pe diff --git a/content/shmem_fadd.tex b/content/shmem_fadd.tex index 4487ff37e..6bc6fb277 100644 --- a/content/shmem_fadd.tex +++ b/content/shmem_fadd.tex @@ -7,12 +7,14 @@ \begin{C11synopsis} TYPE shmem_fadd(TYPE *dest, TYPE value, int pe); \end{C11synopsis} -where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types specified by +Table~\ref{extamotypes}. \begin{Csynopsis} TYPE shmem__fadd(TYPE *dest, TYPE value, int pe); \end{Csynopsis} -where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. \begin{Fsynopsis} INTEGER pe From 09b534015d2d78f774b4beb31281b8c458989a5d Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 10 Jan 2017 20:01:25 -0500 Subject: [PATCH 089/583] WIP: Overhaul of point-to-point synchronization API This includes: - adding shmem_test() - placeholders for shmem_{wait,test}{all,any}() - hoisting common text to the intro --- content/p2p_sync_intro.tex | 64 ++++++++++++++++++++++++++++++ content/shmem_test.tex | 63 +++++++++++++++++++++++++++++ content/shmem_test_all.tex | 0 content/shmem_test_any.tex | 0 content/shmem_wait.tex | 5 +-- content/shmem_wait_all.tex | 0 content/shmem_wait_any.tex | 0 example_code/shmem_test_example1.c | 7 ++++ main_spec.tex | 42 ++++++++------------ 9 files changed, 152 insertions(+), 29 deletions(-) create mode 100644 content/p2p_sync_intro.tex create mode 100644 content/shmem_test.tex create mode 100644 content/shmem_test_all.tex create mode 100644 content/shmem_test_any.tex create mode 100644 content/shmem_wait_all.tex create mode 100644 content/shmem_wait_any.tex create mode 100644 example_code/shmem_test_example1.c diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex new file mode 100644 index 000000000..9a9e8e8e6 --- /dev/null +++ b/content/p2p_sync_intro.tex @@ -0,0 +1,64 @@ +The following section discusses \openshmem \ac{API}s that provides a mechanism +for synchronization between two \ac{PE}s based on the value of a symmetric data +object. + +Where appropriate compiler support is available, \openshmem provides +type-generic point-to-point synchronization interfaces via \Celev{} generic +selection. Such type-generic routines are supported for the +``point-to-point synchronization types'' identified in +Table~\ref{p2psynctypes}. Implementations may optionally support additional +types. + +\begin{table}[h] + \begin{center} + \begin{tabular}{|l|l|} + \hline + \TYPE & \TYPENAME \\ \hline + float & float \\ \hline + double & double \\ \hline + short & short \\ \hline + int & int \\ \hline + long & long \\ \hline + long long & longlong \\ \hline + unsigned int & uint \\ \hline + unsigned long & ulong \\ \hline + unsigned long long & ulonglong \\ \hline + int32\_t & int32 \\ \hline + int64\_t & int64 \\ \hline + uint32\_t & uint32 \\ \hline + uint64\_t & uint64 \\ \hline + intptr\_t & intptr \\ \hline + uintptr\_t & uintptr \\ \hline + size\_t & size \\ \hline + ptrdiff\_t & ptrdiff \\ \hline + \end{tabular} + \caption{Point-to-Point Synchronization Types and Names} + \label{p2psynctypes} + \end{center} +\end{table} + +The point-to-point synchronization routines can be used to portably ensure +that memory access operations observe remote updates in the order enforced by +the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} +routines. + +Some point-to-point synchronization make use of the enumeration constants in +Table~\ref{p2p-consts}, which have the effect to specify the comparison +operation to be performed by the associated routine. + +\begin{table}[h] + \begin{center} + \begin{tabular}{ll} + \hline + Constant Name & Comparison \\ \hline + SHMEM\_CMP\_EQ & Equal \\ + SHMEM\_CMP\_NE & Not equal \\ + SHMEM\_CMP\_GT & Greater than \\ + SHMEM\_CMP\_GE & Greater than or equal to \\ + SHMEM\_CMP\_LT & Less than \\ + SHMEM\_CMP\_LE & Less than or equal to + \end{tabular} + \caption{Point-to-Point Comparison Enumeration Constants} + \label{p2p-consts} + \end{center} +\end{table} diff --git a/content/shmem_test.tex b/content/shmem_test.tex new file mode 100644 index 000000000..d3f6abe16 --- /dev/null +++ b/content/shmem_test.tex @@ -0,0 +1,63 @@ +\apisummary{ + Test whether a variable on the local \ac{PE} has changed. +} + +\begin{apidefinition} + +\begin{C11synopsis} +int shmem_test(TYPE *ivar, TYPE value); +int shmem_test_cmp(TYPE *ivar, int cmp, TYPE value); +\end{C11synopsis} +where \TYPE{} is one of the point-to-point synchronization types specified by +Table \ref{p2psynctypes}. + +\begin{Csynopsis} +int shmem__test(TYPE *ivar, TYPE value); +int shmem__test_cmp(TYPE *ivar, int cmp, TYPE value); +\end{Csynopsis} +where \TYPE{} is one of the point-to-point synchronization types and has a +corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. + +\begin{apiarguments} + + \apiargument{OUT}{ivar}{A pointer to a remotely accessible data object.} + \apiargument{IN}{cmp}{The comparison operator that compares \VAR{ivar} with + \VAR{value}.} + \apiargument{IN}{value}{The value against which the object pointed to + by \VAR{ivar} will be compared.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_test} tests whether the symmetric object pointed to by + \VAR{ivar} is equal to \VAR{value}. + + \FUNC{shmem\_test\_cmp} tests the numeric comparison of the symmetric object + pointed to by \VAR{ivar} with the value \VAR{value} according to the + comparison operator \VAR{cmp}. +} + +\apireturnvalues{ + \FUNC{shmem\_test} returns 1 if the symmetric object pointed to by \VAR{ivar} + is equal to \VAR{value}; otherwise, it returns 0. + + \FUNC{shmem\_test\_cmp} returns 1 if the comparison of the symmetric object + pointed to by \VAR{ivar} with the value \VAR{value} according to the + comparison operator \VAR{cmp} evalutes to true; otherwise, it returns 0. +} + +\apinotes{ + \FUNC{shmem\_test} tests the equality of the symmetric object pointed to by + \VAR{ivar} and \VAR{value}, while \FUNC{shmem\_wait} blocks until the two + are not equal. +} + +\begin{apiexamples} + \apicexample + {The following example demonstrates the use of \FUNC{shmem\_test} to + perform the equivalent functionality of \FUNC{shmem\_wait}.} + {./example_code/shmem_test_example1.c} + {} +\end{apiexamples} + +\end{apidefinition} diff --git a/content/shmem_test_all.tex b/content/shmem_test_all.tex new file mode 100644 index 000000000..e69de29bb diff --git a/content/shmem_test_any.tex b/content/shmem_test_any.tex new file mode 100644 index 000000000..e69de29bb diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index f6b8c297c..d560b729d 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -86,9 +86,8 @@ } \apinotes{ - The \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} routines can be used to - portably ensure that memory access operations observe remote updates in the order - enforced by the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} routines. + \FUNC{shmem\_wait} is functionally equivalent to \FUNC{shmem\_wait\_until} + where \VAR{cmp} is SHMEM\_CMP\_NE. } \apiimpnotes{ diff --git a/content/shmem_wait_all.tex b/content/shmem_wait_all.tex new file mode 100644 index 000000000..e69de29bb diff --git a/content/shmem_wait_any.tex b/content/shmem_wait_any.tex new file mode 100644 index 000000000..e69de29bb diff --git a/example_code/shmem_test_example1.c b/example_code/shmem_test_example1.c new file mode 100644 index 000000000..14cf3da34 --- /dev/null +++ b/example_code/shmem_test_example1.c @@ -0,0 +1,7 @@ +#include +#include + +void user_wait(long *ivar, long value) +{ + while (shmem_test(ivar, value)); +} diff --git a/main_spec.tex b/main_spec.tex index 996317c1c..a3f4902a2 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -196,36 +196,26 @@ \subsubsection{\textbf{SHMEM\_ALLTOALLS}}\label{subsec:shmem_alltoalls} \subsection{Point-To-Point Synchronization Routines} -The following section discusses \openshmem \ac{API}s that provides a mechanism -for synchronization between two \ac{PE}s based on the value of a symmetric data -object. - -Where appropriate compiler support is available, \openshmem provides -type-generic point-to-point synchronization interfaces via \Celev{} generic -selection. Such type-generic routines are supported for the -``point-to-point synchronization types'' identified in -Table~\ref{p2psynctypes}. Implementations may optionally support additional -types. - -\begin{table}[h] - \begin{center} - \begin{tabular}{|l|l|} - \hline - \TYPE & \TYPENAME \\ \hline - short & short \\ \hline - int & int \\ \hline - long & long \\ \hline - long long & longlong \\ \hline - \end{tabular} - \caption{Point-to-Point Synchronization Types and Names} - \label{p2psynctypes} - \end{center} -\end{table} - +\input{content/p2p_sync_intro.tex} \subsubsection{\textbf{SHMEM\_WAIT}}\label{subsec:shmem_wait} \input{content/shmem_wait.tex} +\subsubsection{\textbf{SHMEM\_WAIT\_ALL}}\label{subsec:shmem_wait_all} +\input{content/shmem_wait_all.tex} + +\subsubsection{\textbf{SHMEM\_WAIT\_ANY}}\label{subsec:shmem_wait_any} +\input{content/shmem_wait_any.tex} + +\subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} +\input{content/shmem_test.tex} + +\subsubsection{\textbf{SHMEM\_TEST\_ALL}}\label{subsec:shmem_test_all} +\input{content/shmem_test_all.tex} + +\subsubsection{\textbf{SHMEM\_TEST\_ANY}}\label{subsec:shmem_test_any} +\input{content/shmem_test_any.tex} + From 6aee543bc2660ceba654e7af6239fce6a55306a8 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 18 Jan 2017 08:58:40 -0500 Subject: [PATCH 090/583] Bitwise AMOs: grammar and consistency improvements --- content/backmatter.tex | 3 ++- content/shmem_and.tex | 12 ++++++------ content/shmem_fand.tex | 11 +++++------ content/shmem_for.tex | 12 ++++++------ content/shmem_fxor.tex | 12 ++++++------ content/shmem_or.tex | 12 ++++++------ content/shmem_xor.tex | 12 ++++++------ 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index ae16f0c5f..5cca9bca5 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -378,7 +378,8 @@ \section{Version 1.5} for atomic add and fetch-and-add on floating-point types. \\ See Sections \ref{sec:rma} and \ref{sec:amo}. % -\item Added fetching and non-fetching bitwise and, or, xor atomic operations. +\item Added fetching and non-fetching bitwise and, inclusive or, and + exclusive or atomic operations. \\ See Section \ref{sec:amo}. \end{itemize} diff --git a/content/shmem_and.tex b/content/shmem_and.tex index 12709017f..430aee319 100644 --- a/content/shmem_and.tex +++ b/content/shmem_and.tex @@ -1,5 +1,6 @@ \apisummary{ - Atomically perform a bitwise and operation on a remote data object. + Atomically perform a non-fetching bitwise and operation on a + remote data object. } \begin{apidefinition} @@ -18,18 +19,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise anded with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_and} atomically performs a bitwise and on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_and} atomically performs a non-fetching bitwise and on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } diff --git a/content/shmem_fand.tex b/content/shmem_fand.tex index 6c279233b..8480fb91f 100644 --- a/content/shmem_fand.tex +++ b/content/shmem_fand.tex @@ -1,5 +1,5 @@ \apisummary{ - Atomically perform a fetch-and-bitwise-and operation on a remote data object. + Atomically perform a fetching bitwise and operation on a remote data object. } \begin{apidefinition} @@ -18,18 +18,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise anded with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_fand} atomically performs a fetch-and-bitwise-and on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_fand} atomically performs a fetching bitwise and on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } diff --git a/content/shmem_for.tex b/content/shmem_for.tex index 44cd361d1..af2d54f9d 100644 --- a/content/shmem_for.tex +++ b/content/shmem_for.tex @@ -1,5 +1,6 @@ \apisummary{ - Atomically perform a fetch-and-bitwise-or operation on a remote data object. + Atomically perform a fetching bitwise inclusive or operation on a + remote data object. } \begin{apidefinition} @@ -18,18 +19,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise ored with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_for} atomically performs a fetch-and-bitwise-or on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_for} atomically performs a fetching bitwise inclusive or on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } diff --git a/content/shmem_fxor.tex b/content/shmem_fxor.tex index 82ae615e7..c1c0b6854 100644 --- a/content/shmem_fxor.tex +++ b/content/shmem_fxor.tex @@ -1,5 +1,6 @@ \apisummary{ - Atomically perform a fetch-and-bitwise-xor operation on a remote data object. + Atomically perform a fetching bitwise exclusive or operation on a + remote data object. } \begin{apidefinition} @@ -18,18 +19,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise xored with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_fxor} atomically performs a fetch-and-bitwise-xor on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_fxor} atomically performs a fetching bitwise exclusive or on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } diff --git a/content/shmem_or.tex b/content/shmem_or.tex index 398ed655d..561272677 100644 --- a/content/shmem_or.tex +++ b/content/shmem_or.tex @@ -1,5 +1,6 @@ \apisummary{ - Atomically perform a bitwise or operation on a remote data object. + Atomically perform a non-fetching bitwise inclusive or operation on a + remote data object. } \begin{apidefinition} @@ -18,18 +19,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise ored with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_or} atomically performs a bitwise or on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_or} atomically performs a non-fetching bitwise inclusive or on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } diff --git a/content/shmem_xor.tex b/content/shmem_xor.tex index a99fe54b6..fb06636b6 100644 --- a/content/shmem_xor.tex +++ b/content/shmem_xor.tex @@ -1,5 +1,6 @@ \apisummary{ - Atomically perform a bitwise xor operation on a remote data object. + Atomically perform a non-fetching bitwise exclusive or operation on a + remote data object. } \begin{apidefinition} @@ -18,18 +19,17 @@ \begin{apiarguments} - \apiargument{OUT}{dest}{A pointer to the remotely-accessible data object to + \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to be bitwise xored with the object - pointed to by \VAR{dest}.} + \apiargument{IN}{value}{The operand to the bitwise atomic operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_xor} atomically performs a bitwise xor on the - remotely-accessible data object pointed to by \VAR{dest} at PE \VAR{pe} + \FUNC{shmem\_xor} atomically performs a non-fetching bitwise exclusive or on + the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} with the operand \VAR{value}. } From 5bc544d9dd67d65860ee77232719edb9ae2b028a Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 19 Jan 2017 19:30:35 -0500 Subject: [PATCH 091/583] Annex F: Expanded SMA entry Related to openshmem-org/specification#14. --- content/backmatter.tex | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..77c19ef73 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -368,7 +368,10 @@ \section{Overview}\label{subsec:dep_overview} \_SHMEM\_MINOR\_VERSION & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MINOR\_VERSION} \\ \hline \_SHMEM\_MAX\_NAME\_LEN & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAX\_NAME\_LEN} \\ \hline \_SHMEM\_VENDOR\_STRING & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_VENDOR\_STRING} \\ \hline - SMA\_* environment variables & 1.4 & Current & SHMEM\_* \\ \hline + SMA\_VERSION & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_VERSION} \\ \hline + SMA\_INFO & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_INFO} \\ \hline + SMA\_SYMMETRIC\_SIZE & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_SYMMETRIC\_SIZE} \\ \hline + SMA\_DEBUG & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_DEBUG} \\ \hline \end{tabular} \end{center} @@ -413,7 +416,7 @@ \subsection{SHMEM\_CACHE} This API has largely gone unused on cache-coherent system architectures. \FUNC{SHMEM\_CACHE} has been deprecated. -\subsection{\_SHMEM\_* constants} +\subsection{\_SHMEM\_* Library Constants} The library constants \begin{center} \begin{tabular}{ll} @@ -422,13 +425,26 @@ \subsection{\_SHMEM\_* constants} \_SHMEM\_BCAST\_SYNC\_SIZE & \_SHMEM\_MINOR\_VERSION \\ \_SHMEM\_COLLECT\_SYNC\_SIZE & \_SHMEM\_MAX\_NAME\_LEN \\ \_SHMEM\_REDUCE\_SYNC\_SIZE & \_SHMEM\_VENDOR\_STRING \\ - \end{tabular} +\end{tabular} \end{center} do not adhere to the \Clang{} standard's reserved identifiers and the \Cpp{} standard's reserved names. These constants have been deprecated and replaced with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran{} naming conventions. +\subsection{SMA\_* Environment Variables} +The environment variables +\begin{center} +\begin{tabular}{ll} + SMA\_VERSION \\ + SMA\_INFO \\ + SMA\_SYMMETRIC\_SIZE \\ + SMA\_DEBUG \\ +\end{tabular} +\end{center} +were deprecated in order to normalize the \openshmem \ac{API} to use +\shmemprefix{} as the standard prefix for all environment variables. + From 42d3db0b73fe44d389ac1e87e8a3db9a2e82768e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 19 Jan 2017 19:31:09 -0500 Subject: [PATCH 092/583] Annex F: Added deprecated Fortran routines from v1.2 Related to Redmine Issues 45 and 90. Other Changes - Moved entry for `start_pes` to top of table. --- content/backmatter.tex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..122279090 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -334,13 +334,16 @@ \section{Overview}\label{subsec:dep_overview} & \shortstack{\textbf{Last Version Supported}} & \textbf{Replaced By} \\ \hline + \CorCpp: \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \Fortran: \hyperref[subsec:start_pes]{\FUNC{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline \CorCpp: \FUNC{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline \CorCpp: \FUNC{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \Fortran: \FUNC{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline + \Fortran: \FUNC{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline \CorCpp: \FUNC{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline \CorCpp: \FUNC{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline \CorCpp: \FUNC{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline \CorCpp: \FUNC{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \CorCpp: \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline \Fortran: \FUNC{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} From 4d4bd487eb9f627c61e3dba8897c54ee64ed0f18 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 19 Jan 2017 19:31:09 -0500 Subject: [PATCH 093/583] Annex F: Added deprecation rationale for Fortran routines Other Changes - Normalized text to use "routine" instead of "function" - Reordered `start_pes` to top of list --- content/backmatter.tex | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 122279090..b274026ff 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -377,24 +377,29 @@ \section{Overview}\label{subsec:dep_overview} \section{Deprecation Rationale}\label{subsec:dep_rationale} -\subsection{\_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} The -\CorCpp functions \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, -\FUNC{shfree}, \FUNC{shrealloc} and \FUNC{shmemalign} were deprecated in order -to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard -prefix for all functions. - -\subsection{start\_pes} -The \CorCpp function \FUNC{start\_pes} includes an unnecessary initialization +\subsection{\CorCpp: start\_pes} +The \CorCpp routine \FUNC{start\_pes} includes an unnecessary initialization argument that is remnant of historical \emph{SHMEM} implementations and no longer reflects the requirements of modern \openshmem implementations. Furthermore, the naming of \FUNC{start\_pes} does not include the standardized -\shmemprefixLC{} naming prefix. This function has been deprecated and +\shmemprefixLC{} naming prefix. This routine has been deprecated and \openshmem users are encouraged to use \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} instead. -\subsection{SHMEM\_PUT (Fortran API)} -The \Fortran{} function \FUNC{SHMEM\_PUT} is defined only for the \Fortran{} -\ac{API} and is semantically identical to \Fortran{} functions +\subsection{\CorCpp: \_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} +The \CorCpp routines \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, +\FUNC{shfree}, \FUNC{shrealloc} and \FUNC{shmemalign} were deprecated in order +to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard +prefix for all routines. + +\subsection{\Fortran: START\_PES, MY\_PE, NUM\_PES} +The \Fortran{} routines \FUNC{START\_PES}, \FUNC{MY\_PE}, and \FUNC{NUM\_PES} +were deprecated in order to minimize the API differences from the deprecation +of \CorCpp routines \FUNC{start\_pes}, \FUNC{\_my\_pe}, and \FUNC{\_num\_pes}. + +\subsection{\Fortran: SHMEM\_PUT} +The \Fortran{} routine \FUNC{SHMEM\_PUT} is defined only for the \Fortran{} +\ac{API} and is semantically identical to \Fortran{} routines \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64} have defined equivalents in the \CorCpp interface, \FUNC{SHMEM\_PUT} is ambiguous and has been deprecated. From 19f058440b88a1135befc8cc04869987709cf146 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 23 Jan 2017 10:26:59 -0500 Subject: [PATCH 094/583] Clarify init-finalize pairing Remove passage from API notes that contradicts the following semantic from the API description of shmem_init: "At the end of the OpenSHMEM program which it initialized, the call to shmem_init must be matched with a call to shmem_finalize." Signed-off-by: James Dinan --- content/shmem_init.tex | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/content/shmem_init.tex b/content/shmem_init.tex index 065493f90..1f4f5e32d 100644 --- a/content/shmem_init.tex +++ b/content/shmem_init.tex @@ -36,10 +36,8 @@ As of \openshmem Specification 1.2 the use of \FUNC{start\_pes} has been deprecated and is replaced with \FUNC{shmem\_init}. While support for \FUNC{start\_pes} is still required in \openshmem libraries, users are - encouraged to use \FUNC{shmem\_init}. Replacing \FUNC{start\_pes} with - \FUNC{shmem\_init} in \openshmem programs with no further changes is possible; - there is an implicit \FUNC{shmem\_finalize} at the end of main. However, - \FUNC{shmem\_init} differs slightly from \FUNC{start\_pes}: multiple calls to + encouraged to use \FUNC{shmem\_init}. An important difference between + \FUNC{shmem\_init} and \FUNC{start\_pes} is that multiple calls to \FUNC{shmem\_init} within a program results in undefined behavior, while in the case of \FUNC{start\_pes}, any subsequent calls to \FUNC{start\_pes} after the first one resulted in a no-op. From 09d3b9f7b0c9d728ca67f98df8806bb905d8ff9c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 23 Jan 2017 10:47:02 -0500 Subject: [PATCH 095/583] Add changelog entry for shmem_init clarification Signed-off-by: James Dinan --- content/backmatter.tex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..b2295aa7a 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,10 @@ \section{Version 1.5} \begin{itemize} % +\item Clarified that \FUNC{shmem\_init} must be matched with a call to + \FUNC{shmem\_finalize}. +\\See Section \ref{subsec:shmem_init}. +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % From 9d05cae7a6309bce8dd15a03725fda292768045d Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 2 Dec 2016 15:02:28 -0500 Subject: [PATCH 096/583] First draft of contexts proposal Signed-off-by: James Dinan --- content/library_constants.tex | 10 +++ content/shmem_add.tex | 6 ++ content/shmem_barrier_all.tex | 5 +- content/shmem_cswap.tex | 6 ++ content/shmem_ctx.tex | 123 ++++++++++++++++++++++++++++++++++ content/shmem_fadd.tex | 6 ++ content/shmem_fence.tex | 9 ++- content/shmem_fetch.tex | 6 ++ content/shmem_finc.tex | 6 ++ content/shmem_g.tex | 6 ++ content/shmem_get.tex | 10 +++ content/shmem_get_nbi.tex | 8 +++ content/shmem_iget.tex | 7 ++ content/shmem_inc.tex | 6 ++ content/shmem_iput.tex | 7 ++ content/shmem_p.tex | 6 ++ content/shmem_put.tex | 11 +++ content/shmem_put_nbi.tex | 8 +++ content/shmem_quiet.tex | 10 ++- content/shmem_set.tex | 6 ++ content/shmem_swap.tex | 6 ++ main_spec.tex | 4 +- utils/defs.tex | 1 + 23 files changed, 266 insertions(+), 7 deletions(-) create mode 100644 content/shmem_ctx.tex diff --git a/content/library_constants.tex b/content/library_constants.tex index 4e2346f0d..9cc55a353 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -10,7 +10,17 @@ \tabularnewline \hline \hline +\vspace{3mm} +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \newtext{\const{SHMEM\_CTX\_DEFAULT}}}} +& \newtext{Handle of type \CODE{shmem\_ctx\_t} that references the +default communication context. All point-to-point communication operations +and synchronizations that do not specify a context are performed on the +default context. Refer to \hyperref[sec:ctx]{Communication Management +Routines} for more information about the usage of this +constant.}\tabularnewline %new +\hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} \hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} diff --git a/content/shmem_add.tex b/content/shmem_add.tex index fb15fca2c..57dea9d6e 100644 --- a/content/shmem_add.tex +++ b/content/shmem_add.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} void shmem_add(TYPE *dest, TYPE value, int pe); +void shmem_ctx_add(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} void shmem__add(TYPE *dest, TYPE value, int pe); +void shmem_ctx__add(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. @@ -33,6 +35,10 @@ \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number upon which \dest{} is to be updated. If you are using \Fortran, it must be a default integer value.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 31392247b..289f36537 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -1,7 +1,7 @@ \apisummary{ Registers the arrival of a \ac{PE} at a barrier and suspends \ac{PE} execution until all other \ac{PE}s arrive at the barrier and all local and remote memory - updates are completed. + updates \newtext{on all contexts} are completed. } \begin{apidefinition} @@ -29,7 +29,8 @@ Prior to synchronizing with other \ac{PE}s, \FUNC{shmem\_barrier\_all} ensures completion of all previously issued memory stores and remote memory - updates issued via \openshmem{} \acp{AMO} and \ac{RMA} routine calls such + updates issued \newtext{on all contexts} via \openshmem{} \acp{AMO} and + \ac{RMA} routine calls such as \FUNC{shmem\_int\_add}, \FUNC{shmem\_put32}, \FUNC{shmem\_put\_nbi}, and \FUNC{shmem\_get\_nbi}. } diff --git a/content/shmem_cswap.tex b/content/shmem_cswap.tex index 1b9a8886d..1b2863a42 100644 --- a/content/shmem_cswap.tex +++ b/content/shmem_cswap.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} TYPE shmem_cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE shmem_ctx_cswap(TYPE *dest, TYPE cond, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE shmem_ctx__cswap(TYPE *dest, TYPE cond, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. @@ -36,6 +38,10 @@ \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number upon which \VAR{dest} is to be updated. If you are using \Fortran, it must be a default integer value.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_ctx.tex b/content/shmem_ctx.tex new file mode 100644 index 000000000..415b2d145 --- /dev/null +++ b/content/shmem_ctx.tex @@ -0,0 +1,123 @@ +\color{ForestGreen} + +All \openshmem RMA, AMO, and point-to-point synchronization routines are +performed on a communication context. The communication context defines an +independent ordering and completion environment, allowing users to manage the +overlap of communication with computation and also to manage communication +operations performed by separate threads within a multithreaded \ac{PE}. For +example, in single-threaded environments, contexts can be used to pipeline +communication and computation. In multithreaded environments, contexts can +additionally provide thread isolation, eliminating overheads resulting from +thread interference within the communication subsystem. + +Context handles are of type \CODE{shmem\_ctx\_t} and are valid for +language-level assignment and comparison. A handle to the desired context is +passed as an argument in the \CODE{shmem\_ctx...} API routines. API routines +that do not accept a context argument operate on the default context. The +default context can be used explicitly through the \const{SHMEM\_CTX\_DEFAULT} +handle. + +\subsubsection{\textbf{SHMEM\_CTX\_CREATE}} +\label{subsec:shmem_ctx_create} +\apisummary{ + Create a communication context. +} + +\begin{apidefinition} + +\begin{Csynopsis} +int shmem_ctx_create(long options, shmem_ctx_t *ctx); +\end{Csynopsis} + +\begin{apiarguments} + \apiargument{IN}{options}{The set of options requested for the given context. + Multiple options may be requested by combining them with a bitwise + \textit{OR} operation. Otherwise, $0$ can be given if no options are + requested.} + \apiargument{OUT}{ctx}{A handle to the newly created context.} +\end{apiarguments} + +\apidescription{ + The \FUNC{shmem\_ctx\_create} routine creates a new communication context + and returns its handle through the \VAR{ctx} argument. If the context was + created successfully, a value of zero is returned. An unsuccessful context + creation call is not treated as an error and the \openshmem library remains + in a correct state. The creation call can be reattempted with different + options or after additional resources become available. + + The following constants can be supplied as context options: \\ + + \apitablerow{\CONST{SHMEM\_CTX\_SHARED}}{ + In a multithreaded environment, the given context will be used by + multiple threads concurrently.} + \apitablerow{\CONST{SHMEM\_CTX\_PRIVATE}}{ + In a multithreaded environment, the given context will not be used + by multiple threads concurrently.} +} + +\apireturnvalues{ + Zero on success and nonzero on error. +} + +\apinotes{ + None. +} + +%\begin{apiexamples} +% +% \apicexample +% {The following example uses \FUNC{shmem\_p} in a \Clang{} program.} +% {./example_code/shmem_p_example.c} +% {} +% +%\end{apiexamples} + +\end{apidefinition} + +\subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} +\label{subsec:shmem_ctx_create} +\apisummary{ + Destroy a communication context. +} + +\begin{apidefinition} + +\begin{Csynopsis} +void shmem_ctx_destroy(shmem_ctx_t ctx); +\end{Csynopsis} + +\begin{apiarguments} + \apiargument{IN}{ctx}{Handle to the context that will be destroyed.} +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_ctx\_destroy} destroys a context that was created by a call to + \FUNC{shmem\_ctx\_create}. This function performs an implicit quiet + operation on the given context before it is freed. + + \textit{Rationale:} Destroying a context makes it impossible for the user to + complete communication operations that are pending on that context. This + includes nonblocking communication operations, whose local buffers are only + returned to the user after the operations have been completed. An implicit + quiet is performed when freeing a context to avoid this ambiguity. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + None. +} + +%\begin{apiexamples} +% +% \apicexample +% {The following example uses \FUNC{shmem\_p} in a \Clang{} program.} +% {./example_code/shmem_p_example.c} +% {} +% +%\end{apiexamples} + +\end{apidefinition} +\color{black} diff --git a/content/shmem_fadd.tex b/content/shmem_fadd.tex index 4487ff37e..8b63b08c1 100644 --- a/content/shmem_fadd.tex +++ b/content/shmem_fadd.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} TYPE shmem_fadd(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx_fadd(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__fadd(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx__fadd(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. @@ -32,6 +34,10 @@ \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which \VAR{dest} is to be updated. If you are using \Fortran, it must be a default integer value.} +\newtext{ +\apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +} \end{apiarguments} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index c357bdd33..e998d368d 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -7,6 +7,7 @@ \begin{Csynopsis} void shmem_fence(void); +void shmem_ctx_fence(void); \end{Csynopsis} \begin{Fsynopsis} @@ -14,13 +15,17 @@ \end{Fsynopsis} \begin{apiarguments} -\apiargument{None.}{}{} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ This routine assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects. All \PUT{}, \acp{AMO}, and memory store - routines to symmetric data objects issued to a particular remote \ac{PE} prior + routines to symmetric data objects issued to a particular remote \ac{PE} + \newtext{on the given context} prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any subsequent \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, diff --git a/content/shmem_fetch.tex b/content/shmem_fetch.tex index 600232e05..dec052259 100644 --- a/content/shmem_fetch.tex +++ b/content/shmem_fetch.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} TYPE shmem_fetch(const TYPE *dest, int pe); +TYPE shmem_ctx_fetch(const TYPE *dest, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} TYPE shmem__fetch(const TYPE *dest, int pe); +TYPE shmem_ctx__fetch(const TYPE *dest, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. @@ -32,6 +34,10 @@ the remote \ac{PE}.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number from which \VAR{dest} is to be fetched.} +\newtext{ +\apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +} \end{apiarguments} diff --git a/content/shmem_finc.tex b/content/shmem_finc.tex index afaf3b180..4c940bd33 100644 --- a/content/shmem_finc.tex +++ b/content/shmem_finc.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} TYPE shmem_finc(TYPE *dest, int pe); +TYPE shmem_ctx_finc(TYPE *dest, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__finc(TYPE *dest, int pe); +TYPE shmem_ctx__finc(TYPE *dest, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. @@ -31,6 +33,10 @@ \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which \dest{} is to be updated. If you are using \Fortran, it must be a default integer value.} +\newtext{ +\apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +} \end{apiarguments} diff --git a/content/shmem_g.tex b/content/shmem_g.tex index 40b942d3b..a0264fd4b 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -6,17 +6,23 @@ \begin{C11synopsis} TYPE shmem_g(const TYPE *addr, int pe); +TYPE shmem_ctx_g(const TYPE *addr, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} TYPE shmem__g(const TYPE *addr, int pe); +TYPE shmem_ctx__g(const TYPE *addr, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{apiarguments} \apiargument{IN}{addr}{The remotely accessible array element or scalar data object.} \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_get.tex b/content/shmem_get.tex index deab3b5bb..cbb287a50 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -6,21 +6,27 @@ \begin{C11synopsis} void shmem_get(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx_get(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__get(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx__get(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_get(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_get(void *dest, const void *source, size_t nelems, int pe, + shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_getmem(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_getmem(void *dest, const void *source, size_t nelems, int pe, + shmem_ctx_t ctx); \end{CsynopsisCol} \begin{Fsynopsis} @@ -50,6 +56,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index 835eab557..d17d1920d 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -7,21 +7,25 @@ \begin{C11synopsis} void shmem_get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx_get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx__get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_get_nbi(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_get_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_getmem_nbi(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_getmem_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} \begin{Fsynopsis} @@ -51,6 +55,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_iget.tex b/content/shmem_iget.tex index e36c93ef5..4fb0d237b 100644 --- a/content/shmem_iget.tex +++ b/content/shmem_iget.tex @@ -6,16 +6,19 @@ \begin{C11synopsis} void shmem_iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx_iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx__iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_iget(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx_iget(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. @@ -53,6 +56,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_inc.tex b/content/shmem_inc.tex index 239247e1d..dcdbe3c51 100644 --- a/content/shmem_inc.tex +++ b/content/shmem_inc.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} void shmem_inc(TYPE *dest, int pe); +void shmem_ctx_inc(TYPE *dest, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} void shmem__inc(TYPE *dest, int pe); +void shmem_ctx__inc(TYPE *dest, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. @@ -28,6 +30,10 @@ \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which \dest{} is to be updated. If you are using \Fortran{}, it must be a default integer value.} +\newtext{ +\apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +} \end{apiarguments} diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index c5179ad47..eefc7d6c4 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -6,16 +6,19 @@ \begin{C11synopsis} void shmem_iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx_iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx__iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_iput(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void shmem_ctx_iput(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. @@ -53,6 +56,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} diff --git a/content/shmem_p.tex b/content/shmem_p.tex index 001b5c97c..21bd91e2d 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} void shmem_p(TYPE *dest, TYPE value, int pe); +void shmem_ctx_p(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__p(TYPE *dest, TYPE value, int pe); +void shmem_ctx__p(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. @@ -20,6 +22,10 @@ \apiargument{IN}{value}{The value to be transferred to \VAR{addr} on the remote \ac{PE}.} \apiargument{IN}{pe}{The number of the remote \ac{PE}.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_put.tex b/content/shmem_put.tex index a9c4b9293..6830eff3d 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -7,21 +7,28 @@ \begin{C11synopsis} void shmem_put(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx_put(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__put(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx__put(TYPE *dest, const TYPE *source, size_t nelems, int pe, + shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_put(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_put(void *dest, const void *source, size_t nelems, int pe, + shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_putmem(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_putmem(void *dest, const void *source, size_t nelems, int pe, + shmem_ctx_t ctx); \end{CsynopsisCol} \begin{Fsynopsis} @@ -50,6 +57,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_put_nbi.tex b/content/shmem_put_nbi.tex index 4d010ca0a..977b66e68 100644 --- a/content/shmem_put_nbi.tex +++ b/content/shmem_put_nbi.tex @@ -7,21 +7,25 @@ \begin{C11synopsis} void shmem_put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx_put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void shmem_ctx__put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_put_nbi(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_put_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_putmem_nbi(void *dest, const void *source, size_t nelems, int pe); +void shmem_ctx_putmem_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); \end{CsynopsisCol} \begin{Fsynopsis} @@ -50,6 +54,10 @@ \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 32b6282be..8f4b2331c 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -8,6 +8,7 @@ \begin{Csynopsis} void shmem_quiet(void); +void shmem_ctx_quiet(shmem_ctx_t ctx); \end{Csynopsis} \begin{Fsynopsis} @@ -15,13 +16,18 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{None.}{}{} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines on - symmetric data objects issued by the calling \ac{PE}. All \PUT{}, \acp{AMO}, + symmetric data objects issued by the calling \ac{PE} + \newtext{on the given context}. + All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. diff --git a/content/shmem_set.tex b/content/shmem_set.tex index b2d866122..96f35ab90 100644 --- a/content/shmem_set.tex +++ b/content/shmem_set.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} void shmem_set(TYPE *dest, TYPE value, int pe); +void shmem_ctx_set(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} void shmem__set(TYPE *dest, TYPE value, int pe); +void shmem_ctx__set(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. @@ -33,6 +35,10 @@ \apiargument{IN}{value}{The value to be atomically written to the remote \ac{PE}.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which \VAR{dest} is to be updated.} +\newtext{ +\apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +} \end{apiarguments} diff --git a/content/shmem_swap.tex b/content/shmem_swap.tex index 143f42ddd..e69c720b7 100644 --- a/content/shmem_swap.tex +++ b/content/shmem_swap.tex @@ -6,11 +6,13 @@ \begin{C11synopsis} TYPE shmem_swap(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx_swap(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} TYPE shmem__swap(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx__swap(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. @@ -36,6 +38,10 @@ \apiargument{IN}{pe}{ An integer that indicates the \ac{PE} number on which \dest{} is to be updated. If you are using \Fortran, it must be a default integer value.} + \newtext{ + \apiargument{IN}{ctx}{Context on which to perform the operation. When none + is provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + } \end{apiarguments} \apidescription{ diff --git a/main_spec.tex b/main_spec.tex index 996317c1c..26e9c3bab 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -102,7 +102,9 @@ \subsubsection{\textbf{SHPDEALLOC}}\label{subsec:shpdealloc} - +\subsection{Communication Management Routines} +\label{sec:ctx} +\input{content/shmem_ctx.tex} \subsection{Remote Memory Access Routines}\label{sec:rma} diff --git a/utils/defs.tex b/utils/defs.tex index b8bee6ff9..f45e44d74 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -35,6 +35,7 @@ \newcommand{\FUNC}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} +\newcommand{\CODE}[1]{\textit{#1}} \newcommand{\const}[1]{\protect\gb\protect{\textsf{\small #1}}\index{CONST:#1}} \newcommand{\CorCpp}{\textit{C/C++}\xspace} \newcommand{\CorCppFor}{\textit{C/C++/Fortran}\xspace} From 4f146c39f7d518a78c8da0bf4b341f0017012f5c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 24 Jan 2017 21:00:40 -0500 Subject: [PATCH 097/583] Fix typos and minor edits from 1/24 WG reading Signed-off-by: James Dinan --- content/library_constants.tex | 2 +- content/shmem_ctx.tex | 9 +++++---- content/shmem_fence.tex | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 9cc55a353..8331a326a 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -11,7 +11,7 @@ \hline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} +\vtop{\hbox{\CorCpp:} \hbox{\hspace*{12mm} \newtext{\const{SHMEM\_CTX\_DEFAULT}}}} & \newtext{Handle of type \CODE{shmem\_ctx\_t} that references the default communication context. All point-to-point communication operations diff --git a/content/shmem_ctx.tex b/content/shmem_ctx.tex index 415b2d145..0a774d7f5 100644 --- a/content/shmem_ctx.tex +++ b/content/shmem_ctx.tex @@ -1,6 +1,6 @@ \color{ForestGreen} -All \openshmem RMA, AMO, and point-to-point synchronization routines are +All \openshmem RMA, AMO, and memory ordering routines are performed on a communication context. The communication context defines an independent ordering and completion environment, allowing users to manage the overlap of communication with computation and also to manage communication @@ -12,7 +12,7 @@ Context handles are of type \CODE{shmem\_ctx\_t} and are valid for language-level assignment and comparison. A handle to the desired context is -passed as an argument in the \CODE{shmem\_ctx...} API routines. API routines +passed as an argument in the \CODE{shmem\_ctx\_*} API routines. API routines that do not accept a context argument operate on the default context. The default context can be used explicitly through the \const{SHMEM\_CTX\_DEFAULT} handle. @@ -40,7 +40,8 @@ \subsubsection{\textbf{SHMEM\_CTX\_CREATE}} \apidescription{ The \FUNC{shmem\_ctx\_create} routine creates a new communication context and returns its handle through the \VAR{ctx} argument. If the context was - created successfully, a value of zero is returned. An unsuccessful context + created successfully, a value of zero is returned; otherwise a nonzero + value is returned. An unsuccessful context creation call is not treated as an error and the \openshmem library remains in a correct state. The creation call can be reattempted with different options or after additional resources become available. @@ -56,7 +57,7 @@ \subsubsection{\textbf{SHMEM\_CTX\_CREATE}} } \apireturnvalues{ - Zero on success and nonzero on error. + Zero on success and nonzero otherwise. } \apinotes{ diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index e998d368d..381709589 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -7,7 +7,7 @@ \begin{Csynopsis} void shmem_fence(void); -void shmem_ctx_fence(void); +void shmem_ctx_fence(shmem_ctx_t ctx); \end{Csynopsis} \begin{Fsynopsis} From 234645872aa5fe89affe29b9c7ec36400a1cc9dc Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 3 Feb 2017 17:43:04 -0500 Subject: [PATCH 098/583] Add missing SHMEM_GET64 and SHMEM_GET64_NBI routines These are part of the Fortran interface, but were not listed in the spec. Signed-off-by: James Dinan --- content/backmatter.tex | 4 ++++ content/shmem_get.tex | 1 + content/shmem_get_nbi.tex | 1 + 3 files changed, 6 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..1284df3c4 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,10 @@ \section{Version 1.5} \begin{itemize} % +\item Clarified that the \FUNC{SHMEM\_GET64} and \FUNC{SHMEM\_GET64\_NBI} + routines are included in the Fortran language bindings.\\ + See Sections \ref{subsec:shmem_get} and \ref{subsec:shmem_get_nbi}. +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % diff --git a/content/shmem_get.tex b/content/shmem_get.tex index deab3b5bb..3e533cff4 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -31,6 +31,7 @@ CALL SHMEM_GET4(dest, source, nelems, pe) CALL SHMEM_GET8(dest, source, nelems, pe) CALL SHMEM_GET32(dest, source, nelems, pe) +CALL SHMEM_GET64(dest, source, nelems, pe) CALL SHMEM_GET128(dest, source, nelems, pe) CALL SHMEM_GETMEM(dest, source, nelems, pe) CALL SHMEM_INTEGER_GET(dest, source, nelems, pe) diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index 835eab557..bd05aa93e 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -32,6 +32,7 @@ CALL SHMEM_GET4_NBI(dest, source, nelems, pe) CALL SHMEM_GET8_NBI(dest, source, nelems, pe) CALL SHMEM_GET32_NBI(dest, source, nelems, pe) +CALL SHMEM_GET64_NBI(dest, source, nelems, pe) CALL SHMEM_GET128_NBI(dest, source, nelems, pe) CALL SHMEM_GETMEM_NBI(dest, source, nelems, pe) CALL SHMEM_INTEGER_GET_NBI(dest, source, nelems, pe) From 47fe57761476cb56191c57d820b80be89745780d Mon Sep 17 00:00:00 2001 From: Manjunath Date: Mon, 6 Feb 2017 14:47:01 -0500 Subject: [PATCH 099/583] Edits to broadcast, collect and reductions to resolve ambiguity --- content/shmem_broadcast.tex | 4 ++-- content/shmem_collect.tex | 3 ++- content/shmem_reductions.tex | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index 74ff2bbb5..08ee94986 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -76,8 +76,8 @@ Upon return from a broadcast routine, the following are true for the local \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object - is updated. The values in the \VAR{pSync} array are restored to the original - values. + is updated\newtext{, and if the current PE is the root PE, the buffer pointed to by source may be safely reused.} + The values in the \VAR{pSync} array are restored to the original values. } \apidesctable{ diff --git a/content/shmem_collect.tex b/content/shmem_collect.tex index b0b1e5d39..b8a353da7 100644 --- a/content/shmem_collect.tex +++ b/content/shmem_collect.tex @@ -85,7 +85,8 @@ \activeset. Upon return from a collective routine, the following are true for the local - \ac{PE}: The \dest{} array is updated. The values in the \VAR{pSync} array are + \ac{PE}: The \dest{} array is updated \newtext {and the \source{} array may be safely reused}. + The values in the \VAR{pSync} array are restored to the original values. } diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index c9ed53875..57b3af078 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -208,7 +208,8 @@ \activeset{} is ready to accept the results of the \OPR{reduction}. Upon return from a reduction routine, the following are true for the local - \ac{PE}: The \dest{} array is updated. The values in the \VAR{pSync} array are + \ac{PE}: The \dest{} array is updated \newtext{and the \source{} array may be safely reused}. + The values in the \VAR{pSync} array are restored to the original values. } From 8cd8a3ec82e6de7ef9703fa919ab48b1f38ed332 Mon Sep 17 00:00:00 2001 From: Manjunath Date: Mon, 6 Feb 2017 14:56:34 -0500 Subject: [PATCH 100/583] Edits to shmem broadcast to clean semantics --- content/shmem_broadcast.tex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index 08ee94986..005be3913 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -72,11 +72,14 @@ needed to ensure this): The \VAR{pSync} array on all \ac{PE}s in the \activeset{} is not still in use from a prior call to a broadcast routine. The \dest{} array on all \ac{PE}s in the \activeset{} is ready to accept the - broadcast data. + broadcast data. \newtext{The data in the \source{} array on the root \ac{PE} is ready to be broadcasted.} + + \newtext{The \source{} and \dest{} arrays may be the same array, but they may not be overlapping arrays. If they + are different, the source array on the non-root \acp{PE} and \dest{} array on the root \ac{PE} is not used by the broadcast routine.} Upon return from a broadcast routine, the following are true for the local \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object - is updated\newtext{, and if the current PE is the root PE, the buffer pointed to by source may be safely reused.} + is updated. \newtext{If the current PE is the root PE, the \source{} data object may be safely reused.} The values in the \VAR{pSync} array are restored to the original values. } From ef06661250aab84f4b37174307f8a3612b2aa585 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 7 Feb 2017 08:49:59 -0500 Subject: [PATCH 101/583] Remove [u]intptr_t from AMO support --- content/atomics_intro.tex | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index bef8c09dd..168b95e0a 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -51,8 +51,6 @@ int64\_t & int64 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline - intptr\_t & intptr \\ \hline - uintptr\_t & uintptr \\ \hline size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} @@ -78,8 +76,6 @@ int64\_t & int64 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline - intptr\_t & intptr \\ \hline - uintptr\_t & uintptr \\ \hline size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} From ff7747759898f7fdefc2b7892c5b541c00d64864 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 3 Feb 2017 17:23:36 -0500 Subject: [PATCH 102/583] Add dedication to David Knaak in OpenSHMEM 1.4 Signed-off-by: James Dinan --- content/coverpage.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/coverpage.tex b/content/coverpage.tex index a46704771..daef641b7 100644 --- a/content/coverpage.tex +++ b/content/coverpage.tex @@ -82,6 +82,6 @@ \section*{Acknowledgements} \\ We would also like to acknowledge the contribution of the members of the \openshmem mailing list for their ideas, discussions, suggestions, and -constructive criticism which has helped us improve this document. - - +constructive criticism which has helped us improve this document.\\ +\\ +In memory of David Charles Knaak. From 56f9e68b9fcca49bc82776586d16d416aa0243f6 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 7 Feb 2017 11:30:58 -0500 Subject: [PATCH 103/583] Clarify shmemx header is required, even when empty Signed-off-by: James Dinan --- content/backmatter.tex | 3 +++ content/language_bindings_and_conformance.tex | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..4855eee29 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,9 @@ \section{Version 1.5} \begin{itemize} % +\item Clarified that the \openshmem extensions header files are required, even when empty. +\\See Section~\ref{subsec:bindings}. +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % diff --git a/content/language_bindings_and_conformance.tex b/content/language_bindings_and_conformance.tex index 97d9e670b..5b228bd5d 100644 --- a/content/language_bindings_and_conformance.tex +++ b/content/language_bindings_and_conformance.tex @@ -15,5 +15,10 @@ \Fortran), \shmemprefixC (for \Clang) or with \openshmem \ac{API} names. All \openshmem extension \ac{API}s that are not part of this specification must -be defined in the \FUNC{shmemx.h} include file. These extensions shall use the +be defined in the \FUNC{shmemx.h} and \FUNC{shmemx.fh} include files for +\Clang{} and \Fortran{} language bindings, respectively. These header files +must exist, even if they are empty. Any extensions shall use the \FUNC{shmemx\_} prefix for all routine, variable, and constant names. +\openshmem implementations are encouraged to define macros of the form +\CONST{SHMEMX\_HAVE\_extension} that can be used to check for the presence of +a particular extension. From d5f96e715ec246f681d1ff37843fe47346007748 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 7 Feb 2017 13:32:26 -0500 Subject: [PATCH 104/583] Update spec version to 1.4 --- content/backmatter.tex | 2 +- utils/defs.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..990b6358f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -436,7 +436,7 @@ \subsection{\_SHMEM\_* constants} \chapter{Changes to this Document}\label{sec:changelog} -\section{Version 1.5} +\section{Version 1.4} \begin{itemize} % diff --git a/utils/defs.tex b/utils/defs.tex index b8bee6ff9..34e000f2c 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -29,7 +29,7 @@ \newcommand{\newtext}[1]{\textcolor{ForestGreen}{#1}} \newcommand{\oldtext}[1]{\textcolor{magenta}{\sout{#1}}} -\newcommand{\insertDocVersion}{1.5} +\newcommand{\insertDocVersion}{1.4} \newcommand{\OSH}{\emph{OpenSHMEM}} \newcommand{\openshmem}{{Open\-SHMEM}\xspace} \newcommand{\FUNC}[1]{\textit{#1}} From e69ef2cada45afbf5d7d8ed0d4cacbd436b96a53 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 7 Feb 2017 13:33:52 -0500 Subject: [PATCH 105/583] Bitwise AMO overhaul - Renamed AMO routines to shmem_atomic_* prefix - Updated bitwise AMO type-generic support - Updated related examples - Updated AMO intro - Updated changelog --- content/atomics_intro.tex | 68 ++++++++++++------- content/backmatter.tex | 8 ++- .../{shmem_add.tex => shmem_atomic_add.tex} | 15 ++-- .../{shmem_or.tex => shmem_atomic_and.tex} | 20 +++--- ...swap.tex => shmem_atomic_compare_swap.tex} | 17 +++-- ...shmem_fetch.tex => shmem_atomic_fetch.tex} | 21 +++--- ...em_fadd.tex => shmem_atomic_fetch_add.tex} | 16 +++-- ...em_fand.tex => shmem_atomic_fetch_and.tex} | 20 +++--- ...em_finc.tex => shmem_atomic_fetch_inc.tex} | 20 ++++-- ...hmem_for.tex => shmem_atomic_fetch_or.tex} | 21 +++--- ...em_fxor.tex => shmem_atomic_fetch_xor.tex} | 20 +++--- .../{shmem_inc.tex => shmem_atomic_inc.tex} | 22 +++--- .../{shmem_and.tex => shmem_atomic_or.tex} | 20 +++--- .../{shmem_set.tex => shmem_atomic_set.tex} | 17 +++-- .../{shmem_swap.tex => shmem_atomic_swap.tex} | 21 +++--- .../{shmem_xor.tex => shmem_atomic_xor.tex} | 20 +++--- ...d_example.c => shmem_atomic_add_example.c} | 2 +- ....c => shmem_atomic_compare_swap_example.c} | 4 +- ...ple.c => shmem_atomic_fetch_add_example.c} | 2 +- ...ple.c => shmem_atomic_fetch_inc_example.c} | 2 +- ...c_example.c => shmem_atomic_inc_example.c} | 2 +- ..._example.c => shmem_atomic_swap_example.c} | 2 +- main_spec.tex | 56 +++++++-------- 23 files changed, 238 insertions(+), 178 deletions(-) rename content/{shmem_add.tex => shmem_atomic_add.tex} (78%) rename content/{shmem_or.tex => shmem_atomic_and.tex} (53%) rename content/{shmem_cswap.tex => shmem_atomic_compare_swap.tex} (81%) rename content/{shmem_fetch.tex => shmem_atomic_fetch.tex} (61%) rename content/{shmem_fadd.tex => shmem_atomic_fetch_add.tex} (77%) rename content/{shmem_fand.tex => shmem_atomic_fetch_and.tex} (55%) rename content/{shmem_finc.tex => shmem_atomic_fetch_inc.tex} (73%) rename content/{shmem_for.tex => shmem_atomic_fetch_or.tex} (54%) rename content/{shmem_fxor.tex => shmem_atomic_fetch_xor.tex} (55%) rename content/{shmem_inc.tex => shmem_atomic_inc.tex} (68%) rename content/{shmem_and.tex => shmem_atomic_or.tex} (53%) rename content/{shmem_set.tex => shmem_atomic_set.tex} (67%) rename content/{shmem_swap.tex => shmem_atomic_swap.tex} (75%) rename content/{shmem_xor.tex => shmem_atomic_xor.tex} (52%) rename example_code/{shmem_add_example.c => shmem_atomic_add_example.c} (87%) rename example_code/{shmem_cswap_example.c => shmem_atomic_compare_swap_example.c} (60%) rename example_code/{shmem_fadd_example.c => shmem_atomic_fetch_add_example.c} (85%) rename example_code/{shmem_finc_example.c => shmem_atomic_fetch_inc_example.c} (86%) rename example_code/{shmem_inc_example.c => shmem_atomic_inc_example.c} (88%) rename example_code/{shmem_swap_example.c => shmem_atomic_swap_example.c} (85%) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 168b95e0a..96b93bf68 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -4,37 +4,39 @@ Section \ref{sec:rma}, the \acp{AMO} are performed only on symmetric objects. \openshmem{} defines the two types of \ac{AMO} routines: \begin{itemize} -\item % Blocking\\ +\item The \textit{fetching} routines return the original value of, and optionally -update, the remote data object in a single atomic operation. The routines +update, the remote data object in a single atomic operation. The routines return after the data has been fetched and delivered to the local \ac{PE}. -The \textit{fetching} operations include: \FUNC{shmem\_fetch}, -\FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, -\FUNC{shmem\_fadd}, \\ -\FUNC{shmem\_fand}, \FUNC{shmem\_for}, and \FUNC{shmem\_fxor}. +The fetching operations include: +\FUNC{shmem\_atomic\_\{fetch, compare\_swap, swap\}} and +\FUNC{shmem\_atomic\_fetch\_\{inc, add, and, or, xor\}}. - -\item % Non-Blocking\\ +\item The \textit{non-fetching} atomic routines update the remote memory in a single -atomic operation. A \textit{non-fetching} atomic routine starts the atomic -operation and may return before the operation execution on the remote \ac{PE}. -To force completion for these \textit{non-fetching} atomic routines, -\FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can be -used by an \openshmem{} program. +atomic operation. A call to a non-fetching atomic routine issues the atomic +operation and may return before the operation executes on the remote \ac{PE}. +To force completion for these non-fetching atomic routines, +\FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can +be used by an \openshmem{} program. -The \textit{non-fetching} operations include: \FUNC{shmem\_set}, -\FUNC{shmem\_inc}, \FUNC{shmem\_add}, \FUNC{shmem\_and}, \FUNC{shmem\_or}, -and \FUNC{shmem\_xor}. +The non-fetching operations include: +\FUNC{shmem\_atomic\_\{set, inc, add, and, or, xor\}}. \end{itemize} Where appropriate compiler support is available, \openshmem{} provides -type-generic atomic memory operation interfaces via \Celev{} generic selection. -The type-generic \ac{AMO} routines each support the ``standard \ac{AMO} types'' -listed in Table~\ref{stdamotypes}, except for \FUNC{shmem\_fadd}, -\FUNC{shmem\_add}, \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, and -\FUNC{shmem\_swap}, which support the ``extended \ac{AMO} types'' listed in -Table~\ref{extamotypes}. +type-generic \ac{AMO} interfaces via \Celev{} generic selection. +The type-generic support for the \ac{AMO} routines is as follows: + +\begin{itemize} +\item \FUNC{shmem\_atomic\_\{compare\_swap, fetch\_inc, inc\}} support + the ``standard \ac{AMO} types'' listed in Table~\ref{stdamotypes}, +\item \FUNC{shmem\_atomic\_\{fetch, set, swap, fetch\_add, add\}} support + the ``extended \ac{AMO} types'' listed in Table~\ref{extamotypes}, and +\item \FUNC{shmem\_atomic\_\{fetch\_and, and, fetch\_or, or, fetch\_xor, xor\}} + support the ``bitwise \ac{AMO} types'' listed in Table~\ref{bitamotypes}. +\end{itemize} \begin{table}[h] \begin{center} @@ -56,7 +58,7 @@ \end{tabular} \caption{Standard \ac{AMO} Types and Names} \label{stdamotypes} - \end{center} + \end{center} \end{table} \begin{table}[h] @@ -81,5 +83,23 @@ \end{tabular} \caption{Extended \ac{AMO} Types and Names} \label{extamotypes} - \end{center} + \end{center} +\end{table} + +\begin{table}[h] + \begin{center} + \begin{tabular}{|l|l|} + \hline + \TYPE & \TYPENAME \\ \hline + unsigned int & uint \\ \hline + unsigned long & ulong \\ \hline + unsigned long long & ulonglong \\ \hline + int32\_t & int32 \\ \hline + int64\_t & int64 \\ \hline + uint32\_t & uint32 \\ \hline + uint64\_t & uint64 \\ \hline + \end{tabular} + \caption{Bitwise \ac{AMO} Types and Names} + \label{bitamotypes} + \end{center} \end{table} diff --git a/content/backmatter.tex b/content/backmatter.tex index 5cca9bca5..7f2104d29 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -378,8 +378,12 @@ \section{Version 1.5} for atomic add and fetch-and-add on floating-point types. \\ See Sections \ref{sec:rma} and \ref{sec:amo}. % -\item Added fetching and non-fetching bitwise and, inclusive or, and - exclusive or atomic operations. +\item Renamed AMO operations to use \FUNC{shmem\_atomic\_*} prefix and + deprecated old AMO routines. +\\ See Section \ref{sec:amo}. +% +\item Added fetching and non-fetching bitwise AND, OR, and XOR atomic + operations. \\ See Section \ref{sec:amo}. \end{itemize} diff --git a/content/shmem_add.tex b/content/shmem_atomic_add.tex similarity index 78% rename from content/shmem_add.tex rename to content/shmem_atomic_add.tex index 3e0728151..686cb050d 100644 --- a/content/shmem_add.tex +++ b/content/shmem_atomic_add.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_add(TYPE *dest, TYPE value, int pe); +void shmem_atomic_add(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table~\ref{extamotypes}. \begin{Csynopsis} -void shmem__add(TYPE *dest, TYPE value, int pe); +void shmem__atomic_add(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. @@ -38,10 +38,10 @@ \end{apiarguments} \apidescription{ - The \FUNC{shmem\_add} routine performs an atomic add operation. It adds + The \FUNC{shmem\_atomic\_add} routine performs an atomic add operation. It adds \VAR{value} to \dest{} on \ac{PE} \VAR{pe} and atomically updates the \dest{} without returning the value. - } + } \apidesctable{ If you are using \Fortran, \VAR{dest} must be of the following type: @@ -55,14 +55,17 @@ } \apinotes{ - The term remotely accessible is defined in Section \ref{subsec:memory_model}. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_add} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_add}. } \begin{apiexamples} \apicexample {} - {./example_code/shmem_add_example.c} + {./example_code/shmem_atomic_add_example.c} {} \end{apiexamples} diff --git a/content/shmem_or.tex b/content/shmem_atomic_and.tex similarity index 53% rename from content/shmem_or.tex rename to content/shmem_atomic_and.tex index 561272677..aa40697d9 100644 --- a/content/shmem_or.tex +++ b/content/shmem_atomic_and.tex @@ -1,36 +1,36 @@ \apisummary{ - Atomically perform a non-fetching bitwise inclusive or operation on a + Atomically perform a non-fetching bitwise AND operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -void shmem_or(TYPE *dest, TYPE value, int pe); +void shmem_atomic_and(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__or(TYPE *dest, TYPE value, int pe); +void shmem__atomic_and(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise AND operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_or} atomically performs a non-fetching bitwise inclusive or on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_and} atomically performs a non-fetching bitwise AND + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -38,7 +38,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/content/shmem_cswap.tex b/content/shmem_atomic_compare_swap.tex similarity index 81% rename from content/shmem_cswap.tex rename to content/shmem_atomic_compare_swap.tex index 1b9a8886d..cc815963e 100644 --- a/content/shmem_cswap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -5,14 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE shmem_atomic_compare_swap(TYPE *dest, TYPE cond, TYPE value, int pe); \end{C11synopsis} -where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. \begin{Csynopsis} -TYPE shmem__cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE shmem__atomic_compare_swap(TYPE *dest, TYPE cond, TYPE value, int pe); \end{Csynopsis} -where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{stdamotypes}. \begin{Fsynopsis} INTEGER pe @@ -59,7 +61,10 @@ } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_cswap} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_compare\_swap}. } \begin{apiexamples} @@ -68,7 +73,7 @@ {The following call ensures that the first \ac{PE} to execute the conditional swap will successfully write its \ac{PE} number to \VAR{race\_winner} on \ac{PE} \CONST{0}.} - {./example_code/shmem_cswap_example.c} + {./example_code/shmem_atomic_compare_swap_example.c} {} \end{apiexamples} diff --git a/content/shmem_fetch.tex b/content/shmem_atomic_fetch.tex similarity index 61% rename from content/shmem_fetch.tex rename to content/shmem_atomic_fetch.tex index 600232e05..ca0008cd5 100644 --- a/content/shmem_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -5,14 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_fetch(const TYPE *dest, int pe); +TYPE shmem_atomic_fetch(const TYPE *dest, int pe); \end{C11synopsis} -where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types specified by +Table~\ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__fetch(const TYPE *dest, int pe); +TYPE shmem__atomic_fetch(const TYPE *dest, int pe); \end{Csynopsis} -where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. \begin{Fsynopsis} INTEGER pe @@ -36,18 +38,21 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_fetch} performs an atomic fetch operation. It returns the - contents of the \VAR{dest} as an atomic operation. + \FUNC{shmem\_atomic\_fetch} performs an atomic fetch operation. + It returns the contents of the \VAR{dest} as an atomic operation. } \apireturnvalues{ The contents at the \VAR{dest} address on the remote \ac{PE}. - The data type of the return value is the same as the the type of + The data type of the return value is the same as the type of the remote data object. } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_fetch} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_fetch}. } \end{apidefinition} diff --git a/content/shmem_fadd.tex b/content/shmem_atomic_fetch_add.tex similarity index 77% rename from content/shmem_fadd.tex rename to content/shmem_atomic_fetch_add.tex index 6bc6fb277..ad91f6f0a 100644 --- a/content/shmem_fadd.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_fadd(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_add(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table~\ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__fadd(TYPE *dest, TYPE value, int pe); +TYPE shmem__atomic_fetch_add(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. @@ -38,7 +38,7 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_fadd} routines perform an atomic fetch-and-add operation. An + \FUNC{shmem\_atomic\_fetch\_add} routines perform an atomic fetch-and-add operation. An atomic fetch-and-add operation fetches the old \VAR{dest} and adds \VAR{value} to \VAR{dest} without the possibility of another atomic operation on the \VAR{dest} between the time of the fetch and the update. These routines add @@ -61,14 +61,18 @@ } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_fadd} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_fetch\_add}. } \begin{apiexamples} \apicexample - {The following \FUNC{shmem\_fadd} example is for \CorCpp{} programs:} - {./example_code/shmem_fadd_example.c} + {The following \FUNC{shmem\_atomic\_fetch\_add} example is for + \CorCpp{} programs:} + {./example_code/shmem_atomic_fetch_add_example.c} {} \end{apiexamples} diff --git a/content/shmem_fand.tex b/content/shmem_atomic_fetch_and.tex similarity index 55% rename from content/shmem_fand.tex rename to content/shmem_atomic_fetch_and.tex index 8480fb91f..9a49a88e9 100644 --- a/content/shmem_fand.tex +++ b/content/shmem_atomic_fetch_and.tex @@ -1,35 +1,35 @@ \apisummary{ - Atomically perform a fetching bitwise and operation on a remote data object. + Atomically perform a fetching bitwise AND operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_fand(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_and(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__fand(TYPE *dest, TYPE value, int pe); +TYPE shmem__atomic_fetch_and(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise AND operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_fand} atomically performs a fetching bitwise and on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_fetch\_and} atomically performs a fetching bitwise AND + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -38,7 +38,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/content/shmem_finc.tex b/content/shmem_atomic_fetch_inc.tex similarity index 73% rename from content/shmem_finc.tex rename to content/shmem_atomic_fetch_inc.tex index afaf3b180..dd490d3f1 100644 --- a/content/shmem_finc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -5,14 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_finc(TYPE *dest, int pe); +TYPE shmem_atomic_fetch_inc(TYPE *dest, int pe); \end{C11synopsis} -where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. \begin{Csynopsis} -TYPE shmem__finc(TYPE *dest, int pe); +TYPE shmem__atomic_fetch_inc(TYPE *dest, int pe); \end{Csynopsis} -where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{stdamotypes}. \begin{Fsynopsis} INTEGER pe @@ -54,14 +56,18 @@ } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_finc} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_fetch\_inc}. } \begin{apiexamples} \apicexample - {The following \FUNC{shmem\_finc} example is for \CorCpp{} programs:} - {./example_code/shmem_finc_example.c} + {The following \FUNC{shmem\_atomic\_fetch\_inc} example is for + \CorCpp{} programs:} + {./example_code/shmem_atomic_fetch_inc_example.c} {} \end{apiexamples} diff --git a/content/shmem_for.tex b/content/shmem_atomic_fetch_or.tex similarity index 54% rename from content/shmem_for.tex rename to content/shmem_atomic_fetch_or.tex index af2d54f9d..cb064d388 100644 --- a/content/shmem_for.tex +++ b/content/shmem_atomic_fetch_or.tex @@ -1,36 +1,35 @@ \apisummary{ - Atomically perform a fetching bitwise inclusive or operation on a - remote data object. + Atomically perform a fetching bitwise OR operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_for(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_or(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__for(TYPE *dest, TYPE value, int pe); +TYPE shmem__atomic_fetch_or(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise OR operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_for} atomically performs a fetching bitwise inclusive or on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_fetch\_or} atomically performs a fetching bitwise OR + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -39,7 +38,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/content/shmem_fxor.tex b/content/shmem_atomic_fetch_xor.tex similarity index 55% rename from content/shmem_fxor.tex rename to content/shmem_atomic_fetch_xor.tex index c1c0b6854..c74ff4c03 100644 --- a/content/shmem_fxor.tex +++ b/content/shmem_atomic_fetch_xor.tex @@ -1,36 +1,36 @@ \apisummary{ - Atomically perform a fetching bitwise exclusive or operation on a + Atomically perform a fetching bitwise exclusive or (XOR) operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_fxor(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_xor(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__fxor(TYPE *dest, TYPE value, int pe); +TYPE shmem__atomic_fetch_xor(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise XOR operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_fxor} atomically performs a fetching bitwise exclusive or on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_fetch\_xor} atomically performs a fetching bitwise XOR + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -39,7 +39,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/content/shmem_inc.tex b/content/shmem_atomic_inc.tex similarity index 68% rename from content/shmem_inc.tex rename to content/shmem_atomic_inc.tex index 239247e1d..5a502ddeb 100644 --- a/content/shmem_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -5,14 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_inc(TYPE *dest, int pe); +void shmem_atomic_inc(TYPE *dest, int pe); \end{C11synopsis} -where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types specified by +Table~\ref{stdamotypes}. \begin{Csynopsis} -void shmem__inc(TYPE *dest, int pe); +void shmem__atomic_inc(TYPE *dest, int pe); \end{Csynopsis} -where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. +where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{stdamotypes}. \begin{Fsynopsis} INTEGER pe @@ -33,7 +35,7 @@ \apidescription{ These routines perform an atomic increment operation on the \VAR{dest} data - object on \ac{PE}. + object on \ac{PE}. } @@ -49,14 +51,18 @@ } \apinotes{ - The term remotely accessible is defined in Section \ref{subsec:memory_model}. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_inc} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_inc}. } \begin{apiexamples} \apicexample - { The following \FUNC{shmem\_inc} example is for \CorCpp{} programs: } - {./example_code/shmem_inc_example.c} + { The following \FUNC{shmem\_atomic\_inc} example is for + \CorCpp{} programs: } + {./example_code/shmem_atomic_inc_example.c} {} \end{apiexamples} diff --git a/content/shmem_and.tex b/content/shmem_atomic_or.tex similarity index 53% rename from content/shmem_and.tex rename to content/shmem_atomic_or.tex index 430aee319..da3d94c30 100644 --- a/content/shmem_and.tex +++ b/content/shmem_atomic_or.tex @@ -1,36 +1,36 @@ \apisummary{ - Atomically perform a non-fetching bitwise and operation on a + Atomically perform a non-fetching bitwise OR operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -void shmem_and(TYPE *dest, TYPE value, int pe); +void shmem_atomic_or(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__and(TYPE *dest, TYPE value, int pe); +void shmem__atomic_or(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise OR operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_and} atomically performs a non-fetching bitwise and on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_or} atomically performs a non-fetching bitwise OR + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -38,7 +38,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/content/shmem_set.tex b/content/shmem_atomic_set.tex similarity index 67% rename from content/shmem_set.tex rename to content/shmem_atomic_set.tex index b2d866122..ee8d6d0cd 100644 --- a/content/shmem_set.tex +++ b/content/shmem_atomic_set.tex @@ -5,14 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_set(TYPE *dest, TYPE value, int pe); +void shmem_atomic_set(TYPE *dest, TYPE value, int pe); \end{C11synopsis} -where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types specified by +Table~\ref{extamotypes}. \begin{Csynopsis} -void shmem__set(TYPE *dest, TYPE value, int pe); +void shmem__atomic_set(TYPE *dest, TYPE value, int pe); \end{Csynopsis} -where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. +where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. \begin{Fsynopsis} INTEGER pe @@ -37,7 +39,7 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_set} performs an atomic set operation. It writes the + \FUNC{shmem\_atomic\_set} performs an atomic set operation. It writes the \VAR{value} into \VAR{dest} on \VAR{pe} as an atomic operation. } @@ -46,7 +48,10 @@ } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_set} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_set}. } \end{apidefinition} diff --git a/content/shmem_swap.tex b/content/shmem_atomic_swap.tex similarity index 75% rename from content/shmem_swap.tex rename to content/shmem_atomic_swap.tex index 143f42ddd..3b0811bd2 100644 --- a/content/shmem_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -5,12 +5,12 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_swap(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_swap(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__swap(TYPE *dest, TYPE value, int pe); +TYPE shmem__atomic_swap(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. @@ -39,9 +39,9 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_swap} performs an atomic swap operation. It writes \VAR{value} - into \dest{} on \ac{PE} and returns the previous contents of \dest{} as an - atomic operation. + \FUNC{shmem\_atomic\_swap} performs an atomic swap operation. + It writes \VAR{value} into \dest{} on \ac{PE} and returns the previous + contents of \dest{} as an atomic operation. } \apidesctable{ @@ -60,15 +60,18 @@ } \apinotes{ - None. + As of OpenSHMEM~1.4, the use of \FUNC{shmem\_swap} has been deprecated + and should be expected to be removed in a future specification. + Its behavior and call signature is identical to the replacement + interface, \FUNC{shmem\_atomic\_swap}. } \begin{apiexamples} \apicexample - {The example below swap values between odd numbered \acp{PE} and their right - (modulo) neighbor and outputs the result of swap.} - {./example_code/shmem_swap_example.c} + {The example below swap values between odd numbered \acp{PE} and + their right (modulo) neighbor and outputs the result of swap.} + {./example_code/shmem_atomic_swap_example.c} {} \end{apiexamples} diff --git a/content/shmem_xor.tex b/content/shmem_atomic_xor.tex similarity index 52% rename from content/shmem_xor.tex rename to content/shmem_atomic_xor.tex index fb06636b6..914bc15ce 100644 --- a/content/shmem_xor.tex +++ b/content/shmem_atomic_xor.tex @@ -1,36 +1,36 @@ \apisummary{ - Atomically perform a non-fetching bitwise exclusive or operation on a + Atomically perform a non-fetching bitwise exclusive or (XOR) operation on a remote data object. } \begin{apidefinition} \begin{C11synopsis} -void shmem_xor(TYPE *dest, TYPE value, int pe); +void shmem_atomic_xor(TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by -Table~\ref{stdamotypes}. +Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__xor(TYPE *dest, TYPE value, int pe); +void shmem__atomic_xor(TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding -\TYPENAME{} specified by Table \ref{stdamotypes}. +\TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} - \apiargument{IN}{value}{The operand to the bitwise atomic operation.} + \apiargument{IN}{value}{The operand to the bitwise XOR operation.} \apiargument{IN}{pe}{An integer value for the \ac{PE} on which \VAR{dest} is to be updated.} \end{apiarguments} \apidescription{ - \FUNC{shmem\_xor} atomically performs a non-fetching bitwise exclusive or on - the remotely accessible data object pointed to by \VAR{dest} at PE \VAR{pe} - with the operand \VAR{value}. + \FUNC{shmem\_atomic\_xor} atomically performs a non-fetching bitwise XOR + on the remotely accessible data object pointed to by \VAR{dest} at PE + \VAR{pe} with the operand \VAR{value}. } \apireturnvalues{ @@ -38,7 +38,7 @@ } \apinotes{ - None. + None. } \end{apidefinition} diff --git a/example_code/shmem_add_example.c b/example_code/shmem_atomic_add_example.c similarity index 87% rename from example_code/shmem_add_example.c rename to example_code/shmem_atomic_add_example.c index a94f0c5b6..79e8e7b48 100644 --- a/example_code/shmem_add_example.c +++ b/example_code/shmem_atomic_add_example.c @@ -14,7 +14,7 @@ int main(void) shmem_barrier_all(); if (me == 1){ - old = shmem_add(&dst, 44, 0); + old = shmem_atomic_add(&dst, 44, 0); } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); diff --git a/example_code/shmem_cswap_example.c b/example_code/shmem_atomic_compare_swap_example.c similarity index 60% rename from example_code/shmem_cswap_example.c rename to example_code/shmem_atomic_compare_swap_example.c index 54012fc46..b71a5a0c6 100644 --- a/example_code/shmem_cswap_example.c +++ b/example_code/shmem_atomic_compare_swap_example.c @@ -3,10 +3,10 @@ int main(void) { - static int race_winner = -1; + static int race_winner = -1; int oldval; shmem_init(); - oldval = shmem_cswap(&race_winner, -1, shmem_my_pe(), 0); + oldval = shmem_atomic_compare_swap(&race_winner, -1, shmem_my_pe(), 0); if(oldval == -1) printf("pe %d was first\n",shmem_my_pe()); return 1; } diff --git a/example_code/shmem_fadd_example.c b/example_code/shmem_atomic_fetch_add_example.c similarity index 85% rename from example_code/shmem_fadd_example.c rename to example_code/shmem_atomic_fetch_add_example.c index f218c27ce..b60f62e2f 100644 --- a/example_code/shmem_fadd_example.c +++ b/example_code/shmem_atomic_fetch_add_example.c @@ -14,7 +14,7 @@ int main(void) shmem_barrier_all(); if (me == 1){ - old = shmem_fadd(&dst, 44, 0); + old = shmem_atomic_fetch_add(&dst, 44, 0); } shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); diff --git a/example_code/shmem_finc_example.c b/example_code/shmem_atomic_fetch_inc_example.c similarity index 86% rename from example_code/shmem_finc_example.c rename to example_code/shmem_atomic_fetch_inc_example.c index b1cd94552..b05e79770 100644 --- a/example_code/shmem_finc_example.c +++ b/example_code/shmem_atomic_fetch_inc_example.c @@ -16,7 +16,7 @@ int main(void) shmem_barrier_all(); if (me == 0) - old = shmem_finc(&dst, 1); + old = shmem_atomic_fetch_inc(&dst, 1); shmem_barrier_all(); printf("%d: old = %d, dst = %d\n", me, old, dst); diff --git a/example_code/shmem_inc_example.c b/example_code/shmem_atomic_inc_example.c similarity index 88% rename from example_code/shmem_inc_example.c rename to example_code/shmem_atomic_inc_example.c index f67243eaa..ea8f9cf98 100644 --- a/example_code/shmem_inc_example.c +++ b/example_code/shmem_atomic_inc_example.c @@ -14,7 +14,7 @@ int main(void) shmem_barrier_all(); if (me == 0) - shmem_inc(&dst, 1); + shmem_atomic_inc(&dst, 1); shmem_barrier_all(); printf("%d: dst = %d\n", me, dst); diff --git a/example_code/shmem_swap_example.c b/example_code/shmem_atomic_swap_example.c similarity index 85% rename from example_code/shmem_swap_example.c rename to example_code/shmem_atomic_swap_example.c index f47a35cd3..8c312905e 100644 --- a/example_code/shmem_swap_example.c +++ b/example_code/shmem_atomic_swap_example.c @@ -15,7 +15,7 @@ int main(void) shmem_barrier_all(); new_val = me; if (me & 1){ - swapped_val = shmem_swap(dest, new_val, (me + 1) % npes); + swapped_val = shmem_atomic_swap(dest, new_val, (me + 1) % npes); printf("%d: dest = %ld, swapped = %ld\n", me, *dest, swapped_val); } shmem_free(dest); diff --git a/main_spec.tex b/main_spec.tex index 20370f40d..c5426e4ef 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -139,47 +139,47 @@ \subsubsection{\textbf{SHMEM\_GET\_NBI}}\label{subsec:shmem_get_nbi} \subsection{Atomic Memory Operations}\label{sec:amo} \input{content/atomics_intro} -\subsubsection{\textbf{SHMEM\_ADD}}\label{subsec:shmem_add} -\input{content/shmem_add.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH}}\label{subsec:shmem_fetch} +\input{content/shmem_atomic_fetch.tex} -\subsubsection{\textbf{SHMEM\_CSWAP}}\label{subsec:shmem_cswap} -\input{content/shmem_cswap.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_SET}}\label{subsec:shmem_set} +\input{content/shmem_atomic_set.tex} -\subsubsection{\textbf{SHMEM\_SWAP}}\label{subsec:shmem_swap} -\input{content/shmem_swap.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_COMPARE\_SWAP}}\label{subsec:shmem_cswap} +\input{content/shmem_atomic_compare_swap.tex} -\subsubsection{\textbf{SHMEM\_FINC}}\label{subsec:shmem_finc} -\input{content/shmem_finc.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_SWAP}}\label{subsec:shmem_swap} +\input{content/shmem_atomic_swap.tex} -\subsubsection{\textbf{SHMEM\_INC}}\label{subsec:shmem_inc} -\input{content/shmem_inc.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH\_INC}}\label{subsec:shmem_finc} +\input{content/shmem_atomic_fetch_inc.tex} -\subsubsection{\textbf{SHMEM\_FADD}}\label{subsec:shmem_fadd} -\input{content/shmem_fadd.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_INC}}\label{subsec:shmem_inc} +\input{content/shmem_atomic_inc.tex} -\subsubsection{\textbf{SHMEM\_FETCH}}\label{subsec:shmem_fetch} -\input{content/shmem_fetch.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH\_ADD}}\label{subsec:shmem_fadd} +\input{content/shmem_atomic_fetch_add.tex} -\subsubsection{\textbf{SHMEM\_SET}}\label{subsec:shmem_set} -\input{content/shmem_set.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_ADD}}\label{subsec:shmem_add} +\input{content/shmem_atomic_add.tex} -\subsubsection{\textbf{SHMEM\_FAND}}\label{subsec:shmem_fand} -\input{content/shmem_fand.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH\_AND}}\label{subsec:shmem_fand} +\input{content/shmem_atomic_fetch_and.tex} -\subsubsection{\textbf{SHMEM\_AND}}\label{subsec:shmem_and} -\input{content/shmem_and.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_AND}}\label{subsec:shmem_and} +\input{content/shmem_atomic_and.tex} -\subsubsection{\textbf{SHMEM\_FOR}}\label{subsec:shmem_for} -\input{content/shmem_for.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH\_OR}}\label{subsec:shmem_for} +\input{content/shmem_atomic_fetch_or.tex} -\subsubsection{\textbf{SHMEM\_OR}}\label{subsec:shmem_or} -\input{content/shmem_or.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_OR}}\label{subsec:shmem_or} +\input{content/shmem_atomic_or.tex} -\subsubsection{\textbf{SHMEM\_FXOR}}\label{subsec:shmem_fxor} -\input{content/shmem_fxor.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_FETCH\_XOR}}\label{subsec:shmem_fxor} +\input{content/shmem_atomic_fetch_xor.tex} -\subsubsection{\textbf{SHMEM\_XOR}}\label{subsec:shmem_xor} -\input{content/shmem_xor.tex} +\subsubsection{\textbf{SHMEM\_ATOMIC\_XOR}}\label{subsec:shmem_xor} +\input{content/shmem_atomic_xor.tex} From 73fb59987c8501b243080bfcdf11f26cfaaae6df Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 7 Feb 2017 15:18:34 -0500 Subject: [PATCH 106/583] Finish point-to-point synchronization changes - Refined p2p-sync intro - Updated shmem_test - Deprecated shmem_wait - Removed shmem_{wait,test}_{any,all} (previously proposed) - Updated changelog --- content/backmatter.tex | 4 ++++ content/p2p_sync_intro.tex | 26 ++++++++++++-------------- content/shmem_test.tex | 22 ++++++---------------- content/shmem_test_all.tex | 0 content/shmem_test_any.tex | 0 content/shmem_wait.tex | 25 ++++++++----------------- content/shmem_wait_all.tex | 0 content/shmem_wait_any.tex | 0 example_code/shmem_test_example1.c | 4 ++-- main_spec.tex | 14 +------------- utils/defs.tex | 13 ++++++++++--- 11 files changed, 43 insertions(+), 65 deletions(-) delete mode 100644 content/shmem_test_all.tex delete mode 100644 content/shmem_test_any.tex delete mode 100644 content/shmem_wait_all.tex delete mode 100644 content/shmem_wait_any.tex diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..1d976fd87 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -465,6 +465,10 @@ \section{Version 1.5} \item Clarified deprecation overview and added deprecation rationale in Annex F. \\See Section \ref{sec:dep_api}. % +\item Deprecated the \VAR{shmem\_wait} functions and added \VAR{shmem\_test} + functions. +\\ See Section \ref{subsec:p2p_intro}. +% \end{itemize} \section{Version 1.3} diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 9a9e8e8e6..8b0fa891a 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -1,13 +1,16 @@ The following section discusses \openshmem \ac{API}s that provides a mechanism for synchronization between two \ac{PE}s based on the value of a symmetric data -object. +object. +The point-to-point synchronization routines can be used to portably ensure +that memory access operations observe remote updates in the order enforced by +the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} +routines. Where appropriate compiler support is available, \openshmem provides type-generic point-to-point synchronization interfaces via \Celev{} generic selection. Such type-generic routines are supported for the ``point-to-point synchronization types'' identified in -Table~\ref{p2psynctypes}. Implementations may optionally support additional -types. +Table~\ref{p2psynctypes}. \begin{table}[h] \begin{center} @@ -27,8 +30,6 @@ int64\_t & int64 \\ \hline uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline - intptr\_t & intptr \\ \hline - uintptr\_t & uintptr \\ \hline size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} @@ -37,14 +38,11 @@ \end{center} \end{table} -The point-to-point synchronization routines can be used to portably ensure -that memory access operations observe remote updates in the order enforced by -the initiator PE using the \FUNC{shmem\_fence} and \FUNC{shmem\_quiet} -routines. - -Some point-to-point synchronization make use of the enumeration constants in -Table~\ref{p2p-consts}, which have the effect to specify the comparison -operation to be performed by the associated routine. +The point-to-point synchronization interface provides the enumerated type +\CTYPE{shmem\_cmp}, whose enumerators specify the comparison operators used by +synchronization routines that take a \CTYPE{shmem\_cmp} argument. The +enumerators of \CTYPE{shmem\_cmp} and their associated operations are presented +in Table~\ref{p2p-consts}. \begin{table}[h] \begin{center} @@ -56,7 +54,7 @@ SHMEM\_CMP\_GT & Greater than \\ SHMEM\_CMP\_GE & Greater than or equal to \\ SHMEM\_CMP\_LT & Less than \\ - SHMEM\_CMP\_LE & Less than or equal to + SHMEM\_CMP\_LE & Less than or equal to \\ \hline \end{tabular} \caption{Point-to-Point Comparison Enumeration Constants} \label{p2p-consts} diff --git a/content/shmem_test.tex b/content/shmem_test.tex index d3f6abe16..c6567241a 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,15 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, TYPE value); -int shmem_test_cmp(TYPE *ivar, int cmp, TYPE value); +int shmem_test(TYPE *ivar, shmem_cmp cmp, TYPE value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, TYPE value); -int shmem__test_cmp(TYPE *ivar, int cmp, TYPE value); +int shmem__test(TYPE *ivar, shmem_cmp cmp, TYPE value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. @@ -29,33 +27,25 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_test} tests whether the symmetric object pointed to by - \VAR{ivar} is equal to \VAR{value}. - - \FUNC{shmem\_test\_cmp} tests the numeric comparison of the symmetric object + \FUNC{shmem\_test} tests the numeric comparison of the symmetric object pointed to by \VAR{ivar} with the value \VAR{value} according to the comparison operator \VAR{cmp}. } \apireturnvalues{ - \FUNC{shmem\_test} returns 1 if the symmetric object pointed to by \VAR{ivar} - is equal to \VAR{value}; otherwise, it returns 0. - - \FUNC{shmem\_test\_cmp} returns 1 if the comparison of the symmetric object + \FUNC{shmem\_test} returns 1 if the comparison of the symmetric object pointed to by \VAR{ivar} with the value \VAR{value} according to the comparison operator \VAR{cmp} evalutes to true; otherwise, it returns 0. } \apinotes{ - \FUNC{shmem\_test} tests the equality of the symmetric object pointed to by - \VAR{ivar} and \VAR{value}, while \FUNC{shmem\_wait} blocks until the two - are not equal. + None. } \begin{apiexamples} \apicexample {The following example demonstrates the use of \FUNC{shmem\_test} to - perform the equivalent functionality of \FUNC{shmem\_wait}.} + perform the equivalent functionality of \FUNC{shmem\_wait\_until}.} {./example_code/shmem_test_example1.c} {} \end{apiexamples} diff --git a/content/shmem_test_all.tex b/content/shmem_test_all.tex deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/shmem_test_any.tex b/content/shmem_test_any.tex deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index d560b729d..c78cc5acd 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_wait(TYPE *ivar, TYPE cmp_value); -void shmem_wait_until(TYPE *ivar, int cmp, TYPE cmp_value); +[[deprecated]] void shmem_wait(TYPE *ivar, TYPE cmp_value); +void shmem_wait_until(TYPE *ivar, shmem_cmp cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem__wait(TYPE *ivar, TYPE cmp_value); -void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); +[[deprecated]] void shmem__wait(TYPE *ivar, TYPE cmp_value); +void shmem__wait_until(TYPE *ivar, shmem_cmp cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. @@ -33,7 +33,7 @@ by another \ac{PE}. If you are using \CorCpp, the type of \VAR{ivar} should match that implied in the SYNOPSIS section.} \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with - \VAR{cmp\_value}. \VAR{cmp} must be of type integer. If you are using + \VAR{cmp\_value}. \VAR{cmp} must be of type \CTYPE{shmem\_cmp}. If you are using \Fortran, it must be of default kind. If you are using \CorCpp, the type of \VAR{cmp} should match that implied in the SYNOPSIS section.} \apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. If you are @@ -69,23 +69,14 @@ \apitablerow{shmem\_int4\_wait, shmem\_int4\_wait\_until}{INTEGER*4} \apitablerow{shmem\_int8\_wait, shmem\_int8\_wait\_until}{INTEGER*8} -\apidesctable{ - The following \VAR{cmp} values are supported: -}{CMP Value}{Comparison} - -\CorCppFor:\\ -\apitablerow{SHMEM\_CMP\_EQ }{ Equal} -\apitablerow{SHMEM\_CMP\_NE}{Not equal} -\apitablerow{SHMEM\_CMP\_GT}{Greater than} -\apitablerow{SHMEM\_CMP\_LE}{Less than or equal to} -\apitablerow{SHMEM\_CMP\_LT}{Less than} -\apitablerow{SHMEM\_CMP\_GE}{Greater than or equal to} - \apireturnvalues{ None. } \apinotes{ + As of OpenSHMEM~1.4, the \FUNC{shmem\_wait} routine has been deprecated + and should be expected to be removed in a future specification. + \FUNC{shmem\_wait} is functionally equivalent to \FUNC{shmem\_wait\_until} where \VAR{cmp} is SHMEM\_CMP\_NE. } diff --git a/content/shmem_wait_all.tex b/content/shmem_wait_all.tex deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/shmem_wait_any.tex b/content/shmem_wait_any.tex deleted file mode 100644 index e69de29bb..000000000 diff --git a/example_code/shmem_test_example1.c b/example_code/shmem_test_example1.c index 14cf3da34..496160aa7 100644 --- a/example_code/shmem_test_example1.c +++ b/example_code/shmem_test_example1.c @@ -1,7 +1,7 @@ #include #include -void user_wait(long *ivar, long value) +void user_wait_until(long *ivar, int cmp, long value) { - while (shmem_test(ivar, value)); + while (!shmem_test(ivar, cmp, value)); } diff --git a/main_spec.tex b/main_spec.tex index a3f4902a2..b2d875857 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -195,27 +195,15 @@ \subsubsection{\textbf{SHMEM\_ALLTOALLS}}\label{subsec:shmem_alltoalls} -\subsection{Point-To-Point Synchronization Routines} +\subsection{Point-To-Point Synchronization Routines}\label{subsec:p2p_intro} \input{content/p2p_sync_intro.tex} \subsubsection{\textbf{SHMEM\_WAIT}}\label{subsec:shmem_wait} \input{content/shmem_wait.tex} -\subsubsection{\textbf{SHMEM\_WAIT\_ALL}}\label{subsec:shmem_wait_all} -\input{content/shmem_wait_all.tex} - -\subsubsection{\textbf{SHMEM\_WAIT\_ANY}}\label{subsec:shmem_wait_any} -\input{content/shmem_wait_any.tex} - \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} \input{content/shmem_test.tex} -\subsubsection{\textbf{SHMEM\_TEST\_ALL}}\label{subsec:shmem_test_all} -\input{content/shmem_test_all.tex} - -\subsubsection{\textbf{SHMEM\_TEST\_ANY}}\label{subsec:shmem_test_any} -\input{content/shmem_test_any.tex} - diff --git a/utils/defs.tex b/utils/defs.tex index b8bee6ff9..ed35a2f07 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -33,6 +33,7 @@ \newcommand{\OSH}{\emph{OpenSHMEM}} \newcommand{\openshmem}{{Open\-SHMEM}\xspace} \newcommand{\FUNC}[1]{\textit{#1}} +\newcommand{\CTYPE}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} \newcommand{\const}[1]{\protect\gb\protect{\textsf{\small #1}}\index{CONST:#1}} @@ -333,19 +334,25 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, _Noreturn}, aboveskip=0pt, belowskip=0pt}}{} + morekeywords={size_t, TYPE, _Noreturn, shmem_cmp}, + morecomment=[s][\color{red}\textbf]{[[}{]]}, + aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} + morekeywords={size_t, TYPE, TYPENAME, SIZE, shmem_cmp}, + morecomment=[s][\color{red}\textbf]{[[}{]]}, + aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{Csynopsis} { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} + morekeywords={size_t, TYPE, TYPENAME, SIZE, shmem_cmp}, + morecomment=[s][\color{red}\textbf]{[[}{]]}, + aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} { From 30e83921293fc384ae2209bd99f775a5508e572f Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 7 Feb 2017 16:32:59 -0500 Subject: [PATCH 107/583] Add shmem_calloc function --- content/backmatter.tex | 3 +++ content/shmem_calloc.tex | 40 ++++++++++++++++++++++++++++++++++++++++ main_spec.tex | 3 +++ 3 files changed, 46 insertions(+) create mode 100644 content/shmem_calloc.tex diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..31b3f80cb 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -465,6 +465,9 @@ \section{Version 1.5} \item Clarified deprecation overview and added deprecation rationale in Annex F. \\See Section \ref{sec:dep_api}. % +\item Added the \FUNC{shmem\_calloc} function. +\\ See Section \ref{subsec:shmem_calloc}. +% \end{itemize} \section{Version 1.3} diff --git a/content/shmem_calloc.tex b/content/shmem_calloc.tex new file mode 100644 index 000000000..a4144040c --- /dev/null +++ b/content/shmem_calloc.tex @@ -0,0 +1,40 @@ +\apisummary{ + Allocate a zeroed block of symmetric memory. +} + +\begin{apidefinition} + +\begin{Csynopsis} +void *shmem_calloc(size_t nmemb, size_t size); +\end{Csynopsis} + +\begin{apiarguments} + \apiargument{IN}{nmemb}{The number of elements to allocate.} + \apiargument{IN}{size}{The size in bytes of each element to allocate.} +\end{apiarguments} + + +\apidescription{ + The \FUNC{shmem\_calloc} routine allocates a region of remotely-accessible + memory for an array of \VAR{nmemb} objects of \VAR{size} bytes each and + returns a pointer to the lowest byte address of the allocated symmetric + memory. The space is initialized to all bits zero. + + The values for \VAR{nmemb} and \VAR{size} shall each be equal across + all \ac{PE}s calling \FUNC{shmem\_calloc}; otherwise, the behavior is + undefined. + + The \FUNC{shmem\_calloc} routine calls \FUNC{shmem\_barrier\_all} on exit + prior to returning. +} + +\apireturnvalues{ + The \FUNC{shmem\_calloc} routine returns a pointer to the lowest byte + address of the allocated space; otherwise, it returns a null pointer. +} + +\apinotes{ + None. +} + +\end{apidefinition} diff --git a/main_spec.tex b/main_spec.tex index 996317c1c..5631c2feb 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -91,6 +91,9 @@ \subsection{Memory Management Routines} \subsubsection{\textbf{SHMEM\_MALLOC, SHMEM\_FREE, SHMEM\_REALLOC, SHMEM\_ALIGN}}\label{subsec:shfree} \input{content/shmem_malloc.tex} +\subsubsection{\textbf{SHMEM\_CALLOC}}\label{subsec:shmem_calloc} +\input{content/shmem_calloc.tex} + \subsubsection{\textbf{SHPALLOC}}\label{subsec:shpalloc} \input{content/shpalloc.tex} From 819bf719cdcabe2af86788c04c57fe2c65d1cf2e Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Tue, 7 Feb 2017 21:11:29 -0500 Subject: [PATCH 108/583] Initial work to deprecate the Fortran API --- content/backmatter.tex | 14 ++++++++++++++ content/language_bindings_and_conformance.tex | 4 ++++ content/memory_model.tex | 18 ++++++++++++------ content/programming_model_overview.tex | 5 ++++- utils/defs.tex | 14 ++++++++++++-- utils/packages.tex | 1 + 6 files changed, 47 insertions(+), 9 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..44dc2292a 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -113,6 +113,7 @@ \subsection*{Programs written in \Cpp} \subsection*{Programs written in \Fortran} +\begin{deprecate} The \openshmem{} Reference Implementation provides a wrapper program named \textbf{oshfort}, to aid in the compilation of \Fortran{} programs, the wrapper could be called as follows: @@ -122,6 +123,7 @@ \subsection*{Programs written in \Fortran} \end{lstlisting} Where the $\langle\mbox{compiler options}\rangle$ are options understood by the underlying \Fortran{} compiler called by \textbf{oshfort}. +\end{deprecate} \section{Running Programs} @@ -369,6 +371,7 @@ \section{Overview}\label{subsec:dep_overview} \_SHMEM\_MAX\_NAME\_LEN & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAX\_NAME\_LEN} \\ \hline \_SHMEM\_VENDOR\_STRING & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_VENDOR\_STRING} \\ \hline SMA\_* environment variables & 1.4 & Current & SHMEM\_* \\ \hline + Entire \Fortran{} API & 1.4 & Current & (none) \\ \hline \end{tabular} \end{center} @@ -429,6 +432,15 @@ \subsection{\_SHMEM\_* constants} with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran{} naming conventions. +\subsection{Fortran API}\label{subsec:deprecate-fortran} +The entire \openshmem{} \Fortran{} API was deprecated due to a general lack of +use and a lack of conformance with legacy \Fortran{} standards. In lieu of an +extensive update of the \Fortran{} API, \Fortran{} users are encouraged to +leverage current and future \openshmem{} specifications of the \Clang{} API +through the \Fortran{}-\Clang{} interoperability initially standardized by +\Fortran{}~2003% +\footnote{Formally, \Fortran{}~2003 is known as ISO/IEC~1539-1:2004(E).}. + @@ -465,6 +477,8 @@ \section{Version 1.5} \item Clarified deprecation overview and added deprecation rationale in Annex F. \\See Section \ref{sec:dep_api}. % +\item Deprecated the entire \Fortran{} API. +% \end{itemize} \section{Version 1.3} diff --git a/content/language_bindings_and_conformance.tex b/content/language_bindings_and_conformance.tex index 97d9e670b..a63ecd0e4 100644 --- a/content/language_bindings_and_conformance.tex +++ b/content/language_bindings_and_conformance.tex @@ -1,4 +1,8 @@ \openshmem provides ISO \Clang{} and \Fortran{} \textit{90} language bindings. +As of OpenSHMEM~1.4, the \Fortran{} API is deprecated and should be expected +to be removed in a future specification. For rationale and considerations of +future \Fortran{} use of \openshmem, see Section~\ref{subsec:deprecate-fortran}. + Any implementation that provides both \Clang{} and \Fortran{} bindings can claim conformance to the specification. An implementation that provides e.g.\ only a \Clang{} interface may claim to conform to the \openshmem specification with diff --git a/content/memory_model.tex b/content/memory_model.tex index 4ed391c0c..79e9da673 100644 --- a/content/memory_model.tex +++ b/content/memory_model.tex @@ -26,12 +26,18 @@ data objects are symmetric: % \begin{itemize} - \item \Fortran{} data objects in common blocks or with the SAVE attribute. - These data objects must not be defined in a dynamic shared object (DSO). - \item Global and static \Clang{} and \Cpp variables. These data objects must - not be defined in a DSO. - \item \Fortran{} arrays allocated with \textit{shpalloc} - \item \Clang{} and \Cpp data allocated by \textit{shmem\_malloc} +\item + \begin{deprecate} + \Fortran{} data objects in common blocks or with the SAVE attribute. + These data objects must not be defined in a dynamic shared object (DSO). + \end{deprecate} +\item Global and static \Clang{} and \Cpp variables. These data objects must + not be defined in a DSO. +\item + \begin{deprecate} + \Fortran{} arrays allocated with \textit{shpalloc} + \end{deprecate} +\item \Clang{} and \Cpp data allocated by \textit{shmem\_malloc} \end{itemize} \openshmem dynamic memory allocation routines (\textit{shpalloc} and diff --git a/content/programming_model_overview.tex b/content/programming_model_overview.tex index 24eaec750..a8790248f 100644 --- a/content/programming_model_overview.tex +++ b/content/programming_model_overview.tex @@ -19,7 +19,10 @@ into multiple sub-problems that can be solved independently or with coordination using the communication and synchronization interfaces. The \openshmem specification defines library calls, constants, variables, and language bindings -for \Clang{} and \Fortran{}. The \Cpp{} interface is currently the same as that +for \Clang{} and \Fortran{}% +\footnote{As of \openshmem{}~1.4, the \Fortran{} interface has been deprecated + and should be expected to be removed in a future release.}. +The \Cpp{} interface is currently the same as that for \Clang. Unlike UPC, Fortran 2008, Titanium, X10 and Chapel, which are all PGAS languages, \openshmem relies on the user to use the library calls to implement the correct semantics of its programming model. diff --git a/utils/defs.tex b/utils/defs.tex index b8bee6ff9..91d8cb02a 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -69,6 +69,7 @@ \newcommand{\kth}{${\textit{k}^{\text{\tiny th}}}$} \newcommand{\lth}{${\textit{l}^{\text{\tiny th}}}$} + \begin{acronym} \acro{RMA}{\emph{Remote Memory Access}} \acro{RMO}{\emph{Remote Memory Operation}} @@ -309,6 +310,13 @@ % Library API description template commands % +\newcommand{\deprecationstart}{\color{red} \raisebox{.5ex}{\rule{1em}{.4pt}} + deprecation start \xrfill[.5ex]{.4pt}[red] \mbox{}} +\newcommand{\deprecationend}{\mbox{}\xrfill[.5ex]{.4pt}[red]\mbox{} \color{red} + deprecation end \raisebox{.5ex}{\rule{1em}{.4pt}}} + +\newenvironment{deprecate}{\deprecationstart \\}{\\ \deprecationend} + \newcommand{\apisummary}[1]{ #1 \hfill @@ -357,11 +365,13 @@ {} \lstnewenvironment{Fsynopsis} -{ \textbf{FORTRAN:} +{ \deprecationstart \\ + \textbf{FORTRAN:} \lstset{language={Fortran}, backgroundcolor=\color{gray}, lineskip=3pt, deletekeywords=[2]{STATUS}, deletekeywords=[3]{LOG}, aboveskip=0pt, - belowskip=0pt}}{} + belowskip=0pt}} +{ \deprecationend } \newenvironment{apiarguments}{ \newcommand{\apiargument}[3]{ diff --git a/utils/packages.tex b/utils/packages.tex index 7a7fa8907..30b0c5173 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -8,6 +8,7 @@ \usepackage{amsmath} \usepackage[table]{xcolor} \usepackage{xspace} +\usepackage{xhfill} \usepackage{fancyhdr} \usepackage[nolist]{acronym} \usepackage{listings} From b571215ae995d812486c824a7fe898657e899a45 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 8 Feb 2017 10:49:01 -0500 Subject: [PATCH 109/583] Revised with feedback from 1/25/2017 WG meeting Signed-off-by: James Dinan --- content/backmatter.tex | 5 ++++ content/library_constants.tex | 2 +- content/shmem_barrier.tex | 8 +++++- content/shmem_barrier_all.tex | 13 +++++++--- content/shmem_ctx.tex | 49 ++++++++++++++++++++++++----------- content/shmem_finalize.tex | 5 +++- content/shmem_malloc.tex | 6 ++++- 7 files changed, 66 insertions(+), 22 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..fe5abdaea 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,11 @@ \section{Version 1.5} \begin{itemize} % +\item \newtext{New communication management API, including \FUNC{shmem\_ctx\_create}; + \FUNC{shmem\_ctx\_destroy}; and additional RMA, AMO, and memory ordering + routines that accept \CODE{shmem\_ctx\_t} arguments. +\\See Section \ref{sec:ctx}.} +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % diff --git a/content/library_constants.tex b/content/library_constants.tex index 8331a326a..b2d467212 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -13,7 +13,7 @@ \vspace{3mm} \vtop{\hbox{\CorCpp:} \hbox{\hspace*{12mm} \newtext{\const{SHMEM\_CTX\_DEFAULT}}}} -& \newtext{Handle of type \CODE{shmem\_ctx\_t} that references the +& \newtext{Handle of type \CODE{shmem\_ctx\_t} that corresponds to the default communication context. All point-to-point communication operations and synchronizations that do not specify a context are performed on the default context. Refer to \hyperref[sec:ctx]{Communication Management diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 3c9456fa6..b2f5b0ffb 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -51,7 +51,7 @@ \FUNC{shmem\_barrier} ensures that all previously issued stores and remote memory updates, including \acp{AMO} and \ac{RMA} operations, done by any of the - \acp{PE} in the \activeset are complete before returning. + \acp{PE} in the \activeset \newtext{on a shareable context} are complete before returning. The same \VAR{pSync} array may be reused on consecutive calls to \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. @@ -73,6 +73,12 @@ The \FUNC{shmem\_barrier} routine can be used to portably ensure that memory access operations observe remote updates in the order enforced by initiator PEs. + + \newtext{The \FUNC{shmem\_barrier} routine does not ensure completion + of operations performed on contexts with the \CONST{SHMEM\_CTX\_PRIVATE} + option enabled. Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior + to calling the barrier routine to ensure completion of operations issued on + private contexts.} } \begin{apiexamples} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 289f36537..b8af72583 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -1,7 +1,8 @@ \apisummary{ Registers the arrival of a \ac{PE} at a barrier and suspends \ac{PE} execution - until all other \ac{PE}s arrive at the barrier and all local and remote memory - updates \newtext{on all contexts} are completed. + until all other \ac{PE}s arrive at the barrier and all local + \newtext{updates} and remote memory updates \newtext{on all shareable + contexts} are completed. } \begin{apidefinition} @@ -29,7 +30,7 @@ Prior to synchronizing with other \ac{PE}s, \FUNC{shmem\_barrier\_all} ensures completion of all previously issued memory stores and remote memory - updates issued \newtext{on all contexts} via \openshmem{} \acp{AMO} and + updates issued \newtext{on all shareable contexts} via \openshmem{} \acp{AMO} and \ac{RMA} routine calls such as \FUNC{shmem\_int\_add}, \FUNC{shmem\_put32}, \FUNC{shmem\_put\_nbi}, and \FUNC{shmem\_get\_nbi}. @@ -43,6 +44,12 @@ The \FUNC{shmem\_barrier\_all} routine can be used to portably ensure that memory access operations observe remote updates in the order enforced by initiator PEs. + + \newtext{The \FUNC{shmem\_barrier\_all} routine does not ensure completion + of operations performed on contexts with the \CONST{SHMEM\_CTX\_PRIVATE} + option enabled. Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior + to calling the barrier routine to ensure completion of operations issued on + private contexts.} } \begin{apiexamples} diff --git a/content/shmem_ctx.tex b/content/shmem_ctx.tex index 0a774d7f5..945c0cc00 100644 --- a/content/shmem_ctx.tex +++ b/content/shmem_ctx.tex @@ -46,14 +46,31 @@ \subsubsection{\textbf{SHMEM\_CTX\_CREATE}} in a correct state. The creation call can be reattempted with different options or after additional resources become available. - The following constants can be supplied as context options: \\ + By default and when it is allowed by the threading model set during + initialization, contexts are {\em shareable} and can be used concurrently + by multiple threads within the PE where they were created. + % + The following options can be supplied during context creation to restrict + this usage model and enable performance optimizations. When one or more + options are provided on a context, the application must comply with the + requirements of all provided options when using that context. Otherwise + the behavior is undefined. + + \apitablerow{\CONST{SHMEM\_CTX\_SERIALIZED}}{ + The given context will not be used by multiple threads + concurrently. This option is only valid in the + \const{SHMEM\_THREAD\_MULTIPLE} threading model. When the + \CONST{SHMEM\_CTX\_SERIALIZED} option is set, the user must ensure + that operation involving the given context are serialized by the + application, including operations that perform an explicit or + implicit barrier.} - \apitablerow{\CONST{SHMEM\_CTX\_SHARED}}{ - In a multithreaded environment, the given context will be used by - multiple threads concurrently.} \apitablerow{\CONST{SHMEM\_CTX\_PRIVATE}}{ - In a multithreaded environment, the given context will not be used - by multiple threads concurrently.} + The given context will only be used by the thread that created it. + This option is only valid in the \const{SHMEM\_THREAD\_MULTIPLE} + and \const{SHMEM\_THREAD\_SERIALIZED} models. Contexts with the + \CONST{SHMEM\_CTX\_PRIVATE} option set are excluded from the quiet + operation performed during explicit and implicit barrier operations.} } \apireturnvalues{ @@ -93,14 +110,9 @@ \subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} \apidescription{ \FUNC{shmem\_ctx\_destroy} destroys a context that was created by a call to - \FUNC{shmem\_ctx\_create}. This function performs an implicit quiet - operation on the given context before it is freed. - - \textit{Rationale:} Destroying a context makes it impossible for the user to - complete communication operations that are pending on that context. This - includes nonblocking communication operations, whose local buffers are only - returned to the user after the operations have been completed. An implicit - quiet is performed when freeing a context to avoid this ambiguity. + \FUNC{shmem\_ctx\_create}. It is the user's responsibility to ensure that + the context is no longer in use before calling this routine. This function + performs an implicit quiet operation on the given context before it is freed. } \apireturnvalues{ @@ -108,7 +120,14 @@ \subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} } \apinotes{ - None. + Destroying a context makes it impossible for the user to complete + communication operations that are pending on that context. This includes + nonblocking communication operations, whose local buffers are only returned + to the user after the operations have been completed. An implicit quiet is + performed when freeing a context to avoid this ambiguity. + + A context with the \CONST{SHMEM\_CTX\_PRIVATE} option enabled must be + destroyed by the thread that created it. } %\begin{apiexamples} diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index cf0ab98b1..948696eb9 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -25,7 +25,10 @@ operation requires all \acp{PE} to participate in the call. There is an implicit global barrier in \FUNC{shmem\_finalize} so that pending communications are completed, and no resources can be released until all - \acp{PE} have entered \FUNC{shmem\_finalize}. \FUNC{shmem\_finalize} must be + \acp{PE} have entered \FUNC{shmem\_finalize}. + \newtext{The user is responsible for ensuring that no communication + operations are pending on private contexts prior to calling this routine.} + \FUNC{shmem\_finalize} must be the last \openshmem library call encountered in the \openshmem portion of a program. A call to \FUNC{shmem\_finalize} will release any resources initialized by a corresponding call to \FUNC{shmem\_init}. All processes diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 74df3fb1b..44c0ecdc6 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -49,7 +49,11 @@ \openshmem communication routines. Each of these routines call the \FUNC{shmem\_barrier\_all} routine before returning; this ensures that all \ac{PE}s participate in the memory allocation, and that the memory on other - \ac{PE}s can be used as soon as the local \ac{PE} returns. The user is + \ac{PE}s can be used as soon as the local \ac{PE} returns. + \newtext{The user is responsible for ensuring that no communication + operations are pending on private contexts prior to calling + \FUNC{shmem\_free} and \FUNC{shmem\_realloc} routines.} + The user is \newtext{also} responsible for calling these routines with identical argument(s) on all \ac{PE}s; if differing \VAR{size} arguments are used, the behavior of the call and any subsequent \openshmem calls becomes undefined. From ece3aebe5778da7e0f863a4be5d8fc4ecc057f11 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 8 Feb 2017 11:02:04 -0500 Subject: [PATCH 110/583] Move ctx to first argument This change allows us to re-use the existing C11 binding names (e.g. shmem_long_put) and only introduce new function names in the ISO C bindings. Signed-off-by: James Dinan --- content/shmem_add.tex | 4 ++-- content/shmem_cswap.tex | 4 ++-- content/shmem_fadd.tex | 4 ++-- content/shmem_fetch.tex | 4 ++-- content/shmem_finc.tex | 4 ++-- content/shmem_g.tex | 4 ++-- content/shmem_get.tex | 10 ++++------ content/shmem_get_nbi.tex | 8 ++++---- content/shmem_iget.tex | 6 +++--- content/shmem_inc.tex | 4 ++-- content/shmem_iput.tex | 6 +++--- content/shmem_p.tex | 4 ++-- content/shmem_put.tex | 11 ++++------- content/shmem_put_nbi.tex | 8 ++++---- content/shmem_set.tex | 4 ++-- content/shmem_swap.tex | 4 ++-- utils/defs.tex | 2 +- 17 files changed, 43 insertions(+), 48 deletions(-) diff --git a/content/shmem_add.tex b/content/shmem_add.tex index 57dea9d6e..cf9009adc 100644 --- a/content/shmem_add.tex +++ b/content/shmem_add.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} void shmem_add(TYPE *dest, TYPE value, int pe); -void shmem_ctx_add(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} void shmem__add(TYPE *dest, TYPE value, int pe); -void shmem_ctx__add(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_ctx__add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. diff --git a/content/shmem_cswap.tex b/content/shmem_cswap.tex index 1b2863a42..f6e34b36a 100644 --- a/content/shmem_cswap.tex +++ b/content/shmem_cswap.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_cswap(TYPE *dest, TYPE cond, TYPE value, int pe); -TYPE shmem_ctx_cswap(TYPE *dest, TYPE cond, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_cswap(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__cswap(TYPE *dest, TYPE cond, TYPE value, int pe); -TYPE shmem_ctx__cswap(TYPE *dest, TYPE cond, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__cswap(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. diff --git a/content/shmem_fadd.tex b/content/shmem_fadd.tex index 8b63b08c1..12c0688c8 100644 --- a/content/shmem_fadd.tex +++ b/content/shmem_fadd.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_fadd(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx_fadd(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_fadd(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__fadd(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__fadd(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__fadd(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. diff --git a/content/shmem_fetch.tex b/content/shmem_fetch.tex index dec052259..8a42aa3b2 100644 --- a/content/shmem_fetch.tex +++ b/content/shmem_fetch.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_fetch(const TYPE *dest, int pe); -TYPE shmem_ctx_fetch(const TYPE *dest, int pe, shmem_ctx_t ctx); +TYPE shmem_fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} TYPE shmem__fetch(const TYPE *dest, int pe); -TYPE shmem_ctx__fetch(const TYPE *dest, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. diff --git a/content/shmem_finc.tex b/content/shmem_finc.tex index 4c940bd33..224e35329 100644 --- a/content/shmem_finc.tex +++ b/content/shmem_finc.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_finc(TYPE *dest, int pe); -TYPE shmem_ctx_finc(TYPE *dest, int pe, shmem_ctx_t ctx); +TYPE shmem_finc(shmem_ctx_t ctx, TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} TYPE shmem__finc(TYPE *dest, int pe); -TYPE shmem_ctx__finc(TYPE *dest, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__finc(shmem_ctx_t ctx, TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. diff --git a/content/shmem_g.tex b/content/shmem_g.tex index a0264fd4b..d1174a4d4 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_g(const TYPE *addr, int pe); -TYPE shmem_ctx_g(const TYPE *addr, int pe, shmem_ctx_t ctx); +TYPE shmem_g(shmem_ctx_t ctx, const TYPE *addr, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} TYPE shmem__g(const TYPE *addr, int pe); -TYPE shmem_ctx__g(const TYPE *addr, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__g(shmem_ctx_t ctx, const TYPE *addr, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. diff --git a/content/shmem_get.tex b/content/shmem_get.tex index cbb287a50..2c3d25896 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -6,27 +6,25 @@ \begin{C11synopsis} void shmem_get(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx_get(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_get(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__get(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__get(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx__get(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_get(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_get(void *dest, const void *source, size_t nelems, int pe, - shmem_ctx_t ctx); +void shmem_ctx_get(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_getmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_getmem(void *dest, const void *source, size_t nelems, int pe, - shmem_ctx_t ctx); +void shmem_ctx_getmem(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index d17d1920d..703062abf 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -7,25 +7,25 @@ \begin{C11synopsis} void shmem_get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx_get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_get_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx__get_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_get_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_get_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_get_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_getmem_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_getmem_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_getmem_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} diff --git a/content/shmem_iget.tex b/content/shmem_iget.tex index 4fb0d237b..81c6154f8 100644 --- a/content/shmem_iget.tex +++ b/content/shmem_iget.tex @@ -6,19 +6,19 @@ \begin{C11synopsis} void shmem_iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_iget(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx__iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx__iget(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_iget(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iget(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_iget(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. diff --git a/content/shmem_inc.tex b/content/shmem_inc.tex index dcdbe3c51..471d00d47 100644 --- a/content/shmem_inc.tex +++ b/content/shmem_inc.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} void shmem_inc(TYPE *dest, int pe); -void shmem_ctx_inc(TYPE *dest, int pe, shmem_ctx_t ctx); +void shmem_inc(shmem_ctx_t ctx, TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table \ref{stdamotypes}. \begin{Csynopsis} void shmem__inc(TYPE *dest, int pe); -void shmem_ctx__inc(TYPE *dest, int pe, shmem_ctx_t ctx); +void shmem_ctx__inc(shmem_ctx_t ctx, TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{stdamotypes}. diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index eefc7d6c4..0db11ae74 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -6,19 +6,19 @@ \begin{C11synopsis} void shmem_iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_iput(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx__iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx__iput(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_iput(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iput(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_iput(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. diff --git a/content/shmem_p.tex b/content/shmem_p.tex index 21bd91e2d..12099e08a 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} void shmem_p(TYPE *dest, TYPE value, int pe); -void shmem_ctx_p(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_p(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__p(TYPE *dest, TYPE value, int pe); -void shmem_ctx__p(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_ctx__p(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. diff --git a/content/shmem_put.tex b/content/shmem_put.tex index 6830eff3d..5c9997aaa 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -7,28 +7,25 @@ \begin{C11synopsis} void shmem_put(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx_put(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_put(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__put(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__put(TYPE *dest, const TYPE *source, size_t nelems, int pe, - shmem_ctx_t ctx); +void shmem_ctx__put(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_put(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_put(void *dest, const void *source, size_t nelems, int pe, - shmem_ctx_t ctx); +void shmem_ctx_put(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_putmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_putmem(void *dest, const void *source, size_t nelems, int pe, - shmem_ctx_t ctx); +void shmem_ctx_putmem(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} diff --git a/content/shmem_put_nbi.tex b/content/shmem_put_nbi.tex index 977b66e68..e12801d68 100644 --- a/content/shmem_put_nbi.tex +++ b/content/shmem_put_nbi.tex @@ -7,25 +7,25 @@ \begin{C11synopsis} void shmem_put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx_put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_put_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} void shmem__put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx__put_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} void shmem_put_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_put_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_put_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} void shmem_putmem_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_putmem_nbi(void *dest, const void *source, size_t nelems, int pe, shmem_ctx_t ctx); +void shmem_ctx_putmem_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} diff --git a/content/shmem_set.tex b/content/shmem_set.tex index 96f35ab90..bf34826fa 100644 --- a/content/shmem_set.tex +++ b/content/shmem_set.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} void shmem_set(TYPE *dest, TYPE value, int pe); -void shmem_ctx_set(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_set(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} void shmem__set(TYPE *dest, TYPE value, int pe); -void shmem_ctx__set(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +void shmem_ctx__set(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. diff --git a/content/shmem_swap.tex b/content/shmem_swap.tex index e69c720b7..8fb85b223 100644 --- a/content/shmem_swap.tex +++ b/content/shmem_swap.tex @@ -6,13 +6,13 @@ \begin{C11synopsis} TYPE shmem_swap(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx_swap(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_swap(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} TYPE shmem__swap(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__swap(TYPE *dest, TYPE value, int pe, shmem_ctx_t ctx); +TYPE shmem_ctx__swap(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. diff --git a/utils/defs.tex b/utils/defs.tex index f45e44d74..3de5ce9ee 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -165,7 +165,7 @@ \definecolor{gray}{rgb}{0.92,0.92,0.92} \lstset{ % set defaults for languages not otherwise defined - breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace + breakatwhitespace=true, % sets if automatic breaks should only happen at whitespace basicstyle=\ttfamily\footnotesize, breaklines=true, % sets automatic line breaking escapeinside={|}{|}, % if you want to add LaTeX within your code From aa5fe23a4d2ec9bcdb05e1bffe1f4fe0c4dccfdd Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 8 Feb 2017 22:18:13 -0500 Subject: [PATCH 111/583] Clarified header files for standardized OpenSHMEM API --- content/backmatter.tex | 3 +++ content/language_bindings_and_conformance.tex | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 62104bc54..288fb3a60 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,9 @@ \section{Version 1.5} \begin{itemize} % +\item Clarified header files for OpenSHMEM API. +\\See Section~\ref{subsec:bindings}. +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % diff --git a/content/language_bindings_and_conformance.tex b/content/language_bindings_and_conformance.tex index 97d9e670b..687a4cfc5 100644 --- a/content/language_bindings_and_conformance.tex +++ b/content/language_bindings_and_conformance.tex @@ -3,8 +3,9 @@ conformance to the specification. An implementation that provides e.g.\ only a \Clang{} interface may claim to conform to the \openshmem specification with respect to the \Clang{} language, but not to \Fortran, and should make this -clear in its documentation. The \openshmem header files for \Clang{} and -\Fortran{} must contain only the interfaces and constant names defined in this +clear in its documentation. The \openshmem header files \FUNC{shmem.h} for +\Clang{} and \FUNC{shmem.fh} for \Fortran{} +must contain only the interfaces and constant names defined in this specification. \openshmem \ac{API}s can be implemented as either routines or macros. However, From c4c468fd25520e80c405a27e2805ee68d2c71f65 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 9 Feb 2017 10:41:58 -0500 Subject: [PATCH 112/583] First draft of shmem_sync proposal Signed-off-by: James Dinan --- content/backmatter.tex | 4 ++ content/shmem_barrier_all.tex | 4 +- content/shmem_sync.tex | 80 +++++++++++++++++++++++++++++++++++ content/shmem_sync_all.tex | 51 ++++++++++++++++++++++ main_spec.tex | 10 +++++ 5 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 content/shmem_sync.tex create mode 100644 content/shmem_sync_all.tex diff --git a/content/backmatter.tex b/content/backmatter.tex index 990b6358f..066360a24 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -440,6 +440,10 @@ \section{Version 1.4} \begin{itemize} % +\item \newtext{New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide PE + synchronization without completing pending communication operations. + \\See Sections \ref{subsec:shmem_sync_all} and \ref{subsec:shmem_sync}.} +% \item The \VAR{SHMEM\_SYNC\_SIZE} constant was added. \\See Section \ref{subsec:library_constants}. % diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 31392247b..e480055fd 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -24,8 +24,8 @@ The \FUNC{shmem\_barrier\_all} routine registers the arrival of a \ac{PE} at a barrier. Barriers are a fast mechanism for synchronizing all \ac{PE}s at once. This routine causes a \ac{PE} to suspend execution until all \ac{PE}s - have called \FUNC{shmem\_barrier\_all}. This routine must be used with - \ac{PE}s started by \FUNC{shmem\_init}. + have called \FUNC{shmem\_barrier\_all}. + \oldtext{This routine must be used with \ac{PE}s started by \FUNC{shmem\_init}.} Prior to synchronizing with other \ac{PE}s, \FUNC{shmem\_barrier\_all} ensures completion of all previously issued memory stores and remote memory diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex new file mode 100644 index 000000000..ec844e2dc --- /dev/null +++ b/content/shmem_sync.tex @@ -0,0 +1,80 @@ +\apisummary{ + Performs all operations described in the \FUNC{shmem\_sync\_all} interface + but with respect to a subset of \acp{PE} defined by the \activeset. +} + +\begin{apidefinition} + +\begin{Csynopsis} +void shmem_sync(int PE_start, int logPE_stride, int PE_size, long *pSync); +\end{Csynopsis} + +\begin{apiarguments} + +\apiargument{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset of + \acp{PE}. \VAR{PE\_start} must be of type integer.} +\apiargument{IN}{logPE\_stride}{The log (base 2) of the stride between + consecutive \ac{PE} numbers in the \activeset. \VAR{logPE\_stride} must be + of type integer.} +\apiargument{IN}{PE\_size}{The number of \acp{PE} in the \activeset. + \VAR{PE\_size} must be of type integer.} +\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be + of type long and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. Every element of + this array must be initialized to \CONST{SHMEM\_SYNC\_VALUE} before any of the + \acp{PE} in the \activeset enter \FUNC{shmem\_sync} the first time.} + +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_sync} is a collective synchronization routine over an + \activeset. Control returns from \FUNC{shmem\_sync} after all \acp{PE} in + the \activeset (specified by \VAR{PE\_start}, \VAR{logPE\_stride}, and + \VAR{PE\_size}) have called \FUNC{shmem\_sync}. + + As with all \openshmem collective routines, each of these routines assumes + that only \acp{PE} in the \activeset call the routine. If a \ac{PE} not in + the \activeset calls an \openshmem collective routine, undefined behavior + results. + + The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and + \VAR{PE\_size} must be equal on all \acp{PE} in the \activeset. The same + work array must be passed in \VAR{pSync} to all \acp{PE} in the \activeset. + + In contrast with the \FUNC{shmem\_barrier} routine, \FUNC{shmem\_sync} only + ensures completion of previously issued memory stores and does not ensure + completion of remote memory updates issued via \openshmem routines. + + The same \VAR{pSync} array may be reused on consecutive calls to + \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + If the \VAR{pSync} array is initialized at run time, be sure to use some type of + synchronization, for example, a call to \FUNC{shmem\_sync\_all}, before + calling \FUNC{shmem\_sync} for the first time. + + If the \activeset does not change, \FUNC{shmem\_sync} can be called + repeatedly with the same \VAR{pSync} array. No additional synchronization + beyond that implied by \FUNC{shmem\_sync} itself is necessary in this case. + + The \FUNC{shmem\_sync\_all} routine can be used to portably ensure that + memory access operations observe remote updates in the order enforced by + initiator PEs, provided that the initiator PE ensures completion of remote + updates with a call to \FUNC{shmem\_quiet} prior to the call to + \FUNC{shmem\_sync\_all} routine. +} + +%\begin{apiexamples} +% +%\apicexample +% {The following barrier example is for \CorCpp programs:} +% {./example_code/shmem_barrier_example.c} +% {} +% +%\end{apiexamples} + +\end{apidefinition} diff --git a/content/shmem_sync_all.tex b/content/shmem_sync_all.tex new file mode 100644 index 000000000..6356e15f0 --- /dev/null +++ b/content/shmem_sync_all.tex @@ -0,0 +1,51 @@ +\apisummary{ + Registers the arrival of a \ac{PE} at a barrier and suspends \ac{PE} execution + until all other \ac{PE}s arrive at the barrier. +} + +\begin{apidefinition} + +\begin{Csynopsis} +void shmem_sync_all(void); +\end{Csynopsis} + +\begin{apiarguments} + + \apiargument{None.}{}{} + +\end{apiarguments} + +\apidescription{ + The \FUNC{shmem\_sync\_all} routine registers the arrival of a \ac{PE} at + a barrier. Barriers are a fast mechanism for synchronizing all \ac{PE}s at + once. This routine causes a \ac{PE} to suspend execution until all \ac{PE}s + have called \FUNC{shmem\_sync\_all}. + + In contrast with the \FUNC{shmem\_barrier\_all} routine, + \FUNC{shmem\_sync\_all} only ensures completion of previously issued memory + stores and does not ensure completion of remote memory updates issued via + \openshmem routines. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + The \FUNC{shmem\_sync\_all} routine can be used to portably ensure that + memory access operations observe remote updates in the order enforced by + initiator PEs, provided that the initiator PE ensures completion of remote + updates with a call to \FUNC{shmem\_quiet} prior to the call to + \FUNC{shmem\_sync\_all} routine. +} + +%\begin{apiexamples} +% +%\apicexample +% { The following \FUNC{shmem\_barrier\_all} example is for \CorCpp programs:} +% {./example_code/shmem_barrierall_example.c} +% {} +% +%\end{apiexamples} + +\end{apidefinition} diff --git a/main_spec.tex b/main_spec.tex index 996317c1c..d98449aa3 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -176,6 +176,16 @@ \subsubsection{\textbf{SHMEM\_BARRIER\_ALL}}\label{subsec:shmem_barrier_all} \subsubsection{\textbf{SHMEM\_BARRIER}}\label{subsec:shmem_barrier} \input{content/shmem_barrier.tex} +\subsubsection{\textbf{SHMEM\_SYNC\_ALL}}\label{subsec:shmem_sync_all} +\newtext{ +\input{content/shmem_sync_all.tex} +} + +\subsubsection{\textbf{SHMEM\_SYNC}}\label{subsec:shmem_sync} +\newtext{ +\input{content/shmem_sync.tex} +} + \subsubsection{\textbf{SHMEM\_BROADCAST}}\label{subsec:shmem_broadcast} \input{content/shmem_broadcast.tex} From e96f0f581d630944953396cea68dc70149dc0e12 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 10 Feb 2017 22:59:53 -0500 Subject: [PATCH 113/583] Applied consistency-related change to shmem_info_get_version --- content/backmatter.tex | 3 +++ content/shmem_info_get_version.tex | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 990b6358f..969c626f7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -465,6 +465,9 @@ \section{Version 1.4} \item Clarified deprecation overview and added deprecation rationale in Annex F. \\See Section \ref{sec:dep_api}. % +\item Applied non-functional, consistency-related change to API description for \FUNC{shmem\_info\_get\_version}. +\\See Section \ref{subsec:shmem_info_get_version}. +% \end{itemize} \section{Version 1.3} diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index b4a68e060..e72bc83e8 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -21,8 +21,8 @@ \apidescription{ This routine returns the major and minor version of the \openshmem{} standard in use. For a given library implementation, the major and minor version - returned by these calls is consistent with the compile-time constants, - SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION, defined in its shmem.h. + returned by these calls is consistent with the library constants + SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION. } \apireturnvalues{ From 405fd96ee1339f74bf3ecc28371cddc8797f32bc Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 10 Feb 2017 23:00:14 -0500 Subject: [PATCH 114/583] Fixed erroneous API description for shmem_info_get_name --- content/backmatter.tex | 3 +++ content/shmem_info_get_name.tex | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 969c626f7..7b0759283 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -468,6 +468,9 @@ \section{Version 1.4} \item Applied non-functional, consistency-related change to API description for \FUNC{shmem\_info\_get\_version}. \\See Section \ref{subsec:shmem_info_get_version}. % +\item Fixed erroneous API description for \FUNC{shmem\_info\_get\_name}. +\\See Section \ref{subsec:shmem_info_get_name}. +% \end{itemize} \section{Version 1.3} diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index c608ae046..14059e9d7 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -21,15 +21,14 @@ This routine returns the vendor defined character string of size defined by the constant SHMEM\_MAX\_NAME\_LEN. The program calling this function prepares the memory of size SHMEM\_MAX\_NAME\_LEN, and the implementation - copies the string of size at most SHMEM\_MAX\_NAME\_LEN. In C, the string is - terminated by a null character. In Fortran, the string of size less than + copies the string of size at most SHMEM\_MAX\_NAME\_LEN. In \Clang{}, the string is + terminated by a null character. In \Fortran{}, the string of size less than SHMEM\_MAX\_NAME\_LEN is padded with blank characters up to size SHMEM\_MAX\_NAME\_LEN. The implementation copying a string of size greater than SHMEM\_MAX\_NAME\_LEN results in an undefined behavior. Multiple invocations of the routine in an \openshmem{} program always return the - same string. For a given library implementation, the major and minor - version returned by these calls is consistent with the compile-time - constants defined in its shmem.h. + same string. For a given library implementation, the vendor string + returned is consistent with the library constant SHMEM\_VENDOR\_STRING. } \apireturnvalues{ From 171ddc52fbd7086f79e6aa5af53bc88a8ccd56a2 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 10 Feb 2017 23:25:19 -0500 Subject: [PATCH 115/583] shmem_info_get_{version,name}: Use \const{} for library constants --- content/shmem_info_get_name.tex | 14 +++++++------- content/shmem_info_get_version.tex | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 14059e9d7..7d92457ee 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -19,16 +19,16 @@ \apidescription{ This routine returns the vendor defined character string of size defined by - the constant SHMEM\_MAX\_NAME\_LEN. The program calling this function - prepares the memory of size SHMEM\_MAX\_NAME\_LEN, and the implementation - copies the string of size at most SHMEM\_MAX\_NAME\_LEN. In \Clang{}, the string is + the library constant \const{SHMEM\_MAX\_NAME\_LEN}. The program calling this function + prepares the memory of size \const{SHMEM\_MAX\_NAME\_LEN}, and the implementation + copies the string of size at most \const{SHMEM\_MAX\_NAME\_LEN}. In \Clang{}, the string is terminated by a null character. In \Fortran{}, the string of size less than - SHMEM\_MAX\_NAME\_LEN is padded with blank characters up to size - SHMEM\_MAX\_NAME\_LEN. The implementation copying a string of size greater - than SHMEM\_MAX\_NAME\_LEN results in an undefined behavior. Multiple + \const{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size + \const{SHMEM\_MAX\_NAME\_LEN}. The implementation copying a string of size greater + than \const{SHMEM\_MAX\_NAME\_LEN} results in an undefined behavior. Multiple invocations of the routine in an \openshmem{} program always return the same string. For a given library implementation, the vendor string - returned is consistent with the library constant SHMEM\_VENDOR\_STRING. + returned is consistent with the library constant \const{SHMEM\_VENDOR\_STRING}. } \apireturnvalues{ diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index e72bc83e8..214bcca25 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -22,7 +22,7 @@ This routine returns the major and minor version of the \openshmem{} standard in use. For a given library implementation, the major and minor version returned by these calls is consistent with the library constants - SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION. + \const{SHMEM\_MAJOR\_VERSION} and \const{SHMEM\_MINOR\_VERSION}. } \apireturnvalues{ From ca1a5fc21462f89bbd8538a6a3857868ada93400 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 10 Feb 2017 23:41:14 -0500 Subject: [PATCH 116/583] More fixes for erroneous API description to shmem_info_get_name --- content/shmem_info_get_name.tex | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 7d92457ee..33c061e45 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -20,14 +20,16 @@ \apidescription{ This routine returns the vendor defined character string of size defined by the library constant \const{SHMEM\_MAX\_NAME\_LEN}. The program calling this function - prepares the memory of size \const{SHMEM\_MAX\_NAME\_LEN}, and the implementation - copies the string of size at most \const{SHMEM\_MAX\_NAME\_LEN}. In \Clang{}, the string is + prepares the \VAR{name} memory buffer of at least size \const{SHMEM\_MAX\_NAME\_LEN}. + The implementation + copies the vendor defined string of size at most \const{SHMEM\_MAX\_NAME\_LEN} to \VAR{name}. + In \Clang{}, the string is terminated by a null character. In \Fortran{}, the string of size less than \const{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size - \const{SHMEM\_MAX\_NAME\_LEN}. The implementation copying a string of size greater - than \const{SHMEM\_MAX\_NAME\_LEN} results in an undefined behavior. Multiple - invocations of the routine in an \openshmem{} program always return the - same string. For a given library implementation, the vendor string + \const{SHMEM\_MAX\_NAME\_LEN}. + If the \VAR{name} memory buffer is provided with size less than + \const{SHMEM\_MAX\_NAME\_LEN}, behavior is undefined. + For a given library implementation, the vendor string returned is consistent with the library constant \const{SHMEM\_VENDOR\_STRING}. } From e0f76b656674924379b53f9e3aa62dad5fdac566 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 10 Feb 2017 23:54:58 -0500 Subject: [PATCH 117/583] shmem_info_get_name: C --> C/C++ --- content/shmem_info_get_name.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 33c061e45..82f0d4153 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -23,7 +23,7 @@ prepares the \VAR{name} memory buffer of at least size \const{SHMEM\_MAX\_NAME\_LEN}. The implementation copies the vendor defined string of size at most \const{SHMEM\_MAX\_NAME\_LEN} to \VAR{name}. - In \Clang{}, the string is + In \CorCpp{}, the string is terminated by a null character. In \Fortran{}, the string of size less than \const{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size \const{SHMEM\_MAX\_NAME\_LEN}. From e752f1e32a65fc00a2f6c51cd4cbe0c5094fb1b1 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sat, 11 Feb 2017 00:02:02 -0500 Subject: [PATCH 118/583] shmem_info_get_{version,name}: Use \CONST{}, not \const{} --- content/shmem_info_get_name.tex | 14 +++++++------- content/shmem_info_get_version.tex | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 82f0d4153..c7c9b7462 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -19,18 +19,18 @@ \apidescription{ This routine returns the vendor defined character string of size defined by - the library constant \const{SHMEM\_MAX\_NAME\_LEN}. The program calling this function - prepares the \VAR{name} memory buffer of at least size \const{SHMEM\_MAX\_NAME\_LEN}. + the library constant \CONST{SHMEM\_MAX\_NAME\_LEN}. The program calling this function + prepares the \VAR{name} memory buffer of at least size \CONST{SHMEM\_MAX\_NAME\_LEN}. The implementation - copies the vendor defined string of size at most \const{SHMEM\_MAX\_NAME\_LEN} to \VAR{name}. + copies the vendor defined string of size at most \CONST{SHMEM\_MAX\_NAME\_LEN} to \VAR{name}. In \CorCpp{}, the string is terminated by a null character. In \Fortran{}, the string of size less than - \const{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size - \const{SHMEM\_MAX\_NAME\_LEN}. + \CONST{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size + \CONST{SHMEM\_MAX\_NAME\_LEN}. If the \VAR{name} memory buffer is provided with size less than - \const{SHMEM\_MAX\_NAME\_LEN}, behavior is undefined. + \CONST{SHMEM\_MAX\_NAME\_LEN}, behavior is undefined. For a given library implementation, the vendor string - returned is consistent with the library constant \const{SHMEM\_VENDOR\_STRING}. + returned is consistent with the library constant \CONST{SHMEM\_VENDOR\_STRING}. } \apireturnvalues{ diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index 214bcca25..cbaefcc37 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -22,7 +22,7 @@ This routine returns the major and minor version of the \openshmem{} standard in use. For a given library implementation, the major and minor version returned by these calls is consistent with the library constants - \const{SHMEM\_MAJOR\_VERSION} and \const{SHMEM\_MINOR\_VERSION}. + \CONST{SHMEM\_MAJOR\_VERSION} and \CONST{SHMEM\_MINOR\_VERSION}. } \apireturnvalues{ From 4d5d3fb98eb36a6ef60d678427a1a7ed3327424a Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sat, 11 Feb 2017 00:19:45 -0500 Subject: [PATCH 119/583] utils/defs.tex: Added \HEADER command --- content/backmatter.tex | 2 +- content/shmem_info_get_name.tex | 2 +- content/shmem_info_get_version.tex | 2 +- utils/defs.tex | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 990b6358f..6d9a3e7ab 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -21,7 +21,7 @@ \section*{Incorporating \openshmem{} into Programs}\label{sec:writing_programs} To write a ``Hello World" \openshmem program we need to: \begin{itemize} -\item Add the include file shmem.h (for \Clang) or shmem.fh (for \Fortran). +\item Add the include file \HEADER{shmem.h} (for \Clang) or \HEADER{shmem.fh} (for \Fortran). \item Add the initialization call \FUNC{shmem\_init}, (line 9). \item Use OpenSHMEM calls to query the the total number of PEs (line 10) and PE id (line 11). diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index c608ae046..6c5c77cfd 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -29,7 +29,7 @@ invocations of the routine in an \openshmem{} program always return the same string. For a given library implementation, the major and minor version returned by these calls is consistent with the compile-time - constants defined in its shmem.h. + constants defined in its \HEADER{shmem.h}. } \apireturnvalues{ diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index b4a68e060..b3509147f 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -22,7 +22,7 @@ This routine returns the major and minor version of the \openshmem{} standard in use. For a given library implementation, the major and minor version returned by these calls is consistent with the compile-time constants, - SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION, defined in its shmem.h. + SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION, defined in its \HEADER{shmem.h}. } \apireturnvalues{ diff --git a/utils/defs.tex b/utils/defs.tex index 34e000f2c..c80d30a39 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -32,6 +32,7 @@ \newcommand{\insertDocVersion}{1.4} \newcommand{\OSH}{\emph{OpenSHMEM}} \newcommand{\openshmem}{{Open\-SHMEM}\xspace} +\newcommand{\HEADER}[1]{\textit{#1}} \newcommand{\FUNC}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} From bb5646e4c77ca158a9a27b1d98f8d64de61bc6e8 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sat, 11 Feb 2017 00:20:48 -0500 Subject: [PATCH 120/583] Comments --- utils/defs.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/defs.tex b/utils/defs.tex index c80d30a39..d61608459 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -36,7 +36,7 @@ \newcommand{\FUNC}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} -\newcommand{\const}[1]{\protect\gb\protect{\textsf{\small #1}}\index{CONST:#1}} +\newcommand{\const}[1]{\protect\gb\protect{\textsf{\small #1}}\index{CONST:#1}} % Only library_constants.tex table. \newcommand{\CorCpp}{\textit{C/C++}\xspace} \newcommand{\CorCppFor}{\textit{C/C++/Fortran}\xspace} \newcommand{\Fortran}{\textit{Fortran}} From 584411428ef7e8f7773ac71df96522c4d0368a06 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sat, 11 Feb 2017 00:35:53 -0500 Subject: [PATCH 121/583] Applied \HEADER to instances of shmemx.h --- content/backmatter.tex | 2 +- content/language_bindings_and_conformance.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6d9a3e7ab..5c2aab828 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -683,7 +683,7 @@ \section{Version 1.1} \\See Section \ref{subsec:progress}. % \item Clarification of naming convention for non-standard interfaces and their -inclusion in \FUNC{shmemx.h}. +inclusion in \HEADER{shmemx.h}. \\See Section \ref{subsec:bindings}. % \item Various fixes to \openshmem code examples across the specification to diff --git a/content/language_bindings_and_conformance.tex b/content/language_bindings_and_conformance.tex index 97d9e670b..88d929d20 100644 --- a/content/language_bindings_and_conformance.tex +++ b/content/language_bindings_and_conformance.tex @@ -15,5 +15,5 @@ \Fortran), \shmemprefixC (for \Clang) or with \openshmem \ac{API} names. All \openshmem extension \ac{API}s that are not part of this specification must -be defined in the \FUNC{shmemx.h} include file. These extensions shall use the +be defined in the \HEADER{shmemx.h} include file. These extensions shall use the \FUNC{shmemx\_} prefix for all routine, variable, and constant names. From 4b4fa23308b7aec02f6164c21b44df4451d39d47 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Sun, 12 Feb 2017 07:57:26 -0500 Subject: [PATCH 122/583] Remove _deprecated_sources files Signed-off-by: James Dinan --- _deprecated_sources/C/Makefile | 38 - _deprecated_sources/C/all2all.c | 200 -- _deprecated_sources/C/all2all_main.c | 276 --- _deprecated_sources/C/all2all_subs.c | 56 - _deprecated_sources/C/bench.h | 281 --- _deprecated_sources/C/circ.c | 12 - _deprecated_sources/C/cshift.c | 11 - _deprecated_sources/C/helloworld.c | 22 - _deprecated_sources/C/iput.c | 48 - _deprecated_sources/C/just_shmalloc.c | 21 - _deprecated_sources/C/mpp_bench.h | 115 - _deprecated_sources/C/pi.c | 105 - _deprecated_sources/C/ping.c | 31 - _deprecated_sources/C/reduce-max.c | 45 - _deprecated_sources/C/shmalloc.c | 18 - _deprecated_sources/C/shmem_long_finc_only.c | 104 - _deprecated_sources/C/test_all2all.c | 82 - _deprecated_sources/Diagrams_for_Spec1.1.pptx | Bin 78685 -> 0 bytes _deprecated_sources/EXAMPLES/Makefile | 84 - .../EXAMPLES/hello-openshmem-c.output | 4 - .../EXAMPLES/hello-openshmem-f90.output | 4 - .../EXAMPLES/hello-openshmem.c | 14 - .../EXAMPLES/hello-openshmem.f90 | 16 - .../EXAMPLES/shmem_add_example.c | 22 - .../EXAMPLES/shmem_and_example.f90 | 22 - .../EXAMPLES/shmem_barrier_example.c | 28 - .../EXAMPLES/shmem_barrierall_example.c | 21 - .../EXAMPLES/shmem_broadcast_example.c | 31 - .../EXAMPLES/shmem_broadcast_example.f90 | 10 - .../EXAMPLES/shmem_collect_example.c | 31 - .../EXAMPLES/shmem_collect_example.f90 | 5 - .../EXAMPLES/shmem_cswap_example.c | 12 - .../EXAMPLES/shmem_fadd_example.c | 22 - .../EXAMPLES/shmem_fence_example.c | 22 - .../EXAMPLES/shmem_finalize_example.c | 21 - .../EXAMPLES/shmem_finc_example.c | 24 - .../EXAMPLES/shmem_g_example.c | 21 - .../EXAMPLES/shmem_get_example.f90 | 15 - .../EXAMPLES/shmem_global_exit_example.c | 28 - .../EXAMPLES/shmem_iget_example.f90 | 11 - .../EXAMPLES/shmem_inc_example.c | 22 - .../EXAMPLES/shmem_init_example.f90 | 21 - .../EXAMPLES/shmem_iput_example.c | 22 - .../EXAMPLES/shmem_lock_example.c | 22 - .../EXAMPLES/shmem_max_example.f90 | 14 - .../EXAMPLES/shmem_min_example.f90 | 14 - .../EXAMPLES/shmem_mype_example.c | 13 - .../EXAMPLES/shmem_npes_example.c | 17 - .../EXAMPLES/shmem_or_example.f90 | 15 - .../EXAMPLES/shmem_p_example.c | 27 - .../EXAMPLES/shmem_prod_example.f90 | 14 - .../EXAMPLES/shmem_ptr_example.c | 31 - .../EXAMPLES/shmem_ptr_example.f90 | 29 - .../EXAMPLES/shmem_put_example.c | 18 - .../EXAMPLES/shmem_quiet_example.c | 32 - .../EXAMPLES/shmem_quiet_example.f90 | 21 - .../EXAMPLES/shmem_shmalloc_example.c | 18 - .../EXAMPLES/shmem_startpes_example.f90 | 18 - .../EXAMPLES/shmem_sum_example.f90 | 14 - .../EXAMPLES/shmem_swap_example.c | 23 - .../EXAMPLES/shmem_wait1_example.f90 | 2 - .../EXAMPLES/shmem_wait2_example.f90 | 2 - .../EXAMPLES/shmem_wait3_example.f90 | 4 - .../EXAMPLES/shmem_wait4_example.f90 | 12 - .../EXAMPLES/shmem_xor_example.f90 | 14 - .../EXAMPLES/writing_shmem_example.c | 32 - .../EXAMPLES/writing_shmem_example.output | 3 - _deprecated_sources/Fortran/hello.f90 | 16 - .../INTRODUCTION/atomics_intro.tex | 30 - .../INTRODUCTION/changelog.tex | 58 - .../INTRODUCTION/changelog1.2.tex | 40 - .../INTRODUCTION/collective_intro.tex | 53 - .../compile_exec_applications.tex | 61 - .../INTRODUCTION/deprecated_API.tex | 20 - .../INTRODUCTION/deprication.tex | 7 - .../INTRODUCTION/environment_variables.tex | 26 - _deprecated_sources/INTRODUCTION/examples.tex | 24 - .../INTRODUCTION/examples_C.tex | 33 - .../INTRODUCTION/examples_Fortran.tex | 4 - .../INTRODUCTION/execution_model.tex | 127 -- .../INTRODUCTION/introduction.tex | 10 - .../INTRODUCTION/introduction_pgas.tex | 168 -- .../INTRODUCTION/language_bindings.tex | 32 - .../INTRODUCTION/library_constants.tex | 113 - .../INTRODUCTION/locks_intro.tex | 3 - .../INTRODUCTION/memory_management_intro.tex | 1 - .../INTRODUCTION/memory_model.tex | 68 - .../INTRODUCTION/mpi_interoperability.tex | 11 - .../INTRODUCTION/new_execution_model.tex | 141 -- .../INTRODUCTION/openshmem_history.tex | 93 - .../INTRODUCTION/ordering_intro.tex | 2 - .../original_language_bindings.tex | 7 - .../INTRODUCTION/osh_project.tex | 8 - _deprecated_sources/INTRODUCTION/overview.tex | 74 - .../INTRODUCTION/programming_model.tex | 107 - .../INTRODUCTION/rma_intro.tex | 30 - .../INTRODUCTION/setup_query_intro.tex | 1 - .../INTRODUCTION/synchronization_intro.tex | 1 - .../INTRODUCTION/synchronization_model.tex | 176 -- .../INTRODUCTION/undefined_behavior.tex | 55 - .../INTRODUCTION/writing_programs.tex | 44 - _deprecated_sources/MACROS | 4 - _deprecated_sources/Makefile | 38 - _deprecated_sources/OSH_Spec1.1.xlsx | Bin 67288 -> 0 bytes _deprecated_sources/OpenSHMEM_Pound.png | Bin 327975 -> 0 bytes _deprecated_sources/README | 1 - .../TEX_FILES/NEW_shmem_my_pe.tex | 45 - .../TEX_FILES/NEW_shmem_num_pe.tex | 46 - _deprecated_sources/TEX_FILES/shfree.tex | 97 - _deprecated_sources/TEX_FILES/shmem_add.tex | 43 - .../TEX_FILES/shmem_addr_accessible.tex | 64 - .../TEX_FILES/shmem_barrier.tex | 57 - .../TEX_FILES/shmem_barrier_all.tex | 85 - .../TEX_FILES/shmem_broadcast.tex | 284 --- _deprecated_sources/TEX_FILES/shmem_cache.tex | 118 - .../TEX_FILES/shmem_collect.tex | 272 --- _deprecated_sources/TEX_FILES/shmem_cswap.tex | 134 -- _deprecated_sources/TEX_FILES/shmem_fadd.tex | 113 - _deprecated_sources/TEX_FILES/shmem_fence.tex | 43 - .../TEX_FILES/shmem_finalize.tex | 57 - _deprecated_sources/TEX_FILES/shmem_finc.tex | 57 - _deprecated_sources/TEX_FILES/shmem_g.tex | 49 - _deprecated_sources/TEX_FILES/shmem_get.tex | 89 - .../TEX_FILES/shmem_global_exit.tex | 62 - _deprecated_sources/TEX_FILES/shmem_iget.tex | 90 - _deprecated_sources/TEX_FILES/shmem_inc.tex | 52 - _deprecated_sources/TEX_FILES/shmem_init.tex | 47 - _deprecated_sources/TEX_FILES/shmem_iput.tex | 86 - _deprecated_sources/TEX_FILES/shmem_lock.tex | 41 - _deprecated_sources/TEX_FILES/shmem_name.tex | 40 - _deprecated_sources/TEX_FILES/shmem_p.tex | 33 - .../TEX_FILES/shmem_pe_accessible.tex | 29 - _deprecated_sources/TEX_FILES/shmem_ptr.tex | 45 - _deprecated_sources/TEX_FILES/shmem_put.tex | 87 - _deprecated_sources/TEX_FILES/shmem_quiet.tex | 45 - .../TEX_FILES/shmem_reductions.tex | 302 --- _deprecated_sources/TEX_FILES/shmem_swap.tex | 67 - .../TEX_FILES/shmem_version.tex | 34 - _deprecated_sources/TEX_FILES/shmem_wait.tex | 127 -- _deprecated_sources/TEX_FILES/shpalloc.tex | 55 - _deprecated_sources/TEX_FILES/shpclmove.tex | 42 - _deprecated_sources/TEX_FILES/shpdeallc.tex | 35 - _deprecated_sources/TEX_FILES/start_pes.tex | 47 - _deprecated_sources/coverpage.tex | 99 - _deprecated_sources/diagrams/fence.png | Bin 138243 -> 0 bytes .../diagrams/mp_lc_unicos_shmem_fence.graffle | Bin 2400 -> 0 bytes .../diagrams/mp_lc_unicos_shmem_fence.pdf | Bin 19742 -> 0 bytes .../diagrams/mp_lc_unicos_shmem_quiet.graffle | Bin 2556 -> 0 bytes .../diagrams/mp_lc_unicos_shmem_quiet.pdf | Bin 21837 -> 0 bytes .../diagrams/mpi_fence.graffle | Bin 2559 -> 0 bytes _deprecated_sources/diagrams/mpi_fence.pdf | Bin 22183 -> 0 bytes .../diagrams/q_unicos_shmem_fence.graffle | Bin 2420 -> 0 bytes .../diagrams/q_unicos_shmem_fence.pdf | Bin 19872 -> 0 bytes .../diagrams/q_unicos_shmem_quiet.graffle | Bin 2604 -> 0 bytes .../diagrams/q_unicos_shmem_quiet.pdf | Bin 22022 -> 0 bytes _deprecated_sources/diagrams/quiet.png | Bin 163192 -> 0 bytes .../diagrams/symmetric-variables.pdf | Bin 129092 -> 0 bytes .../diagrams/updated/barrier.graffle | 1703 -------------- .../diagrams/updated/barrier.pdf | Bin 84875 -> 0 bytes .../diagrams/updated/barrierall.graffle | 1962 ----------------- .../diagrams/updated/barrierall.pdf | Bin 93368 -> 0 bytes .../diagrams/updated/fence.graffle | 1347 ----------- .../diagrams/updated/fence.pdf | Bin 66570 -> 0 bytes .../diagrams/updated/mem_model.graffle | 880 -------- .../diagrams/updated/mem_model.pdf | Bin 71465 -> 0 bytes .../diagrams/updated/quiet.graffle | 1309 ----------- .../diagrams/updated/quiet.pdf | Bin 63074 -> 0 bytes .../diagrams/updated/wait.graffle | 685 ------ _deprecated_sources/diagrams/updated/wait.pdf | Bin 57694 -> 0 bytes _deprecated_sources/main_spec.tex | 286 --- _deprecated_sources/openshmem-book/Makefile | 61 - .../openshmem-book/OpenSHMEM_Pound.png | Bin 327975 -> 0 bytes _deprecated_sources/openshmem-book/about.tex | 67 - _deprecated_sources/openshmem-book/api.tex | 41 - .../openshmem-book/authors.tex | 43 - _deprecated_sources/openshmem-book/book.bib | 243 -- .../openshmem-book/example.tex | 381 ---- .../openshmem-book/foreword.tex | 39 - _deprecated_sources/openshmem-book/future.tex | 158 -- .../openshmem-book/introduction.tex | 261 --- _deprecated_sources/openshmem-book/main.tex | 265 --- .../openshmem-book/nutshell.tex | 475 ---- .../openshmem-book/openshmem-in-practice.tex | 64 - .../openshmem-book/other-openshmems.tex | 45 - .../openshmem-book/performance.tex | 58 - .../openshmem-book/programming-issues.tex | 189 -- .../openshmem-book/programs/add.c | 28 - .../openshmem-book/programs/add.output | 1 - .../openshmem-book/programs/amo.c | 127 -- .../openshmem-book/programs/broadcast.c | 46 - .../openshmem-book/programs/broadcast.output | 9 - .../openshmem-book/programs/fadd.c | 30 - .../openshmem-book/programs/fadd.output | 2 - .../openshmem-book/programs/finc.c | 30 - .../openshmem-book/programs/finc.output | 2 - .../openshmem-book/programs/hello-mpi.c | 15 - .../openshmem-book/programs/hello-mpi.output | 4 - .../programs/hello-openshmem-c.output | 4 - .../programs/hello-openshmem-f90.output | 4 - .../openshmem-book/programs/hello-openshmem.c | 14 - .../programs/hello-openshmem.f90 | 16 - .../openshmem-book/programs/hello-seq.c | 8 - .../openshmem-book/programs/hello-seq.output | 1 - .../openshmem-book/programs/inc.c | 28 - .../openshmem-book/programs/inc.output | 1 - .../openshmem-book/programs/ptp.c | 104 - .../openshmem-book/programs/put-ordering.c | 6 - .../openshmem-book/programs/rotate-put.c | 29 - .../openshmem-book/programs/rotate-put.output | 4 - .../programs/synch-not-needed.c | 14 - .../reference-implementation.tex | 615 ------ .../openshmem-book/thankyou.tex | 39 - .../openshmem-book/titlepage.tex | 71 - _deprecated_sources/openshmem-book/v&v.tex | 56 - _deprecated_sources/osh.tex | 1023 --------- 215 files changed, 20105 deletions(-) delete mode 100644 _deprecated_sources/C/Makefile delete mode 100644 _deprecated_sources/C/all2all.c delete mode 100644 _deprecated_sources/C/all2all_main.c delete mode 100644 _deprecated_sources/C/all2all_subs.c delete mode 100644 _deprecated_sources/C/bench.h delete mode 100644 _deprecated_sources/C/circ.c delete mode 100644 _deprecated_sources/C/cshift.c delete mode 100644 _deprecated_sources/C/helloworld.c delete mode 100644 _deprecated_sources/C/iput.c delete mode 100644 _deprecated_sources/C/just_shmalloc.c delete mode 100755 _deprecated_sources/C/mpp_bench.h delete mode 100644 _deprecated_sources/C/pi.c delete mode 100644 _deprecated_sources/C/ping.c delete mode 100644 _deprecated_sources/C/reduce-max.c delete mode 100644 _deprecated_sources/C/shmalloc.c delete mode 100644 _deprecated_sources/C/shmem_long_finc_only.c delete mode 100755 _deprecated_sources/C/test_all2all.c delete mode 100644 _deprecated_sources/Diagrams_for_Spec1.1.pptx delete mode 100644 _deprecated_sources/EXAMPLES/Makefile delete mode 100644 _deprecated_sources/EXAMPLES/hello-openshmem-c.output delete mode 100644 _deprecated_sources/EXAMPLES/hello-openshmem-f90.output delete mode 100644 _deprecated_sources/EXAMPLES/hello-openshmem.c delete mode 100644 _deprecated_sources/EXAMPLES/hello-openshmem.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_add_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_and_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_barrier_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_barrierall_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_broadcast_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_broadcast_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_collect_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_collect_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_cswap_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_fadd_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_fence_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_finalize_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_finc_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_g_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_get_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_global_exit_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_iget_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_inc_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_init_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_iput_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_lock_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_max_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_min_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_mype_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_npes_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_or_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_p_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_prod_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_ptr_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_ptr_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_put_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_quiet_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_quiet_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_shmalloc_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_startpes_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_sum_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_swap_example.c delete mode 100644 _deprecated_sources/EXAMPLES/shmem_wait1_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_wait2_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_wait3_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_wait4_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/shmem_xor_example.f90 delete mode 100644 _deprecated_sources/EXAMPLES/writing_shmem_example.c delete mode 100644 _deprecated_sources/EXAMPLES/writing_shmem_example.output delete mode 100644 _deprecated_sources/Fortran/hello.f90 delete mode 100644 _deprecated_sources/INTRODUCTION/atomics_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/changelog.tex delete mode 100644 _deprecated_sources/INTRODUCTION/changelog1.2.tex delete mode 100644 _deprecated_sources/INTRODUCTION/collective_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/compile_exec_applications.tex delete mode 100644 _deprecated_sources/INTRODUCTION/deprecated_API.tex delete mode 100644 _deprecated_sources/INTRODUCTION/deprication.tex delete mode 100644 _deprecated_sources/INTRODUCTION/environment_variables.tex delete mode 100644 _deprecated_sources/INTRODUCTION/examples.tex delete mode 100644 _deprecated_sources/INTRODUCTION/examples_C.tex delete mode 100644 _deprecated_sources/INTRODUCTION/examples_Fortran.tex delete mode 100644 _deprecated_sources/INTRODUCTION/execution_model.tex delete mode 100644 _deprecated_sources/INTRODUCTION/introduction.tex delete mode 100644 _deprecated_sources/INTRODUCTION/introduction_pgas.tex delete mode 100644 _deprecated_sources/INTRODUCTION/language_bindings.tex delete mode 100644 _deprecated_sources/INTRODUCTION/library_constants.tex delete mode 100644 _deprecated_sources/INTRODUCTION/locks_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/memory_management_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/memory_model.tex delete mode 100644 _deprecated_sources/INTRODUCTION/mpi_interoperability.tex delete mode 100644 _deprecated_sources/INTRODUCTION/new_execution_model.tex delete mode 100644 _deprecated_sources/INTRODUCTION/openshmem_history.tex delete mode 100644 _deprecated_sources/INTRODUCTION/ordering_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/original_language_bindings.tex delete mode 100644 _deprecated_sources/INTRODUCTION/osh_project.tex delete mode 100644 _deprecated_sources/INTRODUCTION/overview.tex delete mode 100644 _deprecated_sources/INTRODUCTION/programming_model.tex delete mode 100644 _deprecated_sources/INTRODUCTION/rma_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/setup_query_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/synchronization_intro.tex delete mode 100644 _deprecated_sources/INTRODUCTION/synchronization_model.tex delete mode 100644 _deprecated_sources/INTRODUCTION/undefined_behavior.tex delete mode 100644 _deprecated_sources/INTRODUCTION/writing_programs.tex delete mode 100644 _deprecated_sources/MACROS delete mode 100644 _deprecated_sources/Makefile delete mode 100644 _deprecated_sources/OSH_Spec1.1.xlsx delete mode 100644 _deprecated_sources/OpenSHMEM_Pound.png delete mode 100644 _deprecated_sources/README delete mode 100644 _deprecated_sources/TEX_FILES/NEW_shmem_my_pe.tex delete mode 100644 _deprecated_sources/TEX_FILES/NEW_shmem_num_pe.tex delete mode 100644 _deprecated_sources/TEX_FILES/shfree.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_add.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_addr_accessible.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_barrier.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_barrier_all.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_broadcast.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_cache.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_collect.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_cswap.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_fadd.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_fence.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_finalize.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_finc.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_g.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_get.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_global_exit.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_iget.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_inc.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_init.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_iput.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_lock.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_name.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_p.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_pe_accessible.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_ptr.tex delete mode 100755 _deprecated_sources/TEX_FILES/shmem_put.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_quiet.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_reductions.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_swap.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_version.tex delete mode 100644 _deprecated_sources/TEX_FILES/shmem_wait.tex delete mode 100644 _deprecated_sources/TEX_FILES/shpalloc.tex delete mode 100644 _deprecated_sources/TEX_FILES/shpclmove.tex delete mode 100644 _deprecated_sources/TEX_FILES/shpdeallc.tex delete mode 100644 _deprecated_sources/TEX_FILES/start_pes.tex delete mode 100644 _deprecated_sources/coverpage.tex delete mode 100644 _deprecated_sources/diagrams/fence.png delete mode 100755 _deprecated_sources/diagrams/mp_lc_unicos_shmem_fence.graffle delete mode 100755 _deprecated_sources/diagrams/mp_lc_unicos_shmem_fence.pdf delete mode 100755 _deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.graffle delete mode 100755 _deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.pdf delete mode 100755 _deprecated_sources/diagrams/mpi_fence.graffle delete mode 100755 _deprecated_sources/diagrams/mpi_fence.pdf delete mode 100755 _deprecated_sources/diagrams/q_unicos_shmem_fence.graffle delete mode 100755 _deprecated_sources/diagrams/q_unicos_shmem_fence.pdf delete mode 100755 _deprecated_sources/diagrams/q_unicos_shmem_quiet.graffle delete mode 100755 _deprecated_sources/diagrams/q_unicos_shmem_quiet.pdf delete mode 100644 _deprecated_sources/diagrams/quiet.png delete mode 100644 _deprecated_sources/diagrams/symmetric-variables.pdf delete mode 100644 _deprecated_sources/diagrams/updated/barrier.graffle delete mode 100644 _deprecated_sources/diagrams/updated/barrier.pdf delete mode 100644 _deprecated_sources/diagrams/updated/barrierall.graffle delete mode 100644 _deprecated_sources/diagrams/updated/barrierall.pdf delete mode 100644 _deprecated_sources/diagrams/updated/fence.graffle delete mode 100644 _deprecated_sources/diagrams/updated/fence.pdf delete mode 100644 _deprecated_sources/diagrams/updated/mem_model.graffle delete mode 100644 _deprecated_sources/diagrams/updated/mem_model.pdf delete mode 100644 _deprecated_sources/diagrams/updated/quiet.graffle delete mode 100644 _deprecated_sources/diagrams/updated/quiet.pdf delete mode 100644 _deprecated_sources/diagrams/updated/wait.graffle delete mode 100644 _deprecated_sources/diagrams/updated/wait.pdf delete mode 100755 _deprecated_sources/main_spec.tex delete mode 100644 _deprecated_sources/openshmem-book/Makefile delete mode 100644 _deprecated_sources/openshmem-book/OpenSHMEM_Pound.png delete mode 100644 _deprecated_sources/openshmem-book/about.tex delete mode 100644 _deprecated_sources/openshmem-book/api.tex delete mode 100644 _deprecated_sources/openshmem-book/authors.tex delete mode 100644 _deprecated_sources/openshmem-book/book.bib delete mode 100644 _deprecated_sources/openshmem-book/example.tex delete mode 100644 _deprecated_sources/openshmem-book/foreword.tex delete mode 100644 _deprecated_sources/openshmem-book/future.tex delete mode 100644 _deprecated_sources/openshmem-book/introduction.tex delete mode 100644 _deprecated_sources/openshmem-book/main.tex delete mode 100644 _deprecated_sources/openshmem-book/nutshell.tex delete mode 100644 _deprecated_sources/openshmem-book/openshmem-in-practice.tex delete mode 100644 _deprecated_sources/openshmem-book/other-openshmems.tex delete mode 100644 _deprecated_sources/openshmem-book/performance.tex delete mode 100644 _deprecated_sources/openshmem-book/programming-issues.tex delete mode 100644 _deprecated_sources/openshmem-book/programs/add.c delete mode 100644 _deprecated_sources/openshmem-book/programs/add.output delete mode 100644 _deprecated_sources/openshmem-book/programs/amo.c delete mode 100644 _deprecated_sources/openshmem-book/programs/broadcast.c delete mode 100644 _deprecated_sources/openshmem-book/programs/broadcast.output delete mode 100644 _deprecated_sources/openshmem-book/programs/fadd.c delete mode 100644 _deprecated_sources/openshmem-book/programs/fadd.output delete mode 100644 _deprecated_sources/openshmem-book/programs/finc.c delete mode 100644 _deprecated_sources/openshmem-book/programs/finc.output delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-mpi.c delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-mpi.output delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-openshmem-c.output delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-openshmem-f90.output delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-openshmem.c delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-openshmem.f90 delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-seq.c delete mode 100644 _deprecated_sources/openshmem-book/programs/hello-seq.output delete mode 100644 _deprecated_sources/openshmem-book/programs/inc.c delete mode 100644 _deprecated_sources/openshmem-book/programs/inc.output delete mode 100644 _deprecated_sources/openshmem-book/programs/ptp.c delete mode 100644 _deprecated_sources/openshmem-book/programs/put-ordering.c delete mode 100644 _deprecated_sources/openshmem-book/programs/rotate-put.c delete mode 100644 _deprecated_sources/openshmem-book/programs/rotate-put.output delete mode 100644 _deprecated_sources/openshmem-book/programs/synch-not-needed.c delete mode 100644 _deprecated_sources/openshmem-book/reference-implementation.tex delete mode 100644 _deprecated_sources/openshmem-book/thankyou.tex delete mode 100644 _deprecated_sources/openshmem-book/titlepage.tex delete mode 100644 _deprecated_sources/openshmem-book/v&v.tex delete mode 100755 _deprecated_sources/osh.tex diff --git a/_deprecated_sources/C/Makefile b/_deprecated_sources/C/Makefile deleted file mode 100644 index f734dbde7..000000000 --- a/_deprecated_sources/C/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -SHELL = /bin/sh - -CC = oshcc -CFLAGS = -Wall -pedantic -DNDEBUG -O3 - -RUNCMD=oshrun -NPROCOPT=-np -NPROC=2 -RUNOPT=$(NPROCOPT) $(NPROC) - -C_TESTS = circ.c cshift.c helloworld.c pi.c reduce-max.c shmem_long_finc_only.c -C_EXES = $(C_TESTS:.c=) -EXES = $(C_EXES) - -all default: $(EXES) - -run-circ: circ - $(RUNCMD) $(RUNOPT) ./circ - -run-cshift: cshift - $(RUNCMD) $(RUNOPT) ./cshift - -run-helloworld: helloworld - $(RUNCMD) $(RUNOPT) ./helloworld - -run-pi: pi - $(RUNCMD) $(RUNOPT) ./pi - -run-reduce-max: reduce-max - $(RUNCMD) $(RUNOPT) ./reduce-max - -run-finc: shmem_long_finc_only - $(RUNCMD) $(RUNOPT) ./shmem_long_finc_only - -run: all run-circ run-cshift run-helloworld run-pi run-reduce-max run-finc - -clean: - rm -f $(EXES) diff --git a/_deprecated_sources/C/all2all.c b/_deprecated_sources/C/all2all.c deleted file mode 100644 index f4b57c990..000000000 --- a/_deprecated_sources/C/all2all.c +++ /dev/null @@ -1,200 +0,0 @@ -/* -** Required includes and definitions -*/ - -#include -#include -#include -#include -#include -#include - -/* -** LP64 types -*/ - -typedef signed char int8 ; -typedef unsigned char uint8 ; -typedef short int16; -typedef unsigned short uint16; -typedef int int32; -typedef unsigned int uint32; -typedef long int64; -typedef unsigned long uint64; - -/* -** timing -*/ - -#include - -typedef struct { - double accum_wall, accum_cpus; - double start_wall, start_cpus; - time_t init_time; - char running; -} timer; - -void timer_clear (timer *t); -void timer_start (timer *t); -void timer_stop (timer *t); -void timer_report (timer *t, double *pwall, double *pcpus, int64 print); - -/* -** some masking macros -*/ - -#define _ZERO64 0uL -#define _maskl(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) << (64-(x)))) -#define _maskr(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) >> (64-(x)))) -#define _mask(x) (((x) < 64) ? _maskl(x) : _maskr(2*64 - (x))) - -/* -** PRNG -*/ - -#define _BR_RUNUP_ 128L -#define _BR_LG_TABSZ_ 7L -#define _BR_TABSZ_ (1L<<_BR_LG_TABSZ_) - -typedef struct { - uint64 hi, lo, ind; - uint64 tab[_BR_TABSZ_]; -} brand_t; - -#define _BR_64STEP_(H,L,A,B) {\ - uint64 x;\ - x = H ^ (H << A) ^ (L >> (64-A));\ - H = L | (x >> (B-64));\ - L = x << (128 - B);\ -} - -uint64 brand (brand_t *p); -void brand_init (brand_t *p, uint64 val); - -/* -** shmem functionality -*/ - -/* -** max size of tab (in wrds) -*/ - -#ifndef LG_NWRDS -#define LG_NWRDS 24L -#endif -#define NWRDS (1uL << LG_NWRDS) - -#include - -#define MY_GTHREAD shmem_my_pe() -#define GTHREADS shmem_n_pes() -#define TYPE uint64 - -TYPE *mpp_alloc (int64 nbytes); -void mpp_free (TYPE *ptr); -int64 mpp_accum_long (int64 val); -void do_sync_init (void); -int64 all2all (TYPE *dst, uint64 *src, int64 len, int64 nwrd); -void do_all2all (TYPE *tab, uint64 *loc, brand_t *br, int64 msize, - int64 tsize, int64 rep, int64 print); -void do_warmup (brand_t *br); - - -/* -** driver program -*/ - -int main (int argc, char *argv[]) - -{ - brand_t br; - int64 seed, arg, msize, tsize, rep; - TYPE *tab; - uint64 *loc; - - start_pes(0); - - if (argc < 5) { - if (MY_GTHREAD == 0) - fprintf (stderr, "Usage:\t%s seed msg_size(B) table_size(MB) rep_cnt " - "[ms2 ts2 rc2 ..]\n", argv[0]); - goto DONE; - } - -/* -** alloc some shared space -** (checks for valid pointer and casts) -*/ - - tab = mpp_alloc (NWRDS * sizeof(uint64)); - -/* -** pointer to local space -*/ - - loc = &tab[0]; - - -/* -** init all local memory -*/ - - bzero ((void *)&loc[0], NWRDS * sizeof(uint64)); - - seed = atol (argv[1]); - if (MY_GTHREAD == 0) - printf ("base seed is %ld\n", seed); - seed += (uint64)MY_GTHREAD << 32; - -/* -** seed uniquely per PE -*/ - - brand_init (&br, seed); - - arg = 2; - - while (arg < argc) { - msize = atol (argv[arg++]); - if (arg >= argc) - break; - tsize = atol (argv[arg++]) * (1L << 20); - if (arg >= argc) - break; - rep = atol (argv[arg++]); - - if (MY_GTHREAD == 0) - printf ("tsize = %ldMB msize = %5ldB\n", tsize/(1L<<20), msize); - if (msize < sizeof(long)) { - if (MY_GTHREAD == 0) - printf ("msize must be > %ld B\n", (int64)sizeof(long)); - goto DONE; - } - if (tsize > (NWRDS * sizeof(long))) { - if (MY_GTHREAD == 0) - printf ("tsize must be < %ld MiB\n", - (int64)(NWRDS * sizeof(long)) / (1uL<<20)); - goto DONE; - } - -/* -** exits on error -*/ - - do_all2all (tab, loc, &br, msize, tsize, rep, 1); - - if (MY_GTHREAD == 0) - printf ("\n"); - } - -/* -** free up the shared memory -*/ - - mpp_free (tab); - - DONE: - shmem_barrier_all(); - return 0; -} diff --git a/_deprecated_sources/C/all2all_main.c b/_deprecated_sources/C/all2all_main.c deleted file mode 100644 index 0e0a0ad6a..000000000 --- a/_deprecated_sources/C/all2all_main.c +++ /dev/null @@ -1,276 +0,0 @@ -/* CVS info */ -/* $RCSfile: all2all_main.c,v $ */ -/* -* Purpose: all2all.c copies data from one half of a table to the other -* half of the table. -* -* -* Date Description -* -* all2all has been modified to automatically compare cksum results -* for 128 processors at run time and to print an error message -* if there is a discrepancy. -* In the future additional error checking for any number of processors -* will be done. -* added memset(tab,0,tsize) -* -* Preprocessor DEFINED Variables: -* 1. This benchmark will automatically verify checksums unless CHECKOFF is -* defined in the makefile flags. To turn off the automated check specify -* -DCHECKOFF in the makefile flags and recompile. -* (MUST define CHECKOFF if not using 128 processors.) -* 2. If additional timing info is needed for debugging specify -DPTIMES in -* the makfile flags. -*/ - -#include -#include "all2all.h" - -int64 SELF, SIZE; - -#if 0 -int64 known_v[] = { - 0x889d1f6f6b165117, - 0xc2597eee7a77503b, - 0x9fde67a85fec3140, - 0x98218560b0e2fcad, - 0x77970e91ec2ae92f, - 0xd7c257a76e652480, - 0xfae8fc3473e44bd7, - 0xae70524b190b97d1, - 0xbd3481e6d55c2587, - 0x92b1e34c9a63c162, - 0xd53483207d373375, - 0x818b5ae39e15de0c, - 0xa10c2c69b3441650, - 0x3213b203ef570cfe, - 0x953cacafbc6694af, - 0x0435c6359cfeac6a, - 0x0107162b374ac090, - 0x3b4579d543eb131e, - 0x1f46dbcd8e23ca22, - 0x4f99bd5b1c45bff2, - 0x69872eca2dd09002, - 0x5a10168c91da8c2e, - 0xfb7842751192f1bf, - 0x42d182c4447097fe, - 0xacdb47e7a6c94a44, - 0x91fb985dbdd6e93b, - 0x4796404dd92f2c3a, - 0xcda282a270d3610f, - 0x29d786ca8abdaf09, - 0x3f9af62d5a02bdc6, - 0x513eb2b11ab80a05, - 0x59a32e0cc53f2c3d, - 0x5b22688cc292ee8c, - 0xd7076df7f4c3b35b, - 0x3dcf8e920a889b72, - 0x6cf0fe53b376b881 -}; - -#endif -int gv = 0; - -/* Set up for one iteration only.*/ -int64 ckv[3] = { - 0x156a0e1af0914226, - 0xa70ebc57a39fd98d, - 0x1513f274d76734c6, -}; - -uint64 do_cksum (uint64 *arr, int64 len) -{ - int64 i, cksum; - - // compute src cksum - for (i = cksum = 0; i < len; i++) - cksum += arr[i]; - return accum_long (cksum); -} - -int main (int argc, char *argv[]) -{ - static char cvs_info[] = "BMkGRP $Date: $ $Revision: $ $RCSfile: all2all_main.c,v $ $Name: $"; - - int itr; - int idx; - brand_t br; - timer t, t0, t1; - double nsec; - - double total_time = 0.0; - - int status = 0; - - int64 i, seed, arg, msize, tsize, len, oldsize=0, rep, cksum; - uint64 *tab=NULL; - - start_pes(0); - SELF=_my_pe(); - SIZE=_n_pes(); - - if (argc < 5) { - if (SELF == 0) - fprintf (stderr, "Usage:\t%s seed msg_size(B) table_size(MB) rep_cnt " - "[ms2 ts2 rc2 ..]\n", argv[0]); - status = 1; - goto DONE; - } - seed = atol (argv[1]); - if (SELF == 0) - printf ("base seed is %ld\n", seed); - seed += SELF << 32; - brand_init (&br, seed); // seed uniquely per PE - - arg = 2; - - while (arg < argc) { - - - msize = atol (argv[arg++]); if (arg >= argc) break; - /* Table size * 1 million. */ - tsize = atol (argv[arg++]) * (1L << 20); if (arg >= argc) break; - //rep = atol (argv[arg++]); - rep = 1; - arg++; - - if (SELF == 0) printf ("tsize = %ldMB msize = %dB\n", - tsize/(1L<<20), msize); - if (msize < sizeof(long)) { - if (SELF == 0) printf ("msize too short!\n"); - //status = 1; - goto DONE; - } - //itr=0; - - idx = 0; - - switch(SIZE){ - case 2: - idx = 0; - break; - case 4: - idx = 1; - break; - case 8: - idx = 2; - break; - default: - fprintf(stderr,"warning, check sum for (%d) pes not supported.\n", - SIZE); - } - - while (rep-- > 0) { - - /* START TIMING */ - //timer_clear (&t0); - //timer_clear (&t1); - //timer_start (&t0); - - if ((tab == NULL) || (tsize > oldsize)) { - if (tab != NULL) { - dram_shfree (tab); - oldsize = 0; - } - if (SELF == 0) printf ("trying dram_shmalloc of %ld bytes\n", tsize); - tab = (uint64 *) dram_shmalloc (tsize); - - if (tab == NULL) { - if (SELF == 0) printf ("dram_shmalloc failed!\n"); - status = 1; - goto DONE; - - } - oldsize = tsize; - } - - // length in words - len = tsize / sizeof(uint64); - - // important to init table - // to ensure cksum consistency on different platforms - memset(tab,0,tsize); - - for (i = 0; i < len; i+=64){ - tab[i] = brand(&br); - } - - // we'll have destination/source arrays each of half size - len /= 2; - - //timer_stop (&t0); - // source checksum - cksum = do_cksum (&tab[len], len); - if (SELF == 0) printf ("cksum is %016lx\n", cksum); - if (SELF == 0){ - //if(cksum!=ckv[itr++]){ - /* Set up for one iteration only. */ - if(cksum!=ckv[idx]){ - printf ("cksum %016lx != ckv[%d] %016x\n",cksum,idx,ckv[idx]); - gexit(1); - } - - } - - //timer_start (&t1); - len = do_all2all (&tab[0], &tab[len], len, msize/sizeof(uint64)); - - shmem_barrier_all(); - - //timer_stop (&t1); - /* END TIMING */ -#if 0 - - // dest checksum - i = do_cksum (&tab[0], len); - if (i != cksum) { - printf ("PE %4ld ERROR: %016lx != %016lx\n", SIZE, i, cksum); - status = 1; - goto DONE; - } - -#ifndef CHECKOFF - if (i != known_v[gv]) { - printf ("CHECKSUM PE %4ld ERROR: %016lx != %016lx\n", SIZE, i, known_v[gv]); - status = 1; - goto DONE; - } - gv++; -#endif - - - //t.accum_wall = t0.accum_wall + t1.accum_wall; - //t.accum_cpus = t0.accum_cpus + t1.accum_cpus; - - - /*if (SELF == 0) { - -#ifdef PTIMES - printf ("%8.3f %8.3f\n", t0.accum_wall , t1.accum_wall); - printf ("%8.3f %8.3f\n", t0.accum_cpus , t1.accum_cpus); -#endif - printf ("wall reports %8.3f secs cpus report %8.3f secs\n", - t.accum_wall, t.accum_cpus); - nsec = MAX(t.accum_wall, t.accum_cpus); - total_time += nsec; - if (nsec > 0) - printf ("%8.3f MB/sec with %ld bytes transfers\n", - len*sizeof(uint64)/(double)(1L<<20)/nsec, msize); - }*/ -#endif - } - //if (SELF == 0) - //printf ("\n"); - } - //if (SELF == 0) - //{ - //printf ("total time = %14.9f\n", total_time); - - //} - - DONE: - shmem_barrier_all(); - return status; -} - - diff --git a/_deprecated_sources/C/all2all_subs.c b/_deprecated_sources/C/all2all_subs.c deleted file mode 100644 index 362185099..000000000 --- a/_deprecated_sources/C/all2all_subs.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "bench.h" -#include - -#define PERM(ME,TOT,ITER) ((ME)^(ITER)) // ok if 2^n pes - -#define MAX(A,B) (((A)>(B)) ? (A) : (B)) -#define MIN(A,B) (((A)<(B)) ? (A) : (B)) - -int64 do_all2all (uint64 *dst, uint64 *src, int64 len, int64 nwrd); -int64 accum_long (int64 val); - -extern int64 SELF, SIZE; - -/* returns words sent per PE */ - -int64 do_all2all (uint64 *dst, uint64 *src, int64 len, int64 nwrd) -{ -static char cvs_info[] = "BMKGRP $Date: $ $Revision: $ $RCSfile: all2all.c,v $ $Name: $"; - - int64 i, j, pe; - - len = len - (len % (nwrd * SIZE)); // force even multiple - for (i = 0; i < len; i+=SIZE*nwrd) { - shmem_barrier_all(); - for (j = 0; j < SIZE; j++) { - pe = PERM(SELF,SIZE,j); - /* shmem_put (&dst[i + SELF*nwrd], &src[i + pe*nwrd], nwrd, pe);*/ - shmem_put64 (&dst[i + SELF*nwrd], &src[i + pe*nwrd], nwrd, pe); - } - } - return len; -} - -int64 accum_long (int64 val) - -{ - int64 i; - static int64 target, source, init=0; - static int64 Sync[_SHMEM_REDUCE_SYNC_SIZE]; - static int64 Work[2 + _SHMEM_REDUCE_MIN_WRKDATA_SIZE]; - - if (! init) { - /* need to initialize Sync first time around */ - for(i = 0; i < _SHMEM_REDUCE_SYNC_SIZE; i++) - Sync[i] = _SHMEM_SYNC_VALUE; - init = 1; - } - source = val; - shmem_barrier_all(); - - shmem_long_sum_to_all (&target, &source, 1, 0, 0, SIZE, Work, Sync); - - shmem_barrier_all(); - return target; -} - diff --git a/_deprecated_sources/C/bench.h b/_deprecated_sources/C/bench.h deleted file mode 100644 index 499fd09d3..000000000 --- a/_deprecated_sources/C/bench.h +++ /dev/null @@ -1,281 +0,0 @@ -#include -#include -#include - - -typedef signed char int8 ; -typedef unsigned char uint8 ; -typedef short int16; -typedef unsigned short uint16; -typedef int int32; -typedef unsigned int uint32; -typedef long int64; -typedef unsigned long uint64; - -/* timing */ - -#include -#include - -/* wall-clock time */ - -static double wall(void) - -{ - struct timeval tp; - - gettimeofday (&tp, NULL); - return - tp.tv_sec + tp.tv_usec/(double)1.0e6; -} - -#include - -/* cpu + system time */ - -static double cpus(void) -{ - struct rusage ru; - - getrusage(RUSAGE_SELF,&ru); - return - (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + - (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec)/(double)1.0e6; -} - -typedef struct { - double accum_wall, accum_cpus; - double start_wall, start_cpus; - time_t init_time; - char running; -} timer; - -static void timer_clear (timer *t) -{ - t->accum_wall = t->accum_cpus = 0; - t->start_wall = t->start_cpus = 0; - t->running = 0; -} - -static void timer_start (timer *t) -{ - t->start_wall = wall(); - t->start_cpus = cpus(); - t->running = 1; -} - -static void timer_stop (timer *t) -{ - if (t->running == 0) - return; - t->accum_cpus += cpus() - t->start_cpus; - t->accum_wall += wall() - t->start_wall; - t->running = 0; -} - -static void timer_report (timer *t, double *pwall, double *pcpus, - int64 print) -{ - double w, c; - - w = t->accum_wall; - c = t->accum_cpus; - - if (t->running) { - c += cpus() - t->start_cpus; - w += wall() - t->start_wall; - } - if (print) { - printf ("%7.3f secs of wall clock time\n", w); - printf ("%7.3f secs of cpu and system time\n", c); - } - - if (pwall) *pwall = w; - if (pcpus) *pcpus = c; -} - - -/* some masking macros */ - -#define _ZERO64 0uL -#define _maskl(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) << (64-(x)))) -#define _maskr(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) >> (64-(x)))) -#define _mask(x) (((x) < 64) ? _maskl(x) : _maskr(2*64 - (x))) - -/* PRNG */ - -#define _BR_RUNUP_ 128L -#define _BR_LG_TABSZ_ 7L -#define _BR_TABSZ_ (1L<<_BR_LG_TABSZ_) - -typedef struct { - uint64 hi, lo, ind; - uint64 tab[_BR_TABSZ_]; -} brand_t; - -#define _BR_64STEP_(H,L,A,B) {\ - uint64 x;\ - x = H ^ (H << A) ^ (L >> (64-A));\ - H = L | (x >> (B-64));\ - L = x << (128 - B);\ -} - -static uint64 brand (brand_t *p) { - uint64 hi=p->hi, lo=p->lo, i=p->ind, ret; - - ret = p->tab[i]; - - _BR_64STEP_(hi,lo,45,118); - - p->tab[i] = ret + hi; - - p->hi = hi; - p->lo = lo; - p->ind = hi & _maskr(_BR_LG_TABSZ_); - - return ret; -} - -static void brand_init (brand_t *p, uint64 val) - -{ - int64 i; - uint64 hi, lo; - - hi = 0x9ccae22ed2c6e578uL ^ val; - lo = 0xce4db5d70739bd22uL & _maskl(118-64); - - for (i = 0; i < 64; i++) - _BR_64STEP_(hi,lo,33,118); - - for (i = 0; i < _BR_TABSZ_; i++) { - _BR_64STEP_(hi,lo,33,118); - p->tab[i] = hi; - } - p->ind = _BR_TABSZ_/2; - p->hi = hi; - p->lo = lo; - - for (i = 0; i < _BR_RUNUP_; i++) - brand(p); -} - -/* init / end subroutines */ - -/* prints information, initializes PRNG, returns number of iterations */ - -#define INIT_ST "INIT>" -#define END_ST "END>" -#define MAX_HOST 80L - -static int64 bench_init (int argc, char *argv[], brand_t *br, - timer *t, char *more_args) -{ - uint64 seed; - int64 niters; - int i; - time_t c; - static char host[MAX_HOST]; - - if ((i = sizeof(void *)) != 8) { - printf ("error: sizeof(void *) = %d\n", i); - exit(1); - } - if ((i = sizeof(long)) != 8) { - printf ("error: sizeof(long) = %d\n", i); - exit(1); - } - if ((i = sizeof(int)) != 4) { - printf ("error: sizeof(int) = %d\n", i); - exit(1); - } - - if (argc < 3) { - /* prog seed iters [... other args] */ - printf ("Usage:\t%s seed iters %s\n", - argv[0], (more_args != NULL) ? more_args : ""); - exit(0); - } - - printf ("\n===================================================\n\n"); - - /* print start time of day */ - time (&c); - printf ("%s %s started at: %s", INIT_ST, argv[0], ctime(&c)); - t->init_time = c; - - gethostname (host, MAX_HOST); - printf ("%s host machine is %s\n", INIT_ST, host); - - printf ("%s program built on %s @ %s\n", - INIT_ST, __DATE__, __TIME__); - - seed = atol (argv[1]); - niters = atol (argv[2]); - - printf ("%s seed is %ld niters is %ld\n", INIT_ST, seed, niters); - if (argc > 3) { - printf ("%s other args: ", INIT_ST); - argv += 3; - while (*argv) - printf (" %s", *argv++); - printf ("\n"); - } - - if (br != NULL) - brand_init (br, seed); - - if (t != NULL) - timer_clear (t); - - printf ("\n"); - - return niters; -} - -static void bench_end (timer *t, int64 iters, char *work) -{ - time_t c; - double wall, cpus, rate; - - printf ("\n"); - - /* print end time of day */ - time (&c); - printf ("%s ended at: %s", END_ST, ctime(&c)); - c = c - t->init_time; - printf ("%s elapsed time is %d seconds\n", END_ST, c); - - if (t != NULL) { - timer_report(t, &wall, &cpus, 0); - - printf ("%s %7.3f secs of wall time ", - END_ST, wall); - if (c <= 0) c = 1; - printf ("%7.3f%% of value reported by time()\n", wall/c*100.); - - if (wall <= 0) wall = 0.0001; - printf ("%s %7.3f secs of cpu+sys time utilization = %5.3f%%\n", - END_ST, cpus, cpus/wall*100.); - - if (cpus > (wall+.01)) - printf ("this result is suspicious since cpu+system > wall\n"); - if ((iters > 0) && (work != NULL)) { - const char *units[4] = {"", "K", "M", "G"}; - int i = 0; - - rate = iters/wall; - while (i < 3) { - if (rate > 999.999) { - rate /= 1024.; - i++; - } - else - break; - } - - printf ("%s %8.4f %s %s per second\n", - END_ST, rate, units[i], work); - } - } -} diff --git a/_deprecated_sources/C/circ.c b/_deprecated_sources/C/circ.c deleted file mode 100644 index 14781051f..000000000 --- a/_deprecated_sources/C/circ.c +++ /dev/null @@ -1,12 +0,0 @@ -/* circular shift bbb into aaa */ -#include - -int aaa, bbb; - -int main (int argc, char * argv[]) -{ - start_pes(0); - shmem_int_get(&aaa, &bbb, 1,(_my_pe() + 1)% _num_pes()); - shmem_barrier_all(); - return 0; -} diff --git a/_deprecated_sources/C/cshift.c b/_deprecated_sources/C/cshift.c deleted file mode 100644 index ec4a7d4d2..000000000 --- a/_deprecated_sources/C/cshift.c +++ /dev/null @@ -1,11 +0,0 @@ -/* circular shift bbb into aaa */ -#include -int aaa, bbb; -int main (int argc, char * argv[]) -{ - start_pes(0); - shmem_int_get(&aaa, &bbb, 1,(_my_pe() + 1)% _num_pes()); - shmem_barrier_all(); - return 0; -} - diff --git a/_deprecated_sources/C/helloworld.c b/_deprecated_sources/C/helloworld.c deleted file mode 100644 index 3bd870d6a..000000000 --- a/_deprecated_sources/C/helloworld.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(int argc, char* argv[]) -{ - int me, my_num_pes; - /* - ** Starts/Initializes SHMEM/OpenSHMEM - */ - start_pes(0); - /* - ** Fetch the number or processes - ** Some implementations use num_pes(); - */ - my_num_pes = _num_pes(); - /* - ** Assign my process ID to me - */ - me = _my_pe(); - printf("Hello World from %d of %d\n", me, my_num_pes); - return 0; -} diff --git a/_deprecated_sources/C/iput.c b/_deprecated_sources/C/iput.c deleted file mode 100644 index f36052d86..000000000 --- a/_deprecated_sources/C/iput.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This program is an adaptation of examples found in the man pages - * of SGI's SHMEM implementation. - * - * In this program, iput is used to select 5 elements from array source separated by - * a stride of 2 and write them to array target using a stride of 1. - * - * Given the array source = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } - * iput will select 5 elements from array source on PE 0, using a stride of 2: - * - * selected elements = { 1, 3, 5, 7, 9 } - * - * These elements will then be written to the array source on PE 1 using a stride of 1: - * - * target = { 1, 3, 5, 7, 9 } - * - */ - -#include -#include - -int -main(void) -{ - short source[10] = { 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10 }; - static short target[10]; - int me; - - start_pes(0); - me = _my_pe(); - - if (me == 0) { - /* put 10 words into target on PE 1 */ - shmem_short_iput(target, source, 1, 2, 5, 1); - } - - shmem_barrier_all(); /* sync sender and receiver */ - - if (me == 1) { - printf("target on PE %d is %hd %hd %hd %hd %hd\n", me, - target[0], target[1], target[2], - target[3], target[4] ); - } - shmem_barrier_all(); /* sync before exiting */ - - return 0; -} diff --git a/_deprecated_sources/C/just_shmalloc.c b/_deprecated_sources/C/just_shmalloc.c deleted file mode 100644 index 9b17c442e..000000000 --- a/_deprecated_sources/C/just_shmalloc.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * just do a shmalloc and a free, no output to be expected - */ - -#include - -int -main() -{ - long *x; - - start_pes(0); - - x = (long *) shmalloc(sizeof(*x)); - - shfree(x); - shmem_barrier_all(); - - return 0; -} - diff --git a/_deprecated_sources/C/mpp_bench.h b/_deprecated_sources/C/mpp_bench.h deleted file mode 100755 index 08cb2576f..000000000 --- a/_deprecated_sources/C/mpp_bench.h +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include -#include - -// LP64 types - -typedef signed char int8 ; -typedef unsigned char uint8 ; -typedef short int16; -typedef unsigned short uint16; -typedef int int32; -typedef unsigned int uint32; -typedef long int64; -typedef unsigned long uint64; - -// timing - -#include - -typedef struct { - double accum_wall, accum_cpus; - double start_wall, start_cpus; - time_t init_time; - char running; -} timer; - -void timer_clear (timer *t); -void timer_start (timer *t); -void timer_stop (timer *t); -void timer_report (timer *t, double *pwall, double *pcpus, int64 print); - -// some masking macros - -#define _ZERO64 0uL -#define _maskl(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) << (64-(x)))) -#define _maskr(x) (((x) == 0) ? _ZERO64 : ((~_ZERO64) >> (64-(x)))) -#define _mask(x) (((x) < 64) ? _maskl(x) : _maskr(2*64 - (x))) - -// PRNG - -#define _BR_RUNUP_ 128L -#define _BR_LG_TABSZ_ 7L -#define _BR_TABSZ_ (1L<<_BR_LG_TABSZ_) - -typedef struct { - uint64 hi, lo, ind; - uint64 tab[_BR_TABSZ_]; -} brand_t; - -#define _BR_64STEP_(H,L,A,B) {\ - uint64 x;\ - x = H ^ (H << A) ^ (L >> (64-A));\ - H = L | (x >> (B-64));\ - L = x << (128 - B);\ -} - -uint64 brand (brand_t *p); -void brand_init (brand_t *p, uint64 val); - -// upc/shmem functionality - -// max size of tab (in wrds) -#ifndef LG_NWRDS -//#define LG_NWRDS 27L -// HACK: can't upc_all_alloc more than 2^24 words /PE -#define LG_NWRDS 24L -#endif -#define NWRDS (1uL << LG_NWRDS) - -#if defined(__UPC__) -#include -#include -#define MY_GTHREAD MYTHREAD -#define GTHREADS THREADS -#define TYPE shared uint64 - -#define mpp_init() // no-op -#define mpp_barrier_all() upc_barrier -#define mpp_exit(status) upc_global_exit(status) - -#else - -#if defined(CRAY_XT) -#include -#else -#include -#endif - -#define MY_GTHREAD shmem_my_pe() -#define GTHREADS shmem_n_pes() -#define TYPE uint64 - -#define mpp_init shmem_init -#define mpp_barrier_all shmem_barrier_all - -#if defined(CRAY_XT) -#define mpp_exit(status) shmem_finalize() -#else -#define mpp_exit(status) globalexit(status) -#endif - -#endif - -TYPE *mpp_alloc (int64 nbytes); -void mpp_free (TYPE *ptr); -int64 mpp_accum_long (int64 val); -void do_sync_init (void); -void mpp_put (TYPE *dst, uint64 *src, int64 nelem, int64 pe); -void mpp_broadcast (TYPE *dst, TYPE *src, int64 nelem, int64 root); -int64 all2all (TYPE *dst, uint64 *src, int64 len, int64 nwrd); -void do_all2all (TYPE *tab, uint64 *loc, brand_t *br, int64 msize, - int64 tsize, int64 rep, int64 print); -void do_warmup (brand_t *br); diff --git a/_deprecated_sources/C/pi.c b/_deprecated_sources/C/pi.c deleted file mode 100644 index a1d7fe61e..000000000 --- a/_deprecated_sources/C/pi.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * This file is distributed as part of GatorSHMEM, a project of the HCS - * Research Lab / CHREC at the University of Florida. - * - * Copyright (c) 2005-2010, the University of Florida. - * All rights reserved. - * - * Modified by SPoole from ORNL to be OpenSHMEM V1.0 compliant - * and work with other architectures. - * - */ -#include -#include -#include -#include -#include -#include - -#define M_PI_2 1.57079632679489661923 -#define TRIES 1000000000 - - -double timerval() -{ - struct timeval st; - gettimeofday ( &st, NULL); - return st.tv_sec + st.tv_usec * 1e-6; -} - - -int main(int argc, char *argv[]) -{ -/* 1. get random [0, 1] ==> - 2. get random [0, pi/2] ==>theta - 3. hit X < sin(theta) - 4. 2/pi = hit/tries. -*/ - double X, Theta, My_pi; - double Tstart, Tend; - int i, total, hit=0; - int *buf, my_mem; - int rank, numprocs, num_of_procs; - - num_of_procs = atoi(argv[1]); - - start_pes (0); - - numprocs = _num_pes(); - rank = _my_pe(); - - my_mem = (sizeof(int) * numprocs); - buf = shmalloc(my_mem); - - srand( (unsigned int) time(NULL)); - - if ( rank == 0 ) { - printf("pi is %f\n", M_PI_2 ); - printf("sin(pi/2) is %f\n", sin(M_PI_2)); - fflush(stdout); - } - - Tstart = timerval(); - - if ( rank != 0 ) { - total = TRIES/(numprocs-1); - if (rank == 1) - total += TRIES % (numprocs-1); - - srand( (unsigned int) time(NULL)); - - for ( i = 0; i < total ; i++){ - X = rand(); - X = X/RAND_MAX; - - Theta = rand(); - Theta = ( M_PI_2 ) * (Theta/RAND_MAX); - if ( X < sin(Theta)) - hit++; - } - buf[0] = hit; - } - - shmem_barrier_all(); - - if ( rank == 0 ) - for ( i = 1; i < numprocs; i++) { - shmem_getmem(buf, buf, sizeof(int), i); - hit += buf[0]; - printf("from node(%d), getmem buf\t %d, so hit is\t %d\n", i, buf[0], hit); - } - - shmem_barrier_all(); - - if ( rank == 0 ) { - My_pi = 2 * ( 1 / ( ((double)hit)/TRIES ) ); - Tend = timerval(); - printf("Hit is : %d :: Total is %d \n",hit, TRIES); - printf("My pi is %.16f \n", My_pi); - printf("Elapsed time is %f \n", Tend - Tstart); - } - - shmem_barrier_all(); - - return 0; -} diff --git a/_deprecated_sources/C/ping.c b/_deprecated_sources/C/ping.c deleted file mode 100644 index 803080d40..000000000 --- a/_deprecated_sources/C/ping.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * test if PE is accessible - * - */ - -#include - -#include - -int -main(void) -{ - int me, npes; - - setbuf(stdout, NULL); - - start_pes(0); - me = _my_pe(); - npes = _num_pes(); - - if (me == 0) { - int i; - for (i = 1; i < npes; i += 1) { - printf("From %d: PE %d is ", me, i); - printf("%s", shmem_pe_accessible(i) ? "" : "NOT "); - printf("accessible\n"); - } - } - - return 0; -} diff --git a/_deprecated_sources/C/reduce-max.c b/_deprecated_sources/C/reduce-max.c deleted file mode 100644 index 353f7ecd3..000000000 --- a/_deprecated_sources/C/reduce-max.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * reduce [0,1,2] + _my_pe() across 4 PEs with MAX() - * - * - */ - -#include -#include - -#include - -long pSync[_SHMEM_BCAST_SYNC_SIZE]; - -#define N 3 - -long src[N]; -long dst[N]; -long pWrk[_SHMEM_REDUCE_SYNC_SIZE]; - -int -main(void) -{ - int i; - - for (i = 0; i < SHMEM_BCAST_SYNC_SIZE; i += 1) { - pSync[i] = _SHMEM_SYNC_VALUE; - } - - start_pes(0); - - for (i = 0; i < N; i += 1) { - src[i] = _my_pe() + i; - } - shmem_barrier_all(); - - shmem_long_max_to_all(dst, src, N, 0, 0, _num_pes(), pWrk, pSync); - - printf("%d/%d dst =", _my_pe(), _num_pes() ); - for (i = 0; i < N; i+= 1) { - printf(" %ld", dst[i]); - } - printf("\n"); - - return 0; -} diff --git a/_deprecated_sources/C/shmalloc.c b/_deprecated_sources/C/shmalloc.c deleted file mode 100644 index a10b30141..000000000 --- a/_deprecated_sources/C/shmalloc.c +++ /dev/null @@ -1,18 +0,0 @@ -/* -* OpenSHMEM program to allocate (shmalloc) symmetric memory (1 long integer), -* and then free it. Success of allocation is untested. -* -* This program produces no output. -*/ - -#include - -int -main(void) -{ - long *x; - start_pes(0); - x = (long *) shmalloc(sizeof(*x)); - shfree(x); - return 0; -} diff --git a/_deprecated_sources/C/shmem_long_finc_only.c b/_deprecated_sources/C/shmem_long_finc_only.c deleted file mode 100644 index 1798df225..000000000 --- a/_deprecated_sources/C/shmem_long_finc_only.c +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** -!---------------------------------------------------------------------- -! Copyright (c) 2010, Cray Inc. -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without -! modification, are permitted provided that the following conditions are -! met: -! -! * Redistributions of source code must retain the above copyright -! notice, this list of conditions and the following disclaimer. -! -! * Redistributions in binary form must reproduce the above copyright -! notice, this list of conditions and the following disclaimer in the -! documentation and/or other materials provided with the distribution. -! -! * Neither the name Cray Inc. nor the names of its contributors may be -! used to endorse or promote products derived from this software -! without specific prior written permission. - -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -! A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -! OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -! LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -!---------------------------------------------------------------------- -! -! Purpose: Functional tests for the following shmem_finc routines --- -! shmem_long_finc -! -!*********************************************************************/ -#include -#include -#include - -#define ITER 50 - -long count; - -int main(int argc, char **argv) -{ - int i,j; - long modj,oldj,oldxmodj; - int my_pe,n_pes; - size_t max_elements_bytes; - static long *x; - - start_pes(0); - my_pe = shmem_my_pe(); - n_pes = shmem_n_pes(); -#ifdef HAVE_SET_CACHE_INV - shmem_set_cache_inv(); -#endif - -/* fail if trying to use only one processor */ - if ( n_pes <= 1 ){ - fprintf(stderr, "FAIL - test requires at least two PEs\n"); - exit(1); - } - - if(my_pe == 0) - fprintf(stderr, "shmem_long_finc(%s) n_pes=%d\n", argv[0],n_pes); - -/* shmalloc x on all pes (only use the one on PE 0) */ - - max_elements_bytes = (size_t) (sizeof(long) * n_pes); - x = (long *)shmalloc( max_elements_bytes ); - for(i=0; i -#include - -int main (int argc, char *argv[]) - -{ - brand_t br; - int64 seed, arg, msize, tsize, rep; - TYPE *tab; - uint64 *loc; - - mpp_init(); - - if (argc < 5) { - if (MY_GTHREAD == 0) - fprintf (stderr, "Usage:\t%s seed msg_size(B) table_size(MB) rep_cnt " - "[ms2 ts2 rc2 ..]\n", argv[0]); - goto DONE; - } - - // alloc some shared space - // (checks for valid pointer and casts) - tab = mpp_alloc (NWRDS * sizeof(uint64)); - - // pointer to local space -#if defined(__UPC__) - loc = (uint64 *)&tab[MY_GTHREAD]; - -#else - loc = &tab[0]; - -#endif - - // init all local memory - bzero ((void *)&loc[0], NWRDS * sizeof(uint64)); - - seed = atol (argv[1]); - if (MY_GTHREAD == 0) - printf ("base seed is %ld\n", seed); - seed += (uint64)MY_GTHREAD << 32; - brand_init (&br, seed); // seed uniquely per PE - - arg = 2; - while (arg < argc) { - msize = atol (argv[arg++]); - if (arg >= argc) - break; - tsize = atol (argv[arg++]) * (1L << 20); - if (arg >= argc) - break; - rep = atol (argv[arg++]); - - if (MY_GTHREAD == 0) - printf ("tsize = %ldMB msize = %5ldB\n", tsize/(1L<<20), msize); - if (msize < sizeof(long)) { - if (MY_GTHREAD == 0) - printf ("msize must be > %ld B\n", (int64)sizeof(long)); - goto DONE; - } - if (tsize > (NWRDS * sizeof(long))) { - if (MY_GTHREAD == 0) - printf ("tsize must be < %ld MiB\n", - (int64)(NWRDS * sizeof(long)) / (1uL<<20)); - goto DONE; - } - - // exits on error - do_all2all (tab, loc, &br, msize, tsize, rep, 1); - - if (MY_GTHREAD == 0) - printf ("\n"); - } - - // free up the shared memory - mpp_free (tab); - - DONE: - mpp_barrier_all(); - return 0; -} diff --git a/_deprecated_sources/Diagrams_for_Spec1.1.pptx b/_deprecated_sources/Diagrams_for_Spec1.1.pptx deleted file mode 100644 index aa93a4f43cd902b2bb74c9a26e1a3e796b1ff71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78685 zcmeEtW0Yj;vTfP6ZM&+=w!3WGRb94iTV1xTF59+kqwCe)=i;1u_ZaWI_w(GFKUU^i z>&qPDixn|rM$AZgDPRy305AXu0000&02~PehBZI{03KKX0Av6NAWb1#8z*BMCtW2s zJ7Y&}I#+8ef_xAlid+Doul4`?`X6k8@su^i00xBMtE?N`)OAkM%AwOl_nn>5xyV-l z#3pMNk~AaDi?w$CO6g)W&68nRX^8gEWTWfDbr;>UNV zjnlfGg6S}MQK9~#?G-m4m*OXu#%*3Eb zFn(9fYeU>@SOSL7^*9w1DTs1DKxyW#fPT z#@aWhLLG?k7t5q7*>HK6)fS1PPr_zoHO#E^H@J2|9@T`mjv&pGNo%U-40mTY<}C4; znBSh$2TqH|8g^ReFG>Jo`hh*{w8~#3+a4zW*_iO%C(~!Pbi<{li&6K&25qBmKFe1K zk{WxnmFVH>44TgAA@(DZB$j68@MTKw6Bz*D^Ai|A{vR-*;M|`K_6rkszd|1R3lnr5 zjIA8$>HawWFBbd{27tfYdPRJ%>@NnG;4ASCq5ZdX8-l>;S#5+_8;B%uhOjlTRT4?= zhE5*+kR-{1bdaIto1Ckus|ORl``rYCx=l(oG*SqMRqQhj(CUY|T|8j}CoqpI@m@b9 ztFp852k3`kH;Nx@Byq}GiqniC;FJlMW<5&J{B$l@_~84Vk(Dqdd^M!4RAXG2J{J6} zGbow`1U3_}p|1$HV?HyHW%iK}87fvF=zYv&^K7@7v4gJ(xtvP0M+MPP1t$BzyK zTP!Mb1xxLII5{^o=2QDHX>KGi`q5@DIl|u$Z+ryxFo}Lz?WexsOrJXBZawLbN49TV zA5K3KPf%8VuXcr>_ckRX&rtXJijn^wJ}bC)7Si>$i^n`NGBJ zl*Q}>b@(lA3ZDukW^$H(awiQM?Yo?MK;jq|{eVvLlK^X@d&XMF*XI6zx6k;mx_t{j z?BH)-PyPu60018V0`QNg|F_3(=V0vkMXdCl%x!J{WA|Tp3i!pXzP|83`&E%RBOAbg z5_~1&2|nvVnJa4u*3L-Q&cJBH%MT827T9$1P1el=Ta-X?feNUM~ZRDhqOLTX+5 zFt>fQ8*F8dJhr?|@q82NzNDr-@vWQ!pj^IL@5OR}v1xX1n|PWwdNa+k^I+$DcQc(- z+OPV_ZVh>-9mwb?njTCjO~9WO^f$R=dBn!=O#NAM5QaaAYOo0$v&I4+-!*1!JLaDHyy)-dM8@?S%H|8%UgCtx7D{ zk8umQkdF8batJE&!_2c2lP2Lh*htdIHDa0VWAGM9U|1$V)gDKkezOwc_ z3;+Pi*NQ*9@4x!pdGbc|Dg#2$74-uy&6bLlHw1}rU{V|EtfZ1)kQab06MsWA@=9Fd{Ato zf23~D_0Yf){T-P#3x>Rk8jUeUfixA9cTJN7&(uD6NuXN^wmin#LK_lVi2D_)#=Gc? zqfv?4WDF{u59$oT2Jd*D)woRMOQgmpijVC`D6&;_HQ0Hb z$|3>oWdF>f+z$~E6YaytP<+g%7a%tb^>>s(e{VXK!Oe-9x?xugVf)0$Vno3O$_YK2 zp3Z^wH#s-m)7F-7X_L;=*fQ-KF^WmNXI@J$hK3 zh7nfZ@JZP`31#cv24nm*CFeQ2H3~iQ=vkW`EA~eseMWT3$;zd+kJrXUX{cMYl9{o= zi>e$VIVLlPVkCDFt+ZH=`=9$T#!b6F?y_&pkP7UtV^!Kv5U3xtyIbD~(My~|DZ#a% zDw}xA))hONp#vlV@lxyAr;WU33tLK!)oG+CH+-#N*Q$!D5im`J1 zaW5VYVW#)Dp=*F_{MVTY5C5D5H}`DS10hwF%|2{e)`{k>5)pZ^r#tMrRFCu z008R0dE~!k!~e{K=bGA%85}5HTWKHgFju7l1iaioI3-pKx#q07?AKgC#~|A=)C6XY zTpqixk^(^n^|(l^=V<2A2JJ}*^Bku-k91BB%GZ<)*5y_D)j63j(38!lSw_+9-M=yO z`Ec?;NEc8@v=K-o&!)MFLEkOxRCjlb7mL&}ros6SweK0c#q)0t^V3}8r)MKaOR8gR=K z9ecv0HEr$Wucf zw803Rd_9dt)yR&L4yc~F5gZce@XO{*JFK9XGHYUb4oMr)Ga>Wg+dtG+7%eIbb6s*E zdTHq3nM8BxH~@VQgnb)@;3o#fi1;ny?WAo|Y|k2O)t^Bw@{RrqiOLyp6IB|}Jz*aS zCU9g07-l%Jw;8gdFim1EV9Ie$t-qqerHuQ1xGoe8)OXW0K|Wfet4gs#HhTKoI4GqV zlA|FP|8gAw%7tI$A_t4MCrM;xGkJp-Nh)*&Tut64if7{TvOmJ|C~P3e`%mA6j&4kU zgeAz09_MC$kZ-(t`>jHSjm2C9CMe~%BzYhV>Ng^8&*B7USg#*`8|hnyhO!8WBt^_3 zu|VGeECd>T5yCo{leLe6X+wn@N>-r}HZvS+kMt%z^ja`tkD=SjSI`N^e%XNXF8vxF zTzFfQJ`Y)jBKZ-}OQf3$oVJ)5+1FDKBnGrBBoIo|A?o09#~i7kuIrpdcid-o-LO5; zt74|PEYRc$?{`F0t`T%ASYwmQk!)F`P2GRXV?}7eE5ggy+tj|?wjD{m%+6CRwQPUw z*>p@P2<0Bnuoq0ioFI&dQ0jmLX*m;TBVTinlwWuHm9H zU_RKE-Ss?I)#ORJCZ$WNs{OsjS*1c+mPw6nJG^j48H`X-NoCVCBVaZPBS*74;*{z3 z8+-_n>t-K^R2?*sAE7>DtGHQh@eMof0>M*$)VnA0c4IHRJ+q82F*+zO8uo0>J>pKI zHqZA!9|c#oy7| z0OmY``@P=1sw#JoK=FI$i~I)oKUxg!V2K5TqbOpzpz%~CwOa_~J@VOcpI8jpV+pTq zX`KSt-SNF7izvk>N&M8I8cB8Apps?IDXYxxPjdLn!|c=cgP-}H4fSqLVFs^sh8$6K6n!ogl3buVg~&a*_k=|7 z5mc?SJDuXD3;h%;rQRTzf3oJRM&crW-xDo^VpHYJb{i4*bW_G6S5NPQVKxa|y;1UF zuP9+OnTw4yMmo|}D$)5_tF;fR#dH%1_gG81uJH@@TU9`;gV6GW62sPBpevnl;CvRA z{~Npw+B%GG!meal;BM7+w^GrlCd+uGl%-W1%&3_28>N(V<@dsp=z#acQ|=zQq~?Q_!AjJAHtXdmgY%YXT3o*VG4|vQ&0No4r@QKmoDQMMNuwUJz~N*%XuXv zoauh$XJGy&t}O6{!j}J zt=^iBIH|(s45LJT+BNjVefy|<%_FhD1!LMe(1uG=?Nj9}16NovQ=z&nz`HIA*#el> zb% z1ZSeAOidLN#g^1M2uN?u2rjWmh8sMk-&cEKY-+MlRCMsQz$))%`Xsx%zD*4AH_Ec{ z7uMtJIa}`)0_0WkAvF8sBhpf>^j3RVnj`$`zksEI`Jh1Imv?(XsP^roIk<+1^=tN1;+_HY=jUqpc9HL=RmcEze6$uL9tz#q@^9cUBkh@!pyl_qlqD6&vrF-Mqh- zqsHGkktx}C?P-j2{y+_g_uX8oXIHqeZ5!q&Ylo9|YWy}~YKbO0?Gpz-1dkIk8a~?k z>AuGc_Z3{M7>}1@Ao?sD2V9JNGQ(%*+0dqaE>yuj<(2&hIZoGlOGsxpaWd*kohPDk zIV8@pKlDZd_nV}8_Q0-ev$Zn%uK{iPHRoFRB1$2dRQholCE^7uw{LZA<+!BhF7ZAs zh_kR&xhaXgrR2|4A#cqH&eughkh`2)_CE0clFb|hKc&5Yv6)Byzh*OkmbK?vnzn0f zDBk!rp9IGnjlv4-1+sC4GMu@V0WB9?#B*V6>a!H2KiJN@uVPV1SK>Y6<}}Gr%sdH8 zg>Jc;V?w-NEE*#lz(?yC!iw8o`lea2z(=?vZHr%vW6+7^mg+M59g#>Gvrc1J=5({( zU&qFr;zb-`-G^2Jr61b4<;eH!(bi{3M|4OiqjuUw`jSaPn$MlNP4}TA+ad>t88UC; z18a5eP2cY2&>|Res}r`pCHA!7`pkqKV!7L)=cJ>OFPSw)&A@(zZdwv$^^E(gvmE)< z-xC)kc8BBBsdGwIr#`=a{6d}U`&N-sHDClemLC&AA8xX14KuMl;9Brji4`WT0^P*z zCPBu)Zq2%&e}n(>IUOc_Otl2`qA%}-weDqRj=kP#ZqB0u4*)qDa;rXq$yywsSAXDH zWe$+xjjaINda&*qGT1*)k*0?8(C;7_eP+0ZephFG?$OoA%VqQ&Y)GWN=h%R=Rfk|J zA1+HqId&_RPQ&`!po}?I`shpuZ_~Kdsw_RUG1^C_tx#6Esv`;XME_lm4|iNCeA*Irl5eT%+6Y ztwr%|0(CM7%NW4@YDTET{H@!8fwM#4qP~r|XhAIX8pKL4VD2)`@-jxq;2m|}@Iw** zni!C}p0h7(qvExqfg!Y@9yK<^&2zr*Vu#Oh0K)!jv^5tJ(XvRFA3K3R4LZZ^I$>Sy z7n>5}|VQi0^5zek|n(y2S-SQIgk zz^$q?Ljc3L@odj ztn@7`wE1uYO&=xc4?ZLE2cJPBFkboMGs!&t2?;Hy9WZ-=jXYkzi`A`O1e;R2Bq!UL zdVkg%xH)C_I034Xz+ECi#QAqz^RD42t%TaIv}r44#80_$p!D1wt{NwB-urWe6ORNtR|F_8Mc`sDuAbNkl9Z@~TC zKS@4RAi$AV&HF^Q??}jSJfaO>CrtLZYmmU# z>=tTMU{$knDEqcZ0hcdW8Ki`0{6E~O93zV<9?UKT^rX0u;tD?e%Nq`fK}bwTB!vv{ zrL<>U;lAjMD9UgaXbiQn&a${XSAH|oW$BPjY;aF^<20`(+D9Uxu%(Qm(vXg~wgk%f2P5V9i{f_j(E-TfGl8H3;!`Cr0#-O%xmBwaTwKOo8Pca4xDJLM^O5hO1o* z1hJMl*-=*L5##}?7d6CdQyAGoFiY`d0Gj=PGr5tRzzI#u*GF)WKCApS99wIGIYO(7 zEe;YnztS?HUZV4-;%qUuGe~`G^oEe!)F%Qy#oxd237-<_8tIT{qBM&}0jP=0KO8rs z4bPtp`0<6%B%uR2)jskNCHe8CU`84-73Ncms{nEpDsBK&?>-m;@?IZpQ+&oi(7SbC z4d!qe=g)8x#tZi)q+a{+T?sz-lL=b~7sM6oCp+Y04#8Ff@n^7O+ieU9-6_&u`J zlQWeo=&(J-9{Uc`x*s!;1I)TI5#;YpX-yS6FZx@aSnZ5bnA#7H)IJ#;RMuZ$=shzT zURSCN49qJAD-Yif{fBStxzRM~+C~UEYKdFB{kcJgJb4%)@b(d1a8L&-T%gfA@2$&!J%OI9n#fr1Nk0-PP^;G`81SZlPUfL}8|j2cdZAI5%SWSg-8NA^l@ z23*ODO$jCS)0+JEq-*@+EDI3T4e}K79>c?tRC|x6hs^V{cgJET4TcUJz$bd6~ zgjA_3UE}}Y=S`d)uKN&@G;cZp%s)ODne}bVt%8LZ9`F_M-kQ9JMV4%gmH-8#VX2+I z2pFTd&_LPFVnmX!44-_>99vGd_E6Kwu`F*2*o8>gvPF8LmNA10!qEKAHzOi6BKN?_Mr&YeBt`|tTN#F+y?f^jw$AAvmRJJ`NbTFK^Zy}=IP+9B{ktf#* z{&!8}@9jYQPuYQy;eQSBr;jlHy;AhA=@I{2WU&9sJH$U{hj0Iqc3_!koy7mbjv?^> zf|N4)j!wo7|A3T#yY!!N(Z8@^@rwWhZ2PYFQlRT@AhqcPo|OkPpf6g~1rVwGy+$}- zwRZiZkU?C}5d|n40?X6u7Vr4xe!*oQIm)_mwU*kg1U@7uhN7_$kHG~CLC?Vh8X-djTCK-k! z((W7r&z;oNu)WN5r?ex3`Zn0LcO{k zlle5(hs#-_+)~Q02aEa5W0uo)knhup@-|s{$#sey3Q%ACs7H1DGqc{(IJ6hvgM~D9adXPi^4&ss@_u+qMmkFwa9p51=C{fw`7anrUmNiwfg>hN@T zah3(z{D0?19Gi3G!5)PsZX@WJ z1_17*r{rkN+d-(^O%JGVTG5ul>0A*nmdpv8^WgN8f*x>&xtH6N=8b4H2V0zd`sK2~ z)-PX~L4n(2!QwljzK-;aTMowSBa!GEu+@s!NPyEiG-ljdRHyxh=q4zUO^*|*f$It| zuGA>uAr^(#gFQk(;?`sQ)iy1@*QLv!w_q^{5iEG#_V7Q4|XL3O^FjW2dxb@oiYg9f*si8ZD8MnXKFK9JBa!OO|GD4u!K={5z9Z{o+Y zU)mJ+d2(>2>HeaBBF-ubv1Z?-FS{Ziuy=9SbyEEc)w5{X!^-5)R8Vnw!tu16 zZezcJrh%$joLG`EgqyjsGF00rItLV^<~J{yv`vGy!pn-ogCS@0(-k(zwR!0y_tila zyZ4j3vzT7x*w;JtL(v2h`#l!fjq#iT8^#B4^?fn#RAb$&t^iepvV2y`;}6mJwJ2Va zsk7ib_G|xVLREbq>({n;5|wy=#|>*AD;KgT9jZ~u5!s|IcC|h@l~kV-=PAU)AD9xf z#L%MD{x)n6L&Q4cC(nvH+k%kO~@U~JeH6(T%Q2$W4T|KK> z&)&`nL&;3nblHAVeWDGnr^6QJop+5rA%nj3Pk3D7fEIc!vZ8~M?i$#2hRy;%x{d-k z;bRs8>Vo1tyVVba+weAy`~>?eSowQ~_s`|A|HSWqRi^vT+2QX8q5dcHJLZ2$Ui1GR z7aaeRc4*neIvo3|ktd-43EJ^z?N_1l540ox0a+?kyFZ#0Mm#~!*=0)6NjedUHD2Wc z7W7qPZSP*fSv>3{v(0zzSv0xS@r!q4{fap{ov1o2DNtmbk?uGqx<{}MEm6DUxY?|f z^f@Q|Y5!fH4vX{VQOV7==!afm)a9|Npy&UD_0)t` zH-z;$FqD^gN35~Li|k{7wiw5Ij?)ku6kd0%^5;fTfxm;{+v;|1`edIK-iuh|6kvsWT}h zE1b+zxmC(VK*OfXMu2bylNoS0It)G-^IJ0@vnynFD<3C`*7;&xw$2Wanm~IP_`q5Q zImZr=KYyVviLUC%;qOq|6`E)@a2w#zZS(IX9&4ue)||vCvT~C5iORO&y$>p}@KCHk zw=5@5CvokQercJop6vo&kPSO7HD`PpyqTRqvb5^%?8pn7B){>zFNo+`W~Dlh=8=H( z_kenK0Ph{GI5XLPx05=#Rvu*WEh2R8kR2U-;&; z%xLYnQAFKxMfG5cHn}E%dORj{*2UXpWSi(8$*-eA)T_k<~nr-Z3fFs&;goEym!TnU-n8}u)?Yri~*pZL-%k9e+^L<&T z+(s@adS9i#M{DEVlnN7vXT5rM)ZtzlUqt+@oXxG&XWO`9xAY!K+SK6Eo$C!GkZnOB zLHw%ub+bjPr2b8YM4gE+6zSrte<nXv^FMz zL=|2T1ow zpa1|2NPqnQ=I`c%|Gg>pcNNH=#cqX~rp+E3$_M>455#FR(MW!FD03)oJ4LL7KW9CF zM!uo`J(UR8BMR_%)9S&vq&q$7s>-etPK>uzSQ~f8l%s@>_ws&PlSzl{m_f-JdU91Q z5nV!qE7oZaUa@GdWn-?0V11pQkk^>S$FGIzZY>psEYfBt&8k2!3=!O!ye^ddaOwK! z6q@1(5%pT2E?UX#?|{|sBhnmRVCUS-;K>JR-(;XWv!>+Ibm`E{$8APklj;Ro2r`Y8 ze1AVMRayk8WcjPus{lu4ZYWDwQP(s{?hQp%NicQ=18Q~yjqRx?n}JT~Zxcohgfm}! zLzS|Yrk)oXonIg}h4~rraMh8n46h~IsmW(YD}zuLG(GVsL`|j(jSv8SH*ilLBwR4z zf25ki0u*DGkq76uwo5OakGKXwYXi3TVb;;XM}$pJE>) zyvPKFIu3QP7*olBZVs)H zGhZ=e7y}xscT}&vPQ49q@5Xr=7u87_3?4ITrEVNa-oTg6-#`J7ml`w|=m!P*uyGQ@ z5vji^yyup+e^FUM0(gHDqq?k2AbUa1cW>%)Mp~p?G|ztdNmZAg9EU{#S&mqgi*W15 zTpDgThBz#W-B*gAS^n(Hn$!Lbu9JB54Pny16Rzd!Mqqn{V$ovGZ>)xzYx`xtBSh$d zhf>hydH`VXKV<*;u^AkM4FGg%7C}LS{}W)EoXNp7HIjl>uLfMWVJ=|yhA_XucLy-{ z=+zVqR3X|?v3p$r#f95|2M;ME0Q0uK-_H{^5VF6$a3%i$K|-P~L>#-eb+WKE{6-m? zV^vxUTtj4z`jNIth{zAL@~65m;fEY^oRwWgKu3hoxongHxW(L#G+ZrLW*`CWW*Uxx z%WNY!9Hd84ESwHJ%xv$OA3vun&$SqMHTdiCcIO0MtT+}++{U6v(ZUNC4hd{)Zz&g7 zrlT`sl|eo>m0C!cIKFgZs4BM+y9~n15e1^e@9%F6jZf#(L7s731E85A*W5SFKEPhC zOmMJAt3P0O5vL$385xU+$KY|tYQglMm2I0BAycVlGiBz;Il9)X1EZC_B{{%~Y*&r0 zoYe4(AJ=fWQRB_kcY_~mc!sstr}YOFp>^b4#r#C(bJewP@yD~eVACM2dJYt9Hl(S_caPhi-~b*PVh10P~x9~ z2|*lwDKhQ!W6ts6uZJ=WVat#kzqnQM7q|Mq0qURCMup0iLk0)Jr#G_~IP6mz0GQRU z{!0)88yhkirXQ~W;Rt>z1hVm^8?vUa8l6KY3G0<A&@5j*sZSLpO4qecIm}j;fnk zg>X^pb|?C7C$*qwg0DL)@X!|9+sCst#i`c!Q*VOlDsYn)&koA@CfC&J-l49ZMG1S% zj3UuhN|ms=qDe?AYq|Gmt+zFMMWRqU!okVWpNYR3I%zGJ^QHC+Y60CG{W<6&BFCiU z8R=|g;E0L(pf_W676+k=c>aq}RDgr7e6SK18pFw3-OaI#NVpyDi%7R*mdOQROEq?? zl%j|=0g9Ux{7hhVoydt6b471b4QG!k7~N-=D!Eik90A=2e~_xXRbNbQj;VEgQ4$VcJFofQ{BKgavspBOlGDA)t z+)YE3PD-#PYFS?KdAs57#aqQMy1w$cUiLU zc$X%KL(*l9tBe*9el_+m+jfAjn2S*|*l!zHSnVp51sGU91ah?BRpQ{q?S=0o^Vrp> zsA3_(yn%hW!JSc1OnnPwydyxp-(b{_LJXHN{qcwchqC*&kWXTS;Wh$oFv%MBX+j9d zhGxEqC<^f%xgH9Xui6k^DObGyMpLlfOW;nnh!CmPAgv4*J;iA{65J<60j@E44|b6* zfRC!muAP(a(hcY_<`#r99**a=;&a(@1e~P9>?YjcW>oN|#j5*$uRb)8LJq|nWm=}asas29 z<7y@fhILVWTGjaC4)$fr2g{BPI~f^Glx60h$#{K6rd)HNUc$4dW&*g=vx<7iuGi~e z1@+z&)f6yju9P!`Zc~PxFRVW$=v|t|o$)+Y%%`yTI%g(wPkn6;*^cu6&)7P1sndaexm@{>Ye=MLwbUgT{LRbv8 zb>HcC1PHke8f9BH}?6LB#OYKr6}vGjSGVK ze~n)|E!M zB{Su^LW&t^70OAw<4p~zTD^g`x&a3Rktr%dmZ`3Skd}kx@h7UNODQbiVrpm9*w3rm^fdY3G^xvv z$s;zbYF#-9G-=4d3$^P336^c3l$tw5_|lOv9Nop9HOt)zK(BK1Da$tHj7D{{x!kcJiyzmNY_07fLEiAA49NR)X3^2~}5{bE{ z6?eZP2*5jb;A{_(vrLXc&;{UJN8qm5V5Z<1@^JvfJbdQ}7R>FveGv};I5q*{{85;m zXoN5n;CvH!dLSXESdI|BZfpRGHkhV6g*pIaUI0cH2 zLbV>JqrgRZ0q4|`Cizp^CXY8Yl9{|Cj3}g^#F@!fI`d>$s%{#(lVGfCS!hGezqG7u zrNLcY^07vV?bcb^9<3$pEI}I*>}_v$4oyEU&xi^H&F8H!_IoT-$f-#E?OVL$axcOi z{SVBR4>JSVv$$nf;U~Gpk2-JfJ#_6Jp7z`bWzEZH7V*YfIhUFOLsb$o*w>Su)K~m3!LY zA7bSh!#^tsUPKFM;08~IF<*>MW7lZxZHnyor3+$XZzwu3LlWo#Ivyl+#EaUGw?^|a zLPqd8uiK~!kNdT>QSzPNR5q;#Ovy9>gP5J}y4XFDrj=OmhQh` z+rMjpe-?;;rvjd9d|}%#qBndj*VlwXPuw#-6fr$bR3l~&mt{pKxLF)+1fvMkMDo(+ z0FYzIIzhAeZIf79f|c?Qc9E4?;oyTF4Gad7x_0&Rs;hF{vk!KcvA(v0{E>18qxP%U zrh&1B(c4>hqfb}XA7D)j;wmN;C6c^#S8j$rj<-jAoz)>Sab81MBSD}{qb9?mkAkD_ z%V(@7{`Bg1Rb_6Fj(3tYX@Q#d8)G1EkVf+-5}!`2zirND!~?=%{bkBBsZSyT8*7% zy8+@TQK*fgE5`wb7g3{p{ZFqaA9q9z)G z?7iG5KlH^vv6@Nbt98oC^i7UBdkMX=X4o_$1v17)EA0&k?8CD?Fkg3&^tsK)pMiPf z+t|@t3N)JSH+N`gxH8s(%8?@aZDg}6(y~fHcs0hkQ(O%yJICmaZ(}onM+6+9Cq1t; zg~u2(*CDe*Y;VNdm=!mXwlUX7VX8}0<>GMnj-u>Go-0AEN@FQb(A!HZ*J?!))X6 zlUPW^SBaC**F%#n!^4wUqQ==o$^v{7Dco?n)#M~hX}7vX$UUlqL^ZOU^M)(c(t}5e zoVTp72~ZX|4wBgK_EsUJ%@!u9;V5q*6`j4wk)WB!yD3{CK#PquE9V`j9x>$h8%yD? z937{6rlo&Gki+rte=ZlHdrXlva`nGAZ$xsaeL4gl80_3hJ-n-&C5*(GF9bH6#ZO&_ zK`4wpN_Qgbjrf4UOGb6HUIifzf`lQHi$ssZ@7n^Nd(_&p1rEj!szUGb9@`8>H!35e zk`HX5)nYML(F%B?x562F#`)kVn-h5oHk47`Utyt#YU_2f%>o68`e$|iVK9{(IsfftBBHdm1ZO19Hu)Un%JY->keUcA}ZRw#8 zj+-~{Eva~2!V<;VSim`>uKl@pchcu4YSgwTNN*kb%huji<(@Zt`jE!ZX|?`_GKSL2 z;BR%iN2~ofNFahY_|#tCk9{4!`8F4g_M=?J#tBA+ z41gULQOCuc>kjUb+>!;hCpT!+h^8ow#P4 zyMV*+oX=M~EGg{ zZnFbX6cvZI%cY_@UFh3Gm$w68?`~wuZpYgGXa`f~>;|s70;^Ta5;O@>F^z5la=0Mg zKFCfiUsOuTk=n&ToQLU0QCvjC48&`quzvtc0o-k6se|hC9rzFmUhJdD(OI{0e@L1b z(EC@UJnwd^0L*)sKZwN<;iGc@kTg4vb7fGWO{Ypq0@sp%l}0P4+(s+f{an?;jmMG3 zv{t){$9$G0p`*=`XbekzUI;?NMipuJ7x#Ch-JY)cIXSGlIGEKq^0^Gmf}q(-XFRQo z*a4V%0`fyC&o9Mge#k5qZ9Xtp^B#fIb{>*u&>Wh32Q@=m@YMo~U$ATu()8#+4d4zy z)rv6r6^)|S*Bj!Vl3v9aDhg}kvV4xQ>7m9rNvDvr^(V2wEtH|VbJHtGr{ZWOmk!1% z7r|37^m+YdhFAas%Em;Kc|qdrWL`O2-Dlf-`*(2=KqkdUJ%47_I5v2)Suk?vgY^uJ zAa61!alBI3k^YzAM_~HifCJJNbNM7gFloq}*;jDovg|Qnm?G3f{L~j})~xVMR7uSG z1*6`;q`sly-?uNi77f5jk_0+HWe(^{KkI?ZW?!h3`d#6r*g(Z#>~f_ncdo$*6Lq(L z{1ACM-FZGD=IH2^QlA9e;fHAezFo3QWpeZKd&6zE>Bs_4{pE8y6TS)GwI$v zr=?P72+FzLoFsVz*$ArP845f1Klr&)nKD#SjTXUufUev|t7v!we-|B)e_>Tn#Pn~3J>oi98&ZEJh!L^ua;;YHO z4G^(!qnKu$88%{y#?Hu%z6x1L^LBOs5Uzq@mksy(FUYx?w5|eSU(Zslr1&*EM)k3b zVGPPQ^0C-?Z?Qp5oFn1Y$+9|4t++7Kn81nG=~-a73cMjg^vJ#S@Pos@Ck*LGL4KFx z5eNng1#2mWn;fn&P6s)%q3kSgHL~1Fim>ySk5P2eNu6L4l}2xHzJg;T>M(QHQXeQ$ zK$u5E96xG}{vdj{e#wiWQ6Gub=1G4s45FT(lSzA$_>)i+1RFLH$ulsizXIRw>??y9 zADRUbM?l^r*AF&Cx7Qi@q~3Zh%q#VR78WOnna&>Z)ug68w&%t`WiZ zVNf7k5^uK!s0K=5j93#qJ=r0nTYJ;2AEWLd4Z_*fgq*$BN>M~Z)4LTxZ=;s^@jJWz z0`35|<(KgGaD_AqVPD;Q=m6|{L%Ts5hO_nbWrus;Tf1QWYJxkvf_rp;JU)AS$aH|z z{mQ`Ej_P~1e#G{(a@hq&%bW5PjFGW%X|Zh1o&r41okPiW>jBJmoCN>)=F^MfV>fvw z^x!e|BJH>8OGBHcc7NpMQGtlKxRW2#8m%QY$I^bBCOI{CU%Hwz@EQ_*1{9gq@|1G} z`nY{UQu}_#(BMxITG5{dvS@YQA9nQ|okEf`5glw|r+fgKbMQnxQmr~#NX12ln~l3> zQv=U=J~x~4Q%651UR@dSfQv-8S1PtTDBfDdTbB_M+RNZ~K-fo4e}|QDJ};4@JcW%` zWq7-o{Y>DeM+9n$ZizP&OZvS(TbI#9TLKA8{#}n`-^zS?uz-KHy@3pP7atthZyNh` z?FqJhH%O8u`PP}@^sp#6kRKx6j&SF#;$}aqv%8In1taBn8C$mSQ8by zxc?6f!7CW8AsLp5rRDpeVlim+W9RBCTEQ;UhX)PYUe{^5f4W>BY|UT&F(fXMf4p%gn8@Tj%5fx8C3|H z%4p;anVjPmSNJRw-Pp@z*RyM6-7lb!=!XDC^+{NL{_Kn0>lyu!43)aQfQn}o!f=VP zq-q5qza)a8GoP|VC032f#$EXuAFh#|0U))XBUI55vPy2c zQjMMC)J*6SRDY^!T`OXug?#6;HcP^xMk;Pfgr(o8pwzK5r_NJ;Kw1uK&vx(HvbQN| zoYObdg%d^zKgb4d`yPGj4|KM;L^{;bwSjki)*Nl?-oyGEv<6dn0NBM4|LTmz{G-GB zif`;c4NyQW%QYzcD$%(=i4-P!Wv#s}b-Y_^`WhxQJeh@XFEo@wEOoJXX>@>!gJ~LZ zZVi6Ib_ac$#1%@Hg=u{C%K;lDp!#;;r>8=rEi~G5$PpHjuoxu?PPuO9PePMk&8 zMM|f|h)_|*G208#++fZr>}1K~7YA4o_veC*tnnpwjO14>AYy2P=#eosh}z8rmm>F_ z2Gs#2?{&n=-=S9cm*@Q;0q+l>mX*Xab@j zptMNuAYGB7ROuZAqyz+{CmO2Y5408Xbbj_ zm)gry@WSg4t~a5ch5X!$`;jv2w?zAK@Zesq=apJIH+aVdVFEr^_Wz)V5`- zzzGgJdiL?Gt_>$mGX6c+K`;u6s``YS&oNeD$bC#mlbr#7P>|K1(DWe;4@b+$zRX zMkTyuqH<3^AXi$v%+Qp{cP*{Jr7FTAj+2#|v~b_`S)D1pp@@h*E&tE{s-amFg*a?6 zQC9IIS+z2B;89lo!Toprq2~wGdT|zak60o5gS5E+-}=?Je>raebHC`jB|` z)_`^XUNVH|4bcK%VhOZLf}A@$giOW~iP67K^Gpt33C~tr5VO8<@Jq|dD_G7J6|-C$ z^d3ueX06L}2RMt}8TMsdVjoVIC#b|5-#4x_wH>{4B+0fCZ-3khFN>R(S(%~~+RCyHr7idq}seL}RJ^*vH=fg$~$>wC&o zCBt)WyexWg>Tiw+zATQu%RkVJhqL;|5pSL4Tuh81jv8LnD;#vJIe!~cZ7>^GNc|W|c4)3sxvSxPskbARlQ+$fe z3XGA(S+Yf2rp@iGB@G*YW-MP%UtE{q+xbbb%=6qO!?{A{P!)|f>zsSSrpNL}nNPz%c zwEQ%&QOh*vE>3_Y;Z0Qnla5oU3Gi7W(#b9-uJ}CzU~aPKCRN(SVM+xQJ>M5PbR>TL zcDgoyJI*VIjultLD$RXF&aF}e;ey01MQTjOb5nIBbRhBj@EeZE#6i(s9Q#kjhTRH_{*8_$$toNLHu>D^GQ^G<2psbW9(r?tJKfR$AS5WR?73v+vFv z+4?w(n`4%j++>BxX0cb}+FQjpjA`F8YL?1%nizu*pVS z-5QOK?#a^ET4}15T`apUF5)V?E~j>S$;%^U{BKqeJ28%*GL&~+E?p~{Jz8tOlZA76 zJXE7|=4ZQ3ek}hIw%K&gCGru~{L)&!Ns|#jLNLL9Iz8k|=k8}i^2@Egi*If&+~41t zJIQe1%+B2xy3Ad=b)a$og|)q^{L`-&_=mxR!hsj>>wY$Qwd9+sE_JEF<{1CPr)b)B z+kwjOyPs&k3(5vhaq_f3-9-fVoMJJZ67HLmj+0{>P~1|77jN~bK;z!j#@xz2zRjo?kuOqki8<51D{C#h-EP*Nu&m)JA01sZ;1%Zn zGg^4qvSflmP4;tLsm|_N61aozU=iHNU*vtRq~_t=V^5neu1&91WEj)0VVT2UdBiqn zT&Vh9j<(f!>~#UBX1{*9RD~yuOL%$p;wf88cgT|QrV1%ho&fdqcI=nXx9^isWZSxz zxVPF{X4@$sE^8sN*CbUral`85o6XBFcr|Qk*eoxXzN+bTqjiw}@Q7e)*e^$Z{JK`> zj`L9XhI0PNBMu8$Z$D!P^w7m`yZSxwMag$4(|K-2!4>`zuWim`&?GvI}ZN?uO<}9+F zB5dvi&!z?Qq1G+KYK&JjFmJi|Lj^KZBkIt#7q=Gt7WLJ#nU@qEJQ;pln>VTQwkgC< z%BOeLr=E-VDe!cSufM+ff*k7+-La~+gIl+{?A%0+qnHteQ}0Z{Lp-%or$W(}oV;2Z zW}pqN&|*{O496#~mR-7Znde%L&X2EYtWxPV(&$PQQnd$A_~RyY?z-@_{1kNzV!dos z9oqRdg*vF>zQX*6&`1}T(A2j!gWHw{&YB2~ z(nT)@jg+$<>*Zbd?JvC8HWw)KHBG}B(AR0o(v+#8ezWL`UgS|b-dMZFnI`bG;izt! z`2(|vK#$1T&r`bdsjy1z1Rgr(ic(#M4`OG|}X-kY*Y?Ln|YjV~e*aS-~)q>?o|qc|q< zf@kk@Fz3awr{gN*3cI`Vm`&feynKUx$@dP=T69bKT*ZA|-NClphJb7x?_)OaJ_5fg zhd#7;&LzimN$IxdMWS*>o1xiSN3+iCa1CFQiGx`?*!e;$C*_upPwVLHj_(P2galIp z9$EU;ejTu#D}{`E@@o07c^FfNmz}G?=BILooDfYwr8=-ts(A83656#4IfsYkY!OdC zJG}mJ!(e=WW;B>CtW(UU(k4kafg4ihyH06Aa&JskRC-{T)AliZIi zY?;8u=LjxT{&$V<_tDj26F2v%^GqbjUH|j-v!#%QR*kqbdJA?}#*gX*0VauTSvA>O z+KH~`23*`aRZN`8*@KBp!9Wm#CdOac3N;m}E zPPQo72(N^M|NVi1rW&9}TEi>6Uay_g+QU3}s!uPN6JbF%PfMTV=1K4Bg?H@UBj z-LATYZ7c0BLa(LZ+noz!+2v>akDnOLVJ1>tnti0e1atKHxga{=1~(=|bI|p6G81`) zwOtBKSMRX3a0p$4(K9$3gfR6JzghLLiKQ|h)nnHzkB9Gk?Y!vm=9%qJS}kwKy_;0V zCJG{DV^&vXY8fV}a*oi1DL!HiyR#ff>!;*w%SIz;EEb!5baP-g>%#luciuitgE5>s zA_GZ|-12JYLa$NTvmSdV)2aH;=bnv}8QQ~@qWQ`kNda;Z^AeIA?3mivG=7+0XcU?MfV+w<`?O?v8!f zsPMc@(4cWlnBZz0mrmm^+`UDAQuamG-H{lP{2_#2a5ZpMKgdS0w9TM8Hb0zh2Bei&c+4?QU8%Zlo}3UHyfEzR8g{ghR@^AAG7cBRToS`-2A&MDX!A>- ziDR~6py6}ik8dnLp7~t5NRP8hXqUFgiJsESEgSI&MI6+=9B^dwOl@Gzh81n6cGh(N zr*+4jfW!gbL@7qg=V8x=Q;)rDvb}FoGEpew%8{oqkUvd06RAr(Sur6vT>Y3my6i3$ zui3i*xlSYFxFeil#q6ISrOTCHxo)U+nLW2OH`Opw#;j@E*-*{1de?pTvq7SEVPf<9 zNr>f}1B)X}0>w`^Vv{3V*DlMJ%4jihUR`UXdNK7?|J#jwb)4s5obk(}_q~ubDN-7m z1BvQ@$TtB7^)j9q+rr`D)!P?e89l4DRJe1*%EMy&qlPH8TFyaCVCS@UyjGfMaP^g# z{m^V@uU=G_01s3$#rbM&qGtnePv>nG*QFZ&yKEgb*XdM_#wC9FwpATr6T`bC!MR4I zqcoIx5r4Gfm7K--V#HE{nPpY8M2`<|Wq~bW#f*+~WA)n2mjQw)nPz zo|*jCl``)&rh}C;3)2%O*HXWzKhR;BE-S*6GWGcUtlT$v=;X6y*=udnn>#f6Dd#pf z&19pyNtyG5ilDD3P`GmukVR&P_`@4Rd~EJn|RaS64ONe5&g&KF*?wRBa;NBi;oi z+#2nxHO(}x&%gfRE$5G^_Q7j3m&wIn1_N%HP$_)sLoeQHoFnpozrqp|_G-mCD1GIi z)I$R|pwL0B62UiB9t3VHb#f%J8*^A(?U-1I8z$u3;mGYi_Pz25DG9t4?vI&+9eDVw_NZ^rFs zFLtCa)U{lNtNCg`uV5HHc{LZ*9od(5E4z0W+qSFqN;GxURYvBdsd=wjv`M*Gmt!0NneKT?Z}DqH=#BL=JZ@c=G8C zChM8{_3X`q&6QQiKMrsH_ZL@xTg?Cbp#T5t=U5p)nH)Z+0Un?Cb=(C2aQM#!`rP-h zzvJ!U=_BjwW= zbpP|gjs5Yt{9);T4*yT=|MH6wyoSLZ0I0wzBj9o0$KDNu;Q&DEYVYao3jjxdfc}^K zeLX>#4zxA`?A{=OAbkE1cKidraR}f012+GSV{CXG#5tsu#oo#8J_sW~SnA%t`8)m_ z{09vn2AGbfgS&$_%wFhF7NBGwz+4@E2mJB+Z-V~~^M3}qx%z=T|9%9(H0En?@ik0{VaT^u2cIe-?z-{aj40g0KVt969;GTf^iJ{3EJ?PR3>+ z%nAD6hxuw5|LGs-eos#ygu%E+GF?1$4%0cr`D*WT9hBwaXE%<_I5}t?mN7^VHE`eI z#!V2G0$~9szgvH%Pp$3q(CE~PSSWge*(kS|R8~+)X#_|D7 zL+ej`gs1E8x(L!nlkM$ict{(VKFxrg_f1U@2GgP0c5pX2lp6@sp1N;$<50HX)=gS< zz?8}kZ~#1jd*It1a0f_$5MT&s0@py-6YvH@9sn@F74&fcLmfaL7!@<%0{Zlw-}B?=H_nfq&p4lbe(gW<_&de_kP>w~bv1PZ^+)PD>K;Id z`ZM(x>L%)T>N4t2f2H})W&cMif0g}jeh>W)xjig}f93b@vUUJmS+240vIw)>U=d^y zWx4$qmJkaU%LNv2%>fMI{j1zu{|^5TUSNO)D64--^`G-PYymL91f&E8_=C9Kpi~bf z><$Egss4LA`IAx_0h$XmTK}ciUOKGH|DxjP&7(JtUIm1XN*uj>^ukf?L-=1U@2D6U zb{Tx%{EPZOTFze>|G|O7zhQw=`70gi-?i?rt{%pI2-58e((T~u00(sk09^O*4Dg0I zI{6C8ojDo@2LL;1D`<* zfHDPKKO8;$UpN?`6*ct{8fscv8c+~a!C*LeLW%a|=?hnnvKiRXo$+Fqd;BWn znDDjoFC2!07?F$jyr0lBaB`jE<`F$Bc1~PEUO`dm(q-lAH*RWZ-qO-GGBzhbpgKZB zLrp_>$QRWS|3k)4(9oW~aP;I=13Eh|wli{%kFj5Sl~MkMUihLRhU1?1AOoj}JX#cc z$l7nt{?{0L@_)qHUyS|D*CfD14OYq%)F%K4Kqj99-W_?w01g5EcOB{_6sIm$5=zP> zUPP-=&pTnDkBJb>c6UeMY}l_7$d`lk>ILa5_*sHtu!^Y-Qg5U>O{K*LX8Pc(voaUX zb#U5dT4E+8!~O07)5S07Z6=K~xh9(2QLPKhPx7MMbodJ9R!I73It=eWtSg8`nTTy5 zC-dhEyqmdl7y7y3@X)BTw1EtLxuRz+cfM$Hsh$Ny&aqhj17l~tKdl)&fMQ-EXrxbO}Bg(inDKnes{x=dP|WO1)yifC+?HGb4l?$A8StLjRnAiL^C!p*bG(&)eVxN7jCc3 zuA#=yqW%V{>T;s!{CNtn{_CPZl*tG4XCqO3n+s_l2DNz7|+JS+9bb{|+zGNg>d6 zVHyji5W?=#RYmsMtLip=NjNnF3V=R6awDna2W>*G7{p;cMhq?3D#?o1P@f`PM`(|+gw9)~`4|ywUttae@!Gx< z6yQCgjLCU^xcSbpsuZK_**7`EA#DXpL=m1hal7@OSSvVu5Ni6x+dnQ#3l`fgTvPA5 zj3P*7ZEQuh1X&MdnMV?wc9dr(lQz$J55^P{4AaeQQSX=fz)el<^+h_9Ix-Xh7Tu6U zP(wN<88sXuhlM5Hh$}$>Y^XV{n!E==Wca8 zm){4;t8ZdjI|GtOJGg9|~cCgEvbak_N3}ZHxJXw6exY)stDRV;3pF-Te@rv9{W0 z@1`@SkoMF2XS&z@XR+#|_1zu4s0kbE`2_vqDUnX`;6Dhv5VblKTT20)T6Pw47b22s ztcMCV?vg?ojlgOqzGwmi3FH1vSk8u|o!}UIL(-k1r|* z!G$$VJ8T$}ArPY7Xl!`Bj!zl5jKBQlGdy`{fk2ZNR*iN;Us9cBm?H43b-w7Cn2Fuk zfCevkR1+kMQk(O}q~q^bHI|3R(5}D#maywD=tdq4UvAfJIU(!%F%JUcT6dacOhhcI z=6d3|dUpcTo9l}pu!xo>_ndX47c_~HCGZ4JKk>qkLz+C2RU>l{Y*>M0#CbY(Xbk~tp9DW%1n4kd{HiMT{d}XS1mNa zjI<D^gMN_y+C zd;Wtf-|2Kmb_XN*<~z9UR*hTSIJf?(+l_AT$YUckobO{R0|c)1 ziOWFoH#&pA>)yWJz+}H1qwnG>zZE;qtUoF1$l)9{VYpPJqK_I0Ffr?;0F2yC4dJ28 zl6S|YGS;^uVhNmYo~QTjbk3yUsxQOZv5TU3>G{r(DbytE0z1+LGxqkKSUluO7J*|4 zMS8W2j~ge8ADt>$MNPz$>a?gQQ5(UUUu&NFHNBLYPyPWGylcYtyz@PUmU~dSf(^Iu zH0%q!bI4%OC78ncijQ$ZPLFD#2a3$GWaID;- zRtP;j4qEGodxReqoKjWDg$Jvq>3sR=T3QA6)hMOb#J89r*YRq|dS~OTYPv%a(#6?U zw^;qYpd+UbM<>`i_GLdt7DSHIo9q;(kCW2F)yg(kR?ZQW%~BQ-EnWBb%aWJK zIDu2a7mSl6!z)Qdw{X)|{R#3mk`b36P1{o(M`Rv%Ah?6g%qMmuoo9%s+Nk#lEl*%S z@W*MU%&W-av&=i@nQyOngU#CJtHYD4Mb1xn%@IFuAL)xblty&I_C4o&eqXe92>LGM zewA^=H|LP?J>M!XoNt*}Xa05~*u$ZXl=d)~mX&Cor1%LknKLK%Oi2G;f`a~}NtKym zr0nN3TaTLMg}sh^@&r2VV$0L7Sf$V`0$&|S#M^llDZDhX?8K_3c0562pZM)8Pfg*O zs__1Z&r&O;P`vi-a68{mN=Ajv0ww~rT$?5{Q$1% zQ}(a$${fc{p@17uwH?0M*_Pp!l{Y5Vg{TVBFV`fQGa=o331$s4fejD7O@sipx*!Ds zq<6y`Gh9Q&3la4`*=@Lsxk&p>EXRv}Mryj}3bN}@NqL11W6K0Hvk5oW$?;B3e*CWID-P?K}ZF#Kw@~TNa`v>)r|URPtDvE?9J>qH7F>AJI`U|BiPG0vY(v9T8(81Q9(%z3 zdexhyW%cCnMP}sY?Om1fU}rzbhMO&Ikn9GlA`7wTQjyWct`$|5n>0It93NL5-rTyX zj1T9&R((@H%}$)~U_p;qWuojIns&}AR<5g{MHcK9eJ;ma*f=AqcKD2!MtS(Ud<*JQ z%Qy^%v`u)H3YRbSRvW?y!L{M;^)47>OEL#4TGbJ)lBVC>cp^d7D#P0R8@}t?loiZu zLmXvTIp#Y5X@qmS#Lpyg=4ZW<*(;HZ=?753HHdM~+C8-}R*ueyR`S9Lt+8g~<%C;E zW<3^zSS2;t088zYW0MCcvx6}kjqutw^v9oe6d?FoX3q0)i9E>srCxEJq{N*0&D12T z^sAUIkBE?Cq<6&Yn5b3=J3+;n{WS+g zMqE9L=W3IkcFjFR!{%ocD-$OK7G>0;+vczzS$HqzCCpW<-}gc29W8#(%FSS&%t#m3 zYUFqBo)^5(cy*{iB2u3zU*k?%;WhUQaoe7ZTu=M3+Qr^v7B@F#s z5g7(XCE?BJRlT%Z8Yy0-YnQsXo@M5UkZa2l)nEVPsCs|jh%A>Gpx%$(+80tR!j;t^ z+sr6{C<|u)Xv@azw(QOlW7GQ9{;?(58q}`v6mnZn^R_=pn8j6o?MCn=S zg^fT)L3-yvhVQEn1;j9ZxrtN&wu#7L+45zQPa1>7Jsc(ayJW8@+6uq&So(ljT&ksk z(o0u2KyQtLH$TwZ&a5P%-0>~NE0}3Kq&eyAmJVhwY^Q}U_PuqJ$*}XcTeu8%w@UTp)k8!r`+$XB{X0XxQ7Gz_I@?bL&LM(W zjie$crF8MpUsH^N+%|A4J#``A;1kZciB#;4;0>}PSpEzFh7tCeR(KuVpTH&dcZQm(%?x%_uL%;)jv^~}sqBIg!s0H4Ctx@+=*10Oc6gbKNVwYV z?mdR4vpUIoeR-8Q(-z3=>_(m05)SF%X3{Tw2_+&&0cMp|CmO972@u%E<#NV7$ah>5 zYZZYPb;ay?;BqsvN~vY*1qBe;m3@X{1N(0M$=H?|sv!h3dh5j)*PUUCFe{U4-|KQ}iNa8BSh3!j0(sZ}9JP;OnE@QPP z@#y&`4A>hGW#g@fiLkl%EY#QVH^CZq60;S7kStrBt>tRz=Wv>#!FV*6$hPvB^hKd> zgqvcxB4k63uLzzZOTw$onw15>0Wm$_q~N0vMLYrR7`ZiU_`VkF)}Drb{bKk_9Pw)T z*k@&u>}N<#Zsok1PY0A4;^q;WejaatHJcBAj_{f*3RdjD@=-^S#RlKsEI1*^R4+K6 z25klhjPh#Go0zRH$S|_h;1C69;qeH!B6C7wRV}b|#zP8lRSEeLIQ8rJmf6~yNfEwH zVKWd?eUoE1lFix@9zp@EFuyoM*fF&+)w+^qV~uC<_l8Xe5Nf$_{gxT=K`B+;`K{v! zoRN)g_w75_UaVws7`%6@nY$@@ONo3rGyaRsR_A9^T6l-D`Cn zpTaizZF(BNXP7+WMu$F|l>yK7V6vE0=s7vF@(TZC?Z(qD2YE4m-!^vn-FI5|_AcIp zQ|)ne&?91>%yKyr^a>n)5HDcYn_LIELaJRVnXbQjyrQ3rfb#-WPk;a*^6yQiKRvm)wSRhk?oq+F{H^?8m3W5YhW?l+l zTKdWMd()3sITXM_K$rrUyfJEzB_^04*HIZ1pos74E&F*Ceq`DR3VjRyM83JT?*z_bE5rQw+Hk|MB0>6Otx@t01rRRq zqX3|Z!YfvX0@UwM;Vq#VKaf2KmLTar4EUwV<79%GRV|^(0Xgpj8yO;Ht21^Gt|3lg zW1GdWe2vFFIF!PcYp^$XTwIiRXu-}EVUYo^)g5)Kavb^9pkiKEF(NN%u~CIOkp}%z zm%73q8$%Rd&_8DF5^{WuXf&>VdAR8=mo5)ykN+Z>8DfRY zTEQYX=~PsrUw9ood(tU{Lx)bCV_*(b^vIVi4)zW~Ht@=3bvcZB9^nS!R?`4DCWy7d z7ogk6o2u)z3J}UwSlO1QNI_PQ`pa{j)kv=XTv%Xi*k*``4e<`%ZvieJfzU+HMo$Vn zT>x`}ybvAwH7(Z)Dx{}KI|}f;kpurKhj_i7RHLp2f7v!aOS3j}dce=^x_OEY_Uz-i zCT@f|))Fq@a+zr7m-P)EWK)Yrv4&UY3k^DG`Ia%PT$sA*UQ@?s%MW0@C;&|!Rx`Zp z>}ZHU$T&EF;V)bb+-nx!B{ZDu(&gXn6-I}Yq2+_EtZHIyN9xt)ArWM;VP9#Tju07a zQ-tb8WC1*Wq5a*AdS!fbI{#?B#a!$OAV?#Da13Ge9(y!&-lc5HY@sx-=x0r`Kzfpr ztq?v^UZZ*31W#WCPwe8C*_xl;e1gHhfIi_G*iW8`EwjlMT#R~q6Vh!@#g&kHVEF$+0Yh4qj2g|OQq#fW2#PEqTz8Q zp1g=t9FjrE2H9oc=T-Wd5jT*LwMvHYA(u#^<2?P@>X%c*Ye7-mNc6=aJ9GDVy{a+9 z{;$h^Hu{DG?!S5;IQdC>vUGfgU~Z!({Ly8&6PVJJ`6!LSMh^JY+>a$){TuMzrenk_ zNWP{B_i9G-`pe9TY4h*W)kb`$#oE$2YcQJ)nRuw~kSb&D%oLv4PoK&89p4hzrO@P) z-uMNZ_CrVfWS=L62$c`3`oWG?LZamh@^r1{9ctTDpnUiWUT%ckfix=8uNB|1koP=@ zS!Vb)hTv?F7g|-qLX*t>Ss~;!1^5DXCJx}JkIbe|4bLausKZp*vfz>EbHB>)Iwhr# z>hK=fL&AM0`2+DfcG7iDIFv_a+|t#|3G=ob7*3oy5tY|w=io-;75IOwIMiA` zvo7J;zIX?W*9tg3BZ5`OX(Y)#OMT-^Z~fZt&e^G;v;NbvDKcU*svU%mByRHFb39~5 zk^->ek!?v|Nd1f3<%6LVz^?^?{G3J9kHvd|DyxY&SVlid4Mg93~em5$fS z?u)>X6Pgj=&j;*Sa11VL0wsw3M6Pxm57vZU3jVJu>1b2le!O20Mt0wV9&fk**>==&BJNsL2 zKsPDC_PJPnT-jdd<_39d0*X(1xatrxn68A?i=zO{jeKxfTMv2{BnLvbVC5hw>Rn|m zco(YLTtDMarN%SZ8;!g#ere^k%%|Dh9j;f&T2&4$*)0vLYg>*`|AO?(p8WQmXzTa9 z)gX+EIjm@1!rrAT70Xv>lyxmle5`my+*YFcCarerQVx&p;OJs%#wnfMepWf_+Vic; z7Ns7~$V1H-vV}hPb*Ti4p_YY8DO)AhN1s~+CG-?>lF*B`rAizcG1?|xNYlJ0xDnXA zvuSvw3xpLxhn^NR!3sWC7elxX$=k5%HjE*z&P%)C^1%YhSW$kElxx`?ROrG}GK4T0 z_H~oguc&_F(!GX~>1yse_9Nlh@%AZ%-?QBH#@ZBZ-N`lO-uQSA{fC!Ec^e0xn@tG5 z(@`p;ne2q0NxO8Gv`IA=kbm{;Zc)Tn36r>JBX>XNKHam6N<|l4>m@NLqd{3!ojjs7 zzBULwt=^@kV=(Rpap|9Aa1+)aUL16-*WuqFXQED}4|Rd#fdbe8CVkaBOIcwzH}BKB z+4;WCxrLx$4~0)ZcZ%n?@J{AxfZE>4!GT6GQF6DIPJRE0n`pAeWJ}!L9Ix+as-A5B zEO$O<*IXJKkcZsocNEN3DcK^)HC31EyCyyHchP5spIA*p5r0<=P31geLkNwRmwb{kA704|@DEmScqpC&QpvY}~E|F%(TBW$dzZzd=z(rWQm zmZKOjY_9D_0UDM{YF(tZE`16@4)~0|PxOe4b`S@TZ)dSDibKF0MG~e!tfEh%<6H7) z@wz!}OtBe=+h75{b6zc;45>g>$+kn;YSMhE&VP@g>u6NOLZA6T#WB4OW$+-A;nE{- zN{g3bCb)wwM5d)4!t`<)x?&Z3T)ed>btdkWE4<&8+FdNs&K4MoS{-u`@6_aON#%%c zQA}`EI*4!H_pi;vW$b=Wk?8hOg~-+6KBzwAspnnFGnLaq-6Z!ns*g9GLC9B*BFqmE zGtvX~S_?=jeD2Pz>bMS_QHB2SnG0h?e!tQc+{u35gW$3VBaLv|SY0JE$OLLqQ;%?C zY2@qd&DZm*3+Lrm$A9>t&Dg?ABw+0v5_Vn+oI?;%rB+c3Gzq>-)x$ao9es zCtokcb3E=2uIP5L^DZ8z(q}VNC_jZb>z6RM<7}?Hn{`TJ)KljaCa$z#_@JX4M|_D( zEfU5(sv{^7#cz_whkwOZ6Onj7a9GdAEJm;*7Zwkm&s|Fn_`&Zyl(B+ZVaB$ zC!dpM5W20tq7oL0jIs-KxzHm6vG8Qktn^)J^WMo&}s2=ql?~cZCXaJUq4vz<93=%=;asFB0W=> zwlW{6LLMXc@VqEOlLEV&lc#g?LK}H+`!;bpE4P=uvw-VuI}A7Wb3J$WivhpTiN;Ln zkZSf6y@kqKZrG?+N@*!2-c>Mzu3ri^1qTMrlYM(U3+fkMr`osIYl&-UpVW!)QG#_D zK7UF9T=3tsL_4uIt{%u{Y62H2-y8*m^knW=PwO|YIUcS*wXjy#MpjwDH+N%MqLAeQ zc{W3CqR-cihOQx<%&m0z_Dr!Ft8K^!izyV~!Cl414}9wVIx9LJY7N>H!1_|}CuAu? zE5wlzS$sKRf1x;wyoVJnda+hu{{_Mfxi1?rBk;7Xks7a$5pJ{P2JH}6b1c>llv+@< z-(j^$Gn`nK0<@c_xovJl`OJ04GN-z&8&!6vk~H+8^9TSvNUxU%~^{T6v4 ztg%3$L1h(HS{JG=yP!R=oY$_ZYslQC+O6KR$bG5rPTV*LOa|ViW?YgpxCW{GwJ|3c zEg*+i%5qk&9)F}DNVS4wBZ{F(Mg|{8rHRz}p!jYEqs!Qx1h_vo!L~M3g^Mbk>iUw< zwRK7Qn6cctbxXd7mKr&*oRyg{EwSs|QJ=46FNWgS%YDW53{j(w%GEH_91SCP9aeQq zKk>m&G28?b{lwITV~FsGU*b!bIdxh;M62^8`jB#BzV1l5^MtCZ^qm`QMtgl=dZ3(k zsyXI%KTF}f=ZEOPXD;?XgAL7V&DgG$o@p8YtE%X>IwQgcwV|Ao6p!iXs329|usIkl z?Pqi@!NrKG5^N4qFYQQ~Z732-6HhO_F8eftle_ql5#;(e zc@L6h-A0f%1&Gr~BE5#kl1%ONc_7;+;BsR{NI1FJi*CekCw$-^CiqlW1l1*w?It>6 zpi1vw2ki*KMH?ursTcO-+`iylf^UeveuC;-!fYrzsgyAWJuB5YJDp}X(Sz^5JzVdB7G%R;G?OGH z%=c28VV3eMR_a))*^}LC?bOqP*$*JkebbOFfyHc=*4^v}4;wO84{omO;U>e<0$fDi zH>DO`sumfB%@&TTDLmH=%uNnb&zsbjj=80G(o#?E>7H>_oL9*D!Z{s{(H!oZB|NaI zkh=&I(#xj%{mj=Dldxj*P3>k@5Jut^Eb{q{hsvx`TlWX+uVc7cAV9s&LVu)kZWP7` zI&$~P+LtDl^stXvsPBkD(vg-yIC{yYiG{<*K+!;K;f0 z^^bE_vk^^9RnTb3Y!^YkD%A53_Qqj1ck+prf)zHgNa_0P3$v_nO_OSTFkkv9R7(=% zg!~srOpVS0dRnpH0M)7pTD2{Z$MMh24|+{sPpb)`B?%j@Bi8W=$?g!&jh~Ay!th0N z3Gbq73j2lRF>@yDqlA{6Mu?X(p#*>irSjOE?jmxsS zCf$P>o=ILd!w@G$N6uSLTD6-*ebQ3=F@#v{9a&0D9k(p9Djb~kKHY+681P*gEl@Z$ z{A`&^+Z|>{ict~|;=bl)gcywb^la*NfTdOlI74v;KYsy0c6z-Dj?<*CyW|WcIB-Dk zu7b9)iv^@u!5+NB{63@!JG-!koP}}_4Ur{5smfc4wX=fBkfsZ5f^XoJ0(!CrWLw_3 z-9675LqC+DOk=MXM&Zyj4Q}5NtY>zKB8d@RuRfZJLK7!C{HtkFBRBy-5=^ za;&wV9T>%?ehe(X@FYDcTi>?6zquL&v3LI9L;x*g5I(-*0#d09DIWWM5>e5WRO1`4 zgOHLBht!b9&e*nr^P}V__dGo-Kk<-ng4-^TDppb)l$QdmJl}3qfq+d+z=HzZTX!VC zd3)d=hT8VT3zEC)!M0}#x9>()>w7~WqSAsut%%M$-_}rG4Uo=#dgFuRVn=x_CXHX;YF}yOFFBK z45MJEvPQvtEEl{B$NYfsIplc#V2BVNEIaAwWVsEd+lx+lj5oysY;s&m-4-Ql6<^!u zslLtsMV49jm_-OPjueaOq&e(-K2Ohpr31es5_S6LDitJRg7jTbO z!Sepc(!`4kF{FrG>$OHFBy%%I;&mqtbO~i|r}N;|9EBBb;uc-Y z@}3`qMHvdgFE(DP^U_lgb=b)27BKI-7-OP(J0VXZL71l^a~~$7I}yT5Zbz~c4dz){ zbmj#G5E|p^D)2a%Uvg=)2fokNELaVf(_7L&LQH77b z`wBK@t`nwjvEh3rQbj30n|-mqt4%jcqVEWdv@ ziAL^6w73i$pcbArYJTyEswCwZS8Ruz!sDPdPEk#k)e~qplg7d9Jd{h5QMiD^b5icC z-%zV6zOn&%wX^AmR|2S0HOvL~V)u}Hh0qSriVoS?Bcyih)POqaOnoykwNL=D z0&uW1@!o0npxSQ|w+I@^V`K^Eu!0B0&FS*UAB9EWQWA-kWIoTDFY3kTeXEsqClQzw?C+Yd{(AolDBf#W&cDfYN%SvZ-|ML;}(Jf6Mv z5gXn@Iw^#!o5`8yXQFX@5&lnRXhR5ym`-nTImB6ynJpCfH*iQuOfC z^H8p{dGFx<*BWYK5LD=#Ya@5{~@w=o;$(2W z8=@c}NEt;$x+1-0)Byw}k=_JEL7LW`8pAwnnv2$32ADMH@1Q@ zWGR?U8z;+6tuHuOjceBX-QF3a481Q;d%|!%7H0yIGQT4X^8O#NBCf zRm?AjhbwqZTbP#=`?@?ye>l+J^MrNAx_G_3Q)SXB=yCZ-Wah=e=3D6*A#a5ge`}Jr z%G6YM7|mNcRWRh@ghfho{;Xn~Q_2tL5_Ia(RDL1Yi%^x=H7aAUAhs-%VL*6`45oYj zo<}TpfN{lg_=OO%_ZUl&$|}Bfsd0{(>#0n`-gxyk)%6{@^~cqxROhe5V1zKt%7z2vAia}8A$Ku|$d2V2XnLCha(~B!=k_p9{>(_hQBt6gkR@9_l zG}a_lA3+i(@I;6ro;a~@u%dk`?=twUMqBOF=i=B_B@n89m=i1B2a7l~E1;Q%`G_q+ z#`Pd>B?VYGG)FiO4l2L%iH#J zRoM-^cXI4Qt4pf|qMgRdrJ$CG*8}HIca&-kRd~q1ioNQpw0u*mdRc4;hmoWK&))A(cEvVaEK>CcT zo2RXl*=)bXuS^sypHLH_ltaoYdC*o{NXq>boe9Y1gvn}urqU750AAU}(+Z>1K75z? zL5q`x@{&H{u}<&hJ>t1;m&uqs;$g>aqYg#fK|5WfQT8oz7x*|Zh}8Z9P{;)r_fdx) zp_?3&)n0}amw>ydPOl<7ZFh~~%#deM4}fWSU?0AM#+d|lA4qFfC0&@Qfcu$k z%1}yZ&!zII`~LD0F5uw(eay{6ij+f}sjSG()#H`(Ey=$iwmX6csGozJB_*z@oO3j} zhJ%Y|-`2p$4~=4i5%ulDMQA<8+7UZuz+MnR!8S}XLV@p(y;7>@1&XD-iB9WSnek_H z^P$|u!v1QlkT74b>tXf{S}UYCc(g!7M~+mK2RWChVMZbFvmkZ`l4AOpM72X7m>FI3 z55QvqgR_hiymfpsbY`-n)Kx?w^i^lFubQ*bHkct5f9ZqH$0<;J5G>Nal?YB^_l{+-9XB zYqZ*1&66Vt^z2yjj=|q7ipndx6BU?yq2r3J0I1T>UeCF*IZ^on;ba4^gUT&UZH`fT z-#jKj8)gEl`3)2|T}Nu*`{Ew19RLW=;^ojdbDWiI02VBh*c|TCO?F!@>TjGXSMxCD z7H1Ba*Ee=Skw-ib!qVK{T3`VWO7la(>GYwt#%(=W3i;5es3k~r4=U`lG0?X}uMoBunz>uG zeZfQh(BVLNoiS;3+YAZ$6lHZQSE-yuM!(j(yp>0{^aA}HPDM#)%rCtrW8_7nO{}w| z`C|QXMj4r2@-_>+rWND%a&newC{LsoE3$}fK{raJk@%srmq&L7{nU@wj<#AAIp4SulgUJU%zu zuSr0lrb2er-48ObHVak{u>Er~_CtAl z!heJf!@d~1EsIFilh)srck@SRwiUv1 zV!(_p+kv~_eGe@t>m=dYY2t@+d$%HXrok4|&1{!(1{sb0YB0f4VQ2!Rj38hEmUzg* zP^wz!Bb%L40!YL8aE&>K)UG?zJvzea9);dwcBy*$p!n9y^W}$?r(GH*^j?1q{cVC7 zT997`MNer4Yls-w^Va@5P{s3rm-GjSCSL%lWd(E1xiW{Y(;#XEz&FL;JOq9Im!5a% z$_!>lrDifo`|d7e_Gme0iE9jTI^wB5;%ThPKH>@4ZlE_87_&(Qji~(#O8;1~v>@wpbg`%kv^x0w`z&q#z^FWbUg~t-QDc5Z}Mi2>~bv7#AGyH7ihx6q| z%Ga8TFZNd&c#S{s2N${NJa03(4Xia$>NE6ZQmwdfcw&t6@1(8I^KNf!lTF;7+p`Un zV{V;bRAtCpVgO;5VZ^TQnVC;NP-fcN+ejrE$+~o8i__PBiEhD}5yi7npTsV2u2zXA(Z6JlC)T3H~OdiN#4V8hMq9 z0oiKaR>kH9@Og_u(~08arH1qdCOBbV1w~O|)v9*8(YNm=^ly#!*fIY^I8hp+kk0eT zvYjtV_CD;1WQ9s%-XgZUp%tgi{#I9S9sk<$39oeap3-kBt8bDkcf}u16jjx%Jw}ep zh&Jh3nc%M*kgenx`lpU~8?|SnQ$pr#zpoJP_$HZs=wtZWmqApEqNghBcp9NXuK6 z5fhTP%$~Tx{nUPXOlqw_Dz(Qze&Xqw=HS>?-Fbeo*;U83iIWKfkcR9#4S!V0K9^43 zsPge~S8Ap%o@lt&+OIXKE*28uuHACIN9&BE&-6Y9d?Nu6bZ#U}SemZwdOvRTkCL$y z?E0b-`}U^=OFZ~W-@-*hg?j98j}6Y&mY^hmp=<)Ha3@oHu#_-1H);GqQh^mjx4S#i z8tm><#3DJ9kuVxgz^guZ06Xoa$<<{<;Hj^7gvJC;2e#%KR*x(0Oi#Zq-0~#UH)qX! z{eu>8;9~r;^7nxoETpk~mrI-Xa8y&_snJ#yttYS*|_)O zRy__?KAG}_$rRCuV?S87fjpef$Mn~Hx#o1n+0?vm7||P@C9n46%eT%tC}b{DEkgUt zz8K-dRqn+55$-r+i8yhnQiogD7za@k89TtlZ3|(Zo?9E3WT)!rTLopml4z|CufOHD zFvt}BP5awY>Sy^`l1!!5n=xhtk<+3Q+hE3ZQCsR;J2(WxYa*NhXj=ttYp7wqX}j(; zc?j|0cBi1L3G5bvY#lRSAFVQ_OG-32mPpM8T#j)lzQr~jZ^UK?Fk`BB)q zLZ9ix{qZE~19zU3(oQBCUyAI0v?P0x`hNHQR*s#Y4Yofw4Prza z{FpwB$L>xZhdae?f63J+jz)X$YruXVl(Q(E!Z?;36EYJLQx`KYwFzv?n=&u$!(;cQ zgH?Lxcn4);Tj7U#Nc(ZUyCo({#fy0Q=&zAIvnR>6v(U@2PM?CpV25U<6}$HC=C{=b z?I6`-JGK7LeBCqG2fGMwNV25Te(R-da7!Z8mN-G|Pqwbd@5R}y=AL5_;`Gd$B|6XmIQ9QJZh&i#Er8rVK`i}=V7VY*d(jap6tev(asm2cjH z`~wF3B3o%x4^{P$l?%{y)$rbA&n^)(JvnjkF(gJTxso%&GMejVMo6VBQi(435bFCH z#%5xLn4DQ}7-ltFL+s^@Loe)%h`7|b4u7IjcaK6&ALOJ5>F)&?RdOTGHQjE*J&p=L zRc#~T&9-|rR<7bPX!Y6iRYu!OoR~?Yho6s;Rt^KYe0|Iht!8c6GhuKX0dWl%+D-i& zMl0TAOLN8B=rL)jbdp`lY518HgNviBBEj$4S|z0uW;c2urtfspFgUvjbEQq zNZ!6>50-v7F;JbDW9mEFu_`00w!z?=%Wr~?uZEvl@e_&Kb=I^>@Rtjdw|vY0#S<%U zRd_}ZTUS$8EMk;*c~jQo!gxXPj4tK)o5BH!p;w2J+>rzDyX*+Xv8xk-gwqHT7-+#S zq_rrC_4epwRZ=g3M2S@}oz!>{Vh-O%WvTa6^!mbVLlKmFIpm0^Vg2z~2EyQ%?Cvb; z*S48UANmzu^>titW}4~^^(ik5#DTd*^orxg?sO4M7X9|hD^@AU?VW3ragGm5q^!i$fde@+Oje$erV zJ|;cjDqMw14)&F|nD{-N~z(+R2W0@Y0?*4fDCo!Jz|IA4IFZ>t= z;76cG7Ql}HH<}i&5RP7x@&#ro6#CZsKm1@E@-%88Im~q%jN3!+OX$P7yQl@>tqB||lc21E_V{5x+d{>r? z$09Vfy2)=Le0NXFfZH`%-j&y3c0;X~tt%ZXE?=eTRH=>2n?gI)<;!Z5XkhE5102s+ z?H90w!2m^S6ypt?e_^;6qJ*(6=3l@6R8}1dZC-j67uDEj2Il@;7t$guBC_oVN1m zFVN=uFPOIVdk0Ck?3X{aGSp6f4LgOid%c*vi*n9``^+g`zKB!5ScJo;5)PQB4Au~4 zk&iMfd0!2e(nK}>%3B>PcMOJQnpT<&`RMjrHa&IaG2|P>XAmwKXm*E$Ht>5wWxMko zlzm4&8Tl4W9hZEz`mFXhGM|7}l!@q{r9oGjLZEMMIVehy>lj=jx{WYyz}M22PGKv} zG^|!OznPd78CJPg-%tk(z>LrpDs$DjruOADO?|zK99$qm$TnrD7gt#5n)n4#)-6Tr z*8OK?LIQKY71t4*!s2Fc%u2pH;(3z-JK~8Rw>=DBwN}AVT)rrDBsW|o(4;zB8e2?| zPTkAOBx5Z8i09M@{6G;T3F1$11RmEZRCeiN_IvCR&)qX*Al6yNzuM^AD%(L|rMjU8 zUzyWaU0#ZMd@|5M`VR+1CFg?2m64wO2})}lzh9H9QsWo;cF+@9=2Y=|dtGJii3xQ! z{;GiL$H=$N*Os5Y$=At3rX!-Ajhw}?k1tzh8jkn)1>4zyKf;8vtux${=7-LAQJ#<+ z-kQl{v&YK8TsD;EzXlc&jmfoJC^xF}IO%{_%k$W=`+$lIC3KNuH5~WimFfl{Ld$@T zp42Kx{ak0^pQF|;L+4Kn!tr`frKAddZP0u%1#U1%)93Xbf%LOGL-pNlj)c1E!c-6^|{0k({hU z!3!F-A5{FWT&tyRin3x| z?8r!W>Wt&4;i!_L+91fH;ggJO({t*-` zM_sY$eeCF89#`pzQ#YB~_QRZdRcw^g&}5o%8Js6z;x*0bA)Ir6J}v{fN_?ahCKolX zc--!f4mW2#bx99!lmd12Q+d+In*k5e_Pw<7i7qOv-ztNw<|b*|&;NPJYS;&P8{-|p zOBjV$>`bqMsu2U$En~`mO{m>tn-yObQ*Up&R;x5yNLhYIR@~Wnueqo5FfmN1b~=9- zuGAq5FX!wk;8gYx4uB6$-fF`3zM;v}_t2v8_n(i?sfA3S?b;TkLKIx4-t0BFR{KOR z0(K4je25BCpF*QnT8{K~H!oszzWL3u(D$2Ls#DD;e5dVm?-S_3@k+b-pnD=ySqTU3 zD43%|I| zzgjh3DT6;uzV*SiRv7QESoehPTZx!BX!~3@suvJk`Y_k|*aK&2=caRxh%^WD_V{ug zXijSfvQ76vP<4x!Z(JOS`GPk%b|sTj89rOjy|(VNw*r;CPSw^mR*TBdt?67CoKjs# zALT>6FqeDr0`h)PutTb5FJ8IgS*ynEDKZYPB+51}nfex?-!!hG!UplJEN{Uk&O^Df zIbr!%lnf`jcbz=K)Y_ilZ^i$82j%(5t~<6CJl9=OvA1d$=CCI~jkuC)s$F#TOGsME zC6!D{gq=dT!>s0TTh-d!-Ouem!5p)r+7%GB^9{_!CMy34&>w-gc!QIvU7?js0x-UTu|-Wf8aT>8xC@uNc?Xv7X^d}i{7XHzN6$+VWwk-Q;ULkHog26flZx+G+q+d~qK z>pH~z_k&iPDsuomC6%*4TdDx*-HK`foVk`<5JwwOdI?_^K^Oink6OJ27&Zqki88nU z%L#(_zv-4&4U9h<%>2_Y|4)9cmj5642(=AHeFVa^vw(2<NmK{R=*D zz${O$TxatG?3%zqkX{2b7w}-U0UoS8_Xn(cRj>|A>^wP#4NSN)15R>q?#r9bM?BvI z-X4;o136X4{$a#I&*W3yY%Q(x(KkOtNKfb~F^qdag7Yjp-Y7McAi~Axu4Q^BgXIc@ zecXK{bLUUvE;zAj_}2o)AaC6fwb(J z%rgTCR(VJLoEY*hyn@wYF@Cj;AzmO>J*K#(r&;=iWdxJ@;aj`p*e+~*ge^t6-U_O` zJ+E*n+}@RSlWh|cUg&*eB};>hLp|IBx@yz#Rh#1)GkD*X14rAHDmN~UyHX7DQT9%; z%Z+lhNRQp1@m?F(@>e&Pa}j3`2b&uDm@$u!;4jmTr&EDz=bqkmu)wV!?kyzwK*KaD z83DE|LRCXjx;aB5zm!#S*wxVdg?o%)gmo`NJYIETxfLPII%{7q()Y*lf~&b+b+(~9 z77t9k)-s#YpoiozFIi%l%jn)#>(>Q*`XWw#YsnNkIM_Fmm+{wv(T&InJyJ7)lc!b* zqfB7w2ctB@HCq>H);J9!vYeBjFyr0u0@zHO=MSXGyb_$KQ~{GznP|13f9*Ao(kB~yv2me^%rZptIigdAob{=m+DS)yS2yssL5s>dl6a_U%!aax@P6b%0=5( z^A|HA=Z7}d8XOI_GMeXLlOZZC<@_0C=bl?-r27S@*EVBL`G;+4-yTa})$UsjBfKNH zleY~-S)GtgHiC69w@2>9G8?oj0%$?n;-Z6aG=p+Y7 zr)lm|fI{-Rr`Q9-!O$|!?FZ+0ja?mMBIQ_>{(-Bae3?s3kJUsJUb%SD{`EY*u>o)n zM~O(mGl=NZT>?zW>B%SUqv)ycKt{7)?l4GdKa34=Upur70xe9kn4Sg?!A5Ph#p}0% z&$Bn2XQh(__-DIUJ^=B?=odGf%`Kw{0~W^Jdt zbd=w^hxn9zi?~9cZFsUA_KuZJ3|&ac$0364@os*_tByX&YzKr8gw%WfdY_5o@|;cJ zf!cWf=)}sQL5m7`W#M@x*m|)jV;m>yKcu{uM7g>t+Gzq-b?h#do?kzGn-dk3YmTBh zA?@Ffu(fHVpOv>!}<2kH3DY^Y`~_n~fiE)eQI;!>f?t5zk~q>(tRM ztlBVdMqgVvaoy-$Vw5=Mdgp5bv*73R_u)Y=)OIUEUsLe8?XyFda@>zZFmSOJ4I zk>hU7;OtECr?ekud0N!vK{yS#6=4mXy_8nLlG$Z)8i~q(z6zrfFV$6`G|IP7x=L=K zF9=DFea#563jS7~l+T2iOT?!*Wi(-Srvma}TG+=}u#J<=^G|7qRuQ|77JfcM@3KMq z_h#S-*-q4Zc%+CET{AX99dUVQ-HD=3Ch7+h>s`-rC86h7i606yVQ`*r8aW#T%4xo1 zjzAVttwlmWeUE5D{+&1k~ zP||?f=n>>GgQgdAY%`@iuFH=V4uZ?A-wtYB?=Q+$sV!O19?~40%U{?)9c!12AmPfp z86Zk(k~<(z##L19W=*gyVANz@hvr-thCw+EF1$L-${HoUm~ecWSvKQ6C#YwFedzT7 zI%QautG>{x(QKY1{AcHtpcSVqSUOC>tT+w7XJQDeJg5(HtNC~pjW1MpG#SY8_RC$$ zD+8M%E-h=#$%}efk}J+e{0g_hWuZS4q5lLDW-hZE`aZP|W*duT{ubr$Bd)8?@hh!7R(cs*Nz^Cv}i$ zh2;p%SE~3(s$rgNW_o}JU7t}ScMU>V#CdaR8tC_+)Yz%T791jiXdfm=XwbV6c%5xl zIJ?~7=epcXh*eiP=jC!a@>j;$^wJJknU{gg=(E2Vys>~ZBjJ8$tZv6IGkQbb5}Fdr7W?iMCgoOHx{bfdOph2_`H`Tvu*)i?iNyJG*TB)QLfc< z!%rtan0bs-puSCmWum(s4VSuL`L=uAI_TI9q*TcqOcjO_M4o0m-BsCGXG<)3Pc%qM zvrzA*2jJx%t=!hXwZF|Q;0ticSY+iG@Z;p}}L> z%w%V^l)RQE-7TGmRsEq(lZMLHbs0Ic%T)rM-0d%A`G&U2CJ!u=V7+2xGAeE_iWPlK z2wqDeR_`!_7qtce=f#;`CVV6Y<^!fd-)^M>~I`h%8&O1<*Q&I_~?_!B*+ zXD|}dmsDQlx&0i7^D?^WWF+Sm&VMLkvdETUh`%AdVYJX{m&n20AVG1iHm;JAjVx1X zzom+baEtexFSyy8o}zHq_hD=l&G$>|txV|=1LeMkZbEGx3SL`#Xx!6ByXg$29+(>s zux>IER@XFCa}@|{(=|R^GN1^nb|u2h5^p2;<|a1`R^?+2_~VM#gy0@&oyZML?E!xK zV^($p00*)w4cfG z`wd|3tT<@Y)43QC7fse^)pB!NWlH+|b|s?Mdc4(~<|^VaE%k0>OHX;drPiDebZHVg}z)sGf8jNx_l@0MsyjbD&6GHEg$Hof6Eq@0#u`@nRN zIX=7R7-B{FcwES?XB>0=PQHj`U9lzJ$tW6LHB?cwq_cY!1HJ|Ax3gHVs4E^E@N$H& zU6RWT#GPa7|52BXubmEI*gdRq=O@OoJqn#>CabVimXpOuogu?GY5nR%1$Vr}c|d7% zO2v0+c@Qgq4>(JNyEkrE0PY3rvR;h}s%$_F0|WXn`g89r3)dDMW0K zKl~J1S1F=3%Rk$SzT&scJIjA|PBC41VIUigNe(*Qe&26pJ>N#dm?t0TiX?pr%wn|;b zzE!$^o#Vq1U-GkE^dxtC9gPRq947j3(9A6p(3XW#sy~F_>bTqZ9~@U7SRJv5h_ioF zM;?ALPYzXZohZ|NhhN^8bTR`+c-0eUtqs&;M&!KKb2P^N+#bz;gcf0C!JgN>k z=6aeDIW`*@cg*yR3lKFi!Oj`}gm&`)75Lfm3&wZ4tx}+-t@NM;TOcykU-1o`X&NMB zdU_UXnfn}Flf0xQSLSV_eHk=|yg(H%lqGHJwP^QP47_LG&Km7-t7c*45jvtNQW7!U zZde+uuMF`}Bj@W-{5gpPQc zr)FmSp6aQ@eEilEBOfTC)n7qYzV&m2cjH6wc|t^hUDVB6d1@mSZnA?y*Uc9BB_oDh zYY2&T1hMWCb|51r8lW_sS$HZV>{{{L73Mh>j@l|B7ZgzHFvBtr;xjh-6hRJl!$2)y z!h$o12CCh z>+a6-nJez)+pRBLE#=$QO*j0~7xQ%}$yrlNpQ2n}^ZMz~+Sv~JuAZ>uMeiW`NR*5t zlqB>=qA%V%bIEHs5PL^H=<3^3fs~84fzNhu8h03V=H+=$YTRx)`HHT-^qrcqAZK^0 z=0DdPsz(D4%^YN#TbnbAG#J-;{$7z7KCSc7PcSb7YKgOjQ!u8{(6RLT;e_PrZv#I{;d;pbROy;Fo(-)jkBXnxI9J&#J(JK}F`S>ioYDQ}8aY=xWO6{_}Pdqc!- z{^rO5{nA1HuwWm0G2^Xse_LqXs3p^~`>{M#KQYZ$HB-jID(~GFahmLL>L@6I4Iyo9 zT%|pmQ|*^Gt#`QSG5O-O;B|0%k43-#$7}YCYK-L#EI3QGM7ZQylzeBt*Mo9X_2tf* zJUcfA_)fbzCtv!|qZo%~WZT{48~n2+`@wnk&#ajsrkQARF^L&8lIs^rZug0YIqBwJ z4(y>jI)@k7oJH~rm;r8?0hvOO*NT6*Q*NBUn8A!O*Ht^rwLHuq@!SgV&MDl=8$vb? zNu|~^UC5f1XTe|;PEDb{wA?r$r20Z&|BEOuL@%h~|&f->Y<%+%td6SYyhR-CanmAPBU<22Sld6F6R7#vdur+8ko_~4OXr1vZs-MB zqsseA_rYh2@0lW=nR}~7n><1kI_CC7h%rPW*=BSnS^b!^yCK2#Xl0mUuXK4m{gmM;Uao4Hl<|&>wU{y~ zDX0!p4~H)W`Z(#$>lw<|DfppJ4rPW06x)KP5r}OotjNjU997GQ!|8U3mUhk16~v1s zy7c^99G>IaErwp}U^K2yt-r4u54yzvBm42lwZ?ieAPIE-)U{V39()y`spg4V1)`@! ztL3!!R93#K3C4xwbtqdPbFrd9way8uccB<3pE?!U{>o|2x?ov-alD+8?~PZ0B(NY; z;}2`|0$3gRby?fl1+UVo&`gPUX?}V0qfvP-dmWG%?giG*?pS-aK1<=y$jKOs`3(5( zkFjmY6U1Nf0G>nIyhXr_>&COTdX0y7PLsq}8BTl}fB&d&(#F?A*+$q}{v8fiq z4wsZ!`(eNt)#}zESBedMy+^Q?+YtbrbP^y?!jM;4E4?+iP8G2<$Rl2+eP17~0G~P@ zV7t>F0K_7`3A|&Ea+?bhsgk^Qs8!r46lIAI)ub`KWzft?jgVk*;TI8PnrA9frkwR7 z*@nKDInVzC!l}zEt3bZ_Q^l@AewYixI9|UgnGNqTU2sgqN( z(TMt?vS>d8VHe*+gC3rG9cTI0`0N)COEqYJkc?$*WQO(15Y#BgXEfRX+8&y6;fSZ8 z)r0mdQ9s4v&*vL5PwnqlwW~;_4qgUV>S;(zBw+4D>nR^s$BtB5#+*$SZEnPN-smEC z^{Yv*J*VS%g*31ewpD1T zM)&W3OXY4_u|PYA-0&lwh+dO<-fiT``6j*9>C{`D5fZ36Z?gsq^ov(dXM+y*(|y{~ zbvLpHvjwvy-8r-YU_=k=MoMi0AKh3sh&nLOUE12W{{~q0nkns|c?+&=FI$U^n&ZNC z0iOlCprjCpmvj`OR>uDiTrU4<<0-3w3h7J+QQ_;xm}`Yp)CGj2lJ2~8jWb)1l}VNQ z5z(_^#ESahG)JV&JnmoFCf=*jOH{0nIacOl*9g55qju1G9GWnIcu`2SdTU`bl$K52 z%EPF2V8r>zwGIWRMc1lz4u{eJmL$GK0Xd|rM0_f`t{#VVJX>J-#rCw?pz0T=#U6#G z))tXyW@C8e`oncgHr6}HmEKn%a>Vnl?GTKj8X_%@cosMTM?94d7|t>J9`}kKz;O&& zp>|=)fL6A@$(8wDRZ0q2f=eQtm_{rgs*)>lP7nm0ODfK=!OJJO*fVlp# z2l#9hi4EXWfdb&zOHE5TOu`{Q;>AF3PW0xw+~J)sx9I~P41Qsy(&E$ziKt6>eb3uK z^`pq|9%((Ud=7Q(vaJm8`-p2SRWeahaI`LraE_I2HBP9m^D)@8Z)kiE+b4_&IrRxs@Js+ebY5fXIP~2T1e{?}sa(_cr;Jcn*0zlkwx+{Z>N#s8SFV1tr8m z3%|I`tSV7fz1~e+vJ-Q!n3`#?E-9jJ{(Wc{-TFKRxP~XBl7^yC|NbHZ2_@T_&3#~H z9q~}D0OuNePupoulKVj;6h~~60l}n_#UhawvP54g7$(RN$4fodFuJXyKxk z2&@bS5c<|9`LIsU^G`-Hlj-@rsqH^=htcACe(#{6wFvmbW}q`-U4$XJsdtlFx|1yH zIHo5<)kWZk{eU)FllNq`(TZ>6Fy)=)4TFKecs>6s=>PI?fYT$!oKD~fZB7AClYjy> z6<{8|{nytW(c2A~EWACU=XR(+InB1_yz_KD&wetdW`@Oa_1MPk&DHg;FHskFdzyx; ze1jUY?~Q%UHH_&uH|l%W9DZ%vdQ^0wqPB4QqA!PgDE*30c=7A1ZXx zEy`GlzYw*-H~MH|!%X{}YGzQTskeW!4L=N=N1;7^BYZ05R_t4dV16mJHm5O^Om&gY z&6IiNiO4mw8uXC2WHyHSj1^HVx=nL)F_uNL0RKYoYyXcc2;us_Tp=dvKim;C%F9_~ zUS*B=4tSFTwVYh-h%ra07`8<@tHn6g!4=s2LhsMdka=usO^fhDJ0k^|Ui|)1X)+ zcGpK5%n*L_met#3AVTkH{y$h<@bla$)O%(s#fBlA&q!y^jo~)d>P`cu)lf_~B#FyE z9t3BZNSSl{W5$t?%FiO)Pq7bjXvS?Z3dt&68dECqn`{sYyKHcQVN_iBU#~G2PHx1l zh<-F)wp;2v@(K&i2xE>IDAKuTzlt|O{E28W<5=H181O^M+1bEuD~{fKE|&nowZ0XC zWrcy`ylaV-n$hYK0Vd5YpVU)Ndy7%H_^0R{e&QS}j*dR!(Z0)Z93U)lfg2nT0dDa2 zm&0kUs3!2)+OZ=*N$h*L1Q450_+PzHfrkzB)b%VPi~{eD%+K?sgJU z#d477#>Y|8Vy_eY(lbM~^>xM`r~BGKt)m^iw=qDCIZ!4TTXUdwCdg}ov>hFuB~-hXW$Cxg1llP#uTz1oGm5K_$C4-~p4;F*jsxXg+Nx?I}z z$Jt7r^F0%-uEB-VlhA@ob>qJ3wLncZf6Pv}peg>)76Y29QdYj)+I0MC%7l|wQL|Y} z1yQdurDJ4Zd46lH<(RRc-ecmU8{01nt_2nvPL#)WO?119%XNo}QX$TIn7OK=}4^J>@vBDU&( zDd+v(w1_+aD%gumn5eVc^dGX3PdBCR3kNEpo;b^OISok{@ zZ_h0tnk*6_<)wKbn-m!SE6dD^{xr4}d7GZUkR8i5=EPHRyt7bH?Kl~zQ1iJ$>j(wK zDB*b-E@@27L^li$EWKb+%V&DfFgxLB4*jbpJ82=xw zH{T)5jB@SAe!2scHfNiCQmjyPwP@eEeCVI6luhP-TrReKA(Cs=vg1y4&6bbh(?k^1er5N56c+loLBqk>~RZl{u;U&^+9w>@} zPF<}Gq zj!3~pH{*aOkoQBu2?lSZ$Alu#7A{PqL1N#=0tc*NIL|gzdfh|{Hn5=ZcSy5O$eWUx zvONP3LBx_VLmsKd5Pu|8!43xMGTg?2@^u-X_H*o?>D)$jT-*fujJngz6z5A0(iU{l zuEQ>;K0Az|K&iV4-K4fDP;8=$$n_R0!m~W%KD%vB5C$l27k+LMaq-yBt$A)C!^)Qa zFqk09)}_pyK~Rv!G}!GD)>Aj-yjj6oMhqT0?+pIU8QxX>c_nA=<@yevlhddhdH3G4 zAXrO_*M`tzVLDG}GEYeGf8X8q|H&HhRaoAa|8x$zer#z3C@*k> zm2h=)JIj_=N_FeXJzLA{Ng&ySA~oXT>0gwxhr6viAJ;1Sf-c=v?DwxY71{mNAw|X- zd+KJs!<`f<{#fF0mwW9QpOBsuew9wDpXySkmL+yi?-ucOicBw%3hAP}zj$9*px!;_ zDWX?BW`KS{2Ao&ce}Sg+IboL}^q!?CEC2-Xgi^ZQz8R<8%6E(ap3T!D)G#EmL-L0t z$vYsRlSj7%6+LMn8l?z|tFqIcvPbsPKxAdz&?+Iyb=k5c7D+p!Fd{7jA(Gh_w9wo> zSn2v1g=LG?AofS`~~ z;b-5kMY|qcp4;7vJt*uz?^rO5xmVtp0b3_@fhdoWz=-u$1&Cg7#X;v$+jWH;f72a>XEl=2TY$5M?B6GZ@Hz<;hYQKXVAD3t0SJ_xPP6f9dR3|9Om!33rb}x+)AzD z|1`{P@*{Hu#ialwR1ipz+7;cLB`r#=!~%U0!^YiGtOO4bM^qyFckX3eVwHNhi1ly@ zot#j2-bbUbuAm=bxE zjuru4c{aDsv`A&y^xay+e1=@ghMX7o6>b+4S+^Cu)gN%tlE^_R<1AyO&o0@We%a&3 zun!&cL&%G~1?)_k-Qw4`PCWAatk+ZEm$q0ib@4v(x*2a=VM6DjX2L+N-cKuJgkty! z+qbT1S+b&0xY#bs^5`DBh}jETgd}$ZeNHxLtrd2aD^;7l&Vzc58?OQF3o~Ll>90{7 zZ`LFB0N`PL6?^K4=QEeUt<^IMQzld{bHxCm=KRWto})`-vA5Vzp`w?^E5*8L2e@*M zRp@;nf3-;69njg%|zVNI5WLiEqi zzh{k77jXjKa>4Vc6NWE-q9afb==HVKe295N`ce#^l>?qZh<%0`%Tj&ERFJsgF#Rz8 zQ9~;sT42Mq56aMtb4Zd-N|BCk^e?y^=BRCSOZsELTEy85vbv5#jQiaLRix7WXOC#R zW%l>^$G_P!GfJt|8MHIzkg+A=!;`<~z0U;V-{H2A%%Fh#*MffUdv0I$e$U(b!@L50 z!Y3XR6<~=7eO=)>p)mZl+>S2_E9XX0VP6G_puYKipPypLuE46mIHF)IfDbT~1s+wQ z8~|p&fG{6Ysx{6N=i%0fH)IYCgXfLy(&QKDP=i3tQN*D>v~yw`X4E z;GCZ;_nIi6+TT_LQ7*GufMiN4agMFge8d9`^*W$>z2AV=OS1@f$$`$GUVh4;`(41?4SPGaI(un&_y1|{y~CQ^mcC(B6bnV^ z9TY)2BE3dIx`6Z!0#ZT?olv9n&Xz7!x^zK$m9F&OTd2|#N(>P2yLF#)wtDv7&w0*2 z@B3Zf7cY>6YyFseX4aZDvu4e3TwIr)aG}t|V_MJ{h8zK2I>%aap+PwqxvA-f8qwY) zn(A=K>$7&?J4!d#=@gYqFrTu!5y}|7rep39niCH{uu10Xe125EJwn3y$NljiMro$#_)D>yRlenr7EtHDw=vcTou8X5X7GxtD&AX3PS-Umf|PgPcH0@r!+b$;)SM9B4f!j=&xR(9ZAYl^mZ7Vyk*5%6(OF?z zfzJrXvMf-Ss#bbt<`i;$etLR?zai$cig3{BGatGock<>gd@mTA>3ABJX9O4H4A>OsvFJ%c%-0`&WKU84YADkG-W`L)Fx zJ22f5no_5GX;ss(Va_pX0_?rod=}xmW?T%}C@UipK*Jjsh z@tS&@6|H39mo7OfR8@PhmGDERi5BA;&ogrLF{WsZD|tCq!c9>H;1MqgM2gmlUGW=6 zpy*2i%<`meR%cU~b<(h@*vyIAP1s6jF8L#z^uT6h+C*1X-I|Y);@BqN-^OjPa(ybHtHh8 zM{M;{)tIOXCBkS&xhXlv(Nw1Fw6f?_p^iL@-0szp45d<@+|kkJF|kIxM!XEFoSZvy zf=Zm58w;*u{ma00*&TvjU=#lp>ts%7^Y*fl+n0sX(xYaH^FrI@^-3TpXOwolHooNLt6 zt4BHnkSM&gKd}PZGyo5(>gV-v>;r4Xih;0T=J6*?<~qCtnVM5UF59Dp{AWOiOx5HX#A#cHKI|eE&n3 zFea*f?^r<81xQ;+xCz`ZCG^RGPhb*eDS);Q;&R`b(Fm={06Pbp^K|&}sY~gAPyJdG zWMIuF=ty9SYx9ii$k5a39x4R1KX?w9%q>R(P#m59`TptTdHy{2G2^-NIey{C<4D+y zi1DXmeTW4FJ`*yVGv&8<}4AvO^a;57J z{B1d*dG12f)0hY0mE~fmr;q8D&bYsY5=$O+IG(wk_T(9XKwTd{L#69{fFmruh5a$= z=8!$nafH9;`}!qF>->FBz_DF+`Sb;3G}6^qrj!HJTHf;!Sd6UO=+IHyIJ5C^ccqID zx}_XHzPQWnHd2ab?jZK%e}8TS%Xj>{B_7lFf1s?=_=Hf+FLiLfcenUf4krLe$Bq6+ zIh@C*TK_DEb8BDx`|AEL?}q_M+BsMODky^|zV}7?*4|?BE7q*pKinTOHNZ`Oy+1(! zSg@d+X24}y(5wdfBE zvenD%o|CAdYU~~adA(w6+xf_k97AV(5??1 z0#?eiQcCSJ2zy@|c_`-Dl75RX!a^Q#RvpYsBcRhzE6#~%5H<>{hzb+uN2I-cE@}$D zk*u&sV66!vJjdNcZcGer2|w2&b3jA3bpt*jnc^<*<;X3wbdxZ@?YAR}Rrija&2JE6 zeecs>SdsbJBy%N2Phr}CQ%-Ln|48^%s_<~^vpn*CMRnf@*@jme$X}Hdu<(T2y;y;{PBXjd-Elr#h^6Oxfm(!| zF1|q2*c=^XPck_=PPbr(Q#Vn+oGeB|uV4&&6sbQ($~c_tZv^7YIZC(L0E0q{g&}gF zCuo_|hdv!fIJ`Xz7rlg#O0O4p9=JE$%Lh+Co|tDwULFX2)`)gljG+5)5*64qGQ5&sNOt=69$$6l;t{ zC^$-s_h$p8_O;bev7@=MZzA5p%m;z1xUYP@qQmu4&NAaz{6w( z?om{Ku^bJ#;CJ&Xw%xI^c*Z*!L;s7ywAS4xo9B?Nz4K}@<$S;aJL|#p83kxvSzeBP zp0b11DvcTd8vFn?iS;K2p>8^w%NSE7)Z$6lUjMr^$T`951E1TfDE(W0dPbp{-_rAg zWpcfq0ay3^PJtC;%6S5?OUW=x*7NL7pcS1?5D;#H9hJaMkF$g(xZ%pDbW3z|tr*#U zzvWL|Em0wP=h<`iKwv5*?wBrQVc!l4{@17~Nr2@&vz8G}+UEqUA>f?n| znX?=af=kI;X7Jo+9Z67Xw8PaXcDMyePniFT1vyDJG6Pn#ys>lvjOtmws0bptE1vc; zk~GNc3uSYVT8FTBCZ8>lV&xcbs=yO;KmpJ%$zpu3qDL^u4+Ou3$c-s5Ffy73`x&CE z5zC78qrC8<Qs1wfE<`Q7Ys^h|SUMKJ2&Dkd zTcAWwk$r28E{H7n`0MQ&L(eRf41X~GB_X-a%Y`9alE-#Auf?LrB)IKetE z457PjSmBX2vwTd^+GiF2Jc^+<6D!A#sZp!I2YjrB2mEUpl;x5Vn~sV~=AegnxroqBimba| zu@uL4AQ%ESyLsBNBM#Fx0o^iT?ak3WcB?`;QQlJBhAjEy(x5nnQ5U_Z&LaW$?&gpd zETnNqNL?hcSGTG+W>m`3PHZ-neo)9KbBhx4N=<(xLfI!LIXpIB&aqoHcl88kktK3*8$~A~9udvaIQIPUm7z(X~$oQYV%LorI({k2X{y z%mm0kIjX0!u;@Ne4Jd_TR2uXxNcboO<#|@+<(h)j8V*V^q{)DNv}mIn>1v`AI}dD_ zmFCds6*MGkM9=u1pq9LfQTw~DZFt-JyNt=2)_&;vJui{O(w>8ZiOuv#!ehG2O`HR$ zRMnnOXw&5>pQ%jFGph-UfJ)6%>F6}?k~1Z0_joo`viF3-&4Z=>qw~(ctAM;OZu@_! z|04(ZKfrZX!hc*?u>kxZpo#SN_+ae;-om$Xab;vPpx?`VRNDa8S>vmJufrQ3|7Y$` z^AGNigHa{+!qjwntG78kp6cpRGofXl3qyf4ABX8<9o`v<-fq#EmfU&v8|m|Mbc1R+^+UM}EgPEQ#1)$-^XGZ6t zh6$F8kG(;Sdq!a}YtB93RGtR~+U`6BX#xouZU>bEH;{B6KrhbOn@9PSZ+h_|&dyM! z%Y10RLVbcNom8#PYu~QUollJpckWM%e6cpdMoY`t><-%s+bXx!X;$)OZSj{aL{2*J zKZrFYH?d-*RPxuVI|d7>C$PJhEL&(6DC)}dF=CI>vGj=3w2sB*u#4Se8Pix9NpdXg zQ4-yM|0Ows(oG3zcPm**PPTZ7U}|BJEL2qTUKn3#kgoGNW3<7Ql`YM>$oiax9H0UR zZw;^V_07S7>`fHYf*ztN&L-ZFYJz_M$onD-1XK>Or9C;?z3QOE87mgct*U-@^l^+u zs-WB{pENfWuBmiHzjr-}h2?HB4}6wUK5bar!)K^QAyxR5*XVMOJUF*l_^E!yS}`-z zv99f07RnWUgQP0Q%wmz8H%!r@m7n&~c<~{PTl+a}m>$A4A(ts47Yfr=Br+K3EX~`f zdz!2`GNN*-Fr{NfS=so$gZ6zvF%W;z<&Nl7zQt0b5oamX8mA;*o*gAX zGnD6;>*R-R?vms)4~DC66!55TY6OWfcg5dNznkzNoG9GAWY}q9KE~(hN*=@(n}7Tx zeRXxHAiXc6dMLSx3bliDs6@6yW&tbn1&J3pB&`R|GmbI!wpG*hwwv>f3rm21WA1nu z6|JS~Tp7KW7eB3k2zrsgQGl@=E3x%cz7mF*UK&u1^LhThZoEM*+W;ItQWvki-cUX4 zaw9m?geIdJ?7D4cdIIuuv4~oJ@`XfBXs`zjx#8ELuG<-ZkM6ao5~Y7m0qT8*Z?Q%z z29dYD&YPu~oUrc0sTO#{zx)Y@be0}fJ9&{NEx}TLP>UI|ZHYDe2xVU!nx&`=kDZg1 zs+P};s{GN8BXQ2(Lv}8o^PRax!#=(bhi#{{0v?t@YuA2>18j$uc;~D!1OntF_yES4 z=N-By$H*FX?VJIuYt~Sm6tV6nDoGQO+5q9}SRLM|CVT{j5F4k-?Pg2)5`B^7_(tAy?i`*>M!!I#iT|){IP#EV!qP_}!s;_Nd9`cq~i4+)+wZjT>ASh1bybciZ7cE<61K5bEk~4d7E4XBS&vzv_|@SC>uhUH z{*(A*Z@j*oQR};Q<+-b~4@~0(>_VRl>6qBl@?+m8!MMo;Tbj_X7045Yugh0bZVa`< z3x{L!jPOF+#vBTRI-cfJsFq4pm}*97%cm^mkVb7;)zVn0%C+)@!zp76Rjn#M?WLprlw%uP60+B&|JBM;wBu29i) za4mtoI*PYwY$|+T3l!;Z0qrJ8O5lTYY6))PKzrgvho+TSL}s3Nmf~Xgn@8RZ164#9 z3+I@|MPzNA>r3%I^K6VGwWYFVCOa<2jz{ZB(xlMR4ANIb3Xa)k4puGLv2o%9Zn+acZ&5lqx1v6qXl5ZF0jVzP+ zR_9iy6&;*hvcU;Nvip;|4T=ubdlbOmW|opBnE50q&FT6Lf2#S^t(CVYSM#W9cP1R-qhXgI1H=DJdZ24bX&#lSt3N+)_SYzR*%c|HVmne_{pW#lyO5iHl*?Kq(mZeY+SEz%VrSD&REw6ZD|ak-v>NMX(Hhk zOmx6kOf}J9me0Qb+D_`Vv6HAB4~6RWr>%plZCy8{bKE8P%4$+LDU;)L2g4QzHikb5 z>V>?2;*}BDHu}-YCJTSFn>R14*D2-7JHquo8qCn1P9ItX!H&veeH2NTY3?-o3;apiWkg9e>8m9%HSJL^ zb)b<*MZQdsS-MJ%c$XFh|#p-&g-2+-z~l;a2Nn1ueSNI#j4| zIjmj%q-z|`DG&6gqAg|@r;E4JYFE#}w*xQ4KZq{N$M~EjiL-td76|0?wlcc)*$61n z>$2#52Uu%AEZnqJQ$do1LETrX4=fOUIh}rdu}${|Ey^c$bB1?zb}a<>DKnLG4L_N! zuFcYjc3paHR@-@lsrSM0v&LLgzxFkES{}S$-~#AC%#^oB5w{ChU_O`eBaL>oSg^uW zr-r4_iH-%S%!Tlt1L{JGGG#5?O-S5G~5G;i0)_E(U-R|?m#q8&M;G!#dsN(DU~C~Pj$gjy+;US3pB)%K*SJ1A|la(;8x zC~%abo*|!wiqMG3(P`lgd(3ZH}cER;qq-klzl$V4-o7fbz8Yn0TpHp1K7C zd5Ca20e&9u_pO64^T$CQluUdaTHCt%=~f9njj(rCpy#Y-)HRe**Eug~?m*RWI;w&NecI{b9mM3Wc9z@l?ywfkz?FA8 zdCCUV3UA{+X#_2_jv;CL!<*fER8CoE17De*(pWDbfTJ-pj3heM0Z4u?4dra0fH!XZ z!A985KWUVr!!Qc}i^$~vmPlue&$4h+TZ~xY`G}#mhd$<3!pPaScidTN1w8T0Fnw=h zx`|SMgcoO8p3U5w7l~Z zE8Wsb=TG8e0&yOIO&Rt1_)XqobVW`-%A4m;UJOW9y)#(neV|9+>R2TWq%9XUTYye}6v-i@n=~L3NflUKR;%Fs0L8}D z)GZ3iXidC6Wv&pvGG%@PN8wbWk(vn-16+eL(|pjbRM5*h-s@1w;2&$%3=ZuQZ1sIx ztcIV5q$s7HSh8_p?-K0gvFV}+%Rge(DAO^tCNR$zw&P`x*QQi=#8A^R%15K1Hk7ej z^2rTsHHZa5pr`O&P#Wtv%z}%=OSA$x(EjnzD12V9Ib8w)d*P+-CFNxM26GAhD$AO1 zMjINYh&a4$1My*i%97RBS15FhGErL3_vLNgobfKvic@bfu1UU;xa?STsbeLPlGs|k z7m--US!~GA&28^{-dh+|EaZv%oe z!fib&z^ju*d>Zl;SF8h47ElqQB+N21=7QRf#tIcRV^=9Tv-35=y~~ZJNoAXWjRPqg zDlleSoMgB`?X)y#ToKhd1}Zy%*R!L4b3bPuX|5bVT1quK}uZSuBY-HpnPmAo~PQlOR5o&Zr|papN2oCdCzwwUT z51FR?4y`4Rl-X^f4LmiqN(Um>NX03Oj^zQQbn00Ntdh5Lf2r!cXAEV~hf+U4llhBN zHYuYYAwGR)9@-jjSDJQwGJhs0{TJ>zx;7JIB=i>$)k_SkZLM|HH>_<<=&BybsKTydB0J;##oJW*#H>G-c(# z=THZnAh0y%{HE6f{mG<6Hy_G2&)?MxzJA`PHC1Z9+^6@YqV{v!mlQvwayw%mkV)io zM_gZ&t?$ zoX$gmFlw$kNaz7ZB@bquzN5(9P*dDoe&n6tO{dT9BGI=_5Fm zw}cU)*iL_au0p|aUA+H6PHJ|YX4ze*ZdAbp?XFsjDBmjy^>X19y6BO1lRW80(b5Y> zoc?iKRvF=?xU`D$JQ;l0`SK$rjg{h7_ZyXzsd$(1Z};a>zU~z)70eH6lP;!w9nT*r z?%?7blSUd|=H93yQ9%t{8=`6rL-DK@im0tOBB_>{@|MysU>+lK6A;#@un`wA3%Jx# zXKKL|6u+Nkaa2?&M-k3oyG((t6Czx{hGsD?Vtd5J(;mIktxL#bJ!c8!fVYF zI~+36t-JZS;uebiz?novZYnzmSi@yg@>GZgZe757U*2$9zLHNhPGr;>!)_-4+@v-pmw$CW;2-xyk$D8gyMFd&mYdhWf~8vprQ&QQsGe_Sl{b7&SY9{Mzy?nh zKi*wwECZ@#ShzEub}=5z>4C=)vtnCqe7(x9!&%8ep-a$dlU1fyvaSdRA`NbmO__vv zmx6xL{7(MZRmL8&B2$Y@kDRPg)aOSd8PbGnYXPkG2|TKC%h>6>aU*f##r(-*Gx(SzC3fba_{w%DZ(YqBXM3XUl}@Q5!xIQLvSHGJ3cb%;kJ0 z(TXD9wb|R|;z-l;tXHUazf)6HR~;>DcRO0h#7$b0o{Ycriwq9K%ZZ7ty@w>Wd+eOK zjlScX!)x9THrS8IZPx<96{l0|JAC9j5YvdM9nS0#04@4jyJKVOYR;hA<#x_R>WN@c z??t+6o5DV?meMKFpf=&ELbHNR56uLiI@ISn{w&~Nho-Dy{0L9HN2Rf4cgtm0 z*eyeIQYQm6E+@X=c}Qq`>CGhs&B?j*1!QO0sUvVMT;0A9YJ?|hX1iR93u;ZjxgkzE z-e5jYoZR7q*ED_v3NS(d_EHrRG-1evqzk+a>?R%+LKCz{o9;j%EgtF~ntsJr@mgP| z&0^+%yHQuVGj+;ksYxcBR=s@YCR<)U%IU0kTnP%GBezjXUlQTa>J*k*_dg=H^SVTg zqUEVd2U7dOx$+RUEB5G2j!Tb|I|#C)@Mb4BCmvoYK6O6ttpmMAMbXWJrhvMC=qNP} zgmP50tw`JXwb2H(OmwqK{5<4FmxGf7e9p9GdM!2IQuCGpI#MLKm>*0ilfMz=dg1ck z&e*94p1@N32|=)^+EOEIaiA3v3IhCz#YO@6dZaUia0(59)`qpOMS~I-SNM?|OPf=!j zJO)d)8S!*ritHngB2q-VJkCbcx>6LzhM2kfye?AEq-VI!Roqvi=br3`$hq|p{) zy|`nl+&sdVt`y;=@K)hokmv)KD8lKvjhk4WTCJcc;1EU75RK}AW9IJx310yYB~wuA z_5@+zpvy~d@ziB}_i*y)Mk?pPIbkE6OijA_pt*GfRfn)>Ji?lme4?ntxzSCz>~*o? zN1Teme;hym>3=vW7(Fy3&&vQ{LR1iCRZji}CD4J1qo|aRgK~4NOQSLnPof{wl?i`dMIf|Pr-bog$eP0u}#+>t%;FYMlZ0fDt_kQ7Xe}L!x{x z?k+&nKg)SqMD>RSJhbaXi{XQ@O3y}9$%#XMG@CcJ5AzsK@LDYp@9u1lq7>^-XUah` zs3D1;5g$fP@@|MTS0P=R+qXP9lxEtE@Laa^6v234ul!fDOLGaDY#sf(X&>?-@@fjffd z0^`MAl1tud9hAVW2~ox3t)$MX3k#oNWro!bi@=@IX@QUi_Z-WK>3b~%6c|!uWb$I4 zNQd>C%{o}9i(aEikJeBIU=F(4rf-co_k4Pmbc|74v~`oHsX29Sx`F6wgO=FrR1D%9 zNdv;RMVquq7;vefYnL01R4YbE+vJhN6S|n`)U-T;mp+`(N22Ch`pBSQ`f6lVP6;qqcfl(s8C2*Bcu(VplRG~XVdAH%rBg^Nya6TgGbUl!94RRDGi zcGK$`wZgf1Z|8L|MuVb!aAiWnt>4gD9kh%?5HH2IXzPdd!x)*jpOa()y~LKJkz~OT zb3{bMe0}Ms!WZ6I2-rjPYdFvuXxN9zstJE|r5fo|-gG7E!?em^1yFLY;pwCvR7;AI zdjxP+%k9_+Zw#R0&Z^sCQ}NN$;Pno1dTY&5My$;v0xT$j)+vy(=Ig}>oI8UztLt`i z&NASQv|mmo^+p>QK`;1dOip+B9lc96nh}hBUB0C*H=-WwZndiQ!9T6V$i!_=Uh)q^ z*`1})^V{Nlfce>1rGjY!(}ujb5$d+4X84r_&`1#lX+;v<`6*G!;w|0JzIR^1Y^*6u zveoCU$YP#cFj1abUc{|do9{t@;J6b&w~6^U2RDH>2#$i2c*2rS(t5kD&B&)L-g0g0 zk$Q!qsd_4J#s00yHTq|lu8*Mf(bvqDqk>^KjnTFlawQmT#CnJ*3-V6qwt*p9q0@sd zd}TNX8Iceyis$YC@~h-Ss@L&lPoElmj!u={+-es9PAYTJZJlJ42pmPa4@NJ48=&b0 zUGX7qb0CSEPo_o!^)SO7b5p%DHs;A2-{}y^YLdG7P!02z63kBftte-LlYHXt@Bwl4 zTQ9_6FG1Lx<^lqAIO3$=;>I&q(u{)UiK5NRkkTQ>@N^;_-iYi3YtT)!ll<@@jpJB| zpXN|SpU9JDg)lZYOB1XmjNU01aAN}Km~BJ}uJc}K8z2JfP65p*N)exUjc|ZdaFv*j zI#_s#QD=gtE^mT3Bha9^sbp9T)8~Mj1{91bH4`fhvDaZ{&3Ush+M)LK*jqdDlInRe)eQ-3BEFE;bIu%1^V}%=bho9Pi3c5a*_ckCuAzGY9aEh0t?h#RN zPrC(u`wZOt3$2yI+JQ$9b)D?n>%F3#U#>Y>Hbiz^zb78&o$`(qUi~iATN=f5r)Wu7 z^-;Erzr$!qaIE-ik&BpO>@y~30@$S6)Ln;H5<{2L`}GnJSRI4tDoj(Ji`zuyI*^>E ziM}B2u#94(^Gc{E$xOeEFPKWT>lrHu7q6$9&0*-u2K#;%FolP#y0oTZb`&RX5{+2B zDHYif&e)ilZ?xZ=Cmq!j6;N{7cCQ)nuIrO}{PoP%11D-k>|z{uy=LRiFr?lYk-j&4 zuz9@Xc~C(knK$lvuYQAH5Al2#-%FNaEB_ipb@r6Mg0_DqC$5!{)5+b{5cV*5Udi*s z4=oYc{10U9k1l99aCK7HEN;Ejd=Oo``RXx6g1tR&o8cTKK@gT%RBGYLLlcppcB=## zSEv*L*?OdEM48od{OXR!Y`QI(F~$0y;(Q^H2Ra5+l?WRb(iNZ;USE!8FIq# zA}Buw)tetQ(+8cv^qe$eohZiC64>VD10@w)gr2`~AEn0)1YijpR0YSoqV-H0#_bNkIv zLy2`r3k+;hTc@lAVuQ4Y@s)1|`*6=O@`V=IlQu_0cohin8o#<+Q$9W&$+wK$w=$-F z>@aRh&i;jmV)pXwGlC+Rx__@v&EO3y;0hc>3PIDlA4FfswNY|~BAY7vjPHea6ivma zYz-Z&gVZSVV(lU>plndTXQ++s)E%Vwy{T2E?$rMLjbFprO6^$bT<1#X(3ekqone;Hx~AHfhb11n z8lgwGg9S-0I?^T6Y9UtmifeX*d@rxpb6+R+f#*{%+c)zs9=KpUx*c<0G)%SoDW_g+ z8!EIo;bIr&9|2l4on64f`ug<}*3U*X&Uyl;4ET-jB`mC4|1hGiU^BO;ju3mNZx%FM zRZ)5Q{>?@PBpv(0ZMn-CRD7%DzBdSE@n$1<6dN6FdY0qkjRpjj6nan}`VNlP8U@nk zAfA2viz+&52TQ{1xZxGW4-EQ@l7k9aEXe)A0aaJ5nl7z;Ip_&{UC4i3+)$JO%P;Qj zF)Ox~8AUhA;lFuieuo z*db!S)TUgHtV&rC6)E8x$IAf;mJH7vIt*cD> zORT%Mv+sH1Ce3C`!v0jglV=f8MSxtZfG?tdZjy{mY|PZ0-EGXiOBlCT4&V1a`9pYP zh@0iPH;1IkUE)@HHn+_Stg*K@9$ID*F3*`A??-d>f#fq2w6~x0Ui!Ltfv}EmE*s}c zl&7ER!*Pc>2XMu+ch_&YS1sg-Iw-q46%uQ04dz-V+h56Ya*_zPmC2|POVs(ib7ZbE zYg>z(t%vp;iM#u9ohD={=E`VDT8lt|FMVdkhrFKEV6f~ZeGlGF2ler>+Wa$CcAtmk zAb|9LS6=-T8Db^iu|qEYp}h8vW={W7-iqJ)tlIA1^xq3;@*6UE^<2c&#so*iHDgc` zf9KLwJtgdMg6MrU`Gv+-2L(y4+QX`z2k#epJ)CZt+M9GbGTwMdN{;=+wP4-R=tcF! zy_$d_>NsXFgi=;+3UCjxbtXj}~IcwP!b^XFX_6wGt-w{d&sI~_3mp#ZS{hX-EZ=A z(FU_&E(gTacw8T3l9^`s!`KoREpM0-2EFT_rewkkQ4POV(t1b)#S1w|n~6+1*BKPE z_S~i1{7gNT{&n%%JcZfVB55k&=OiMqi@7wLxD+FFck6N2#b+Iys~4U_OuzG;%h=xj+rmMgiG6|j4Hh7t|8Kui)O+k^?%!-6`wY4%Tp5(; zlOcG7Zc~eYJzKbMHxk9IA3Z0g6-fO7XJ=cK z3NMi20$b{^D`>#=xUJ7tT7p>f+A@3Zdj|jQ$Yxj<|NPiuR^Y??0eA;R;bmzml+Ull zUA=^>7f#%-btiM<%P2`ey#3xv>2;gzWjKN;VEwA*%es8!Ywu$nT!X(Rs|!sXlF=TR zM&LQc*E2sUVOv~g$+8IZb~C(u?*7qIVq3w0ibLwL7+PLo&zJ3v&b547=Zw2lU$A|a z2Tdvlq#n^Ps_&!|>iH4g@Sh?atlZ20*PN*`x z7q@R(;QTh^PIw3r{R)=$3C4;jIoPIeAmz_&!sDRe;CBg5Td%pANM-uT&NzL%%cEO{ z<3bB4ghfk)T&H1MnHQHTEEpD?pm&iZVocs*)8o;U`8_W6h!y$Z zn7iw?cg`w5D<6{Xc2L7yn(Q?=wqNbVhr1?vkD)9k$7<`zZq=F9IG5Y9h%z@+8eq1c zDa>AiB;5^DofLZ;=|p2`H*V@-iMA9bUz(VI(?6jfzAFcZ{ptK^8s_x#0%k}3_r>dn z`C|%kH2eQ2&>xFNc(jpn>wV&m1w{kANt8zU(Zvo$mgi z3=w!HaoEy@N;%!C{Zd5^*}PudBAh>VHP6BK7IR5}de1GN*UFi-`M3! zH6{C2QstT(r;Ff^)-XLSL zY_|$SyO-{^8%4%IPP@FVW|42d%i#2Dt=?m>_JD+M&D=1~J63j_CeFc_<=)Ko8v15i z+nj((o9ZW}A~G=CQa8UTDXfGz0>y(8Gp+00SR z%-I=iXW_*4%X@B46R_QiPM_oS{hPV9EmVhVjySLU11pw)%ea}_`&&EF8y+z;V!aHd z@YOOYwG&zI=K1<^4h9U_w4{|tP_Lkb?#^Cy;hdjtG3v^>Ph;`e=m8y@!m*P6KsHL} z;N2XUwS7F_c)I8Pnu)kwD*wPK-qGA=55cbm2F#IW9#4iy({p1ohHY;1+Ea(o^Cm?R z+X}z#BYE?3utP%)>|@${96UHOqDFOKV4GTkmL>pmx&-&|tI?19Ub6M0P^@8k)6|Av zM48)v5>a;|%kNEpi_l4b#M~B->r-MK8*X|+dcO5}Hh zJY`t-L4tGok)nYV6nan!2kg^FAm*Z@kMku$q=#_6!=O*Mds5i?cYL zE7DF0WUTwTKFFHTctus)9q~r#<-m(4k;GmK+R{(1nPRg>*=pSG@3KyPXu4Cu+tepf zCTbWJ%|A>}kv@N> zlcNx;i7u)_*s zxAOPw7e;$b7t^eKQ`8+~f)x@Eu@|7lZ6h?x0sMX1yGO%fi*37(EuvWJ+%I)6>)yzb zUe2~&zovO5cz(b6odYAc2iLWjjN{FR!UoFkbZKJemD{tq8iW&Fsk7>yrZT2rPe?%< z+np5AmNb?`mYN8bwkm&oqlQ$a)2mk9JEsDB#smD3qc^S&wC^3p@F~waHE+=mMH;rb zyWMpsfgA}Ix~o4|>NvieW#VybUHyK+9T?Lvg!)7Knp@UIqU2j+6Kv%8*o2Y|{nYZs z&jJ~|7_4$uSZXYJlD)BGeB+|p-|+Ry-2KSC%Xn`!dDz^*m^tSNR!(ct8u7wp6caM8 z$~A=6w!O0Fm`DMAmU`Qzx13+9kHI1w1+{ki_U8$hc8oBJTfvSxb z`$Ixihr*A=L%oM(itJOJVZ#sdP8Q02v~?Svt+Lhkzwg+i``4Or;UWhRk^N_!mRio_ z{tRH~#PEK1LH=0Tzx|{q2?5p*J7*(xcY8A@gKviKslv|yS=+u$cmTi>U@33>G@2OL zdm1^K**I}=e*6CGKpuQr>=s~v05F*Tr-75Q?RyaVPtmMiQUwYDbbSFH;Tz}vcs;%LJKFC=ee-7k_82>ZA$EUB+I}E&{WE|& zqqx6^!v6s42N?E^v|nLQ)W@0|G+Vr(cH*#!K}Zvtcgi3$VyA0VC>yF*-@e-hj8AMyVshkiun_zBtU z_J4xRegD6Jw!8BmLI1Uq{7CiB{BUFVPoM?8LOg|w1ljiT5`uiL1 z|E0Fcu>A?%4~xVNAhhsrH2)~K@3ZdLRpRw3;UVE=EUf#4-;M!)d^z&`J>GY%{T0p> zuYjl$ATJ&u?`OC+!M}(5E~a1M=*??#Qvof-2EwU7!&Qs^J=~uvDM&`7|1&U^h5;e` z3>Wk02e^Mur|-=BVIuuX-CyfZo!k#_|C~errt^G%Ddp|y;FL|^xpn^Sxm)G`1o;Ok zf7i)h30(|f6!HMzEdNc&TgrbA$NP=MU*YJG7?MdqX9TE!Wn;Gb-@|=>;$Pv$bdqk0 z13FU+*t?&lQm^~>aNkYTuW%GEbPRC;I150~Kf?(c{yp6H75-Pa541-i8oz+1pr@PVed{^0BbKeF1xfA6|5pSXlpx zC^}oZ*qYcGgKapi?9D8GCGXcffIm=dZ(aDly!@IK@GHWvhai6-l#~CC@Y9jVufueu1F#svNVSh({~+W+SW!Bd6HSH6v82LAB^=AG!?1>oKP1CIlbRR910 diff --git a/_deprecated_sources/EXAMPLES/Makefile b/_deprecated_sources/EXAMPLES/Makefile deleted file mode 100644 index d581b0f8b..000000000 --- a/_deprecated_sources/EXAMPLES/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -SHELL = /bin/sh - -CC = oshcc -CFLAGS = -Wall -O3 - -RUNCMD=oshrun -NPROCOPT=-np - -C_TESTS = $(wildcard *.c) -C_EXES = $(C_TESTS:.c=) -EXES = $(C_EXES) - -all default: $(EXES) - -run-hello: hello-openshmem - $(RUNCMD) $(NPROCOPT) 2 ./hello-openshmem - -run-cswap: shmem_cswap_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_cswap_example - -run-fadd: shmem_fadd_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_fadd_example - -run-finc: shmem_finc_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_finc_example - -run-g: shmem_g_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_g_example - -run-inc: shmem_inc_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_inc_example - -run-iput: shmem_iput_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_iput_example - -run-lock: shmem_lock_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_lock_example - -run-mype: shmem_mype_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_mype_example - -run-npes: shmem_npes_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_npes_example - -run-p: shmem_p_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_p_example - -run-ptr: shmem_ptr_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_ptr_example - -run-put: shmem_put_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_put_example - -run-shmalloc: shmem_shmalloc_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_shmalloc_example - -run-swap: shmem_swap_example - $(RUNCMD) $(NPROCOPT) 2 ./shmem_swap_example - -run-writing: writing_shmem_example - $(RUNCMD) $(NPROCOPT) 2 ./writing_shmem_example - -run-barrierall: shmem_barrierall_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_barrierall_example - -run-barrier: shmem_barrier_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_barrier_example - -run-broadcast: shmem_broadcast_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_broadcast_example - -run-collect: shmem_collect_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_collect_example - -run-fence: shmem_fence_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_fence_example - -run-quiet: shmem_quiet_example - $(RUNCMD) $(NPROCOPT) 4 ./shmem_quiet_example - -run: all run-hello run-barrierall run-barrier run-broadcast run-collect run-cswap run-fadd run-fence run-finc run-g run-inc run-iput run-lock run-mype run-npes run-p run-ptr run-put run-quiet run-shmalloc run-swap run-writing - -clean: - rm -f $(EXES) diff --git a/_deprecated_sources/EXAMPLES/hello-openshmem-c.output b/_deprecated_sources/EXAMPLES/hello-openshmem-c.output deleted file mode 100644 index 5509dc3b2..000000000 --- a/_deprecated_sources/EXAMPLES/hello-openshmem-c.output +++ /dev/null @@ -1,4 +0,0 @@ -Hello from 0 of 4 -Hello from 2 of 4 -Hello from 3 of 4 -Hello from 1 of 4 diff --git a/_deprecated_sources/EXAMPLES/hello-openshmem-f90.output b/_deprecated_sources/EXAMPLES/hello-openshmem-f90.output deleted file mode 100644 index e2f8b4075..000000000 --- a/_deprecated_sources/EXAMPLES/hello-openshmem-f90.output +++ /dev/null @@ -1,4 +0,0 @@ -Hello from 0 of 4 -Hello from 2 of 4 -Hello from 3 of 4 -Hello from 1 of 4 diff --git a/_deprecated_sources/EXAMPLES/hello-openshmem.c b/_deprecated_sources/EXAMPLES/hello-openshmem.c deleted file mode 100644 index 8102cee6d..000000000 --- a/_deprecated_sources/EXAMPLES/hello-openshmem.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include /* The shmem header file */ - -int -main (int argc, char *argv[]) -{ - int nprocs, me; - - shmem_init (); - nprocs = shmem_n_pes (); - me = shmem_my_pe (); - printf ("Hello from %d of %d\n", me, nprocs); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/hello-openshmem.f90 b/_deprecated_sources/EXAMPLES/hello-openshmem.f90 deleted file mode 100644 index c3d16efd4..000000000 --- a/_deprecated_sources/EXAMPLES/hello-openshmem.f90 +++ /dev/null @@ -1,16 +0,0 @@ -program hello - - include 'shmem.fh' - integer :: shmem_my_pe, shmem_n_pes - - integer :: npes, me - - call shmem_init () - npes = shmem_n_pes () - me = shmem_my_pe () - - write (*, 1000) me, npes - - 1000 format ('Hello from', 1X, I4, 1X, 'of', 1X, I4) - -end program hello diff --git a/_deprecated_sources/EXAMPLES/shmem_add_example.c b/_deprecated_sources/EXAMPLES/shmem_add_example.c deleted file mode 100644 index d7c02c2c1..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_add_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(void) -{ - int me, old; - static int dst; - - shmem_init(); - me = shmem_my_pe(); - - old = -1; - dst = 22; - shmem_barrier_all(); - - if (me == 1){ - old = shmem_int_fadd(&dst, 44, 0); - } - shmem_barrier_all(); - printf("%d: old = %d, dst = %d\n", me, old, dst); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_and_example.f90 b/_deprecated_sources/EXAMPLES/shmem_and_example.f90 deleted file mode 100644 index 6f9c339b3..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_and_example.f90 +++ /dev/null @@ -1,22 +0,0 @@ -INCLUDE "shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -INTEGER*4 PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -INTEGER FOO, FOOAND -SAVE FOO, FOOAND, PWRK -INTRINSIC SHMEM_MY_PE() - -FOO = SHMEM_MY_PE() -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - IF ( MOD(SHMEM_N_PES()(),2) .EQ. 0) THEN - CALL SHMEM_INT8_AND_TO_ALL(FOOAND, FOO, NR, 0, 1, NPES/2, & - PWRK, PSYNC) - ELSE - CALL SHMEM_INT8_AND_TO_ALL(FOOAND, FOO, NR, 0, 1, NPES/2+1, & - PWRK, PSYNC) - - ENDIF - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOAND -ENDIF diff --git a/_deprecated_sources/EXAMPLES/shmem_barrier_example.c b/_deprecated_sources/EXAMPLES/shmem_barrier_example.c deleted file mode 100644 index 5b205d73a..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_barrier_example.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -long pSync[_SHMEM_BARRIER_SYNC_SIZE]; -int x = 10101; - -int main(void) -{ - int i, me, npes; - - for (i = 0; i < _SHMEM_BARRIER_SYNC_SIZE; i += 1){ - pSync[i] = _SHMEM_SYNC_VALUE; - } - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - - if(me % 2 == 0){ - x = 1000 + me; - /*put to next even PE in a circular fashion*/ - shmem_int_p(&x, 4, (me+2)%npes); - /*synchronize all even pes*/ - shmem_barrier(0, 1, (npes/2 + npes%2), pSync); - } - printf("%d: x = %d\n", me, x); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_barrierall_example.c b/_deprecated_sources/EXAMPLES/shmem_barrierall_example.c deleted file mode 100644 index 5e4f430a9..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_barrierall_example.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -int x=1010; - -int main(void) -{ - int me, npes; - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - - /*put to next PE in a circular fashion*/ - shmem_int_p(&x, 4, (me+1)%npes); - /*synchronize all PEs*/ - shmem_barrier_all(); - - printf("%d: x = %d\n", me, x); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_broadcast_example.c b/_deprecated_sources/EXAMPLES/shmem_broadcast_example.c deleted file mode 100644 index c32212bd2..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_broadcast_example.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include - -#define NUM_ELEMS 4 -long pSync[_SHMEM_BCAST_SYNC_SIZE]; -long source[NUM_ELEMS], dest[NUM_ELEMS]; - -int main(void) -{ - int i, me, npes; - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - - if (me == 0) - for (i = 0; i < NUM_ELEMS; i++) - source[i] = i; - for (i=0; i < _SHMEM_BCAST_SYNC_SIZE; i++) { - pSync[i] = _SHMEM_SYNC_VALUE; - } - shmem_barrier_all(); /* Wait for all PEs to initialize pSync */ - - shmem_broadcast64(dest, source, NUM_ELEMS, 4, 5, 0, 3, pSync); - printf("%d: %ld", me, dest[0]); - for (i = 1; i < NUM_ELEMS; i++) - printf(", %ld", dest[i]); - printf("\n"); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_broadcast_example.f90 b/_deprecated_sources/EXAMPLES/shmem_broadcast_example.f90 deleted file mode 100644 index 1f914bc25..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_broadcast_example.f90 +++ /dev/null @@ -1,10 +0,0 @@ -INTEGER PSYNC(SHMEM_BCAST_SYNC_SIZE) -INTEGER DEST, SOURCE, NLONG, PE_ROOT, PE_START, -& LOGPE_STRIDE, PE_SIZE, PSYNC -COMMON /COM/ DEST, SOURCE - -DATA PSYNC /SHMEM_BCAST_SYNC_SIZE*SHMEM_SYNC_VALUE/ - -CALL SHMEM_BROADCAST64(DEST, SOURCE, NLONG, 0, 4, 0, 4, PSYNC) - - diff --git a/_deprecated_sources/EXAMPLES/shmem_collect_example.c b/_deprecated_sources/EXAMPLES/shmem_collect_example.c deleted file mode 100644 index 0461f2e03..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_collect_example.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include - -long pSync[_SHMEM_COLLECT_SYNC_SIZE]; -int source[2]; - -int main(void) -{ - int i, me, npes; - int *dest; - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - - source[0] = me * 2; - source[1] = me * 2 + 1; - dest = (int *)shmem_malloc(sizeof(int) * npes * 2); - for (i=0; i < _SHMEM_COLLECT_SYNC_SIZE; i++) { - pSync[i] = _SHMEM_SYNC_VALUE; - } - shmem_barrier_all(); /* Wait for all PEs to initialize pSync */ - - shmem_collect32(dest, source, 2, 0, 0, npes, pSync); - printf("%d: %d", me, dest[0]); - for (i = 1; i < npes * 2; i++) - printf(", %d", dest[i]); - printf("\n"); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_collect_example.f90 b/_deprecated_sources/EXAMPLES/shmem_collect_example.f90 deleted file mode 100644 index 4fab7afde..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_collect_example.f90 +++ /dev/null @@ -1,5 +0,0 @@ -INTEGER PSYNC(SHMEM_COLLECT_SYNC_SIZE) -DATA PSYNC /SHMEM_COLLECT_SYNC_SIZE*SHMEM_SYNC_VALUE/ - -CALL SHMEM_COLLECT4(DEST, SOURCE, 64, PE_START, LOGPE_STRIDE, -& PE_SIZE, PSYNC) diff --git a/_deprecated_sources/EXAMPLES/shmem_cswap_example.c b/_deprecated_sources/EXAMPLES/shmem_cswap_example.c deleted file mode 100644 index f49e79d2d..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_cswap_example.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include - -int main(void) -{ - static int race_winner = -1; - int oldval; - shmem_init(); - oldval = shmem_int_cswap(&race_winner, -1, shmem_my_pe(), 0); - if(oldval == -1) printf("pe %d was first\n",shmem_my_pe()); - return 1; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_fadd_example.c b/_deprecated_sources/EXAMPLES/shmem_fadd_example.c deleted file mode 100644 index d7c02c2c1..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_fadd_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(void) -{ - int me, old; - static int dst; - - shmem_init(); - me = shmem_my_pe(); - - old = -1; - dst = 22; - shmem_barrier_all(); - - if (me == 1){ - old = shmem_int_fadd(&dst, 44, 0); - } - shmem_barrier_all(); - printf("%d: old = %d, dst = %d\n", me, old, dst); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_fence_example.c b/_deprecated_sources/EXAMPLES/shmem_fence_example.c deleted file mode 100644 index b5ddbaa88..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_fence_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -long dest[10] = {0}; -int targ = 0; - -int main(void) -{ - long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - int src = 99; - shmem_init(); - if (shmem_my_pe() == 0) { - shmem_long_put(dest, source, 10, 1); /*put1*/ - shmem_long_put(dest, source, 10, 2); /*put2*/ - shmem_fence(); - shmem_int_put(&targ, &src, 1, 1); /*put3*/ - shmem_int_put(&targ, &src, 1, 2); /*put4*/ - } - shmem_barrier_all(); /* sync sender and receiver */ - printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); - return 1; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_finalize_example.c b/_deprecated_sources/EXAMPLES/shmem_finalize_example.c deleted file mode 100644 index 0412810de..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_finalize_example.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -long x = 10101; - -int main(void) { - int me, npes; - long y = -1; - - shmem_init(); - - me = shmem_my_pe(); - npes = shmem_n_pes(); - if (me == 0) - y = shmem_long_g(&x, npes-1); - - printf("%d: y = %ld\n", me, y); - - shmem_finalize(); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_finc_example.c b/_deprecated_sources/EXAMPLES/shmem_finc_example.c deleted file mode 100644 index 86d265b84..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_finc_example.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -int dst; - -int main(void) -{ - int me; - int old; - - shmem_init(); - me = shmem_my_pe(); - - old = -1; - dst = 22; - shmem_barrier_all(); - - if (me == 0) - old = shmem_int_finc(&dst, 1); - - shmem_barrier_all(); - printf("%d: old = %d, dst = %d\n", me, old, dst); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_g_example.c b/_deprecated_sources/EXAMPLES/shmem_g_example.c deleted file mode 100644 index 0fb01446a..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_g_example.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -long x = 10101; - -int main(void) -{ - int me, npes; - long y = -1; - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - - if (me == 0) - y = shmem_long_g(&x, npes-1); - - printf("%d: y = %ld\n", me, y); - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_get_example.f90 b/_deprecated_sources/EXAMPLES/shmem_get_example.f90 deleted file mode 100644 index 08b165d74..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_get_example.f90 +++ /dev/null @@ -1,15 +0,0 @@ -PROGRAM REDUCTION -REAL VALUES, SUM -COMMON /C/ VALUES -REAL WORK -CALL SHMEM_INIT() ! ALLOW ANY NUMBER OF PES -VALUES = SHMEM_MY_PE() ! INITIALIZE IT TO SOMETHING -CALL SHMEM_BARRIER_ALL -SUM = 0.0 -DO I = 0, SHMEM_N_PES()-1 - CALL SHMEM_REAL_GET(WORK, VALUES, (SHMEM_N_PES()()-1), I) - SUM = SUM + WORK -ENDDO -PRINT*,'PE ',SHMEM_MY_PE(),' COMPUTED SUM=',SUM -CALL SHMEM_BARRIER_ALL -END diff --git a/_deprecated_sources/EXAMPLES/shmem_global_exit_example.c b/_deprecated_sources/EXAMPLES/shmem_global_exit_example.c deleted file mode 100644 index 71c5f9fef..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_global_exit_example.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include - -int -main(void) -{ - int me, npes; - - shmem_init(); - - me = shmem_my_pe(); - npes = shmem_n_pes(); - - if (me == 0) { - FILE *fp = fopen("input.txt", "r"); - - if (fp == NULL) { /* Input file required by program is not available */ - shmem_global_exit(EXIT_FAILURE); - } - - /* do something with the file */ - - fclose(fp); - } - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_iget_example.f90 b/_deprecated_sources/EXAMPLES/shmem_iget_example.f90 deleted file mode 100644 index 019e9ca0d..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_iget_example.f90 +++ /dev/null @@ -1,11 +0,0 @@ -PROGRAM STRIDELOGICAL -LOGICAL SOURCE(10), DEST(5) -SAVE SOURCE ! SAVE MAKES IT REMOTELY ACCESSIBLE -DATA SOURCE /.T.,.F.,.T.,.F.,.T.,.F.,.T.,.F.,.T.,.F./ -DATA DEST / 5*.F. / -CALL SHMEM_INIT() -IF (SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_LOGICAL_IGET(DEST, SOURCE, 1, 2, 5, 1) - PRINT*,'DEST AFTER SHMEM_LOGICAL_IGET:',DEST -ENDIF -CALL SHMEM_BARRIER_ALL diff --git a/_deprecated_sources/EXAMPLES/shmem_inc_example.c b/_deprecated_sources/EXAMPLES/shmem_inc_example.c deleted file mode 100644 index f8992c645..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_inc_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int dst; - -int main(void) -{ - int me; - - shmem_init(); - me = shmem_my_pe(); - - dst = 74; - shmem_barrier_all(); - - if (me == 0) - shmem_int_inc(&dst, 1); - shmem_barrier_all(); - - printf("%d: dst = %d\n", me, dst); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_init_example.f90 b/_deprecated_sources/EXAMPLES/shmem_init_example.f90 deleted file mode 100644 index 65b32f5db..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_init_example.f90 +++ /dev/null @@ -1,21 +0,0 @@ -PROGRAM PUT - -INTEGER TARG, SRC, RECEIVER, BAR -COMMON /T/ TARG -PARAMETER (RECEIVER=1) -CALL SHMEM_INIT() - -IF (SHMEM_MY_PE() .EQ. 0) THEN - SRC = 33 - CALL SHMEM_INTEGER_PUT(TARG, SRC, 1, RECEIVER) -ENDIF - -CALL SHMEM_BARRIER_ALL ! SYNCHRONIZES SENDER AND RECEIVER - -IF (SHMEM_MY_PE() .EQ. RECEIVER) THEN - PRINT*,'PE ', SHMEM_MY_PE(),' TARG=',TARG,' (expect 33)' -ENDIF - -CALL SHMEM_FINALIZE() - -END diff --git a/_deprecated_sources/EXAMPLES/shmem_iput_example.c b/_deprecated_sources/EXAMPLES/shmem_iput_example.c deleted file mode 100644 index d48f88176..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_iput_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(void) -{ - short source[10] = { 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10 }; - static short dest[10]; - shmem_init(); - if (shmem_my_pe() == 0) { - /* put 5 words into dest on PE 1 */ - shmem_short_iput(dest, source, 1, 2, 5, 1); - } - shmem_barrier_all(); /* sync sender and receiver */ - if (shmem_my_pe() == 1) { - printf("dest on PE %d is %d %d %d %d %d\n", shmem_my_pe(), - (int)dest[0], (int)dest[1], (int)dest[2], - (int)dest[3], (int)dest[4] ); - } - shmem_barrier_all(); /* sync before exiting */ - return 1; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_lock_example.c b/_deprecated_sources/EXAMPLES/shmem_lock_example.c deleted file mode 100644 index 838e43ecf..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_lock_example.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include -long L = 0; - -int main(int argc, char **argv) -{ - int me, slp; - shmem_init(); - me = shmem_my_pe(); - slp = 1; - shmem_barrier_all(); - if (me == 1) - sleep (3); - shmem_set_lock(&L); - printf("%d: sleeping %d second%s...\n", me, slp, slp == 1 ? "" : "s"); - sleep(slp); - printf("%d: sleeping...done\n", me); - shmem_clear_lock(&L); - shmem_barrier_all(); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_max_example.f90 b/_deprecated_sources/EXAMPLES/shmem_max_example.f90 deleted file mode 100644 index 26918897c..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_max_example.f90 +++ /dev/null @@ -1,14 +0,0 @@ -INCLUDE "shmem.fh" -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL FOO, FOOMAX, PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -COMMON /COM/ FOO, FOOMAX, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_REAL8_MAX_TO_ALL(FOOMAX, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOMAX -ENDIF - diff --git a/_deprecated_sources/EXAMPLES/shmem_min_example.f90 b/_deprecated_sources/EXAMPLES/shmem_min_example.f90 deleted file mode 100644 index f7f3ddcbe..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_min_example.f90 +++ /dev/null @@ -1,14 +0,0 @@ -INCLUDE "shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL FOO, FOOMIN, PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -COMMON /COM/ FOO, FOOMIN, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_REAL8_MIN_TO_ALL(FOOMIN, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOMIN -ENDIF diff --git a/_deprecated_sources/EXAMPLES/shmem_mype_example.c b/_deprecated_sources/EXAMPLES/shmem_mype_example.c deleted file mode 100644 index 762d56a43..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_mype_example.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -int main(void) -{ - int me; - - shmem_init(); - me = shmem_my_pe(); - printf("My PE id is: %d\n", me); - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_npes_example.c b/_deprecated_sources/EXAMPLES/shmem_npes_example.c deleted file mode 100644 index 788abda7d..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_npes_example.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -int main(void) -{ - int npes; - - shmem_init(); - - npes = shmem_n_pes(); - - if (shmem_my_pe() == 0) { - printf("Number of PEs executing this program is: %d\n", npes); - } - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_or_example.f90 b/_deprecated_sources/EXAMPLES/shmem_or_example.f90 deleted file mode 100644 index 84b5dd1c9..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_or_example.f90 +++ /dev/null @@ -1,15 +0,0 @@ -INCLUDE "mpp/shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -INTEGER FOO, FOOOR -COMMON /COM/ FOO, FOOOR, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_INT8_OR_TO_ALL(FOOOR, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOOR -ENDIF diff --git a/_deprecated_sources/EXAMPLES/shmem_p_example.c b/_deprecated_sources/EXAMPLES/shmem_p_example.c deleted file mode 100644 index 740f9285d..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_p_example.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include -static const double e = 2.71828182; -static const double epsilon = 0.00000001; - -int main(void) -{ - double *f; - int me; - - shmem_init(); - me = shmem_my_pe(); - f = (double *) shmem_malloc(sizeof (*f)); - - *f = 3.1415927; - shmem_barrier_all(); - - if (me == 0) - shmem_double_p(f, e, 1); - - shmem_barrier_all(); - if (me == 1) - printf("%s\n", (fabs (*f - e) < epsilon) ? "OK" : "FAIL"); - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_prod_example.f90 b/_deprecated_sources/EXAMPLES/shmem_prod_example.f90 deleted file mode 100644 index db1d1f1cb..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_prod_example.f90 +++ /dev/null @@ -1,14 +0,0 @@ -INCLUDE "shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL FOO, FOOPROD, PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -COMMON /COM/ FOO, FOOPROD, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_COMP8_PROD_TO_ALL(FOOPROD, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOPROD -ENDIF diff --git a/_deprecated_sources/EXAMPLES/shmem_ptr_example.c b/_deprecated_sources/EXAMPLES/shmem_ptr_example.c deleted file mode 100644 index 217b26b61..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_ptr_example.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -int main(void) -{ - static int bigd[100]; - int *ptr; - int i; - - shmem_init(); - - if (shmem_my_pe() == 0) { - /* initialize PE 1's bigd array */ - ptr = shmem_ptr(bigd, 1); - if (ptr == NULL) - printf("can't use pointer to directly access PE 1's array\n"); - else - for (i=0; i<100; i++) - *ptr++ = i+1; - } - - shmem_barrier_all(); - - if (shmem_my_pe() == 1) { - printf("bigd on PE 1 is:\n"); - for (i=0; i<100; i++) - printf(" %d\n",bigd[i]); - printf("\n"); - } - return 1; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_ptr_example.f90 b/_deprecated_sources/EXAMPLES/shmem_ptr_example.f90 deleted file mode 100644 index c7bba2866..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_ptr_example.f90 +++ /dev/null @@ -1,29 +0,0 @@ -PROGRAM REMOTEWRITE -INCLUDE 'shmem.fh' - -INTEGER BIGD(100) -SAVE BIGD - -INTEGER POINTEE(*) -POINTER (PTR,POINTEE) - -CALL SHMEM_INIT() - - -IF (SHMEM_MY_PE() .EQ. 0) THEN - ! initialize PE 1's BIGD array - PTR = SHMEM_PTR(BIGD, 1) ! get address of PE 1's BIGD - ! array - DO I=1,100 - POINTEE(I) = I - ENDDO -ENDIF - -CALL SHMEM_BARRIER_ALL - -IF (SHMEM_MY_PE() .EQ. 1) THEN - PRINT*,'BIGD on PE 1 is: ' - PRINT*,BIGD -ENDIF -END - diff --git a/_deprecated_sources/EXAMPLES/shmem_put_example.c b/_deprecated_sources/EXAMPLES/shmem_put_example.c deleted file mode 100644 index 50b6d38c0..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_put_example.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -int main(void) -{ - long source[10] = { 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10 }; - static long dest[10]; - shmem_init(); - if (shmem_my_pe() == 0) { - /* put 10 words into dest on PE 1 */ - shmem_long_put(dest, source, 10, 1); - } - shmem_barrier_all(); /* sync sender and receiver */ - printf("dest[0] on PE %d is %ld\n", shmem_my_pe(), dest[0]); - return 1; -} - diff --git a/_deprecated_sources/EXAMPLES/shmem_quiet_example.c b/_deprecated_sources/EXAMPLES/shmem_quiet_example.c deleted file mode 100644 index fb258a675..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_quiet_example.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include - -long dest[3] = {0}; -int targ = 0; -long source[3] = {1, 2, 3}; -int src = 90; - -int main(void) -{ - long x[3] = {0}; - int y = 0; - - shmem_init(); - if (shmem_my_pe() == 0) { - shmem_long_put(dest, source, 3, 1); /*put1*/ - shmem_int_put(&targ, &src, 1, 2); /*put2*/ - - shmem_quiet(); - - shmem_long_get(x, dest, 3, 1); /*gets updated value from dest on PE 1 to local array x */ - shmem_int_get(&y, &targ, 1, 2); /*gets updated value from targ on PE 2 to local variable y*/ - printf("x: {%ld,%ld,%ld}\n",x[0],x[1],x[2]); /*x: {1,2,3}*/ - printf("y: %d\n", y); /*y: 90*/ - - shmem_int_put(&targ, &src, 1, 1); /*put3*/ - shmem_int_put(&targ, &src, 1, 2); /*put4*/ - } - shmem_barrier_all(); /* sync sender and receiver */ - return 0; -} - diff --git a/_deprecated_sources/EXAMPLES/shmem_quiet_example.f90 b/_deprecated_sources/EXAMPLES/shmem_quiet_example.f90 deleted file mode 100644 index b2057910b..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_quiet_example.f90 +++ /dev/null @@ -1,21 +0,0 @@ -PROGRAM COMPFLAG -INTEGER FLAG_VAR, ARRAY(100), RECEIVER, SENDER -COMMON/FLAG/FLAG_VAR -COMMON/DATA/ARRAY -INTRINSIC SHMEM_MY_PE() - -FLAG_VAR = 0 -CALL SHMEM_BARRIER_ALL ! wait for FLAG_VAR to be initialized - -SENDER = 0 ! PE 0 sends the data -RECEIVER = 1 ! PE 1 receives the data -IF (SHMEM_MY_PE() .EQ. 0) THEN - ARRAY = 33 - CALL SHMEM_PUT(ARRAY, ARRAY, 100, RECEIVER) ! start sending data - CALL SHMEM_QUIET ! wait for delivery - CALL SHMEM_PUT(FLAG_VAR, 1, 1, RECEIVER) ! send completion flag -ELSE IF (SHMEM_MY_PE() .EQ. RECEIVER) THEN - CALL SHMEM_WAIT(FLAG_VAR, 0) - PRINT*,ARRAY ! ARRAY has been delivered -ENDIF -END diff --git a/_deprecated_sources/EXAMPLES/shmem_shmalloc_example.c b/_deprecated_sources/EXAMPLES/shmem_shmalloc_example.c deleted file mode 100644 index 22dabf588..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_shmalloc_example.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -int main(void) -{ - int *target; - int source; - - shmem_init(); - - source = shmem_my_pe(); - target = shmem_malloc(sizeof(int)); /*symmetric data object on heap*/ - - shmem_int_put(target, &source, 1, (source + 1)% shmem_n_pes()); - shmem_barrier_all(); - printf("On PE%d value of target is %d\n",source,*target); - - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_startpes_example.f90 b/_deprecated_sources/EXAMPLES/shmem_startpes_example.f90 deleted file mode 100644 index 3a7629464..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_startpes_example.f90 +++ /dev/null @@ -1,18 +0,0 @@ -PROGRAM PUT - -INTEGER TARG, SRC, RECEIVER, BAR -COMMON /T/ TARG -PARAMETER (RECEIVER=1) -CALL START_PES(0) - -IF (SHMEM_MY_PE() .EQ. 0) THEN - SRC = 33 - CALL SHMEM_INTEGER_PUT(TARG, SRC, 1, RECEIVER) -ENDIF - -CALL SHMEM_BARRIER_ALL ! SYNCHRONIZES SENDER AND RECEIVER - -IF (SHMEM_MY_PE() .EQ. RECEIVER) THEN - PRINT*,'PE ', SHMEM_MY_PE(),' TARG=',TARG,' (expect 33)' -ENDIF -END diff --git a/_deprecated_sources/EXAMPLES/shmem_sum_example.f90 b/_deprecated_sources/EXAMPLES/shmem_sum_example.f90 deleted file mode 100644 index bf4b87582..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_sum_example.f90 +++ /dev/null @@ -1,14 +0,0 @@ -INCLUDE "shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL FOO, FOOSUM, PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -COMMON /COM/ FOO, FOOSUM, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_INT4_SUM_TO_ALL(FOOSUM, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOSUM -ENDIF diff --git a/_deprecated_sources/EXAMPLES/shmem_swap_example.c b/_deprecated_sources/EXAMPLES/shmem_swap_example.c deleted file mode 100644 index f868015ea..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_swap_example.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -int main(void) -{ - long *dest; - int me, npes; - long swapped_val, new_val; - - shmem_init(); - me = shmem_my_pe(); - npes = shmem_n_pes(); - dest = (long *) shmem_malloc(sizeof (*dest)); - *dest = me; - shmem_barrier_all(); - new_val = me; - if (me & 1){ - swapped_val = shmem_long_swap(dest, new_val, (me + 1) % npes); - printf("%d: dest = %ld, swapped = %ld\n", me, *dest, swapped_val); - } - shmem_free(dest); - return 0; -} diff --git a/_deprecated_sources/EXAMPLES/shmem_wait1_example.f90 b/_deprecated_sources/EXAMPLES/shmem_wait1_example.f90 deleted file mode 100644 index 3d93e56f5..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_wait1_example.f90 +++ /dev/null @@ -1,2 +0,0 @@ -INTEGER*8 IVAR -CALL SHMEM_INT8_WAIT(IVAR, INTEGER*8(100)) diff --git a/_deprecated_sources/EXAMPLES/shmem_wait2_example.f90 b/_deprecated_sources/EXAMPLES/shmem_wait2_example.f90 deleted file mode 100644 index 9870781ca..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_wait2_example.f90 +++ /dev/null @@ -1,2 +0,0 @@ -INTEGER*8 IVAR -CALL SHMEM_INT8_WAIT_UNTIL(IVAR, SHMEM_CMP_NE, INTEGER*8(100)) diff --git a/_deprecated_sources/EXAMPLES/shmem_wait3_example.f90 b/_deprecated_sources/EXAMPLES/shmem_wait3_example.f90 deleted file mode 100644 index 16c3cd57b..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_wait3_example.f90 +++ /dev/null @@ -1,4 +0,0 @@ -#include #include - -int ivar; -shmem_int_wait_until(&ivar, SHMEM_CMP_LT, 0); diff --git a/_deprecated_sources/EXAMPLES/shmem_wait4_example.f90 b/_deprecated_sources/EXAMPLES/shmem_wait4_example.f90 deleted file mode 100644 index fc30fcf47..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_wait4_example.f90 +++ /dev/null @@ -1,12 +0,0 @@ -SUBROUTINE EXAMPLE() -INTEGER FLAG_VAR -COMMON/FLAG/FLAG_VAR -. . . -FLAG_VAR = FLAG_VALUE ! initialize the event variable -. . . -IF (FLAG_VAR .EQ. FLAG_VALUE) THEN - CALL SHMEM_WAIT(FLAG_VAR, FLAG_VALUE) -ENDIF -FLAG_VAR = FLAG_VALUE ! reset the event variable for next time -. . . -END diff --git a/_deprecated_sources/EXAMPLES/shmem_xor_example.f90 b/_deprecated_sources/EXAMPLES/shmem_xor_example.f90 deleted file mode 100644 index faaa8a05c..000000000 --- a/_deprecated_sources/EXAMPLES/shmem_xor_example.f90 +++ /dev/null @@ -1,14 +0,0 @@ -INCLUDE "mpp/shmem.fh" - -INTEGER PSYNC(SHMEM_REDUCE_SYNC_SIZE) -DATA PSYNC /SHMEM_REDUCE_SYNC_SIZE*SHMEM_SYNC_VALUE/ -PARAMETER (NR=1) -REAL FOO, FOOXOR, PWRK(MAX(NR/2+1,SHMEM_REDUCE_MIN_WRKDATA_SIZE)) -COMMON /COM/ FOO, FOOXOR, PWRK -INTRINSIC SHMEM_MY_PE() - -IF ( MOD(SHMEM_MY_PE() .EQ. 0) THEN - CALL SHMEM_REAL8_XOR_TO_ALL(FOOXOR, FOO, NR, 0, 1, N$PES/2, -& PWRK, PSYNC) - PRINT*,'Result on PE ',SHMEM_MY_PE(),' is ',FOOXOR -ENDIF diff --git a/_deprecated_sources/EXAMPLES/writing_shmem_example.c b/_deprecated_sources/EXAMPLES/writing_shmem_example.c deleted file mode 100644 index 6ee05d3f0..000000000 --- a/_deprecated_sources/EXAMPLES/writing_shmem_example.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#define SIZE 16 -int -main(int argc, char* argv[]) -{ - short source[SIZE]; - static short dest[SIZE]; - int i, npes; - shmem_init(); - npes = shmem_n_pes(); - if (shmem_my_pe() == 0) { - /* initialize array */ - for(i = 0; i < SIZE; i++) - source[i] = i; - /* local, not symmetric */ - /* static makes it symmetric */ - /* put "size" words into dest on each PE */ - for(i = 1; i < npes; i++) - shmem_short_put(dest, source, SIZE, i); - } - shmem_barrier_all(); /* sync sender and receiver */ - if (shmem_my_pe() != 0) { - printf("dest on PE %d is \t", shmem_my_pe()); - for(i = 0; i < SIZE; i++) - printf("%hd \t", dest[i]); - printf("\n"); - } - shmem_finalize(); - return 0; -} - diff --git a/_deprecated_sources/EXAMPLES/writing_shmem_example.output b/_deprecated_sources/EXAMPLES/writing_shmem_example.output deleted file mode 100644 index 0207d3ad7..000000000 --- a/_deprecated_sources/EXAMPLES/writing_shmem_example.output +++ /dev/null @@ -1,3 +0,0 @@ -dest on PE 1 is 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -dest on PE 2 is 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -dest on PE 3 is 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 diff --git a/_deprecated_sources/Fortran/hello.f90 b/_deprecated_sources/Fortran/hello.f90 deleted file mode 100644 index 619081dc5..000000000 --- a/_deprecated_sources/Fortran/hello.f90 +++ /dev/null @@ -1,16 +0,0 @@ -program whoami - - include 'shmem.fh' - - integer npes, me - character*32 h - - call start_pes(0) - - npes = num_pes() - me = my_pe() - call hostnm(h) - - print *, h, 'I am ', me, ' of ', npes - -end program whoami diff --git a/_deprecated_sources/INTRODUCTION/atomics_intro.tex b/_deprecated_sources/INTRODUCTION/atomics_intro.tex deleted file mode 100644 index 2c8830311..000000000 --- a/_deprecated_sources/INTRODUCTION/atomics_intro.tex +++ /dev/null @@ -1,30 +0,0 @@ -\label{sec:amo} -%\openshmem{} specification defines various \acp{AMO}. -\ac{AMO} is a one-sided communication mechanism that combines memory update operations with atomicity guarantees described in Section \ref{subsec:amo_guarantees}. -Similar to the \ac{RMA} routines, described in Section \ref{sec:rma}, -the \acp{AMO} are performed only on symmetric objects. -\openshmem{} defines the two types of \ac{AMO} routines: -\begin{itemize} -\item % Blocking\\ -The \textit{fetch-and-operate} routines combine memory update and fetch -operations in a single atomic operation. -The routines return after the data has been fetched and delivered to the local \ac{PE}. -%Fetch-and-operate operations are blocking atomic operation and return as -%soon as the fetched is delivered to the initiator of the operation. - -The \textit{fetch-and-operate} operations include: \FUNC{SHMEM\_CSWAP}, \FUNC{SHMEM\_SWAP}, \FUNC{SHMEM\_FINC}, and\\ \FUNC{SHMEM\_FADD}. - -\item % Non-Blocking\\ -The \textit{non-fetch} atomic routines update the remote memory -in a single atomic operation. -A \textit{non-fetch} atomic routine -starts the atomic operation and may return before the operation execution -on the remote \ac{PE}. -To force completion for these \textit{non-fetch} atomic routines, \FUNC{shmem\_quiet}, -\FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can be used by an \openshmem{} program. - -The \textit{non-fetch} operations include: \FUNC{SHMEM\_INC} and \FUNC{SHMEM\_ADD}. -\end{itemize} -%Fetch-and-operate routines are described in Section \ref{sec:amo_fetch} and non-fetch routines -%described in Section \ref{sec:amo_nonfetch}. -%All atomic operations in \openshmem{} are blocking operations. diff --git a/_deprecated_sources/INTRODUCTION/changelog.tex b/_deprecated_sources/INTRODUCTION/changelog.tex deleted file mode 100644 index 67a9adbaf..000000000 --- a/_deprecated_sources/INTRODUCTION/changelog.tex +++ /dev/null @@ -1,58 +0,0 @@ -\section{Version 1.1} -This section summarizes the changes from the \openshmem specification Version 1.0 to the Version 1.1. -A major change in this version is that it provides an accurate description of \openshmem interfaces so that they are in agreement with the SGI specification. This version also explains \openshmem’s programming, memory, and execution model. The document was throughly changed to improve the readability of specification and usability of interfaces. The code examples were added to demonstrate the usability of API. Additionally, diagrams were added to help understand the subtle semantic differences of various operations. - -%This section summarizes the changes from the \openshmem specification version 1.0 to the version 1.1. -%The major changes consist of more accurate descriptions of the \openshmem \acp{API} that -%were part of the original SGI specification, but were omitted in version 1.0e. This new version also provides new -%diagrams that explain the correct behavior of \openshmem synchronization interfaces in terms of ordering, synchronization, delivery and -%completion of operations. Version 1.1 also does a better job at explaining the programming model, memory model and execution model -%of \openshmem. - -The following list describes the specific changes in 1.1:%\rcomment{\\Eric: "better" is a subjective/ambiguous term, might need need a term to definitively describe how it is better. i.e. is it more descriptive, more detailed, more accurate, easier to understand? etc.\\} - -\begin{itemize} -\item Clarifications of the completion semantics of memory synchronization -interfaces.\\See Section \ref{subsec:memory_order}. -\item Clarification of the completion semantics of memory load and store -operations in context of \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_barrier} -routines.\\See Section \ref{subsec:shmem_barrier_all} and \ref{subsec:shmem_barrier}. -\item Clarification of the completion and ordering semantics of \FUNC{shmem\_quiet} and \FUNC{shmem\_fence}. -\\See Section \ref{subsec:shmem_quiet} and \ref{subsec:shmem_fence}. -\item Clarifications of the completion semantics of \ac{RMA} and \ac{AMO} routines. -\\See Sections \ref{sec:rma} and \ref{sec:amo} -\item Clarifications of the memory model and the memory alignment requirements for symmetric data objects. -\\See Section \ref{subsec:memory_model}. -\item Clarification of the execution model and the definition of a \ac{PE}. -\\See Section \ref{subsec:execution_model} -\item Clarifications of the semantics of \FUNC{shmem\_pe\_accessible} and \FUNC{shmem\_addr\_accessible}. -\\See Section \ref{subsec:shmem_pe_accessible} and \ref{subsec:shmem_addr_accessible}. -\item Added an annex on interoperability with \ac{MPI}.\\See Annex \ref{sec:mpi}. -\item Added examples to the different interfaces. -\item Clarification of the naming conventions for constant in \Clang{} and \Fortran{}. -\\See Section \ref{subsec:library_constants} and \ref{subsec:shmem_wait}. -\item Added \ac{API} calls: \FUNC{shmem\_char\_p}, \FUNC{shmem\_char\_g}.\\See Sections \ref{subsec:shmem_p} and \ref{subsec:shmem_g}. -%These calls are part of the SGI specification. -\item Removed \ac{API} calls: \FUNC{shmem\_char\_put}, \FUNC{shmem\_char\_get}.\\ See Sections \ref{subsec:shmem_put} and \ref{subsec:shmem_get}. -\item The usage of \VAR{ptrdiff\_t}, \VAR{size\_t}, and \VAR{int} in the interface signature - was made consistent with the description.\\See Sections \ref{subsec:coll}, \ref{subsec:shmem_iput}, and \ref{subsec:shmem_iget}. -%Revisions from public comment -\item Revised \FUNC{shmem\_barrier} example.\\See Section \ref{subsec:shmem_barrier}. -\item Clarification of the initial value of \VAR{pSync} work arrays for \FUNC{shmem\_barrier}.\\ See Section \ref{subsec:shmem_barrier}. -\item Clarification of the expected behavior when multiple \FUNC{start\_pes} calls are encountered has been clarified.\\See Section \ref{subsec:start_pes}. -\item Corrected the definition of atomic increment operation.\\See Section \ref{subsec:shmem_inc}. -%\item Removed malloc_error from shmalloc in Specification 1.1 under Section 8.2.1. -\item Clarification of the size of the symmetric heap and when it is set.\\See Section \ref{subsec:shfree}. -\item Clarification of the integer and real sizes for \Fortran{} \ac{API}.\\See Sections \ref{subsec:shmem_add}, \ref{subsec:shmem_cswap}, \ref{subsec:shmem_swap}, \ref{subsec:shmem_finc}, \ref{subsec:shmem_inc}, and \ref{subsec:shmem_fadd}. -\item Clarification of the expected behavior on program \OPR{exit}.\\ See Section \ref{subsec:execution_model}, Execution Model. -\item More detailed description for the progress of \openshmem operations provided.\\ See Section \ref{subsec:progress}. -\item Clarification of naming convention for non-standard interfaces and their inclusion in \FUNC{shmemx.h}.\\ See Section \ref{subsec:bindings}. -\item Various fixes to \openshmem code examples across the specification to include appropriate header files. -%\item Clarification of store operation as memory store in context of \FUNC{shmem\_fence} and {shmem\_quiet} under Sections 8.7.1 and 8.7.2. Duplicate -\item Removing requirement that implementations should detect size mismatch and return error information for \FUNC{shmalloc} and ensuring consistent language.\\See Sections \ref{subsec:shfree} and Annex \ref{sec:undefined}. -\item Fortran programming fixes for examples.\\ See Sections \ref{subsec:shmem_reductions} and \ref{subsec:shmem_wait}. -\item Clarifications of the reuse \VAR{pSync} and \VAR{pWork} across collectives.\\See Sections \ref{subsec:coll}, \ref{subsec:shmem_broadcast}, \ref{subsec:shmem_collect} and \ref{subsec:shmem_reductions}. -\item Name changes for UV and ICE for SGI systems.\\See Annex \ref{sec:openshmem_history}. -%\item Removed XOR reduction for REAL and COMPLEX data types under Section 8.5.5. (Issue #93) -%These calls are not part of the SGI specification. -\end{itemize} diff --git a/_deprecated_sources/INTRODUCTION/changelog1.2.tex b/_deprecated_sources/INTRODUCTION/changelog1.2.tex deleted file mode 100644 index 4f4aa7070..000000000 --- a/_deprecated_sources/INTRODUCTION/changelog1.2.tex +++ /dev/null @@ -1,40 +0,0 @@ -\section{Version 1.2} -This section summarizes the changes from the \openshmem specification Version 1.1 to Version 1.2. -A major change in this version is that it improves upon the execution model described in 1.1 by introducing an explicit \FUNC{shmem\_finalize} library call. This provides a collective mechanism of exiting an \openshmem program and releasing resources used by the library. - - - -The following list describes the specific changes in 1.2: -\begin{itemize} -\item Added specification of \VAR{pSync} initialization for all routines that use it. -\item Replaced all placeholder variable names \VAR{target} with \VAR{dest} to avoid confusion with Fortran `target' keyword. -\item New Execution Model for exiting/finishing OpenSHMEM programs. -\\See Section \ref{subsec:execution_model}. -\item New library constants to support API that query version and name information. -\\See Section \ref{subsec:library_constants}. -\item New API \FUNC{shmem\_init} to provide mechanism to start an \openshmem program and replace deprecated \FUNC{start\_pes}. -\\See Section \ref{subsec:shmem_init}. -\item Deprecation of \FUNC{\_my\_pe} and \FUNC{\_num\_pes} routines. -\\See Sections \ref{subsec:shmem_my_pe} and \ref{subsec:shmem_num_pe}. -\item New API \FUNC{shmem\_finalize} to provide collective mechanism to cleanly exit an \openshmem program and release resources. -\\See Section \ref{subsec:shmem_finalize}. -\item New API \FUNC{shmem\_global\_exit} to provide mechanism to exit an \openshmem program. -\\See Section \ref{subsec:shmem_global_exit}. -\item Clarification related to the address of the referenced object in \FUNC{shmem\_ptr}. -\\See Section \ref{subsec:shmem_ptr}. -\item New API to query the version and name information. -\\See Section \ref{subsec:shmem_version} and \ref{subsec:shmem_name}. -\item \openshmem library API normalization. All C symmetric memory management API begins with \FUNC{shmem\_}. -\\See Section \ref{subsec:shfree}. -\item Notes and clarifications added to \FUNC{shmem\_malloc}. -\\See Section \ref{subsec:shfree}. -\item Deprecation of Fortran API routine \FUNC{SHMEM\_PUT}. -\\See Section \ref{subsec:shmem_put}. -\item Clarification related to \FUNC{shmem\_wait}. -\\See Section \ref{subsec:shmem_wait}. -\item Undefined behavior for null pointers without zero counts added. -\\See Section \ref{sec:undefined} -\item Addition of new Annex for clearly specifying deprecated API and its support in the existing specification version. -\\See Section \ref{sec:dep_api}. - -\end{itemize} diff --git a/_deprecated_sources/INTRODUCTION/collective_intro.tex b/_deprecated_sources/INTRODUCTION/collective_intro.tex deleted file mode 100644 index d34246220..000000000 --- a/_deprecated_sources/INTRODUCTION/collective_intro.tex +++ /dev/null @@ -1,53 +0,0 @@ -%Comments for Manju: -%Are Barrier_all, shmalloc, etc considered collectives? If yes, we need to state that all PEs belong to an implicit active set that contains all PES. -%Also describe the case where collective operations may be invoked by the implicit active set (all PEs) or active sets PEs -%State that collectives can be executed on statements that are not ordered . -%State that from the beginning to the end of the program, the sequence of collectives should be the same on a given active set (or implicit active set). -%Are arguments the same for PEs that call the same collective? (i.e. target or source symmetric data?) -%Which collectives imply synchronization (i.e. barrier, quiet, etc) which ones not (i.e. broadcast on root?) - -\emph{Collective routines} are defined as communication or synchronization operations -on a group of \acp{PE} called an \activeset{}. The collective routines require all -\acp{PE} in the \activeset{} to simultaneously call the routine. -A \ac{PE} that is not part of the \activeset{} calling the collective -routines results in an undefined behavior. All -collective routines have an \activeset{} as an input parameter except -\barrierall{}. The \barrierall{} is called by all \acp{PE} of the \openshmem{} program. - -The \activeset{} is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, -and \VAR{PE\_size}. \VAR{PE\_start} is the starting \ac{PE} number, a log (base -2) of \VAR{logPE\_stride} is the stride between \acp{PE}, and \VAR{PE\_size} is -the number of \acp{PE} participating in the \activeset{}. All \acp{PE} participating in the -collective routines provide the same values for these arguments. - -Another argument important to collective routines is \VAR{pSync}, which is a -symmetric work array. All \acp{PE} participating in a collective must pass the same -\VAR{pSync} array. On completion of a collective call, the \VAR{pSync} is restored to its -original contents. The user is permitted to reuse a \VAR{pSync} array if -all previous collective routines using the \VAR{pSync} array have been completed by all participating -\acp{PE}. One can use a synchronization collective routine such as \barrier{} -to ensure completion of previous collective routines. The \FUNC{shmem\_barrier} routine allows the same \VAR{pSync} array to be used on consecutive calls as long as the \ac{PE} \activeset{} does not change. - -%The two cases below -%show the reuse of \VAR{pSync} array: -% -%\begin{itemize} -%\item The \FUNC{shmem\_barrier} function allows the same \VAR{pSync} array to be used on consecutive calls as long as the active \ac{PE} set does not change. -%\item If the same collective function is called multiple times with the -% same \activeset, the calls may alternate between two \VAR{pSync} arrays. -% The \openshmem functions guarantee that a first call is completely finished by -% all \ac{PE}s by the time processing of a third call begins on any \ac{PE}. -%\end{itemize} - - -All collective routines defined in the specification are blocking. The -collective routines return on completion. The collective routines defined in the \openshmem{} specification -are: - -\begin{itemize} -\item[] \broadcast{} -\item[] \barrier{} -\item[] \barrierall{} -\item[] \collect{} -\item[] \reduction{} -\end{itemize} diff --git a/_deprecated_sources/INTRODUCTION/compile_exec_applications.tex b/_deprecated_sources/INTRODUCTION/compile_exec_applications.tex deleted file mode 100644 index d87463dcf..000000000 --- a/_deprecated_sources/INTRODUCTION/compile_exec_applications.tex +++ /dev/null @@ -1,61 +0,0 @@ - -As of this writing, the \openshmem{} specification is silent regarding how \openshmem{} programs are compiled, linked and run. This section shows some examples of -how wrapper programs are utilized in the \openshmem{} Reference Implementation to compile and launch programs. -%The commands are styled after wrapper programs found in many MPI implementations. -\section{Compilation} -\subsection*{Programs written in \Clang} - -The \openshmem{} Reference Implementation provides a wrapper program named \textbf{oshcc}, to aid in the compilation of \Clang{} programs, the wrapper -could be called as follows: - -\begin{lstlisting}[language=bash] -oshcc -o myprogram myprogram.c -\end{lstlisting} -Where the $\langle\mbox{compiler options}\rangle$ are options understood by the underlying \Clang{} compiler. - - -\subsection*{Programs written in \Cpp} - -The \openshmem{} Reference Implementation provides a wrapper program named \textbf{oshCC}, to aid in the compilation of \Cpp{} programs, the -wrapper could be called as follows: - -\begin{lstlisting}[language=bash] -oshCC -o myprogram myprogram.cpp -\end{lstlisting} -Where the $\langle\mbox{compiler options}\rangle$ are options understood by the underlying \Cpp{} compiler called by \textbf{oshCC}. - - -\subsection*{Programs written in \Fortran} - -The \openshmem{} Reference Implementation provides a wrapper program named \textbf{oshfort}, to aid in the compilation of \Fortran{} programs, -the wrapper could be called as follows: - -\begin{lstlisting}[language=bash] -oshfort -o myprogram myprogram.f -\end{lstlisting} -Where the $\langle\mbox{compiler options}\rangle$ are options understood by the underlying \Fortran{} compiler called by \textbf{oshfort}. - -\section{Running Programs} - -The \openshmem{} Reference Implementation provides a wrapper program named \textbf{oshrun}, to launch \openshmem programs, the wrapper could -be called as follows: - -\begin{lstlisting}[language=bash] -oshrun -np <#> -\end{lstlisting} -The program arguments for \textbf{oshrun} are: - -\begin{tabular}{p{0.3\textwidth}p{0.6\textwidth}} -$\langle\mbox{additional options}\rangle$ & {Options passed to the underlying launcher.}\tabularnewline --np $\langle\mbox{\#}\rangle$ & {The number of \ac{PE}s to be used in the execution.}\tabularnewline -$\langle\mbox{program}\rangle$ & {The program executable to be launched.}\tabularnewline -$\langle\mbox{program arguments}\rangle$ & {Flags and other parameters to pass to the program.}\tabularnewline -\end{tabular} - -%\begin{description} -%\item[$\langle\mbox{additional options}\rangle$] options passed to the underlying launcher -%\item[-np $\langle\mbox{\#}\rangle$] The number of processing elements (PEs) to be used -%in the execution. -%\item [$\langle\mbox{program}\rangle$] The program executable to be launched -%\item [$\langle\mbox{program arguments}\rangle$] flags and other parameters to pass to the program -%\end{description} diff --git a/_deprecated_sources/INTRODUCTION/deprecated_API.tex b/_deprecated_sources/INTRODUCTION/deprecated_API.tex deleted file mode 100644 index 0c962072d..000000000 --- a/_deprecated_sources/INTRODUCTION/deprecated_API.tex +++ /dev/null @@ -1,20 +0,0 @@ -For the \openshmem Specification(s), deprecation is the process of identifying API that is supported but no longer recommended for use by program users. For \openshmem library users, said API \textbf{must} be supported until clearly indicated as otherwise by the Specification. In this chapter we will record the API that has been deprecated, the \openshmem Specification that effected the deprecation, and if the feature is supported in the current version of the specification. - -\begin{center} -\begin{tabular}{|l|c|c|c|} - \hline - \textbf{Deprecated API} & \textbf{Deprecated Since} & \textbf{Currently Supported(?)} & \textbf{Replaced By}\\ \hline %There may be better table headings... - \FUNC{\_my\_pe} & 1.2 & Yes & \FUNC{shmem\_my\_pe} \\ \hline - \FUNC{\_num\_pes} & 1.2 & Yes & \FUNC{shmem\_n\_pes} \\ \hline - \FUNC{shmalloc} & 1.2 & Yes & \FUNC{shmem\_malloc} \\ \hline - \FUNC{shfree} & 1.2 & Yes & \FUNC{shmem\_free} \\ \hline - \FUNC{shrealloc} & 1.2 & Yes & \FUNC{shmem\_realloc} \\ \hline - \FUNC{shmemalign} & 1.2 & Yes & \FUNC{shmem\_align} \\ \hline - \FUNC{start\_pes} & 1.2 & Yes & \FUNC{shmem\_init} \\ \hline - \FUNC{SHMEM\_PUT} & 1.2 & Yes & \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} \\ \hline - - - - \hline - \end{tabular} -\end{center} diff --git a/_deprecated_sources/INTRODUCTION/deprication.tex b/_deprecated_sources/INTRODUCTION/deprication.tex deleted file mode 100644 index b294a3fff..000000000 --- a/_deprecated_sources/INTRODUCTION/deprication.tex +++ /dev/null @@ -1,7 +0,0 @@ -All of these routines are deprecated and are provided for backwards -compatibility. -Implementations must include all items in this section -and the routines should function properly, while notifying the user -about deprecation of the functionality. - -%\rcomment{Do we want to change the requirement from ``must" to ``optional"} diff --git a/_deprecated_sources/INTRODUCTION/environment_variables.tex b/_deprecated_sources/INTRODUCTION/environment_variables.tex deleted file mode 100644 index b138ed7f3..000000000 --- a/_deprecated_sources/INTRODUCTION/environment_variables.tex +++ /dev/null @@ -1,26 +0,0 @@ - -\section{Environment Variables } - -The \openshmem specification provides a set of environment variables that allows users -to configure the \openshmem implementation, and receive information about the -implementation. The implementations of the specification are free to define additional variables. Currently, the specification defines four environment variables. - -\medskip{} - - -\begin{tabular}{|l|l|l|} -\hline -Variable & Value & Routine\tabularnewline -\hline -\hline -\texttt{SMA\_VERSION} & any & print the library version at start-up\tabularnewline -\hline -\texttt{SMA\_INFO} & any & print helpful text about all these environment variables\tabularnewline -\hline -\texttt{SMA\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to allocate for symmetric heap\tabularnewline -\hline -\texttt{SMA\_DEBUG} & any & enable debugging messages\tabularnewline -\hline -\end{tabular} - -\medskip{} diff --git a/_deprecated_sources/INTRODUCTION/examples.tex b/_deprecated_sources/INTRODUCTION/examples.tex deleted file mode 100644 index 3ce534f9b..000000000 --- a/_deprecated_sources/INTRODUCTION/examples.tex +++ /dev/null @@ -1,24 +0,0 @@ -% Custom program listings for example code -% Features: -% - line numbers -% - reduced font size (so they can fit on one page) -\lstset{ - numbers=left, - numberstyle=\tiny, - stepnumber=1, - numbersep=5pt, - numberblanklines=true, - basicstyle=\scriptsize\ttfamily, - keywordstyle=\scriptsize\color{RoyalBlue}\ttfamily\bfseries, - stringstyle=\scriptsize, - commentstyle=\scriptsize, - identifierstyle=\scriptsize\color{black}\ttfamily\bfseries -} - - -\input{INTRODUCTION/examples_C.tex} - -\pagebreak{} - - -\input{INTRODUCTION/examples_Fortran.tex} diff --git a/_deprecated_sources/INTRODUCTION/examples_C.tex b/_deprecated_sources/INTRODUCTION/examples_C.tex deleted file mode 100644 index 0858a1e72..000000000 --- a/_deprecated_sources/INTRODUCTION/examples_C.tex +++ /dev/null @@ -1,33 +0,0 @@ -\subsection{C Language Examples} - -\lstinputlisting[caption={Program that is a trivial Hello World.},label={HelloW},language={C++}]{C/helloworld.c} - -\lstinputlisting[caption={Program that implements a Circular Shift.},label={CircSh},language={C++}]{C/circ.c} - -\pagebreak{} - -\lstinputlisting[caption={Program that demonstrates the use of shmalloc.},label={shamalloc},language={C++}]{C/shmalloc.c} - -\lstinputlisting[caption={Program that implements Ping.},label={ping},language={C++}]{C/ping.c} - -\pagebreak{} - -\lstinputlisting[caption={Program that uses the MAX reduction.},label={max},language={C++}]{C/reduce-max.c} - -\pagebreak{} - -\lstinputlisting[caption={Program that makes use of strided puts.},label={iput},language={C++}]{C/iput.c} - -\pagebreak{} - -\lstinputlisting[caption={Program that implements an ALL-2-ALL (header)},label={all2all_head},language={C++}]{C/bench.h} - -\pagebreak{} - -\lstinputlisting[caption={Program that implements an ALL-2-ALL (main)},label={all2allMain},language={C++}]{C/all2all_main.c} - -\pagebreak{} - -\lstinputlisting[caption={Program that implements an ALL-2-ALL (subs)},label={all2allSub},language={C++}]{C/all2all_subs.c} - -\lstinputlisting[caption={Program that computes Pi},label={compute-pi},language={C++}]{C/pi.c} diff --git a/_deprecated_sources/INTRODUCTION/examples_Fortran.tex b/_deprecated_sources/INTRODUCTION/examples_Fortran.tex deleted file mode 100644 index 9f3a629e9..000000000 --- a/_deprecated_sources/INTRODUCTION/examples_Fortran.tex +++ /dev/null @@ -1,4 +0,0 @@ - -\subsection{Fortran Language Examples} - -\lstinputlisting[caption={Hello World program},label={helloworldf},language={Fortran}]{Fortran/hello.f90} diff --git a/_deprecated_sources/INTRODUCTION/execution_model.tex b/_deprecated_sources/INTRODUCTION/execution_model.tex deleted file mode 100644 index efff8ff05..000000000 --- a/_deprecated_sources/INTRODUCTION/execution_model.tex +++ /dev/null @@ -1,127 +0,0 @@ -%Outline -%%Exectution model -% *Define what is a OpenSHMEM program: a set of processes (either SPMD or MIMD?) where each process has its own 'local' (private) memory and symmetric memory regions that may be accessible by any PEs. -% *Each OpenSHMEM process is called a processing element (PE) -% *Each PE may be mapped to many to one hardware cores/threads or less. -% *The number of PEs is specified at launch/runtime. -% *Each PE must call startpe to initialize the OpenSHMEM runtime, before any other call for OpenSHMEM. There is an implicit barrier at startpe. -% *Each PE executes asynchronously following Fortran or program execution in C [ISO/IEC00 Sec. 5.1.2.3] -% *Each PE will have a unique global identifier and the execution of a program may depend on the PE id, if executed in SPMD. -% *PE id may be used for library calls synchronizations, control flow constructs language in C/Fortran -% *PE may allocate symmetric data objects via a symmetric heap during execution%SP: Does not cover global and static. -% *As of now, PEs may finish execution at any time by returning from the main routine. (no call to shmem_finalize yet!) -% -%This comes from the UPC spec: -%The memory consistency model in a language defines the order in which the results of write operations may be observed through read operations. -%The behavior of a OpenSHMEM program may depend on the timing of accesses to symmetric variables on PEs, so in general a program defines a set of possible executions, -%rather than a single execution. The memory consistency model constrains the set of possible executions for a given program; the user may then rely -%on properties that are true of all of those executions. - - -\section{Execution Model} -%\openshmem can use a single process multiple data (SPMD) or MIMD -%parallelism. An \openshmem application makes use of multiple processors, -%referred to as Processing Elements or PEs, to complete operations -%in parallel. -Although \openshmem follows the SPMD execution model, different \ac{PE}s may have different execution paths and will execute asynchronously following \Fortran{} or program execution in \Clang. Each \ac{PE} may be mapped to many to one hardware cores/threads or less. In \openshmem the number of \ac{PE}s is specified at runtime. - -\openshmem requires initialization before using any of the \openshmem library -routines by calling \textbf{start\_pes()}. %during the initialization phase of a program. %SP:repetitive. -The \ac{PE}s do not exist till after \FUNC{start\_pes} returns. \FUNC{start\_pes} performs any required initialization steps, such as setting up the symmetric heap for every \ac{PE} and creating and assigning \ac{PE} numbers which act like unique global identifiers for the duration of the program. These \ac{PE} identifiers are integers assigned in a monotonically increasing manner from zero to the total number of \ac{PE}s minus 1. \ac{PE} identifiers are used on \openshmem library calls (i.e. to access symmetric objects from specific \ac{PE}s, collective synchronization, etc.) or to dictate a definite control flow for \ac{PE}s using constructs of \Clang{} or \Fortran. Some collective routines require the creation of an \activeset, which is group of \ac{PE}s that is involved in the execution of a collective routine. These collective routines assume that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the \activeset{} calls an \openshmem collective routine, undefined behavior results. -An OpenSHMEM program consists of a set of processes, called \ac{PE}s where each process has its own 'local' (private) memory and symmetric memory regions that may be accessible by any \ac{PE}s. -Although \openshmem follows the \ac{SPMD} execution model, different \ac{PE}s may have different execution paths and will execute asynchronously following \Fortran{} or program execution in \Clang{} or \Cpp. Each PE may be mapped to many to one hardware cores/threads or less. In \openshmem the number of \ac{PE}s is specified at runtime. - -\openshmem requires initialization before using any of the OpenSHMEM library -routines by calling \FUNC{start\_pes}.%during the initialization phase of a program. %SP:repetitive. -The \ac{PE}s do not exist till after \FUNC{start\_pes} returns. \FUNC{start\_pes} performs any required initialization steps, such as setting up the symmetric heap for every \ac{PE} and creating and assigning \ac{PE} numbers -which act like unique global identifiers for the duration of the program. These \ac{PE} identifiers are integers assigned in a monotonically increasing manner from zero to the total number of \ac{PE}s minus 1. \ac{PE} identifiers -are used for other \openshmem library calls (such as collective synchronization) or to dictate a definite control flow for \ac{PE}s using constructs of \Clang{} or \Fortran{}. Some collective routines require the creation of an -\activeset, which is group of \ac{PE}s that is involved in the execution of a collective routine. These collective routines assume that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the \activeset{} calls a -\openshmem collective routine, undefined behavior results. - -%The symmetric heap is one of the memory spaces -%that is remotely accessible by all PEs. The symmetric heap is discussed -%further in the Memory Model section. The PE numbers are the -%identifiers used to refer to each of the PEs involved in the execution. -%Consistent with the SPMD nature of the \openshmem programming model is the concept of symmetric data objects. These are arrays or variables that exist with the same size, type, and relative address on all PEs. Another term for symmetric data objects is "remotely accessible data objects." In the interface definitions for \openshmem data transfer functions, one or more of the parameters are typically required to be symmetric or remotely accessible. The following kinds of data objects are symmetric: -%\begin{itemize} -% \item Fortran data objects in common blocks or with the SAVE attribute. These data objects must not be defined in a dynamic shared object (DSO). -% \item Non-stack C and C++ variables. These data objects must not be defined in a DSO. -% \item Fortran arrays allocated with \textit{shpalloc} -% \item C and C++ data allocated by \textit{shmalloc} -%\end{itemize} -% -%Data transfer in \openshmem is possible through several one-sided put -%(for write) and get (for read) operations, as well as various collective -%routines such as broadcasts and reductions. Since the library provides the flexibility of one-sided operations the execution pattern is depends on the how the programmer decides to distribute work amongst different PEs and the synchronization and ordering operations used. -% -%Query routines are available to gather information about the execution. -%\openshmem also provides synchronization routines to coordinate data -%transfers and other operations. -As of now, an \openshmem program finishes execution by returning from the main routine. -It is up to the implementation on how to handle the finalization of the -\openshmem library and any other resources initialized by the library: -there is currently no explicit call defined in the \openshmem specification. - - -\subsection{Progress of \openshmem Routines} - -The \openshmem model assumes that computation and communication are -naturally overlapped. High quality \openshmem implementations must insure that programs exhibit %SP: Changing MUST to may as per discussion on 01/31/2014 -progression of communication both with and without \openshmem calls. -Consider a \ac{PE} that is engaged in a long computation with no \openshmem calls. -Other \ac{PE}s must be able to communicate (put/get, -collective, atomic) with that computationally-bound \ac{PE} without that \ac{PE} -issuing any explicit \openshmem calls. \openshmem communication calls involving that \ac{PE} must progress -regardless of when that \ac{PE} next engages in an \openshmem call. - -\textbf{Note to implementers:} progress will often be ensured through -the use of a dedicated progress thread in software, or through -network hardware that offloads communication handling from processors. - -%\subsection{Using the Symmetric \VAR{Work} and \VAR{pSync} Arrays} - -%Multiple \VAR{pSync} arrays are often needed if a particular \ac{PE} calls a \openshmem -%collective function twice without intervening barrier synchronization. -%Problems would occur if some \ac{PE}s in the \activeset{} for call 2 arrive at -%call 2 before processing of call 1 is complete by all \ac{PE}s in the call 1 -%\activeset. You can use \FUNC{shmem\_barrier} or \FUNC{shmem\_barrier\_all} to -%perform a barrier synchronization between consecutive calls to \openshmem -%collective functions. There are two special cases: -%\begin{itemize} -%\item The \FUNC{shmem\_barrier} function allows the same \VAR{pSync} array to be used -% on consecutive calls as long as the active \ac{PE} set does not change. -%\item If the same collective function is called multiple times with the -% same \activeset, the calls may alternate between two \VAR{pSync} arrays. -% The \openshmem functions guarantee that a first call is completely finished by -% all \ac{PE}s by the time processing of a third call begins on -% any \ac{PE}. -%\end{itemize} -%Because the \openshmem functions restore \VAR{pSync} to its original contents, -%multiple calls that use the same \VAR{pSync} array do not require that \VAR{pSync} -%be reinitialized after the first call. - -\subsection{Atomicity Guarantees} - -\openshmem contains a number of routines that operate on symmetric data -atomically. These routines guarantee that accesses by \openshmem's -atomic routines will be exclusive, but do not guarantee exclusivity -in combination with other routines, either inside \openshmem or -outside. - -For example: during the execution of a remote integer increment -routine on a symmetric variable \VAR{x}, no other \openshmem atomic -routine may access \VAR{x}. After the increment, \VAR{x} will have -increased its value by \CONST{1} on the target \ac{PE}, at which point other -atomic routines may then modify that \VAR{x}. - -% %Memory model -% *Each OpenSHMEM PEs may have symmetric memory that is accessible by other PEs. -% *Symmetric memory is a region of memory where all the an instance of a data objects is replicated across PEs, have -% the same the same layout and relative offset. -% *All PEs can allocate a symmetric data objects using the symmetric heap, but they must do so as a collective operation. (is there a barrier after shmalloc?) -% *All writes to symmetric memory are relaxed (I'm not sure if this is the completion semantics) and are guaranteed to be visible to other PEs after a barrier_all, barrier(?), quiet, (what about wait? does it means iti sonly visible to me?) -% *Calls to barrier, barrier_all, quiet, wait, lock, atomics, are meant to guarantee memory consistency across PEs. -% *Read/Writes to symmetric data object may appear after startpe or after a the symmetric data object has been allocated in the symmetric heap (if it is a dynamic). -% *Operations like reduction, collect, etc guarantee memory consistency after completion(?) -% *Data races are possible in OpenSHMEM if multiple PEs write/read a symmetric data object from a single PE without proper synchronization. diff --git a/_deprecated_sources/INTRODUCTION/introduction.tex b/_deprecated_sources/INTRODUCTION/introduction.tex deleted file mode 100644 index a6a7303fd..000000000 --- a/_deprecated_sources/INTRODUCTION/introduction.tex +++ /dev/null @@ -1,10 +0,0 @@ -\section{Introduction} - -This document defines the elements of the \openshmem Application Programming -Interface~\footnote{SHMEM and \openshmem are trademarks of Silicon Graphics International Corp.}. -The purpose of the \openshmem \ac{API} is to provide programmers -with a standard interface for writing parallel programs -using \Clang, \Cpp{} and \Fortran{} with one-sided communication. - -More information about the \openshmem project can be found at:\\ -\url{http://www.openshmem.org/} diff --git a/_deprecated_sources/INTRODUCTION/introduction_pgas.tex b/_deprecated_sources/INTRODUCTION/introduction_pgas.tex deleted file mode 100644 index 687c2580c..000000000 --- a/_deprecated_sources/INTRODUCTION/introduction_pgas.tex +++ /dev/null @@ -1,168 +0,0 @@ - -\section{What is \openshmem?} - -This section is an introduction to previous work on \openshmem. We begin -with a quick overview of the Partitioned Global Address Space model, -which is the basis for \openshmem's data sharing strategy. - - -\subsection{Partitioned Global Address Space} - -Conventional Parallel Programming Models can be broadly classified -into 2 types: -\begin{description} -\item [{{Shared-Memory~Model:}}] in this model all processors interact -with a globally available memory space. -\item [{{Distributed-Memory~Model:}}] in this model each processor has -its own memory to work with and can only directly access the data -that resides in its memory. When a processor needs data from another -processor an explicit function call must be made to communicate with -the target processor. -\end{description} -The current high performance computing architectures prefer a combination -of the above mentioned memory models, which is referred to \textbf{Partitioned -Global Address Space} or PGAS for short. In PGAS, each processing -element (\ac{PE}) has access to its own private local memory and also to -a shared memory space. This programming model enhances performance -by exposing data/thread locality. PGAS programming languages include -\textbf{Unified Parallel \Clang (UPC)}, \textbf{Co-Array \Fortran (CAF)}, -\textbf{Titanium}, \textbf{X-10} and \textbf{Chapel}. - -More information about PGAS can be found at the PGAS Forum website.\cite{pgasfor} - - -\subsection{\openshmem} - -% SGI asked for this to be removed to protect the trademark -% -% SHMEM stands for \textbf{SH}ared \textbf{MEM}ory. - -\openshmem is a library \ac{API} that allows its participating processes (the -places where work occurs are called Processing Elements or \ac{PE}s) to -view a Partitioned Global Address Space. Each \ac{PE} is able to see -variables with a common name, but each \ac{PE} has its own local copy -of the variable. - -The \openshmem library provides inter-processor communication using data -passing and one-sided communication techniques. \openshmem differs from -the Message Passing Interface (MPI), currently the most widely used -communication model, in that the latter generally uses two-sided communication -(MPI now also includes one-sided calls). In two-sided communication, -both sides of the exchange (source and destination) are required to -participate actively. The one-sided communication mechanism decouples -data transfer and synchronization, reducing communication overhead, -resulting in faster communication patterns. Figure \ref{fig:Communication-Scheme} -shows diagrams for one-sided and two-sided communications.\medskip{} - - -%\begin{center} -%\begin{figure}[H] -%\begin{centering} -%\includegraphics[scale=0.7]{media/communication} -%\par\end{centering} -% -%\caption{Communication Scheme\label{fig:Communication-Scheme}} -%\end{figure} -% -%\par\end{center} - -\medskip{} -The following are some of the communication operations available in -\openshmem: -\begin{enumerate} -\item \textbf{Data Transfers } - -\begin{enumerate} -\item One-sided puts : the initiator \ac{PE} (active side) specifies the local -data to be written to the target \ac{PE}'s (passive side) memory. -\item One-sided gets : an explicit fetch operation is used to copy a variable -amount of data from a remote process and store it locally.\end{enumerate} -\begin{description} -\item [{{Note:}}] By avoiding the need for matching send and receive -calls, \openshmem simplifies the communication process by reducing the -number of calls required to have one \ac{PE} interact with other \ac{PE}s. -\end{description} -\item \textbf{Synchronization Mechanisms } - -\begin{enumerate} -\item Fence: Ensures ordering of PUT operations to a specific \ac{PE}. -\item Quiet: Ensures ordering of PUT operations to all \ac{PE}s. -\item Barrier: A collective synchronization routine in which no \ac{PE} may leave -the barrier prior to all \ac{PE}s entering the barrier. -\end{enumerate} -\item \textbf{Collective Communication} - -\begin{enumerate} -\item Broadcast: Copy a block of data from one \ac{PE} to one or more target -\ac{PE}s. -\item Collection: Concatenate elements from the source array to a target -array over the specified \ac{PE}s. -\item Reduction: Perform an associative binary operation over the specified -\ac{PE}s. -\end{enumerate} -\item \textbf{Address Manipulation} - -\begin{enumerate} -\item Allocating and deallocating memory blocks in the symmetric space. -\end{enumerate} -\item \textbf{Locks} - -\begin{enumerate} -\item Implementation of mutual exclusion. -\end{enumerate} -\item \textbf{Atomic Memory Operations} - -\begin{enumerate} -\item Swap, Conditional Swap, Add and Increment -\end{enumerate} -\item \textbf{Data Cache control} - -\begin{enumerate} -\item Implementation of mechanisms to exploit the capabilities of hardware -cache if available. -\end{enumerate} -\end{enumerate} -\begin{description} -\item [{{Note:}}] More information about \openshmem routines can be found -in the Library Routines section. -\end{description} - -\subsection{History of \openshmem} -\begin{description} -\item [{{Cray~SHMEM~(MP-SHMEM,~LC-SHMEM):}}] Cray first introduced -SHMEM in 1993 for its Cray T3D systems. Cray SHMEM was also used in -other models: T3E, PVP and XT series. -\item [{{SGI~SHMEM~(SGI-SHMEM):}}] Cray Research merged with Silicon -Graphics (SGI) in February 1996. At this point SHMEM was incorporated -into SGI's Message Passing Toolkit (MPT). The platforms supported -were - SGI Irix, Origin and Altix. -\item [{{Quadrics~SHMEM~(Q-SHMEM):}}] an optimized API for the Quadrics -QsNet interconnect. It included SGI extensions and provided non-blocking -puts and gets. A joint effort from HCS Lab \& Quadrics incorporated -a program profiling interface called PSHMEM that can aid in the execution -analysis of SHMEM programs. -\end{description} -The success of SHMEM's performance attracted several vendors to provide -implementations (with varying names and features) for their systems. -Some of them include: -\begin{description} -\item [{{HP~SHMEM:}}] Based on the Quadrics API. It is included in the -UPC product kit. -\item [{{Cyclops-64~SHMEM~(C64-SHMEM):}}] this SHMEM API supports the -Cyclops-64 architecture. Most of the core features of Cray SHMEM are -available with some additional interfaces specific to the Cyclops-64 -architecture. % -%\begin{comment} -%Forcing new line, can't get \LaTeX{} to do it automatically. -%\end{comment} - -\item [{{IBM~SHMEM:}}] An implementation created by IBM intended for -internal use only. -\item [{{TurboSHMEM:}}] This implementation uses IBM's Low-Level \ac{API} -(LAPI) technology to obtain optimized one-sided communication for -the put/get operations. This allows applications written with the -SHMEM API to run on IBM platforms with minimal source code changes. -\item [{{GPSHMEM:}}] This implementation of SHMEM aims at providing full -portability of applications. It is built mostly with Cray T3D components -and functionalities and provides MPI and ARMCI support. This project -is no longer maintained. \end{description} diff --git a/_deprecated_sources/INTRODUCTION/language_bindings.tex b/_deprecated_sources/INTRODUCTION/language_bindings.tex deleted file mode 100644 index 176f7ae50..000000000 --- a/_deprecated_sources/INTRODUCTION/language_bindings.tex +++ /dev/null @@ -1,32 +0,0 @@ -\section{Language Bindings and Conformance} -\label{subsec:bindings} -%\openshmem is available with \Clang{} and \Fortran{} bindings. The \Cpp{} -%interface is currently the same as that for \Clang. An \openshmem implementation can be conformant to one or both of the -%interfaces. An implementation that provides e.g.\ only a \Clang{} interface may claim to conform to the \openshmem specification with respect to -%the \Clang{} language, but not to \Fortran{} and should make this clear in its documentation. An implementation that provides both \Clang{} and \Fortran{} bindings may claim -%complete conformance. - -\openshmem provides ISO \Clang{} and \Fortran{} \textit{90} language bindings. Any implementation that provides both \Clang{} and \Fortran{} bindings can claim conformance to the specification. An implementation that provides e.g.\ only a \Clang{} interface may claim to conform to the \openshmem specification with respect to -the \Clang{} language, but not to \Fortran{}, and should make this clear in its documentation. The \openshmem header files for \Clang{} and \Fortran{} must contain only the interfaces and constant names defined in this specification. - -\openshmem{} \ac{API}s can be implemented as either routines or macros. However, implementing the interfaces using macros is strongly discouraged as this could severely limit the use of external profiling tools and high-level compiler optimizations. An \openshmem{} program should avoid defining routine names, variables, or -identifiers with the prefix \shmemprefix{} (for \Clang{} and \Fortran{}), \shmemprefixC{} (for \Clang{}) or with \openshmem \ac{API} names. - -All \openshmem extension \ac{API}s that are not part of this specification must be defined in the \FUNC{shmemx.h} include file. These extensions shall use the \FUNC{shmemx\_} prefix for all routine, variable, and constant names. - -%The \openshmem{} constants and environment variables are in all capital letters. -%All \openshmem{} functions are prefixed with \shmemprefix{}, besides these -%expections : start\_pes{}, shfree{}, shpalloc{}, shpclmove{}, shpdellc{}. -%\begin{itemize} -%\item start\_pes{} -%\item shfree{} -%\item shpalloc{} -%\item shpclmove{} -%\item shpdellc{} -%\end{itemize} - - -% -%The \openshmem{} -%functions does not return any error code. - diff --git a/_deprecated_sources/INTRODUCTION/library_constants.tex b/_deprecated_sources/INTRODUCTION/library_constants.tex deleted file mode 100644 index ae8325d6b..000000000 --- a/_deprecated_sources/INTRODUCTION/library_constants.tex +++ /dev/null @@ -1,113 +0,0 @@ -\section{Library Constants} -%\color{red} -%\subsection*{\sout{Constants Related To Collective Operations}} -%\sout{Below are the library constants for collective operations.} -%Ticket \#107 -%\color{black} -The constants that start with SHMEM\_* are for \Fortran{}. For backwards -compatibility, the \CorCpp constants may start with either \_SHMEM\_* or SHMEM\_*. -\newline -\newline -\begin{tabular}{|p{0.4\textwidth}|p{0.5\textwidth}|} -\hline -\textbf{Constant} & \textbf{Description} -\tabularnewline -\hline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_BCAST\_SYNC\_SIZE}} -\hbox{\hspace*{12mm} \const{SHMEM\_BCAST\_SYNC\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_BCAST\_SYNC\_SIZE}}} -& Length of the \VAR{pSync} arrays needed for broadcast routines. The value -of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_broadcast]{Broadcast Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant. \tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_SYNC\_VALUE}} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_VALUE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_VALUE}}} -& Holds the value used to initialize the elements of \VAR{pSync} arrays. The -value of this constant is implementation specific.\tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_REDUCE\_SYNC\_SIZE}} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_SYNC\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_SYNC\_SIZE}}} -& Length of the work arrays needed for reduction routines. The value -of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_reductions]{Reduction Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant.\tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_BARRIER\_SYNC\_SIZE}} -\hbox{\hspace*{12mm} \const{SHMEM\_BARRIER\_SYNC\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_BARRIER\_SYNC\_SIZE}}} -& Length of the work array needed for barrier routines. The value -of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_barrier]{Barrier Synchronization Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant.\tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_COLLECT\_SYNC\_SIZE}} -\hbox{\hspace*{12mm} \const{SHMEM\_COLLECT\_SYNC\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_COLLECT\_SYNC\_SIZE}}} -& Length of the work array needed for collect routines. The value -of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_collect]{Collect Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline -\hline -\end{tabular} - -\begin{tabular}{|p{0.4\textwidth}|p{0.5\textwidth}|} -\hline -\tabularnewline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}}} -& Minimum length of work arrays used in various collective routines.\tabularnewline -\hline -%\color{red} -%\vtop{\hbox{} -%\hbox{\hspace*{12mm} \const{}} -%\hbox{} -%\hbox{\hspace*{12mm} \const{}}} -%& \color{red} -%Ticket \#107 \tabularnewline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_MAJOR\_VERSION}} -\hbox{\hspace*{12mm} \const{SHMEM\_MAJOR\_VERSION}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_MAJOR\_VERSION}}} -& -Integer representing the major version of \openshmem{} standard in use. \tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_MINOR\_VERSION}} -\hbox{\hspace*{12mm} \const{SHMEM\_MINOR\_VERSION}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_MINOR\_VERSION}}} -& -Integer representing the minor version of \openshmem{} standard in use. \tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_MAX\_NAME\_LEN}} -\hbox{\hspace*{12mm} \const{SHMEM\_MAX\_NAME\_LEN}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_MAX\_NAME\_LEN}}} -& -Integer representing the length of vendor string. \tabularnewline -\hline -\vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \const{\_SHMEM\_VENDOR\_STRING}} -\hbox{\hspace*{12mm} \const{SHMEM\_VENDOR\_STRING}} -\hbox{\strut \Fortran:} -\hbox{\hspace*{12mm} \const{SHMEM\_VENDOR\_STRING}}} -& -String representing the string of length less than \const{SHMEM\_MAX\_NAME\_LEN} . \tabularnewline -\hline - -\end{tabular} -\color{black} diff --git a/_deprecated_sources/INTRODUCTION/locks_intro.tex b/_deprecated_sources/INTRODUCTION/locks_intro.tex deleted file mode 100644 index 08ef9665e..000000000 --- a/_deprecated_sources/INTRODUCTION/locks_intro.tex +++ /dev/null @@ -1,3 +0,0 @@ -The following section discusses \openshmem locks as a mechanism to provide mutual exclusion. Three routines are available for distributed locking, -%namely, -\textit{set, test} and \textit{clear}. \ No newline at end of file diff --git a/_deprecated_sources/INTRODUCTION/memory_management_intro.tex b/_deprecated_sources/INTRODUCTION/memory_management_intro.tex deleted file mode 100644 index b204b7385..000000000 --- a/_deprecated_sources/INTRODUCTION/memory_management_intro.tex +++ /dev/null @@ -1 +0,0 @@ -\openshmem provides a set of \ac{API}s for managing the symmetric heap. The \ac{API}s allow one to dynamically allocate, deallocate, reallocate and align symmetric data objects in the symmetric heap, in \Clang{} and \Fortran. diff --git a/_deprecated_sources/INTRODUCTION/memory_model.tex b/_deprecated_sources/INTRODUCTION/memory_model.tex deleted file mode 100644 index 5c4859c34..000000000 --- a/_deprecated_sources/INTRODUCTION/memory_model.tex +++ /dev/null @@ -1,68 +0,0 @@ -%Outline -%%Exectution model -% *Define what is a OpenSHMEM program: a set of processes (either SPMD or MIMD?) where each process has its own 'local' (private) memory and symmetric memory regions that may be accessible by any PEs. -% *Each OpenSHMEM process is called a processing element (PE) -% *Each PE may be mapped to many to one hardware cores/threads or less. -% *The number of PEs is specified at launch/runtime. -% *Each PE must call startpe to initialize the OpenSHMEM runtime, before any other call for OpenSHMEM. There is an implicit barrier at startpe. -% *Each PE executes asynchronously following Fortran or program execution in C [ISO/IEC00 Sec. 5.1.2.3] -% *Each PE will have a unique global identifier and the execution of a program may depend on the PE id, if executed in SPMD. -% *PE id may be used for library calls synchronizations, control flow constructs language in C/Fortran -% *PE may allocate symmetric data objects via a symmetric heap -% *As of now, PEs may finish execution at any time by returning from the main function. (no call to shmem_finalize yet!) -% -% %Memory model -% *Each OpenSHMEM PEs may have symmetric memory that is accessible by other PEs. -% *Symmetric memory is a region of memory where all the an instance of a data objects is replicated across PEs, have -% the same the same layout and relative offset. -% *All PEs can allocate a symmetric data objects using the symmetric heap, but they must do so as a collective operation. (is there a barrier after shmalloc?) -% *All writes to symmetric memory are relaxed (I'm not sure if this is the completion semantics) and are guaranteed to be visible to other PEs after a barrier_all, barrier(?), quiet, (what about wait? does it means iti sonly visible to me?) -% *Calls to barrier, barrier_all, quiet, wait, lock, atomics, are meant to guarantee memory consistency across PEs. -% *Read/Writes to symmetric data object may appear after startpe or after a the symmetric data object has been allocated in the symmetric heap (if it is a dynamic). -% *Operations like reduction, collect, etc guarantee memory consistency after completion(?) -% *Data races are possible in OpenSHMEM if multiple PEs write/read a symmetric data object from a single PE without proper synchronization. -% -%This comes from the UPC spec: -%The memory consistency model in a language defines the order in which the results of write operations may be observed through read operations. -%The behavior of a OpenSHMEM program may depend on the timing of accesses to symetric variables on PEs, so in general a program defines a set of possible executions, -%rather than a single execution. The memory consistency model constrains the set of possible executions for a given program; the user may then rely -%on properties that are true of all of those executions. - -\section{Memory Model} -\begin{figure}[h] -\includegraphics[width=0.95\textwidth]{diagrams/updated/mem_model} -\caption{\OSH{} Memory Model} -\label{fig:mem_model} -\end{figure} -An \openshmem program consists of data objects that are private to each \ac{PE} and data objects that are remotely accessible by all \ac{PE}s. Private data objects are stored in the local memory of each \ac{PE} and can only be accessed by the \ac{PE} itself; these data objects cannot be accessed by other \ac{PE}s via \openshmem routines. Private data objects follow the memory model of \Clang{} or \Fortran{}. Remotely accessible objects, however, can be accessed by remote \ac{PE}s using \openshmem routines. -Remotely accessible data objects are called \emph{Symmetric Objects}. -%An object is symmetric if it has a corresponding object with the same -%SP: No, if there is a way to create such objects without them being global/static/common/save or shmalloced/shpalloced would they would be symmetric as per this definition...NOT the way OpenSHMEM defines. -%All symmetric data objects have a corresponding object with the same -%name, type, size, and offset (from an arbitrary memory address) on all \ac{PE}s. Symmetric objects are accessible by all executing \ac{PE}s via the \openshmem \ac{API}. -Each symmetric data object has a corresponding object with the same name, type, size, and offset (from an arbitrary memory address) on all PEs where that object is accessible via the \openshmem \ac{API}. (For the definition of what is accessible, see the descriptions for \FUNC{shmem\_pe\_accessible} and \FUNC{shmem\_addr\_accessible} in sections \ref{subsec:shmem_pe_accessible} and \ref{subsec:shmem_addr_accessible}.) -Symmetric data objects accessed via typed \openshmem interfaces are required to be natural aligned based on their type requirements and underlying architecture. -In \openshmem{} the following kinds of data objects are symmetric: -\begin{itemize} - \item \Fortran{} data objects in common blocks or with the SAVE attribute. These data objects must not be defined in a dynamic shared object (DSO). - \item Global and static \Clang{} and \Cpp{} variables. These data objects must not be defined in a DSO. - \item \Fortran{} arrays allocated with \textit{shpalloc} - \item \Clang{} and \Cpp{} data allocated by \textit{shmem\_malloc} -\end{itemize} - -%Symmetric Objects -%are static and global variables in \Clang{} and \Cpp, which are often allocated -%at the same address on all \ac{PE}s where the program is being executed -%(\emph{e.g.} in the ELF executable format). -%See Figure \ref{fig:SymmetricHeap1} -%for an example of how Symmetric Memory Objects may be arranged in -%memory. -\openshmem dynamic memory allocation routines (\textit{shpalloc} and \textit{shmem\_malloc}) allow collective allocation of \emph{Symmetric Data Objects} on a special memory region called the \emph{Symmetric Heap}. The Symmetric Heap is created during the execution of a program at a memory location determined by the implementation. The Symmetric Heap may reside in different memory regions on different \ac{PE}s. Figure~\ref{fig:mem_model} shows how \openshmem implements a \ac{PGAS} model using remotely accessible symmetric objects and private data objects when executing an \openshmem program. Symmetric data objects are stored on the symmetric heap or in the global/static memory section of each \ac{PE}. - -%Symmetric data objects can be allocated dynamically in the symmetric heap of each \ac{PE} using -%a collective \FUNC{shmalloc} or \FUNC{shpalloc} memory allocation call. - -%\openshmem specification does not require a particular memory layout; it is up to the implementation -%to decide how to implement the symmetric heap. -%Objects that reside in the private address space can only be accessed by the \ac{PE} itself; these data objects -%cannot be accessed by other \ac{PE}s via \openshmem routines. diff --git a/_deprecated_sources/INTRODUCTION/mpi_interoperability.tex b/_deprecated_sources/INTRODUCTION/mpi_interoperability.tex deleted file mode 100644 index c90be3690..000000000 --- a/_deprecated_sources/INTRODUCTION/mpi_interoperability.tex +++ /dev/null @@ -1,11 +0,0 @@ -\section{\ac{MPI} Interoperability} -\begin{sloppypar} %SP: to prevent constants from running into margins. -\openshmem routines can be used in conjunction with \ac{MPI} -routines in the same program. For example, on SGI systems, programs that use both \ac{MPI} and \openshmem routines call \FUNC{MPI\_Init} and \FUNC{MPI\_Finalize} but omit the call to the \FUNC{shmem\_init} routine. \openshmem \ac{PE} numbers are equal to the \ac{MPI} rank within the \CONST{MPI\_COMM\_WORLD} environment variable. Note that this precludes use of \openshmem routines between processes in different \CONST{MPI\_COMM\_WORLD}s. -\ac{MPI} processes started using the \FUNC{MPI\_Comm\_spawn} routine, for -example, cannot use \openshmem routines to communicate with their parent -\ac{MPI} processes. -\end{sloppypar} -On SGI systems where \ac{MPI} jobs use TCP/sockets for inter-host communication, \openshmem routines can be used to communicate with processes running on the same host. The \FUNC{shmem\_pe\_accessible} routine can be used to determine if a remote \ac{PE} is accessible via \openshmem communication from the local \ac{PE}. When running an \ac{MPI} program involving multiple executable files, \openshmem routines can be used to communicate with processes running from the same or different executable files, provided that the communication is limited to symmetric data objects. On these systems, static memory such as a \Fortran{} common block or \Clang{} global variable, is symmetric between processes running from the same executable file, but is not symmetric between processes running from different executable files. Data allocated from the symmetric heap (\FUNC{shmem\_malloc} or \FUNC{shpalloc}) is symmetric across the same or different executable files. The routine \FUNC{shmem\_addr\_accessible} can be used to determine if a local address is accessible via \openshmem communication from a remote \ac{PE}. - - Another important feature of these systems is that the \FUNC{shmem\_pe\_accessible} routine returns \CONST{TRUE} only if the remote \ac{PE} is a process running from the same executable file as the local PE, indicating that full \openshmem support (static memory and symmetric heap) is available. When using \openshmem routines within an \ac{MPI} program, the use of \ac{MPI} memory placement environment variables is required when using non-default memory placement options. diff --git a/_deprecated_sources/INTRODUCTION/new_execution_model.tex b/_deprecated_sources/INTRODUCTION/new_execution_model.tex deleted file mode 100644 index 0fa0e6adf..000000000 --- a/_deprecated_sources/INTRODUCTION/new_execution_model.tex +++ /dev/null @@ -1,141 +0,0 @@ -%Outline -%%Exectution model -% *Define what is a OpenSHMEM program: a set of processes (either SPMD or MIMD?) where each process has its own 'local' (private) memory and symmetric memory regions that may be accessible by any PEs. -% *Each OpenSHMEM process is called a processing element (PE) -% *Each PE may be mapped to many to one hardware cores/threads or less. -% *The number of PEs is specified at launch/runtime. -% *Each PE must call startpe to initialize the OpenSHMEM runtime, before any other call for OpenSHMEM. There is an implicit barrier at startpe. -% *Each PE executes asynchronously following Fortran or program execution in C [ISO/IEC00 Sec. 5.1.2.3] -% *Each PE will have a unique global identifier and the execution of a program may depend on the PE id, if executed in SPMD. -% *PE id may be used for library calls synchronizations, control flow constructs language in C/Fortran -% *PE may allocate symmetric data objects via a symmetric heap during execution%SP: Does not cover global and static. -% *As of now, PEs may finish execution at any time by returning from the main function. (no call to shmem_finalize yet!) -% -%This comes from the UPC spec: -%The memory consistency model in a language defines the order in which the results of write operations may be observed through read operations. -%The behavior of a OpenSHMEM program may depend on the timing of accesses to symetric variables on PEs, so in general a program defines a set of possible executions, -%rather than a single execution. The memory consistency model constrains the set of possible executions for a given program; the user may then rely -%on properties that are true of all of those executions. - - -\section{Execution Model} -\label{subsec:execution_model} -%An \openshmem{} program consists of a set of processes, called \ac{PE}s, that execute in a \ac{SPMD}-like execution model. In \openshmem different \ac{PE}s can have different execution paths and will execute asynchronously -%following \Fortran{} or \Clang{} program execution. The \ac{PE}s progress independently, and can communicate and synchronize using the \openshmem{} \ac{API}. -%The number of \ac{PE}s in the \openshmem{} program is specified at runtime by the user. %A \ac{PE} can be implemented as an OS process or OS thread~\footnote{As long as the memory model and execution model of \openshmem is followed.}. -%The total number of \ac{PE}s, \VAR{N}, can be mapped to \VAR{M} hardware cores/threads where \VAR{M} can be less or equal than \VAR{N}. %As long as the memory model and execution model of \openshmem is followed. -%An \openshmem program must start by calling the initialization function \FUNC{start\_pes} before using any of the other \openshmem library routines. \ac{PE}s do not exist until after the call to \FUNC{start\_pes} returns. -%During execution, each \ac{PE} is assigned a unique global identifier for the duration of the program. These \ac{PE} identifiers are integers assigned in a monotonically increasing manner from zero to the total number of \ac{PE}s minus 1. \ac{PE} identifiers are used for other \openshmem library calls (e.g. to access symmetric objects from specific \ac{PE}s, collective synchronization) or to dictate a control flow for \ac{PE}s using constructs of -%\Clang{} or \Fortran. As of now, an \openshmem program finishes execution by returning from the main function. It is up to the implementation on how to handle the finalization of the \openshmem library and any other -%resources initialized by the library: there is currently no explicit finalization call defined in the \openshmem specification. - -An \openshmem{} program consists of a set of \openshmem{} processes called \ac{PE}s that execute in a \ac{SPMD}-like model where each \ac{PE} can take a different execution path. A \ac{PE} can be implemented using an OS process or an OS thread\footnote{Implementing \ac{PE}s using OS threads requires compiler techniques to implement the \openshmem{} memory model.}. The \ac{PE}s progress asynchronously, and can communicate/synchronize -via the \openshmem{} interfaces. All \ac{PE}s in an \openshmem{} program should start by calling the initialization routine \FUNC{shmem\_init} \footnote{\textbf{start\_pes} has been deprecated as of Specification 1.2} before using any of the other \openshmem{} library routines. -%SP: Spec 1.2, ticket 108, text from Oscar. -%As of now, an \openshmem program finishes execution by returning from the main function. On program exit, \openshmem must complete all pending communication and release all the resources associated to the library using an implicit collective synchronization across \ac{PE}s. -%On program exit, \openshmem can release all the resources associated to the library. -% It is up to the implementation on how to handle the finalization of the \openshmem library. -An \openshmem program finishes execution by returning from the main routine or when any PE calls \FUNC{shmem\_global\_exit}. When returning from main, \openshmem must complete all pending communication and release all the resources associated to the library using an implicit collective synchronization across PEs. The -user has the option to call \FUNC{shmem\_finalize} (before returning from main) to complete all pending communication and release all the \openshmem library resources without terminating the program. Calling any \openshmem routine after \FUNC{shmem\_finalize} leads to undefined behavior. - -The \ac{PE}{}s of the \openshmem{} program are identified by unique integers. The identifiers are integers assigned in a monotonically increasing manner from zero to the total number of \ac{PE}s minus 1. \ac{PE} identifiers are used for \openshmem{} calls (e.g. to specify \PUT{} or \GET{} routines on symmetric data objects, collective synchronization calls) or to dictate a control flow for \ac{PE}s using constructs of \Clang{} or \Fortran. The identifiers are fixed for the life cycle of the \openshmem{} program. -%on exit implementation are expected to release resources associated to the library - %following \Fortran{} or \Clang{} program execution. -%Each \ac{PE} can be implemented as an OS process or OS thread as long as the constraints imposed -%by the memory model and execution model are respected. -%The \ac{PE} in turn is mapped to either a processor core or a hardware thread. \rcomment{Manju: This sentence requires scrutiny}. -%Though all \ac{PE}s are required to execute the same program, each \ac{PE} is allowed to take -%a different control path. The \ac{PE}s progress independently, and can communicate and synchronize using the \openshmem{} interfaces. - -%The life cycle of \openshmem{} program starts with each \ac{PE} calling a global -%collective routine start\_pes{}, and ends with implementation dependent -%finalization. -%All \ac{PE}s in an \openshmem{} program should start by calling -%the initialization function start\_pes before using any of the other \openshmem{} -%library routines. A \ac{PE}{} calling start\_pes{} call more than once in the lifetime of program can result in an undefined behavior. The current specification does not define the finalization of \openshmem{}program. The implementations are allowed to provide their own interfaces for finalization as long as it is not required for the correct functioning of the \openshmem{} program. -%The \ac{PE}{}s of the \openshmem{} program are identified by unique integers. -%The identifiers are integers assigned in a monotonically increasing manner from zero to the total number of \ac{PE}s minus 1. \ac{PE} identifiers are used for other \openshmem{} library calls (such as collective synchronization) or to dictate a control flow for \ac{PE}s using constructs of \Clang{} or \Fortran. The identifiers are fixed for the life cycle of the \openshmem{} program. -%on exit implementation are expected to release resources associated to the library - -\subsection{Progress of \openshmem Operations} -\label{subsec:progress} -The \openshmem model assumes that computation and communication are naturally overlapped. \openshmem programs are expected to exhibit progression of communication both with and without \openshmem calls. Consider a \ac{PE} that is engaged in a computation with no \openshmem calls. Other \ac{PE}s should be able to communicate (\OPR{put}, \OPR{get}, \OPR{collective}, \OPR{atomic}, etc) and complete communication operations with that computationally-bound \ac{PE} without that \ac{PE} issuing any explicit \openshmem calls. \openshmem communication calls involving that \ac{PE} should progress regardless of when that \ac{PE} next engages in an \openshmem call. - -\textbf{Note to implementors:} - -\begin{itemize} -\item An \openshmem implementation for hardware that does not provide asynchronous communication capabilities may require a software progress thread in order to process remotely-issued communication requests without explicit program calls to the \openshmem library. \item High performance implementations of \openshmem are expected to leverage hardware offload capabilities and - provide asynchronous one-sided communication without software assistance. -\item Implementations should avoid deferring the execution of one-sided operations until a synchronization point where data is known to be available. High-quality implementations should attempt asynchronous delivery whenever possible, for performance reasons. Additionally, the \openshmem community discourages releasing \openshmem implementations that do not provide asynchronous one-sided operations, as these have very limited performance value for \openshmem programs. -\end{itemize} - -% -%ORIGINAL TEXT -%The \openshmem model assumes that computation and communication are -%naturally overlapped, and that all data transfers eventually complete. The OpenSHMEM execution model assumes that computation and communication are naturally overlapped. -%OpenSHMEM programs are expected to exhibit progression of communication both with and without OpenSHMEM calls. -% -%\textbf{Note to implementors:} while delivery can be deferred, for example until a synchronization point at which data is known to be available, high-quality implementations should attempt asynchronous delivery, whenever possible, for performance reasons. Progress can be ensured through the use of a dedicated progress thread in software, or through network hardware that offloads communication handling from processors, for example. - -%High quality \openshmem implementations must insure that programs exhibit %SP: Changing MUST to may as per discussion on 01/31/2014 -%progression of communication both with and without \openshmem calls. - -% A high quality \openshmem{} implementation may ensure that communication will -% progress without requiring \openshmem{} calls. - -%Consider a \ac{PE} that is engaged in a long computation with no \openshmem calls: other \ac{PE}s must be able to communicate (e.g. \PUT{}/\GET{}, -%collective, atomic operations) with that computationally-bound \ac{PE} without that \ac{PE} -%issuing any explicit \openshmem calls. \openshmem communication calls involving that \ac{PE} must progress -%regardless of when that \ac{PE} next engages in an \openshmem call. - -%\textbf{Note to implementers:} progress will often be ensured through -%the use of a dedicated progress thread in software, or through -%network hardware that offloads communication handling from processors, for example. -%SP: Why only communication ? Shouldn't t be for all openshmem calls? -% TC: separating out communication seemed to be the relevant comment here, as -% opposed to other offloads -%\subsection{Using the Symmetric \VAR{Work} and \VAR{pSync} Arrays} - -%Multiple \VAR{pSync} arrays are often needed if a particular \ac{PE} calls a \openshmem -%collective function twice without intervening barrier synchronization. -%Problems would occur if some \ac{PE}s in the \activeset{} for call 2 arrive at -%call 2 before processing of call 1 is complete by all \ac{PE}s in the call 1 -%\activeset. You can use \FUNC{shmem\_barrier} or \FUNC{shmem\_barrier\_all} to -%perform a barrier synchronization between consecutive calls to \openshmem -%collective functions. There are two special cases: -%\begin{itemize} -%\item The \FUNC{shmem\_barrier} function allows the same \VAR{pSync} array to be used -% on consecutive calls as long as the active \ac{PE} set does not change. -%\item If the same collective function is called multiple times with the -% same \activeset, the calls may alternate between two \VAR{pSync} arrays. -% The \openshmem functions guarantee that a first call is completely finished by -% all \ac{PE}s by the time processing of a third call begins on -% any \ac{PE}. -%\end{itemize} -%Because the \openshmem functions restore \VAR{pSync} to its original contents, -%multiple calls that use the same \VAR{pSync} array do not require that \VAR{pSync} -%be reinitialized after the first call. - -\subsection{Atomicity Guarantees} -\label{subsec:amo_guarantees} -\openshmem contains a number of routines that operate on symmetric data -atomically (Section \ref{sec:amo}). These routines guarantee that accesses by \openshmem's atomic operations will be exclusive, but do not guarantee exclusivity -in combination with other routines, either inside \openshmem or outside. - -For example: during the execution of an atomic remote integer increment -operation on a symmetric variable \VAR{X}, no other \openshmem atomic -operation may access \VAR{X}. After the increment, \VAR{X} will have -increased its value by \CONST{1} on the destination \ac{PE}, at which point other -atomic operations may then modify that \VAR{X}. -However, access to the symmetric object \VAR{X} with non-atomic operations, such as one-sided \PUT{} or \GET{} operations, will \OPR{invalidate} the atomicity guarantees. - -% %Memory model -% *Each OpenSHMEM PEs may have symmetric memory that is accessible by other PEs. -% *Symmetric memory is a region of memory where all the an instance of a data objects is replicated across PEs, have -% the same the same layout and relative offset. -% *All PEs can allocate a symmetric data objects using the symmetric heap, but they must do so as a collective operation. (is there a barrier after shmalloc?) -% *All writes to symmetric memory are relaxed (I'm not sure if this is the completion semantics) and are guaranteed to be visible to other PEs after a barrier_all, barrier(?), quiet, (what about wait? does it means iti sonly visible to me?) -% *Calls to barrier, barrier_all, quiet, wait, lock, atomics, are meant to guarantee memory consistency across PEs. -% *Read/Writes to symmetic data object may appear after startpe or after a the symmetric data object has been allocated in the symmetric heap (if it is a dynamic). -% *Operations like reduction, collect, etc guarantee memory consistency after completion(?) -% *Data races are possible in OpenSHMEM if multiple PEs write/read a symmetric data object from a single PE without proper synchronization. diff --git a/_deprecated_sources/INTRODUCTION/openshmem_history.tex b/_deprecated_sources/INTRODUCTION/openshmem_history.tex deleted file mode 100644 index 138a855ad..000000000 --- a/_deprecated_sources/INTRODUCTION/openshmem_history.tex +++ /dev/null @@ -1,93 +0,0 @@ -SHMEM has a long history as a parallel programming -model, having been used extensively on a number of products since -1993, including Cray T3D, Cray X1E, the Cray XT3/4, SGI Origin, SGI -Altix, clusters based on the Quadrics interconnect, and to a very -limited extent, Infiniband based clusters. - -\begin{itemize} -\item A SHMEM Timeline - \begin{itemize} - \item Cray SHMEM - \begin{itemize} - \item SHMEM first introduced by Cray Research Inc. in 1993 for Cray T3D - \item Cray is acquired by SGI in 1996 - \item Cray is acquired by Tera in 2000 (MTA) - \item Platforms: Cray T3D, T3E, C90, J90, SV1, SV2, X1, X2, XE, XMT, XT - \end{itemize} - \item SGI SHMEM - \begin{itemize} - \item SGI purchases Cray Research Inc. and SHMEM was integrated into - SGI's Message Passing Toolkit (MPT) - \item SGI currently owns the rights to SHMEM and \openshmem - \item Platforms: Origin, Altix 4700, Altix XE, ICE, UV - \item SGI was purchased by Rackable Systems in 2009 - \item SGI and Open Source Software Solutions, Inc. (OSSS) signed a - SHMEM trademark licensing agreement, in 2010 - \end{itemize} - \item Other Implementations - \begin{itemize} - \item Quadrics (Vega UK, Ltd.) - \item Hewlett Packard - \item GPSHMEM - \item IBM - \item QLogic - \item Mellanox - % \item University of Houston - \item University of Florida - \end{itemize} - \end{itemize} -\item OpenSHMEM Implementations - \begin{itemize} - \item SGI \openshmem - \item University of Houston - \openshmem Reference Implementation - \item Mellanox ScalableSHMEM - \item Portals-SHMEM - \item IBM OpenSHMEM - \end{itemize} -\end{itemize} - - -%Despite being supported by a variety of vendors there is no standard -%defining the SHMEM memory model or programming interface. Consistencies -%(where they exist) and extensions across the various implementations have -%been driven by the needs of an enthusiastic user community. The lack of a -%SHMEM standard has allowed each implementation to differ in both interface -%and semantics from vendor to vendor and even product line to product line, -%which has to this point limited broader acceptance. - -%\begin{description} -%\item [{{Cray~SHMEM~(MP-SHMEM,~LC-SHMEM):}}] Cray first introduced -%SHMEM in 1993 for its Cray T3D systems. Cray SHMEM was also used in -%other models: T3E, PVP and XT series. -%\item [{{SGI~SHMEM~(SGI-SHMEM):}}] Cray Research merged with Silicon -%Graphics (SGI) in February 1996. At this point SHMEM was incorporated -%into SGI's Message Passing Toolkit (MPT). The platforms supported -%were - SGI Irix, Origin and Altix. -%\item [{{Quadrics~SHMEM~(Q-SHMEM):}}] an optimized API for the Quadrics -%QsNet interconnect. It included SGI extensions and provided non-blocking -%puts and gets. A joint effort from HCS Lab \& Quadrics incorporated -%a program profiling interface called PSHMEM that can aid in the execution -%analysis of SHMEM programs. -%\end{description} -%The success of SHMEM's performance attracted several vendors to provide -%implementations (with varying names and features) for their systems. -%Some of them include: -%\begin{description} -%\item [{{HP~SHMEM:}}] Based on the Quadrics API. It is included in the -%UPC product kit. -%\item [{{Cyclops-64~SHMEM~(C64-SHMEM):}}] this SHMEM API supports the -%Cyclops-64 architecture. Most of the core features of Cray SHMEM are -%available with some additional interfaces specific to the Cyclops-64 -%architecture. -% -%\item [{{IBM~SHMEM:}}] An implementation created by IBM intended for -%internal use only. -%\item [{{TurboSHMEM:}}] This implementation uses IBM's Low-Level API -%(LAPI) technology to obtain optimized one-sided communication for -%the put/get operations. This allows applications written with the -%SHMEM API to run on IBM platforms with minimal source code changes. -%\item [{{GPSHMEM:}}] This implementation of SHMEM aims at providing full -%portability of applications. It is built mostly with Cray T3D components -%and functionalities and provides MPI and ARMCI support. This project -%is no longer maintained. -%\end{description} diff --git a/_deprecated_sources/INTRODUCTION/ordering_intro.tex b/_deprecated_sources/INTRODUCTION/ordering_intro.tex deleted file mode 100644 index ac8fc9f59..000000000 --- a/_deprecated_sources/INTRODUCTION/ordering_intro.tex +++ /dev/null @@ -1,2 +0,0 @@ -The following section discusses \openshmem \ac{API}s that provide mechanisms to ensure ordering and/or delivery of \OPR{Put}, \ac{AMO}, and memory store routines to symmetric data -objects. \ No newline at end of file diff --git a/_deprecated_sources/INTRODUCTION/original_language_bindings.tex b/_deprecated_sources/INTRODUCTION/original_language_bindings.tex deleted file mode 100644 index f2db6e94c..000000000 --- a/_deprecated_sources/INTRODUCTION/original_language_bindings.tex +++ /dev/null @@ -1,7 +0,0 @@ -\section{Language Bindings and Conformance} - -\openshmem is available with \Clang{} and \Fortran{} bindings. The \Cpp{} -interface is currently the same as that for \Clang. An \openshmem implementation can be conformant to one or both of the -interfaces. An implementation that provides e.g.\ only a \Clang{} interface may claim to conform to the \openshmem specification with respect to -the \Clang{} language, but not to \Fortran{} and should make this clear in its documentation. An implementation that provides both \Clang{} and \Fortran{} bindings may claim -complete conformance. diff --git a/_deprecated_sources/INTRODUCTION/osh_project.tex b/_deprecated_sources/INTRODUCTION/osh_project.tex deleted file mode 100644 index e4f822c2f..000000000 --- a/_deprecated_sources/INTRODUCTION/osh_project.tex +++ /dev/null @@ -1,8 +0,0 @@ -\section{The \openshmem Effort} - -\openshmem is a \ac{PGAS} library interface specification. \openshmem aims to provide a standard \ac{API} for SHMEM libraries to aid portability and facilitate uniform predictable results of \openshmem programs by explicitly stating the behavior and semantics of the \openshmem library calls. Through the different versions, \openshmem will continue to address the requirements of the \ac{PGAS} community. -As of this specification, existing vendors are moving towards \openshmem compliant implementations and new vendors are developing \openshmem library implementations to help the users write portable \openshmem code. This ensures that programs can run on multiple platforms without having to deal with subtle vendor-specific implementation differences. For more details on the history of -\openshmem please refer to \hyperref[sec:openshmem_history]{The History of \openshmem} section. - -%\footnote{The \openshmem specification is owned by Open Source Software Solutions LLC, a non-profit organization.} -The \openshmem\footnote{The \openshmem specification is owned by Open Source Software Solutions Inc., a non-profit organization, under an agreement with SGI.} effort is driven by the \ac{ESSC} at \ac{ORNL} and the University of Houston with significant input from the \openshmem{} community. Besides the specification, the effort also includes providing a reference \openshmem implementation, validation and verification suites, tools, a mailing list and website infrastructure to support specification activities. For more information please refer to: \url{http://www.openshmem.org/}. diff --git a/_deprecated_sources/INTRODUCTION/overview.tex b/_deprecated_sources/INTRODUCTION/overview.tex deleted file mode 100644 index 8c5de8282..000000000 --- a/_deprecated_sources/INTRODUCTION/overview.tex +++ /dev/null @@ -1,74 +0,0 @@ -\section{Overview} -\openshmem is a \ac{PGAS} library interface specification. In the \ac{PGAS} model each process has a local and -globally shared memory where portions of the shared memory may have affinity to a particular process. \openshmem -implements \ac{PGAS} using symmetric memory to share information among processes or \ac{PE}s. -It provides interfaces to perform communication and synchronization operations on both local and symmetric memory. -\openshmem is a library and unlike UPC, CAF, Titanium, X10 and Chapel, which are all -PGAS languages, it relies on the programmer to use the library calls correctly. - -The \openshmem specification is a result of effort to standardize widely available SHMEM implementations. -The initial goal of the specification is to consolidate existing vendor SHMEM implementations, and pave the way for -a defacto standard for SHMEM with community involvement. This enables portability of SHMEM programs, and -allows vendors to build and optimize their hardware architecture for OpenSHMEM. - -The \openshmem specification defines routines, constants, variables, and language bindings for \Clang{} and \Fortran. -Some of important \openshmem operations are as follows: - -\begin{enumerate} -\item \textbf{Data Transfers } - -\begin{enumerate} -\item One-sided puts : the initiator \ac{PE} (active side) specifies the local -data to be written to the target \ac{PE}'s (passive side) memory. -\item One-sided gets : an explicit fetch operation is used to copy a variable -amount of data from a remote process and store it locally.\end{enumerate} -\begin{description} -\item [{{Note:}}] By avoiding the need for matching send and receive -calls, \openshmem{}simplifies the communication process by reducing the -number of calls required to have one \ac{PE} interact with other \ac{PE}s. -\end{description} -\item \textbf{Synchronization Mechanisms } - -\begin{enumerate} -\item Fence: Ensures ordering of PUT operations to a specific \ac{PE}. -\item Quiet: Ensures ordering of PUT operations to all \ac{PE}s. -\item Barrier: A collective synchronization routine in which no \ac{PE} may leave -the barrier prior to all \ac{PE}s entering the barrier. -\end{enumerate} -\item \textbf{Collective Communication} - -\begin{enumerate} -\item Broadcast: Copy a block of data from one \ac{PE} to one or more remote -\ac{PE}s. -\item Collection: Concatenate elements from the source array to a target -array over the specified \ac{PE}s. -\item Reduction: Perform an associative binary operation over the specified -\ac{PE}s. -\end{enumerate} -\item \textbf{Address Manipulation} - -\begin{enumerate} -\item Allocating and deallocating memory blocks in the symmetric space. -\end{enumerate} -\item \textbf{Locks} - -\begin{enumerate} -\item Implementation of mutual exclusion. -\end{enumerate} -\item \textbf{Atomic Memory Operations} - -\begin{enumerate} -\item Swap, Conditional Swap, Add and Increment -\end{enumerate} -\item \textbf{Data Cache control} - -\begin{enumerate} -\item Implementation of mechanisms to exploit the capabilities of hardware -cache if available. -\end{enumerate} -\end{enumerate} -\begin{description} -\item [{{Note:}}] More information about \openshmem routines can be found -in the Library Routines section. -\end{description} - diff --git a/_deprecated_sources/INTRODUCTION/programming_model.tex b/_deprecated_sources/INTRODUCTION/programming_model.tex deleted file mode 100644 index ac0b4dad4..000000000 --- a/_deprecated_sources/INTRODUCTION/programming_model.tex +++ /dev/null @@ -1,107 +0,0 @@ -\section{Programming Model Overview} -%SP: Addressing suggestions from discussion on 01/28/2014 Merging the commented portions into the body. -%The \openshmem programming model consists of library routines that provide -%low-latency, high-bandwidth communication for use in highly parallelized -%scalable programs. The routines in the \openshmem \ac{API} provide a programming -%model for exchanging data between cooperating parallel processes. The resulting programs are similar -%in style to \ac{MPI} programs. The \openshmem \ac{API} can be used either alone -%or in combination with \ac{MPI} routines in the same parallel program. -%\openshmem implements a \ac{PGAS} model. -%In the \ac{PGAS} model, each process has a local and globally shared memory where portions of the shared memory may have affinity to a particular process. -\openshmem implements \ac{PGAS} by defining remotely accessible data objects as mechanisms to share information among \openshmem processes or \acp{PE} and private data objects that are accessible by the \ac{PE} itself. The \ac{API} allows communication and synchronization operations on both private (local to the PE initiating the operation) and remotely accessible data objects. The key feature of \openshmem is that data transfer operations are \textit{\textbf{one-sided}} in nature. This means that a local \ac{PE} executing a data transfer routine does not require the participation of the remote \ac{PE} to complete the routine. This allows for overlap between communication and computation to hide data transfer latencies, which makes \openshmem ideal for unstructured, small/medium size data communication patterns. The \openshmem library routines have the potential to provide a low-latency, high-bandwidth communication \ac{API} for use in highly parallelized scalable programs. -%\rcomment{Manju: To do - Make sure the first paragraph does not say the same -%things has first paragraph of Section 1} -%An \openshmem program is currently \ac{SPMD} in style. The -%\openshmem processes, called \ac{PE}s, all start at the -%same time, and they all run the same program. Usually the \ac{PE}s perform -%computation on their own subdomains of the larger problem, and periodically -%communicate with other \ac{PE}s to exchange information on which the -%next computation phase depends. -%SP: Addressing suggestions from discussion on 01/31/2014 - -%Data latency is the period of time that starts when a \ac{PE} initiates a transfer of data -%and ends when a \ac{PE} can use the data. %SP: What about put? Not guaranteed till synchronization is hit. - -%SP: Addressing suggestions from discussion on 01/28/2014 -%\openshmem routines support remote data transfer through \PUT operations, which transfer data to a -%different \ac{PE}, get operations, which transfer data from a different \ac{PE}, and remote pointers, which -%allow direct references to data objects owned by another \ac{PE}. Other operations supported are \OPR{collective} -%\OPR{broadcast} and \OPR{reduction}, \OPR{barrier synchronization}, and \OPR{atomic memory operations}. -%An atomic memory operation is an atomic read-and-update operation, such as a fetch-and-increment, on a remote -%or local data object. - -%\rcomment{Manju: [The idea is to talk SPMD. We are talking about nature of interfaces rather than -% the interfaces that enable SPMD. Replace the second paragraph with the one below ?]} -%\rcomment{\\ Oscar: I'm good with this change. minor change to say the SPMD can be used to decompose work\\} -The \openshmem{} interfaces can be used to implement \ac{SPMD} style programs. It provides interfaces to start the \openshmem{} \ac{PE}s in parallel, and communication and synchronization interfaces to access remotely accessible data objects across \ac{PE}s. These interfaces can be leveraged to divide a problem into multiple sub-problems that can be solved independently or with coordination using the communication and synchronization interfaces. The \openshmem specification defines library calls, constants, variables, and language bindings for \Clang{} and \Fortran{}. The \Cpp{} interface is currently the same as that for \Clang. Unlike UPC, Fortran 2008, Titanium, X10 and Chapel, which are all PGAS languages, \openshmem relies on -the user to use the library calls to implement the correct semantics of its programming model. - -An overview of the \openshmem routines is described below: - -\begin{enumerate} -\item \textbf{Library Setup and Query} - -\begin{enumerate} -\item \OPR{Initialization}: The \openshmem library environment is initialized. -\item \OPR{Query}: The local \ac{PE} may get number of \acp{PE} running the same program and its unique integer identifier. -\item \OPR{Accessibility}: The local \ac{PE} can find out if a remote \ac{PE} is executing the same binary, or if a particular symmetric data object can be accessed by a remote \ac{PE}, or may obtain a pointer to a symmetric data object on the specified remote \ac{PE} on shared memory systems. -\end{enumerate} - -\item \textbf{Symmetric Data Object Management} -\begin{enumerate} -\item \OPR{Allocation}: All executing \ac{PE}s must participate in the allocation of a symmetric data object with identical arguments. -\item \OPR{Deallocation}: All executing \ac{PE}s must participate in the deallocation of the same symmetric data object with identical arguments. -\item \OPR{Reallocation}: All executing \ac{PE}s must participate in the reallocation of the same symmetric data object with identical arguments. -\end{enumerate} - -\item \textbf{Remote Memory Access} - -\begin{enumerate} -\item \PUT: The local \ac{PE} specifies the \source{} -data object (private or symmetric) that is copied to the symmetric data object on the remote \ac{PE}. -\item \GET: The local \ac{PE} specifies the symmetric data object on the remote \ac{PE} -that is copied to a data object (private or symmetric) on the local \ac{PE}. -\end{enumerate} - -\item \textbf{Atomics} -\begin{enumerate} -\item \OPR{Swap}: The \ac{PE} initiating the swap gets the old value of a symmetric data object from a remote \ac{PE} and copies a new value to that symmetric data object on the remote \ac{PE}. -\item \OPR{Increment}: The \ac{PE} initiating the increment adds 1 to the symmetric data object on the remote \ac{PE}. -\item \OPR{Add}: The \ac{PE} initiating the add specifies the value to be added to the symmetric data object on the remote \ac{PE}. -\item \OPR{Compare and Swap}: The \ac{PE} initiating the swap gets the old value of the symmetric data object based on a value to be compared and copies a new value to the symmetric data object on the remote \ac{PE}. -\item \OPR{Fetch and Increment}: The \ac{PE} initiating the increment adds 1 to the symmetric data object on the remote \ac{PE} and returns with the old value. -\item \OPR{Fetch and Add}: The \ac{PE} initiating the add specifies the value to be added to the symmetric data object on the remote \ac{PE} and returns with the old value. -\end{enumerate} - -\item \textbf{Synchronization and Ordering} -\begin{enumerate} -\item \OPR{Fence}: The \ac{PE} calling fence ensures ordering of remote access operations and stores to symmetric data objects with respect to a specific destination \ac{PE}. -\item \OPR{Quiet}: The \ac{PE} calling quiet ensures completion of remote access operations and stores to symmetric data objects. -\item \OPR{Barrier}: All or some \ac{PE}s collectively synchronize and ensure completion of all remote and local updates prior to any \ac{PE} returning from the call. -\end{enumerate} - -\item \textbf{Collective Communication} -\begin{enumerate} -\item \OPR{Broadcast}: The \textit{root} \ac{PE} specifies a symmetric data object to be copied to a symmetric data object on one or more remote \acp{PE} (not including itself). -\item \OPR{Collection}: All \acp{PE} participating in the routine get the result of concatenated symmetric objects contributed by each of the \acp{PE} in another symmetric data object. -\item \OPR{Reduction}: All \acp{PE} participating in the routine get the result of an associative binary routine over elements of the specified symmetric data object on another symmetric data object. -\end{enumerate} - -\item \textbf{Mutual Exclusion} -\begin{enumerate} -\item \OPR{Set Lock}: The \ac{PE} acquires exclusive access to the region bounded by the symmetric \textit{lock} variable. -\item \OPR{Test Lock}: The \ac{PE} tests the symmetric \textit{lock} variable for availability. -\item \OPR{Clear Lock}: The \ac{PE} which has previously acquired the \textit{lock} releases it. -\end{enumerate} - -\item \textbf{Data Cache Control \textit{(deprecated on cache coherent systems )}} -\begin{enumerate} -\item Implementation of mechanisms to exploit the capabilities of hardware -cache if available. -\end{enumerate} -\end{enumerate} - -%\begin{description} -%\item [{{Note:}}] More information about \openshmem routines can be found -%in the Library Routines section. -%\end{description} diff --git a/_deprecated_sources/INTRODUCTION/rma_intro.tex b/_deprecated_sources/INTRODUCTION/rma_intro.tex deleted file mode 100644 index 6b5866a33..000000000 --- a/_deprecated_sources/INTRODUCTION/rma_intro.tex +++ /dev/null @@ -1,30 +0,0 @@ -\subsection{Remote Memory Access Routines} -\label{sec:rma} -The \ac{RMA} routines described in this section are one-sided communication -mechanisms of the \openshmem{} \ac{API}. While using these mechanisms, the user is required to provide parameters only on the calling side. A characteristic of one-sided communication is that it decouples communication from -the synchronization. One-sided communication mechanisms transfer -the data but do not synchronize the sender of the data with the receiver of the data. -%Oscar: I commented this because this sentence is useful but for background, but is out of scope for the spec API overview -%However, two-sided communication mechanisms such as Send/Recv have two effects: -%communication of data, and synchronization of the sender with the receiver. - -\openshmem{} \ac{RMA} routines are all performed on the symmetric objects. -The initiator \ac{PE} of the call is designated as \source{}, and the -\ac{PE} in which memory is accessed is designated as \dest{}. In the case of the remote -update routine, \PUT{}, the origin is the \source{} \ac{PE} and the -destination \ac{PE} is the \dest{} PE. In the case of the remote read routine, \GET{}, -the origin is the \dest{} \ac{PE} and the destination is the \source{} \ac{PE}. - -\openshmem{} provides three different types of one-sided communication interfaces. -\FUNC{shmem\_put$<$bits$>$} interface transfers data in chunks -of bits. \FUNC{shmem\_put32}, for example, copies data to a \dest{} \ac{PE} in chunks of 32 bits. \FUNC{shmem\_$<$datatype$>$\_put} interface copies elements of type -\textit{datatype} from a \source{} \ac{PE} to a \dest{} \ac{PE}. -For example, \FUNC{shmem\_integer\_put}, copies elements -of type integer from a \source{} \ac{PE} to a \dest{} \ac{PE}. -\FUNC{shmem\_$<$datatype$>$\_p} interface is similar to \FUNC{shmem\_$<$datatype$>$\_put} except that it only transfers one element of type \VAR{datatype}. - -\openshmem{} provides interfaces for transferring both contiguous and -non-contiguous data. The non-contiguous data transfer interfaces are prefixed -with ``\VAR{i}". \FUNC{shmem\_$<$datatype$>$\_iput} interface, for example, copies strided data elements from the \source{} \ac{PE} to a \dest{} \ac{PE}. - - diff --git a/_deprecated_sources/INTRODUCTION/setup_query_intro.tex b/_deprecated_sources/INTRODUCTION/setup_query_intro.tex deleted file mode 100644 index e961fe7cb..000000000 --- a/_deprecated_sources/INTRODUCTION/setup_query_intro.tex +++ /dev/null @@ -1 +0,0 @@ -The library setup and query interfaces that initialize and monitor the parallel environment of the \ac{PE}s. \ No newline at end of file diff --git a/_deprecated_sources/INTRODUCTION/synchronization_intro.tex b/_deprecated_sources/INTRODUCTION/synchronization_intro.tex deleted file mode 100644 index c8923227f..000000000 --- a/_deprecated_sources/INTRODUCTION/synchronization_intro.tex +++ /dev/null @@ -1 +0,0 @@ -The following section discusses \openshmem \ac{API}s that provides a mechanism for synchronization between two \ac{PE}s based on the value of a symmetric data object. diff --git a/_deprecated_sources/INTRODUCTION/synchronization_model.tex b/_deprecated_sources/INTRODUCTION/synchronization_model.tex deleted file mode 100644 index eb2dcf2cb..000000000 --- a/_deprecated_sources/INTRODUCTION/synchronization_model.tex +++ /dev/null @@ -1,176 +0,0 @@ -\subsubsection{Synchronization and Communication Ordering in \openshmem} - -%In the presence of the \openshmem's one-sided communication, synchronization and ordering become critical. - -When using the \openshmem \ac{API}, synchronization, ordering, and completion of communication become critical. The updates via \PUT{} routines, \acp{AMO} and store routines on symmetric data cannot be guaranteed until some form of synchronization or ordering is introduced by the program user. The table below gives the different synchronization and ordering choices, and the situations where they may be useful.\\ - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -\hline -\textbf{\openshmem \ac{API}} & \centering \textbf{Working of \openshmem \ac{API}} \tabularnewline -\hline -\hline -{Point-to-point synchronization}\\ -\FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until} -& -\raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{diagrams/updated/wait}} -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -{} -& -{ Waits for a symmetric variable to be updated by a remote \ac{PE}. Should be used when computation on the local \ac{PE} cannot proceed without the value that the remote \ac{PE} is to update.} \tabularnewline -\hline -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} - -{Ordering puts issued by a local \ac{PE}} \\ -\FUNC{shmem\_fence} -& -\raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{diagrams/updated/fence}} -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -{} -& -All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline -%Fence guaranteed order of puts before and after before \Put{}s -%before the fence operation by the local \ac{PE} are guaranteed to be completed and visible before puts issued after the fence call. -% This operation should be used when all remote writes by a local \ac{PE} to a specific remote \ac{PE} need to be visible %(\rcomment{Swaroop: assuming visible == delivered}) -%before any new remote write operation to the same \ac{PE}. \tabularnewline -\hline -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -\hline -\textbf{\openshmem \ac{API}} & \centering \textbf{Working of \openshmem \ac{API}} \tabularnewline -\hline -\hline -{Ordering puts issued by all \ac{PE} }\\ -\FUNC{shmem\_quiet} -& -\raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{diagrams/updated/quiet}} -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -{} -& -{All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued by a local \ac{PE} to all remote \ac{PE}s are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \ac{PE}s before the local \ac{PE} proceeds. } \tabularnewline -\hline -\end{tabular} - - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -Collective synchronization over an \activeset \\ -\FUNC{shmem\_barrier} -& -\raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{diagrams/updated/barrier}} -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -{} -& -{All local and remote memory operations issued by all \ac{PE}s within the \activeset{} are guaranteed to be completed before any \ac{PE} in the \activeset{} returns from the call. Additionally, no \ac{PE} my return from the barrier until all \ac{PE}s in the \activeset{} have entered the same barrier call. This routine should be used when synchronization as well as completion of all stores and remote memory updates via \openshmem is required over a sub set of the executing \ac{PE}s.} \tabularnewline %Figure (\ref{fig:barrier}). -\hline -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -\hline -\textbf{\openshmem \ac{API}} & \centering \textbf{Working of \openshmem \ac{API}} \tabularnewline -\hline -\hline -{Collective synchronization over all \ac{PE}s} \\ - \FUNC{shmem\_barrier\_all} -& -\raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{diagrams/updated/barrierall}} -\end{tabular} - -\begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} -{} -& -{All local and remote memory operations issued by all \ac{PE}s are guaranteed to be completed before any \ac{PE} returns from the call. Additionally no \ac{PE} shall return from the barrier until all \ac{PE}s have entered the same \FUNC{shmem\_barrier\_all} call. This routine should be used when synchronization as well as completion of all stores and remote memory updates via \openshmem is required over all \ac{PE}s. } \tabularnewline -\hline -\end{tabular} -\clearpage -%%%%%%%%%%%%%%%%%OLD LAYOUT%%%%%%%%%%%%%%%% -%\begin{tabular}{|p{0.2\textwidth}|p{0.4\textwidth}|p{0.3\textwidth}|} -%\hline -%\textbf{\openshmem \ac{API}} & \centering \textbf{Working of \openshmem \ac{API}} & \textbf{Appropriate Situation}\tabularnewline -%\hline -%\hline -%{Point-to-point synchronization}\\ -%\FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until} -%& -%\raisebox{-\totalheight}{\includegraphics[width=0.39\textwidth]{diagrams/updated/wait}} -%{Waits for a symmetric variable to be updated by a remote \ac{PE}. Should be used when computation at the local \ac{PE} cannot proceed without the value that the remote \ac{PE} is to update.} \tabularnewline -%% Figure (\ref{fig:wait}).}\tabularnewline -%\hline -%Ordering puts issued by a local \ac{PE} \\ -%\FUNC{shmem\_fence} -%& -%\raisebox{-\totalheight}{\includegraphics[width=0.39\textwidth]{diagrams/updated/fence}} -%& -%All puts issued before the fence operation by the local \ac{PE} are guaranteed to be delivered before puts issued after the fence call to the same remote \ac{PE}. This operation should be used when all remote writes by a local \ac{PE} to a remote \ac{PE} need to be visible %(\rcomment{Swaroop: assuming visible == delivered}) -%before any new remote write operation to the same \ac{PE}. \tabularnewline -%%Figure (\ref{fig:fence}).\tabularnewline -%\hline -%Ordering puts issued by all \ac{PE} \\ -%\FUNC{shmem\_quiet} -%& -%\raisebox{-\totalheight}{\includegraphics[width=0.39\textwidth]{diagrams/updated/quiet}} -%& -%{All puts issued by all \ac{PE}s are guaranteed to be delivered before the next local update or remote memory update via \openshmem (\rcomment{May change after SGI's input.}). This operation should be used when all remote writes by all \ac{PE}s need to be visible to all other \ac{PE}s before any new local or remote memory update via \openshmem library operation. } \tabularnewline -%%Figure (\ref{fig:quiet}).} \tabularnewline -%\hline -%\end{tabular} -%\clearpage -%\begin{tabular}{|p{0.2\textwidth}|p{0.4\textwidth}|p{0.3\textwidth}|} -%\hline -%Collective synchronization over an \activeset \\ -%\FUNC{shmem\_barrier} -%& -%\raisebox{-\totalheight}{\includegraphics[width=0.39\textwidth]{diagrams/updated/barrier}} -%& -%{All local and remote memory operations issued by all \ac{PE}s within the \activeset{} are guaranteed to be completed before any \ac{PE} in the \activeset{} returns from the call. Additionally no \ac{PE} my return from the barrier till all \ac{PE}s in the \activeset{} have called the same barrier call. This operation should be used when synchronization as well as completion of local stores and remote memory updates via \openshmem is required over a sub-set of the executing \ac{PE}s.} \tabularnewline %Figure (\ref{fig:barrier}). -%\hline -%Collective synchronization over all \ac{PE}s \\ -% \FUNC{shmem\_barrier\_all} -%& -%\raisebox{-\totalheight}{\includegraphics[width=0.39\textwidth]{diagrams/updated/barrierall}} -%& -%{All local and remote memory operations issued by all \ac{PE}s are guaranteed to be completed before any \ac{PE} returns from the call. Additionally no \ac{PE} my return from the barrier until all \ac{PE}s have called the same barrier call. This operation should be used when synchronization as well as completion of local stores and remote memory updates via \openshmem is required over all \ac{PE}s. } \tabularnewline%Figure (\ref{fig:barrierall}). -% -%\hline -%\end{tabular} - - -%\begin{figure} -%% \centering -% \begin{subfigure}{0.5\textwidth} -% \includegraphics[width=\textwidth]{diagrams/updated/wait} -% \caption{\FUNC{shmem\_wait}} -% \label{fig:wait} -% \end{subfigure} -% \begin{subfigure}{0.49\textwidth} -% \includegraphics[width=\textwidth]{diagrams/updated/fence} -% \caption{\FUNC{shmem\_fence}} -% \label{fig:fence} -% \end{subfigure} -% \begin{subfigure}{0.48\textwidth} -% \includegraphics[width=\textwidth]{diagrams/updated/quiet} -% \caption{\FUNC{shmem\_quiet}} -% \label{fig:quiet} -% \end{subfigure} -% \begin{subfigure}{0.48\textwidth} -% \includegraphics[width=\textwidth]{diagrams/updated/barrier} -% \caption{\FUNC{shmem\_barrier}} -% \label{fig:barrier} -% \end{subfigure} -% \centering -% \begin{subfigure}{0.48\textwidth} -% \includegraphics[width=\textwidth]{diagrams/updated/barrierall} -% \caption{\FUNC{shmem\_barrierall}} -% \label{fig:barrierall} -% \end{subfigure} -% \caption{\openshmem{} synchronization operations}\label{fig:animals} -%\end{figure} diff --git a/_deprecated_sources/INTRODUCTION/undefined_behavior.tex b/_deprecated_sources/INTRODUCTION/undefined_behavior.tex deleted file mode 100644 index f199d4782..000000000 --- a/_deprecated_sources/INTRODUCTION/undefined_behavior.tex +++ /dev/null @@ -1,55 +0,0 @@ - -The specification provides guidelines to the expected behavior of -various library routines. In cases where routines are improperly used -or the input is not in accordance with the specification, undefined -behavior may be observed. Depending on the implementation there are -many interpretations of undefined behavior. - -$\;$ - -$ $% -\begin{tabular}{|>{\raggedright}p{0.3\textwidth}|>{\raggedright}p{0.6\textwidth}|} -\hline -\textbf{Inappropriate Usage} & \textbf{Undefined Behavior}\tabularnewline -\hline -\hline -Uninitialized library & If \openshmem is not initialized through a call to -\FUNC{shmem\_init}, subsequent accesses to \openshmem routines have undefined -results. An implementation may choose, for example, to try to continue or abort -immediately upon the first call to an uninitialized routine.\tabularnewline -\hline -Accessing non-existent \ac{PE}s & If a communications routine accesses a -non-existent \ac{PE}, then the \openshmem library can choose to handle this -situation in an implementation-defined way. For example, the library may issue -an error message saying that the \ac{PE} accessed is outside the range of -accessible \ac{PE}s, or may exit without a warning.\tabularnewline -\hline -Use of non-symmetric variables & Some routines require remotely accessible -variables to perform their function. A \PUT{} to a non-symmetric variable can -be trapped where possible and the library can abort the program. Another -implementation may choose to continue either with a warning or -silently.\tabularnewline -\hline -Non-symmetric variables & The symmetric memory management routines are -collectives, which means that all \ac{PE}s in the program must issue the same -\FUNC{shmem\_malloc} call with the same size request. Program behavior after a -mismatched \FUNC{shmem\_malloc} call is undefined.\tabularnewline -\hline -Use of NULL pointers with non-zero \VAR{len} specified & In any \openshmem routine -that takes a pointer and \VAR{len} describing the number of elements in that -pointer, NULL may not be specified for the pointer unless the corresponding \VAR{len} is also -specified as zero. Otherwise, the resulting behavior is undefined. -The following cases summarize this behavior: -\begin{itemize} - \item \VAR{len} is 0, pointer is NULL: supported. - \item \VAR{len} is not 0, pointer is NULL: undefined behavior. - \item \VAR{len} is 0, pointer is not NULL: supported. - \item \VAR{len} is not 0, pointer is not NULL: supported. -\end{itemize} -\tabularnewline -\hline -Multiple calls to \FUNC{shmem\_init} & In an OpenSHMEM program where -\FUNC{shmem\_init} has already be called, any subsequent calls to -\FUNC{shmem\_init} result in undefined behavior.\tabularnewline -\hline -\end{tabular} diff --git a/_deprecated_sources/INTRODUCTION/writing_programs.tex b/_deprecated_sources/INTRODUCTION/writing_programs.tex deleted file mode 100644 index dace61721..000000000 --- a/_deprecated_sources/INTRODUCTION/writing_programs.tex +++ /dev/null @@ -1,44 +0,0 @@ -\section*{Incorporating \openshmem{} into Programs} - -In this section, we describe how to write a ``Hello World" \openshmem program. -To write a ``Hello World" \openshmem program we need to: - -\begin{itemize} -\item Add the include file shmem.h (for \Clang) or shmem.fh (for \Fortran). -\item Add the initialization call \FUNC{shmem\_init}, (line 9). -\item Use OpenSHMEM calls to query the the total number of PEs (line 10) and PE id (line 11). -\item There is no explicit finalize call; either a return from - \texttt{main()} (line 13) or an explicit \texttt{exit()} acts as an - implicit \openshmem finalization. -\item In \openshmem the order in which lines appear - in the output is not fixed as \ac{PE}s execute asynchronously in parallel. -\end{itemize} - -\begin{minipage}{\linewidth} -\vspace{0.1in} -\numberedlisting{label=openshmem-hello,language=OSH2+C}{EXAMPLES/hello-openshmem.c} -\outputlisting{language=bash,caption={Expected Output (4 - processors)}}{EXAMPLES/hello-openshmem-c.output} -\vspace{0.1in} -\end{minipage} - -\openshmem also has a \Fortran{} API, so for completeness we will now give the -same program written in \Fortran, in listing~\ref{openshmem-hello-f90}: - -\begin{minipage}{\linewidth} -\vspace{0.1in} -\numberedlisting{label=openshmem-hello-f90,language=OSH2+F}{EXAMPLES/hello-openshmem.f90} -\outputlisting{language=bash,caption={Expected Output (4 - processors)}}{EXAMPLES/hello-openshmem-f90.output} -\vspace{0.1in} -\end{minipage} - -The following example shows a more complex \openshmem program that illustrates the use of symmetric data objects. Note the declaration of the \VAR{static short dest} array and its use as the remote destination in \openshmem short \PUT. The use of the \VAR{static} keyword results in the \VAR{dest} array being symmetric on \ac{PE} \CONST{0} and \ac{PE} \CONST{1}. Each \ac{PE} is able to transfer data to the \dest{} array by simply specifying the local address of the symmetric data object which is to receive the data. This aids programmability, as the address of the \dest{} need not be exchanged with the active side (\ac{PE} \CONST{0}) prior to the RMA (Remote Memory Access) routine. Conversely, the declaration of the \VAR{short source} array is asymmetric. Because the \PUT{} handles the references to the \VAR{source} array only on the active (local) side, the asymmetric \source{} object is handled correctly. - -\begin{minipage}{\linewidth} -\vspace{0.1in} -\numberedlisting{label=openshmem-hello,language=OSH2+C}{EXAMPLES/writing_shmem_example.c} -\outputlisting{language=bash,caption={Expected Output (4 - processors)}}{EXAMPLES/writing_shmem_example.output} -\vspace{0.1in} -\end{minipage} diff --git a/_deprecated_sources/MACROS b/_deprecated_sources/MACROS deleted file mode 100644 index 46445be70..000000000 --- a/_deprecated_sources/MACROS +++ /dev/null @@ -1,4 +0,0 @@ -Function: \FUNC{} -Variables: \VAR{} -Constants: \CONST{} - diff --git a/_deprecated_sources/Makefile b/_deprecated_sources/Makefile deleted file mode 100644 index 89c868c6f..000000000 --- a/_deprecated_sources/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -TARGET=main_spec - -# make pdf by default -all: ${TARGET}.pdf - -# it doesn't really need the .dvi, but this way all the refs are right -%.pdf : %.dvi - pdflatex $* - -${TARGET}.bbl: ${TARGET}.bib -# in case we don't already have a .aux file listing citations -# this should probably be a separate makefile target/dependency instead -# of doing it every time... but *shrug* - pdflatex ${TARGET}.tex -# get the citations out of the bibliography - bibtex ${TARGET} -# do it again in case there are out-of-order cross-references - @pdflatex ${TARGET}.tex - -#${TARGET}.dvi: ${TARGET}.bbl ${TARGET}.tex -${TARGET}.dvi: ${TARGET}.tex - @pdflatex ${TARGET}.tex - -# shortcut, so we can say "make ps" -ps: ${TARGET}.ps - -${TARGET}.ps: ${TARGET}.dvi - @dvips -t a4 ${TARGET}.dvi - -clean: - rm -f ${TARGET}.{log,aux,ps,dvi,bbl,blg,log} - -veryclean: clean - rm -f ${TARGET}.{ps,pdf,out} - - -PHONY : ps all clean reallyclean - diff --git a/_deprecated_sources/OSH_Spec1.1.xlsx b/_deprecated_sources/OSH_Spec1.1.xlsx deleted file mode 100644 index 78466fe87bf0d518babd5ea6ce92654feb53cdd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67288 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

=1QD`7kN$ArlqE{rL!A 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

i} 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�ce~a(YVht)2pS_c=f9o>CAO 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 diff --git a/_deprecated_sources/README b/_deprecated_sources/README deleted file mode 100644 index d505ff498..000000000 --- a/_deprecated_sources/README +++ /dev/null @@ -1 +0,0 @@ -Oscar has already created shmem_put.tex in TEX_FILES with the appropriate macros. diff --git a/_deprecated_sources/TEX_FILES/NEW_shmem_my_pe.tex b/_deprecated_sources/TEX_FILES/NEW_shmem_my_pe.tex deleted file mode 100644 index e5f613b15..000000000 --- a/_deprecated_sources/TEX_FILES/NEW_shmem_my_pe.tex +++ /dev/null @@ -1,45 +0,0 @@ -\bAPI{SHMEM\_MY\_PE}{Returns the number of the calling \ac{PE}.} -%Synopsis C -\synC -int shmem_my_pe(void); %*\synCE - -%Synopsis F -\synF -INTEGER SHMEM_MY_PE, ME -ME = SHMEM_MY_PE()%*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{None}{}{} -} -%API Description -{ - This routine returns the \ac{PE} number of the calling \ac{PE}. It accepts no arguments. The result is an integer between \CONST{0} and \VAR{npes} - \CONST{1}, where \VAR{npes} is the total number of \ac{PE}s executing the current program. -} -%API Description Table. -{ -% \desTB{ } -% { -% \cRow{}{} -% } - %Return Value - \desR{Integer - Between \CONST{0} and \VAR{npes} - \CONST{1}} - %NOTES - \notesB{Each \ac{PE} has a unique number or identifier. As of \openshmem - Specification 1.2 the use of name \FUNC{\_my\_pe} has been deprecated. - Although \openshmem libraries are required to support the call, users - are encouraged to use \FUNC{shmem\_my\_pe} instead. The behavior and - signature of the routine \FUNC{shmem\_my\_pe} remains unchanged from the - deprecated \FUNC{\_my\_pe} version. -} -} -%EXAMPLES -\exampleB{ - \exampleITEM - {The following \FUNC{shmem\_my\_pe} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_mype_example.c} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/NEW_shmem_num_pe.tex b/_deprecated_sources/TEX_FILES/NEW_shmem_num_pe.tex deleted file mode 100644 index 878f8f114..000000000 --- a/_deprecated_sources/TEX_FILES/NEW_shmem_num_pe.tex +++ /dev/null @@ -1,46 +0,0 @@ -\bAPI{SHMEM\_N\_PES}{Returns the number of \ac{PE}s running in a program.} -%Synopsis C -\synC -int shmem_n_pes(void); %*\synCE - -%Synopsis F -\synF -INTEGER SHMEM_N_PES, N_PES -N_PES = SHMEM_N_PES()%*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{None}{}{} -} -%API Description -{ - The routine returns the number of \ac{PE}s running the program. -} -%API Description Table. -{ -% \desTB{} -% { -% \cRow{}{} -% } - %Return Value - \desR{Integer - Number of \ac{PE}s running the \openshmem program.} - %NOTES - \notesB{As of \openshmem Specification 1.2 the use of \FUNC{\_num\_pes} - has been deprecated. Although \openshmem libraries are required to - support the call, users are encouraged to use \FUNC{shmem\_n\_pes} - instead. The behavior and signature of the routine - \FUNC{shmem\_n\_pes} remains unchanged from the deprecated - \FUNC{\_num\_pes} version. -} - } - %EXAMPLES -\exampleB{ - \exampleITEM - {The following \FUNC{shmem\_n\_pes} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_npes_example.c} - {} -} -\eAPI - diff --git a/_deprecated_sources/TEX_FILES/shfree.tex b/_deprecated_sources/TEX_FILES/shfree.tex deleted file mode 100644 index 82ff3757c..000000000 --- a/_deprecated_sources/TEX_FILES/shfree.tex +++ /dev/null @@ -1,97 +0,0 @@ -\bAPI{SHMEM\_MALLOC, SHMEM\_FREE, SHMEM\_REALLOC, SHMEM\_ALIGN}{Symmetric heap memory management routines.} -%SYNOPSIS -\synC -void *shmem_malloc(size_t size); -void shmem_free(void *ptr); -void *shmem_realloc(void *ptr, size_t size); -void *shmem_align(size_t alignment, size_t size);%*\synCE - -%DESCRIPTION -%Arguments -\desB{ - \argRow{IN}{size}{The size, in bytes, of a block to be allocated from the symmetric heap. This argument is of type \VAR{size\_t}} - \argRow{IN}{ptr}{Points to a block within the symmetric heap.} - \argRow{IN}{alignment}{Byte alignment of the block allocated from the symmetric heap.} -} -%API Description -{ - The \FUNC{shmem\_malloc} routine returns a pointer to a block of at least \VAR{size} - bytes suitably aligned for any use. This space is allocated from the - symmetric heap (in contrast to \FUNC{malloc}, which allocates from the - private heap). - - The \FUNC{shmem\_align} routine allocates a block in the symmetric heap that - has a byte alignment specified by the alignment argument. - - The \FUNC{shmem\_free} routine causes the block to which \VAR{ptr} points to be - deallocated, that is, made available for further allocation. If \VAR{ptr} is - a null pointer, no action occurs. - - The \FUNC{shmem\_realloc} routine changes the size of the block to which \VAR{ptr} - points to the size (in bytes) specified by \VAR{size}. The contents of the - block are unchanged up to the lesser of the new and old sizes. If the - new size is larger, the value of the newly allocated portion of the - block is indeterminate. - If \VAR{ptr} is a \CONST{NULL} pointer, the \FUNC{shmem\_realloc} routine behaves like the \FUNC{shmem\_malloc} routine for the specified size. If \VAR{size} is \CONST{0} and \VAR{ptr} is not a \CONST{NULL} pointer, the block to which it points is freed. If the space cannot be allocated, the block to which \VAR{ptr} points is unchanged. - - The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines are provided so that multiple \ac{PE}s in a program can allocate symmetric, remotely - accessible memory blocks. These memory blocks can then be used with - \openshmem communication routines. Each of these routines call the - \FUNC{shmem\_barrier\_all} routine before returning; this ensures that all - \ac{PE}s participate in the memory allocation, and that the memory on other - \ac{PE}s can be used as soon as the local \ac{PE} returns. The user is - responsible for calling these routines with identical argument(s) on - all \ac{PE}s; if differing \VAR{size} arguments are used, the behavior of the call and any subsequent \openshmem calls becomes undefined. - %subsequent calls may not - %return the same symmetric heap address on all \ac{PE}s. -} -%API Description Table -{ - %Return Value - \desR{ - The \FUNC{shmem\_malloc} routine returns a pointer to the allocated space; otherwise, it returns a \CONST{NULL} pointer. - - The \FUNC{shmem\_free} routine returns no value. - - The \FUNC{shmem\_realloc} routine returns a pointer to the allocated space (which may have moved); otherwise, it returns a null pointer. - - The \FUNC{shmem\_align} routine returns an aligned pointer to the allocated space; otherwise, it returns a \CONST{NULL} pointer. - } - %NOTES - \notesB{ As of Specification 1.2 the use of \FUNC{shmalloc}, - \FUNC{shmemalign}, \FUNC{shfree}, and \FUNC{shrealloc} has been - deprecated. Although OpenSHMEM libraries are required to support - the calls, program users are encouraged to use - \FUNC{shmem\_malloc}, \FUNC{shmem\_align}, \FUNC{shmem\_free}, - and \FUNC{shmem\_realloc} instead. The behavior and signature - of the routines remains unchanged from the deprecated versions. - -The total size of the symmetric heap is determined at job startup. One can adjust the size of the heap using the \CONST{SMA\_SYMMETRIC\_SIZE} environment variable (where available). - -The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines differ from the private heap allocation routines in that all \ac{PE}s in a program must call them (a barrier is used to ensure this). - } - \notesImp{ - The symmetric heap allocation functions always return a pointer to - corresponding symmetric objects across all PEs. The \openshmem{} - specification does not require that the virtual addresses are equal across - all \acp{PE}. Nevertheless, the implementation must avoid costly address - translation operations in the communication path, including order $N$ (where - $N$ is the number of \acp{PE}) memory translation tables. - In order to avoid address translations, the implementation may - re-map the allocated block of memory based on agreed virtual address. - Additionally, some operating systems provide an option to disable - virtual address randomization, which enables predictable allocation - of virtual memory addresses. - } -} - -%EXAMPLES -%\rcomment{Tommy: Code will not compile without example, need example for shfree. \\} -% -%\exampleB{ -% \exampleITEM -% {The following shmalloc example is for C/C++ programs:} -% {./EXAMPLES/shmem_npes_example.c} -% {} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_add.tex b/_deprecated_sources/TEX_FILES/shmem_add.tex deleted file mode 100644 index d4a18683b..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_add.tex +++ /dev/null @@ -1,43 +0,0 @@ -\bAPI{SHMEM\_ADD}{Performs an atomic add operation on a remote symmetric data object.} -\synC -void shmem_int_add(int *dest, int value, int pe); -void shmem_long_add(long *dest, long value, int pe); -void shmem_longlong_add(long long *dest, long long value, int pe); %*\synCE -\synF -INTEGER pe -INTEGER*4 value_i4 -CALL SHMEM_INT4_ADD(dest, value_i4, pe) -INTEGER*8 value_i8 -CALL SHMEM_INT8_ADD(dest, value_i8, pe) %*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. If you are using \CorCpp, the type of \dest{} should match that implied in the SYNOPSIS section.} - \argRow{IN}{value}{The value to be atomically added to \dest. If you are using \CorCpp, the type of \VAR{value} should match that implied in the SYNOPSIS section. If you are using \Fortran, it must be of type integer with an element size of \dest.} - \argRow{IN}{pe}{An integer that indicates the \ac{PE} number upon which \dest{} is to be updated. If you are using \Fortran, it must be a default integer value.} -} -%API Description -{The \FUNC{shmem\_add} routine performs an atomic add operation. It adds \VAR{value} - to \dest{} on \ac{PE} \VAR{pe} and atomically updates the \dest{} without returning the value. - } -{ - \hfill \\ -\desTB {If you are using \Fortran, \VAR{dest} must be of the following type:} -{ -\cRow{SHMEM\_INT4\_ADD}{\CONST{4}-byte integer} -\cRow{SHMEM\_INT8\_ADD}{\CONST{8}-byte integer} -} - \desR{None.} - \notesB{The term remotely accessible is defined in the Introduction.} -} - -\exampleB{ - \exampleITEM - {} - {./EXAMPLES/shmem_add_example.c} - {} -} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_addr_accessible.tex b/_deprecated_sources/TEX_FILES/shmem_addr_accessible.tex deleted file mode 100644 index 7f1d5f720..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_addr_accessible.tex +++ /dev/null @@ -1,64 +0,0 @@ -\bAPI{SHMEM\_ADDR\_ACCESSIBLE}{Determines whether an address is accessible via OpenSHMEM data transfer routines from the specified remote \ac{PE}.} -%SYNOPSIS -\synC -int shmem_addr_accessible(void *addr, int pe); %*\synCE - -\synF -LOGICAL LOG, SHMEM_ADDR_ACCESSIBLE -INTEGER pe -LOG = SHMEM_ADDR_ACCESSIBLE(addr, pe) %*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{IN}{addr}{Data object on the local \ac{PE}.} - \argRow{IN}{pe}{Integer id of a remote \ac{PE}.} -} -%API Description -{ - \FUNC{shmem\_addr\_accessible} is a query routine that indicates whether a - local address is accessible via \openshmem routines from the specified - remote \ac{PE}. - - This routine verifies that the data object is symmetric and accessible - with respect to a remote \ac{PE} via \openshmem data transfer routines. The - specified address \VAR{addr} is a data object on the local \ac{PE}. - - This routine may be particularly useful for hybrid programming with - other communication libraries (such as \ac{MPI}) or parallel languages. - For example, in SGI Altix series systems, for multiple executable MPI programs - that use \openshmem routines, it is important to note that static memory, - such as a \Fortran{} common block or \Clang{} global variable, is symmetric - between processes running from the same executable file, but is not - symmetric between processes running from different executable files. - Data allocated from the symmetric heap (\FUNC{shmem\_malloc} or \FUNC{shpalloc}) is - symmetric across the same or different executable files. -} -%API Description Table -{ -% \desTB{} -% { -% \cRow{}{} -% } - %Return Value - \desR{ - \CorCpp: The return value is \CONST{1} if \VAR{addr} is a symmetric data object and - accessible via \openshmem routines from the specified remote \ac{PE}; - otherwise, it is \CONST{0}. - - \Fortran: The return value is \CONST{.TRUE.} if \VAR{addr} is a symmetric data object - and accessible via \openshmem routines from the specified remote - \ac{PE}; otherwise, it is \CONST{.FALSE.}. - } - %NOTES - \notesB{None.} -} -%%EXAMPLES -%\exampleB{ -% \exampleITEM -% {TEST} -% {./EXAMPLES/shmem_npes_example.c} -% {} -%} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_barrier.tex b/_deprecated_sources/TEX_FILES/shmem_barrier.tex deleted file mode 100644 index b82f64221..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_barrier.tex +++ /dev/null @@ -1,57 +0,0 @@ -\bAPI{SHMEM\_BARRIER}{Performs all operations described in the \FUNC{shmem\_barrier\_all} interface but with respect to a subset of \acp{PE} defined by the \activeset{}.} %Eric: Wish list: Add a ~/ref{} to barrier_all API. -\synC -void shmem_barrier(int PE_start, int logPE_stride, int PE_size, long *pSync); %*\synCE -\synF -INTEGER PE_start, logPE_stride, PE_size -INTEGER pSync(SHMEM_BARRIER_SYNC_SIZE) -CALL SHMEM_BARRIER(PE_start, logPE_stride, PE_size, pSync) %*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset{} of \ac{PE}s. \VAR{PE\_start} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{logPE\_stride}{The log (base 2) of the stride between consecutive \ac{PE} numbers in the \activeset. \VAR{logPE\_stride} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{PE\_size}{The number of \ac{PE}s in the \activeset. \VAR{PE\_size} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{pSync}{ A symmetric work array. In \CorCpp, \VAR{pSync} must be of type long and size \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE}. In \Fortran, \VAR{pSync} must be of type integer and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. If you are using \Fortran, it must be a default integer type. Every element of this array must be initialized to \CONST{SHMEM\_SYNC\_VALUE} before any of the \ac{PE}s in the \activeset{} enter \FUNC{shmem\_barrier} the first time.} -} -%API Description -{ - \FUNC{shmem\_barrier} is a collective synchronization routine over an \activeset. Control returns from \FUNC{shmem\_barrier} after all \ac{PE}s in the \activeset{} (specified by - \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}) have called \FUNC{shmem\_barrier}. - - As with all \openshmem collective routines, each of these routines assumes - that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the - \activeset{} calls an \openshmem collective routine, undefined behavior results. - - The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \ac{PE}s in the \activeset. The same work array must be passed - in \VAR{pSync} to all \ac{PE}s in the \activeset. - - \FUNC{shmem\_barrier} ensures that all previously issued stores and - remote memory updates, including \acp{AMO} and \ac{RMA} operations, - done by any of the \ac{PE}s in the \activeset{} are complete before returning. -% For example, \FUNC{shmem\_put} and \FUNC{shmem\_int\_add} - - The same \VAR{pSync} array may be reused on consecutive calls to - \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. -} -%API Description Table -{ - %Return Values - \desR{None.} - %NOTES - \notesB{ - If the \VAR{pSync} array is initialized at run time, be sure to use some type of synchronization, for example, a call to \FUNC{shmem\_barrier\_all}, before calling \FUNC{shmem\_barrier} for the first time. - - If the \activeset{} does not change, \FUNC{shmem\_barrier} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization beyond that implied by \FUNC{shmem\_barrier} itself is necessary in this case. - } -} -%EXAMPLES -\exampleB{ - \exampleITEM - {The following barrier example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_barrier_example.c} - {} -} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_barrier_all.tex b/_deprecated_sources/TEX_FILES/shmem_barrier_all.tex deleted file mode 100644 index adc6cdb3a..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_barrier_all.tex +++ /dev/null @@ -1,85 +0,0 @@ -\bAPI{SHMEM\_BARRIER\_ALL}{Registers the arrival of a \ac{PE} at a barrier and suspends \ac{PE} execution until all other \ac{PE}s arrive at the barrier and all local and remote memory updates are completed.} -\synC %Synopisis for C API - -void shmem_barrier_all(void);%*\synCE - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_BARRIER_ALL%*\synFE - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{None.}{}{} -} -%API description -{ - The \FUNC{shmem\_barrier\_all} routine registers the arrival of a \ac{PE} at a - barrier. Barriers are a fast mechanism for synchronizing all \ac{PE}s at - once. This routine causes a \ac{PE} to suspend execution until all \ac{PE}s have - called \FUNC{shmem\_barrier\_all}. This routine must be used with \ac{PE}s started - by \FUNC{shmem\_init}. - - Prior to synchronizing with other \ac{PE}s, \FUNC{shmem\_barrier\_all} ensures - completion of all previously issued memory stores and remote - memory updates issued via \openshmem{} \acp{AMO} and \ac{RMA} routine calls such as \FUNC{shmem\_int\_add} and \FUNC{shmem\_put32}. -} -{ -%API Description Table. -\desR{ - %Return Values - {None.} -} -% Notes. If there are no notes, this field can be left empty. -\notesB{None.} -} -%Example -\exampleB{ - %For each example, you can enter it as an item. - \exampleITEM - { The following \FUNC{shmem\_barrier\_all} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_barrierall_example.c} - {} -} -\eAPI -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Registers the arrival of a processing element (PE) at a barrier and suspends PE execution until all other PEs arrive at the barrier and all local and remote memory updates are completed. -% -% SYNOPSIS -% C or C++: -% -% void barrier(void); -% -% void shmem_barrier_all(void); -% -% Fortran: -% -% CALL BARRIER -% -% CALL SHMEM_BARRIER_ALL -% -% DESCRIPTION -% -% Arguments -% None. -% -% API Description -% -% The shmem_barrier_all function registers the arrival of a PE at a -% barrier. Barriers are a fast mechanism for synchronizing all PEs at -% once. This routine causes a PE to suspend execution until all PEs have -% called shmem_barrier_all. This function must be used with PEs started -% by start_pes(). -% -% Prior to synchronizing with other PEs, shmem_barrier_all ensures -% completion of all previously issued local memory stores and remote -% memory updates issued via shared memory routine calls such as -% shmem_put32(). -% -% Return Value -% None. -% -% EXAMPLES -% The following shmem_barrier_all example is for C/C++ programs: -% -% \lstinputlisting[language=C]{shmem_barrierall_example.c} diff --git a/_deprecated_sources/TEX_FILES/shmem_broadcast.tex b/_deprecated_sources/TEX_FILES/shmem_broadcast.tex deleted file mode 100644 index a27be099d..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_broadcast.tex +++ /dev/null @@ -1,284 +0,0 @@ -\bAPI{SHMEM\_BROADCAST}{Broadcasts a block of data from one \ac{PE} to one or more destination \ac{PE}s.} -\synC %Synopisis for C API - -void shmem_broadcast32(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_broadcast64(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER nelems, PE_root, PE_start, logPE_stride, PE_size -INTEGER pSync(SHMEM_BCAST_SYNC_SIZE) -CALL SHMEM_BROADCAST4(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_BROADCAST8(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_BROADCAST32(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) -CALL SHMEM_BROADCAST64(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync)%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{dest}{A symmetric data object.} -\argRow{IN}{source}{A symmetric data object that can be of any data type that is permissible for the \dest{} argument.} -\argRow{IN}{nelems}{The number of elements in \source. For \FUNC{shmem\_broadcast32} and \FUNC{shmem\_broadcast4}, this is the number of 32-bit - halfwords. nelems must be of type \VAR{size\_t} in \Clang. If you are using \Fortran, it must be a default integer value.} -\argRow{IN}{PE\_root}{Zero-based ordinal of the \ac{PE}, with respect to the \activeset, - from which the data is copied. Must be greater than - or equal to 0 and less than \VAR{PE\_size}. \VAR{PE\_root} must be of - type integer. If you are using \Fortran, it must be a default integer value.} -\argRow{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset{} of \ac{PE}s. - \VAR{PE\_start} must be of type integer. If you are using - \Fortran, it must be a default integer value.} -\argRow{IN}{logPE\_stride}{ - The log (base 2) of the stride between consecutive - \ac{PE} numbers in the \activeset. \VAR{log\_PE\_stride} must be of - type integer. If you are using \Fortran, it must be a - default integer value.} - -\argRow{IN}{PE\_size}{ - The number of \ac{PE}s in the \activeset. \VAR{PE\_size} must be of - type integer. If you are using \Fortran, it must be a - default integer value.} - -\argRow{IN}{pSync}{ - A symmetric work array. In \CorCpp, \VAR{pSync} must be of type - long and size \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE}. In \Fortran, \VAR{pSync} must be of type integer and size \CONST{SHMEM\_BCAST\_SYNC\_SIZE}. - Every element of this array must be initialized with the - value \CONST{\_SHMEM\_SYNC\_VALUE} (in \CorCpp) or \CONST{SHMEM\_SYNC\_VALUE} (in \Fortran) before any of the \ac{PE}s in the \activeset{} enter - \FUNC{shmem\_broadcast}.} -} -%API description -{ -\openshmem broadcast routines are collective routines. -They copy data object \source{} on the processor specified by \VAR{PE\_root} and -store the values at \dest{} on the other \ac{PE}s specified by the triplet -\VAR{PE\_start}, \VAR{logPE\_stride}, \VAR{PE\_size}. The data is not copied to the \dest{} area on the root \ac{PE}. - -As with all \openshmem collective routines, each of these routines assumes -that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the -\activeset{} calls an \openshmem collective routine, undefined behavior -results. - -The values of arguments \VAR{PE\_root}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \ac{PE}s in the \activeset. The same \dest{} and \source{} data objects and the same \VAR{pSync} work array must be passed to all \ac{PE}s in the \activeset. - -Before any \ac{PE} calls a broadcast routine, you must ensure that the -following conditions exist (synchronization via a barrier or some other -method is often needed to ensure this): The \VAR{pSync} array on all \ac{PE}s in -the \activeset{} is not still in use from a prior call to a broadcast -routine. The \dest{} array on all \ac{PE}s in the \activeset{} is ready to -accept the broadcast data. - -Upon return from a broadcast routine, the following are true for the -local \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object -is updated. The values in the \VAR{pSync} array are restored to the original -values. -} -%API Description Tabl -{ -\desTB { -\hfill \\ -The \dest{} and \source{} data objects must conform to certain typing -constraints, which are as follows: } -{ -\cRow{shmem\_broadcast8, shmem\_broadcast64}{Any noncharacter type that has an - element size of \CONST{64} bits. No \Fortran{} - derived types or \CorCpp{} structures are - allowed.} -\cRow{shmem\_broadcast32}{Any noncharacter type that has an - element size of \CONST{32} bits. No \Fortran{} - derived types or \CorCpp{} structures are - allowed.} -\cRow{shmem\_broadcast4}{Any noncharacter type that has an - element size of \CONST{32} bits.} -} -%Return Values -\desR{None.} -% Notes. If there are no notes, this field can be left empty. -\notesB{ - All \openshmem broadcast routines restore \VAR{pSync} to its original contents. - Multiple calls to \openshmem routines that use the same \VAR{pSync} array do not - require that \VAR{pSync} be reinitialized after the first call. - - You must ensure the that the \VAR{pSync} array is not being updated by any \ac{PE} - in the \activeset{} while any of the \ac{PE}s participates in processing of an - \openshmem broadcast routine. Be careful to avoid these situations: If the - \VAR{pSync} array is initialized at run time, some type of synchronization is - needed to ensure that all \ac{PE}s in the \activeset{} have initialized \VAR{pSync} - before any of them enter an \openshmem routine called with the \VAR{pSync} - synchronization array. A \VAR{pSync} array may be reused on a subsequent - \openshmem broadcast routine only if none of the \ac{PE}s in the \activeset{} are - still processing a prior \openshmem broadcast routine call that used the - same \VAR{pSync} array. In general, this can be ensured only by doing some - type of synchronization. -% However, in the special case of \openshmem -% routines being called with the same \activeset, you can allocate two -% \VAR{pSync} arrays and alternate between them on successive calls. -} -} -%Example -\exampleB{ - %For each example, you can enter it as an item. - \exampleITEM - {In the following examples, the call to \FUNC{shmem\_broadcast64} copies \source{} - on \ac{PE} 4 to \dest{} on \ac{PE}s 5, 6, and 7. - - \CorCpp{} example:} - {./EXAMPLES/shmem_broadcast_example.c} - {} - \exampleITEMF - {\Fortran{} example:} - {./EXAMPLES/shmem_broadcast_example.f90} - {} -} -\eAPI - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Broadcasts a block of data from one processing element (PE) to one or more target PEs. -% -% SYNOPSIS -% C or C++: -% -% void shmem_broadcast32(void *target, const void *source, size_t -% nlong, int PE_root, int PE_start, int logPE_stride, int PE_size, -% long *pSync); -% -% void shmem_broadcast64(void *target, const void *source, size_t -% nlong, int PE_root, int PE_start, int logPE_stride, int PE_size, -% long *pSync); -% -% Fortran: -% -% INTEGER nlong, PE_root, PE_start, logPE_stride, PE_size -% -% INTEGER pSync(SHMEM_BCAST_SYNC_SIZE) -% -% CALL SHMEM_BROADCAST4(target, source, nlong, PE_root, PE_start, -% logPE_stride, PE_size, fIpSync) -% -% CALL SHMEM_BROADCAST8(target, source, nlong, PE_root, PE_start, -% logPE_stride, PE_size, pSync) -% -% CALL SHMEM_BROADCAST32(target, source, nlong, PE_root, PE_start, -% logPE_stride, PE_size, pSync) -% -% CALL SHMEM_BROADCAST64(target, source, nlong, PE_root, PE_start, -% logPE_stride, PE_size, pSync) -% -% DESCRIPTION -% -% Arguments -% -% OUT target A symmetric data object with one of the following data -% types: -% -% Routine Data Type and Language -% -% shmem_broadcast8, -% shmem_broadcast64 Any noncharacter type that has an -% element size of 64 bits. No Fortran -% derived types or C/C++ structures are -% allowed. -% -% shmem_broadcast32 Any noncharacter type that has an -% element size of 32 bits. No Fortran -% derived types or C/C++ structures are -% allowed. -% -% shmem_broadcast4 Any noncharacter type that has an -% element size of 32 bits. -% -% IN source A symmetric data object that can be of any data type that -% is permissible for the target argument. -% -% IN nlong The number of elements in source. For shmem_broadcast32 -% and shmem_broadcast4, this is the number of 32-bit -% halfwords. nlong must be of type integer. If you are -% using Fortran, it must be a default integer value. -% -% IN PE_root Zero-based ordinal of the PE, with respect to the active -% set, from which the data is copied. Must be greater than -% or equal to 0 and less than PE_size. PE_root must be of -% type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN PE_start The lowest PE number of the active set of PEs. -% PE_start must be of type integer. If you are using -% Fortran, it must be a default integer value. -% -% IN logPE_stride -% The log (base 2) of the stride between consecutive -% PE numbers in the active set. log_PE_stride must be of -% type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN PE_size The number of PEs in the active set. PE_size must be of -% type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN pSync A symmetric work array. In C/C++, pSync must be of type -% long and size _SHMEM_BCAST_SYNC_SIZE. In Fortran, pSync -% must be of type integer and size SHMEM_BCAST_SYNC_SIZE. -% Every element of this array must be initialized with the -% value _SHMEM_SYNC_VALUE (in C/C++) or SHMEM_SYNC_VALUE (in -% Fortran) before any of the PEs in the active set enter -% shmem_barrier(). -% -% API Description -% -% OpenSHMEM broadcast routines are collective routines. -% They copy data object source on the processor specified by PE_root and -% store the values at target on the other PEs specified by the triplet -% PE_start, logPE_stride, PE_size. The data is not copied to the target -% area on the root PE. -% -% As with all OpenSHMEM collective routines, each of these routines assumes -% that only PEs in the active set call the routine. If a PE not in the -% active set calls a OpenSHMEM collective routine, undefined behavior -% results. -% -% The values of arguments PE_root, PE_start, logPE_stride, and PE_size -% must be equal on all PEs in the active set. The same target and source -% data objects and the same pSync work array must be passed to all PEs in -% the active set. -% -% Before any PE calls a broadcast routine, you must ensure that the -% following conditions exist (synchronization via a barrier or some other -% method is often needed to ensure this): The pSync array on all PEs in -% the active set is not still in use from a prior call to a broadcast -% routine. The target array on all PEs in the active set is ready to -% accept the broadcast data. -% -% Upon return from a broadcast routine, the following are true for the -% local PE: If the current PE is not the root PE, the target data object -% is updated. The values in the pSync array are restored to the original -% values. -% -% Return Value -% -% None. -% -% NOTES -% -% All OpenSHMEM broadcast routines restore pSync to its original contents. -% Multiple calls to OpenSHMEM routines that use the same pSync array do not -% require that pSync be reinitialized after the first call. -% -% You must ensure the that the pSync array is not being updated by any PE -% in the active set while any of the PEs participates in processing of a -% OpenSHMEM broadcast routine. Be careful to avoid these situations: If the -% pSync array is initialized at run time, some type of synchronization is -% needed to ensure that all PEs in the working set have initialized pSync -% before any of them enter a SHMEM routine called with the pSync -% synchronization array. A pSync array may be reused on a subsequent -% OpenSHMEM broadcast routine only if none of the PEs in the active set are -% still processing a prior OpenSHMEM broadcast routine call that used the -% same pSync array. In general, this can be ensured only by doing some -% type of synchronization. However, in the special case of SHMEM -% routines being called with the same active set, you can allocate two -% pSync arrays and alternate between them on successive calls. -% -% EXAMPLES -% -% In the following examples, the call to shmem_broadcast64 copies source -% on PE 4 to target on PEs 5, 6, and 7. -% -% \lstinputlisting[language=C]{shmem_broadcast_example.c} -% -% \lstinputlisting[language=C]{shmem_broadcast_example.f90} diff --git a/_deprecated_sources/TEX_FILES/shmem_cache.tex b/_deprecated_sources/TEX_FILES/shmem_cache.tex deleted file mode 100644 index d59f03314..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_cache.tex +++ /dev/null @@ -1,118 +0,0 @@ -\bAPI{SHMEM\_CACHE}{Controls data cache utilities.} -\synC %Synopisis for C API - -void shmem_clear_cache_inv(void); -void shmem_set_cache_inv(void); -void shmem_clear_cache_line_inv(void *dest); -void shmem_set_cache_line_inv(void *dest); -void shmem_udcflush(void); -void shmem_udcflush_line(void *dest); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_CLEAR_CACHE_INV -CALL SHMEM_SET_CACHE_INV -CALL SHMEM_SET_CACHE_LINE_INV(dest) -CALL SHMEM_UDCFLUSH -CALL SHMEM_UDCFLUSH_LINE(dest) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{IN}{dest}{A data object that is local to the \ac{PE}. - \VAR{dest} can be of any noncharacter type. If you are using - \Fortran, it can be of any kind.} -} -%API description -{ -\FUNC{shmem\_set\_cache\_inv} enables automatic cache coherency mode. - -\FUNC{shmem\_set\_cache\_line\_inv} enables automatic cache coherency mode for the cache line associated with the address of \VAR{dest} only. - -%IF THIS LINE IS CHANGED, PLEASE MAKE SURE \FUNC{shmem\_set\_cache\ \_inv} DOES NOT SHOW A VISIBLE SPACE BETWEEN cache and _inv. -\FUNC{shmem\_clear\_cache\_inv} disables automatic cache coherency mode -previously enabled by \FUNC{shmem\_set\_cache\ \_inv} or \FUNC{shmem\_set\_cache\_line\_inv}. - -\FUNC{shmem\_udcflush} makes the entire user data cache coherent. - -\FUNC{shmem\_udcflush\_line} makes coherent the cache line that corresponds with -the address specified by \VAR{dest}. -} -%API Description Tabl -{ -%Return Values -\desR{None.} -% Notes. If there are no notes, this field can be left empty. -\notesB{ -These routines have been retained for improved backward compatibility -with legacy architectures. They are not required to be supported by implementing them as \VAR{no-ops} and -where used, they may have no effect on cache line states. -} -} -%Example -\exampleB{ - %For each example, you can enter it as an item. -None. -} -\eAPI - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Controls data cache utilities. -% -% SYNOPSIS -% C or C++: -% -% void shmem_clear_cache_inv(void); -% -% void shmem_set_cache_inv(void); -% -% void shmem_clear_cache_line_inv(void *target); -% -% void shmem_set_cache_line_inv(void *target); -% -% void shmem_udcflush(void); -% -% void shmem_udcflush_line(void *target); -% -% Fortran: -% -% CALL SHMEM_CLEAR_CACHE_INV -% -% CALL SHMEM_SET_CACHE_INV -% -% CALL SHMEM_SET_CACHE_LINE_INV(target) -% -% CALL SHMEM_UDCFLUSH -% -% CALL SHMEM_UDCFLUSH_LINE(target) -% -% DESCRIPTION -% -% Arguments -% -% IN target A data object that is local to the processing element (PE). -% target can be of any noncharacter type. If you are using -% Fortran, it can be of any kind. -% -% API Description -% -% shmem_set_cache_inv enables automatic cache coherency mode. -% -% shmem_set_cache_line_inv enables automatic cache coherency mode for the -% cache line associated with the address of target only. -% -% shmem_clear_cache_inv disables automatic cache coherency mode -% previously enabled by shmem_set_cache_inv or shmem_set_cache_line_inv. -% -% shmem_udcflush makes the entire user data cache coherent. -% -% shmem_udcflush_line makes coherent the cache line that corresponds with -% the address specified by target. -% -% Return Value -% -% None. -% -% NOTES -% These routines have been retained for improved backward compatability -% with legacy architectures. They are not required to be supported and where -% provided they may have no effect on cacheline states. -% diff --git a/_deprecated_sources/TEX_FILES/shmem_collect.tex b/_deprecated_sources/TEX_FILES/shmem_collect.tex deleted file mode 100644 index 8ae1354cd..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_collect.tex +++ /dev/null @@ -1,272 +0,0 @@ -\bAPI{SHMEM\_COLLECT, SHMEM\_FCOLLECT}{Concatenates blocks of data from multiple \ac{PE}s to an array in every \ac{PE}.} -\label{subsec:shmem_collect} -\synC %Synopisis for C API - -void shmem_collect32(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_collect64(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_fcollect32(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_fcollect64(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER nelems -INTEGER PE_start, logPE_stride, PE_size -INTEGER pSync(SHMEM_COLLECT_SYNC_SIZE) -CALL SHMEM_COLLECT4(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT8(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT32(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT64(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT4(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT8(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT32(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT64(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{dest}{A symmetric array. The \dest{} argument must be large - enough to accept the concatenation of the \source{} arrays on - all \ac{PE}s. The data types are as follows: - For \FUNC{shmem\_collect8}, \FUNC{shmem\_collect64}, \FUNC{shmem\_fcollect8}, and \FUNC{shmem\_fcollect64}, any data type with an element size of 64 - bits. \Fortran{} derived types, \Fortran{} character type, and - \CorCpp{} structures are not permitted. For \FUNC{shmem\_collect4}, - \FUNC{shmem\_collect32}, \FUNC{shmem\_fcollect4}, and \FUNC{shmem\_fcollect32}, any data type with an element size of \CONST{32} bits. \Fortran{} - derived types, \Fortran{} character type, and \CorCpp{} structures are not permitted.} -\argRow{IN}{source}{A symmetric data object that can be of any type - permissible for the \dest{} argument.} -\argRow{IN}{nelems}{The number of elements in the \source{} array. \VAR{nelems} must be - of type \VAR{size\_t} for \Clang. If you are using \Fortran, it must be a - default integer value.} -\argRow{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset{} of \ac{PE}s. - \VAR{PE\_start} must be of type integer. If you are using - \Fortran, it must be a default integer value.} -\argRow{IN}{logPE\_stride}{The log (base \CONST{2}) of the stride between consecutive \ac{PE} numbers in the \activeset. \VAR{logPE\_stride} must be of - type integer. If you are using \Fortran, it must be a default integer value.} -\argRow{IN}{PE\_size}{The number of \ac{PE}s in the \activeset. \VAR{PE\_size} must be of type integer. If you are using \Fortran, it must be a default integer value.} -\argRow{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be of type - long and size \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE}. In \Fortran, \VAR{pSync} - must be of type integer and size \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}. - If you are using \Fortran, it must be a default integer - value. Every element of this array must be initialized - with the value \CONST{\_SHMEM\_SYNC\_VALUE} in \CorCpp{} or - \CONST{SHMEM\_SYNC\_VALUE} in \Fortran{} before any of the \ac{PE}s in the \activeset{} enter \FUNC{shmem\_collect} or \FUNC{shmem\_fcollect}.} -} -%API description -{ -\OSH{} \FUNC{collect} and \FUNC{fcollect} routines concatenate -\VAR{nelems} \CONST{64}-bit or \CONST{32}-bit data items from the \source{} array into the \dest{} array, over the set of \ac{PE}s defined by \VAR{PE\_start}, \VAR{log2PE\_stride}, and \VAR{PE\_size}, in processor number order. The resultant \dest{} array -contains the contribution from \ac{PE} \VAR{PE\_start} first, then the contribution -from \ac{PE} \VAR{PE\_start} + \VAR{PE\_stride} second, and so on. The collected result is written to the \dest{} array for all \ac{PE}s in the \activeset. - -The \FUNC{fcollect} routines require that \VAR{nelems} be the same value in all -participating \ac{PE}s, while the \FUNC{collect} routines allow \VAR{nelems} to vary from -\ac{PE} to \ac{PE}. - -As with all \openshmem collective routines, each of these routines assumes -that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the -\activeset{} and calls this collective routine, the behavior is undefined. - -The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \ac{PE}s in the \activeset. The same \dest{} and \source{} arrays -and the same \VAR{pSync} work array must be passed to all \ac{PE}s in the \activeset. - -Upon return from a collective routine, the following are true for the -local \ac{PE}: The \dest{} array is updated. The values in the \VAR{pSync} array -are restored to the original values. -} -{ -{ -%Return Values -\desR{None.} -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ -All \openshmem collective routines reset the values in \VAR{pSync} before they -return, so a particular \VAR{pSync} buffer need only be initialized the first -time it is used. - -You must ensure that the \VAR{pSync} array is not being updated on any \ac{PE} in -the \activeset{} while any of the \ac{PE}s participate in processing of an -\openshmem collective routine. Be careful to avoid these situations: If the -\VAR{pSync} array is initialized at run time, some type of synchronization is -needed to ensure that all \ac{PE}s in the working set have initialized \VAR{pSync} -before any of them enter an \openshmem routine called with the \VAR{pSync} -synchronization array. A \VAR{pSync} array can be reused on a subsequent -\openshmem collective routine only if none of the \ac{PE}s in the \activeset{} are -still processing a prior \openshmem collective routine call that used the -same \VAR{pSync} array. In general, this may be ensured only by doing some -type of synchronization. -%However, in the special case of \openshmem -%routines being called with the same \activeset, you can allocate two -%\VAR{pSync} arrays and alternate between them on successive calls. - -The collective routines operate on active \ac{PE} sets that have a -non-power-of-two \VAR{PE\_size} with some performance degradation. They -operate with no performance degradation when \VAR{nelems} is a -non-power-of-two value. -} -} -%Example -\exampleB{ - \exampleITEM{The following \FUNC{shmem\_collec}t example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_collect_example.c} - {} - %For each example, you can enter it as an item. - \exampleITEMF{The following \FUNC{SHMEM\_COLLECT} example is for \Fortran{} programs:} - {./EXAMPLES/shmem_collect_example.f90} - {} -} -\eAPI - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Concatenates blocks of data from multiple processing -% elements (PEs) to an array in every PE. -% -% SYNOPSIS -% C or C++: -% -% void shmem_collect32(void *target, const void *source, size_t nelems, -% int PE_start, int logPE_stride, int PE_size, long *pSync); -% -% void shmem_collect64(void *target, const void *source, size_t nelems, -% int PE_start, int logPE_stride, int PE_size, long *pSync); -% -% void shmem_fcollect32(void *target, const void *source, size_t -% nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -% -% void shmem_fcollect64(void *target, const void *source, size_t -% nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -% -% Fortran: -% -% INTEGER nelems -% INTEGER PE_start, logPE_stride, PE_size -% INTEGER pSync(SHMEM_COLLECT_SYNC_SIZE) -% -% CALL SHMEM_COLLECT4(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_COLLECT8(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_COLLECT32(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_COLLECT64(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_FCOLLECT4(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_FCOLLECT8(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_FCOLLECT32(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% CALL SHMEM_FCOLLECT64(target, source, nelems, PE_start, logPE_stride, -% PE_size, pSync) -% -% DESCRIPTION -% -% Arguments -% -% OUT target A symmetric array. The target argument must be large -% enough to accept the concatenation of the source arrays on -% all PEs. The data types are as follows: -% For shmem_collect8, shmem_collect64, shmem_fcollect8, and -% shmem_fcollect64, any data type with an element size of 64 -% bits. Fortran derived types, Fortran character type, and -% C/C++ structures are not permitted. For shmem_collect4, -% shmem_collect32, shmem_fcollect4, and shmem_fcollect32, -% any data type with an element size of 32 bits. Fortran -% derived types, Fortran character type, and C/C++ -% structures are not permitted. -% -% IN source A symmetric data object that can be of any type -% permissible for the target argument. -% -% IN nelems The number of elements in the source array. nelems must be -% of type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN PE_start The lowest PE number of the active set of PEs. -% PE_start must be of type integer. If you are using -% Fortran, it must be a default integer value. -% -% IN logPE_stride The log (base 2) of the stride between consecutive -% PE numbers in the active set. logPE_stride must be of -% type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN PE_size The number of PEs in the active set. PE_size must be of -% type integer. If you are using Fortran, it must be a -% default integer value. -% -% IN pSync A symmetric work array. In C/C++, pSync must be of type -% long and size _SHMEM_COLLECT_SYNC_SIZE. In Fortran, pSync -% must be of type integer and size SHMEM_COLLECT_SYNC_SIZE. -% If you are using Fortran, it must be a default integer -% value. Every element of this array must be initialized -% with the value _SHMEM_SYNC_VALUE in C/C++ or -% SHMEM_SYNC_VALUE in Fortran before any of the PEs in the -% active set enter shmem_barrier(). -% -% API Description -% -% OpenSHMEM collect and fcollect routines concatenate -% nelems 64-bit or 32-bit data items from the source array into the target -% array, over the set of PEs defined by PE_start, log2PE_stride, and -% PE_size, in processor number order. The resultant target array -% contains the contribution from PE PE_start first, then the contribution -% from PE PE_start + PE_stride second, and so on. The collected result -% is written to the target array for all PEs in the active set. -% -% The fcollect routines require that nelems be the same value in all -% participating PEs, while the collect routines allow nelems to vary from -% PE to PE. -% -% As with all OpenSHMEM collective routines, each of these routines assumes -% that only PEs in the active set call the routine. If a PE not in the -% active set calls a OpenSHMEM collective routine, undefined behavior -% results. -% -% The values of arguments PE_start, logPE_stride, and PE_size must be -% equal on all PEs in the active set. The same target and source arrays -% and the same pSync work array must be passed to all PEs in the active -% set. -% -% Upon return from a collective routine, the following are true for the -% local PE: The target array is updated. The values in the pSync array -% are restored to the original values. -% -% Return Value -% -% None. -% -% NOTES -% -% All OpenSHMEM collective routines reset the values in pSync before they -% return, so a particular pSync buffer need only be initialized the first -% time it is used. -% -% You must ensure that the pSync array is not being updated on any PE in -% the active set while any of the PEs participate in processing of a -% OpenSHMEM collective routine. Be careful to avoid these situations: If the -% pSync array is initialized at run time, some type of synchronization is -% needed to ensure that all PEs in the working set have initialized pSync -% before any of them enter a OpenSHMEM routine called with the pSync -% synchronization array. A pSync array can be reused on a subsequent -% OpenSHMEM collective routine only if none of the PEs in the active set are -% still processing a prior OpenSHMEM collective routine call that used the -% same pSync array. In general, this may be ensured only by doing some -% type of synchronization. However, in the special case of SHMEM -% routines being called with the same active set, you can allocate two -% pSync arrays and alternate between them on successive calls. -% -% The collective routines operate on active PE sets that have a -% non-power-of-two PE_size with some performance degradation. They -% operate with no performance degradation when nelems is a -% non-power-of-two value. -% -% EXAMPLES -% \lstinputlisting[language=C]{shmem_collect_example.c} -% -% \lstinputlisting[language=C]{shmem_collect_example.f90} diff --git a/_deprecated_sources/TEX_FILES/shmem_cswap.tex b/_deprecated_sources/TEX_FILES/shmem_cswap.tex deleted file mode 100644 index 08387c4f5..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_cswap.tex +++ /dev/null @@ -1,134 +0,0 @@ -\bAPI{SHMEM\_CSWAP}{Performs an atomic conditional swap on a remote data object.} -\synC %Synopisis for C API - -int shmem_int_cswap(int *dest, int cond, int value, int pe); -long shmem_long_cswap(long *dest, long cond, long value, int pe); -long shmem_longlong_cswap(long long *dest, long long cond, long long value, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER pe -INTEGER*4 SHMEM_INT4_CSWAP, cond_i4, value_i4, ires_i4 -ires_i4 = SHMEM_INT4_CSWAP(dest, cond_i4, value_i4, pe) -INTEGER*8 SHMEM_INT8_CSWAP, cond_i8, value_i8, ires_i8 -ires_i8 = SHMEM_INT8_CSWAP(dest, cond_i8, value_i8, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{dest}{The remotely accessible integer data object to be updated on - the remote \ac{PE}. } - % If you are using C/C++, the data type of - % dest should match that implied in the SYNOPSIS section.} -\argRow{IN}{cond}{\VAR{cond} is compared to the remote \VAR{dest} value. If \VAR{cond} and the - remote \VAR{dest} are equal, then \VAR{value} is swapped into the - remote \VAR{dest}. Otherwise, the remote \VAR{dest} is unchanged. - In either case, the old value of the remote \VAR{dest} is - returned as the routine return value. \VAR{cond} must be of the - same data type as \VAR{dest}.} -\argRow{IN}{value}{The value to be atomically written to the remote \ac{PE}. \VAR{value} must be the same data type as \VAR{dest}.} -\argRow{IN}{pe}{An integer that indicates the \ac{PE} number upon which \VAR{dest} is to be updated. If you are using \Fortran, it must be a default integer value.} -} -%API description -{ -The conditional swap routines conditionally update a \VAR{dest} data object -on the specified \ac{PE} and return the prior contents of the data object in one atomic operation. -} -%API Description Tabl -{ -\hfill \\ -\desTB {The \VAR{dest} and source data objects must conform to certain typing -constraints, which are as follows: } -{ -\cRow{SHMEM\_INT4\_CSWAP}{\CONST{4}-byte integer.} -\cRow{SHMEM\_INT8\_CSWAP}{\CONST{8}-byte integer.} -} -\desR{The contents that had been in the \VAR{dest} data object on the remote \ac{PE} -prior to the conditional swap. Data type is the same as the \VAR{dest} data type.} -% Notes. If there are no notes, this field can be left empty. -\notesB{None.} -} -%Example -\exampleB{ - %For each example, you can enter it as an item. - \exampleITEM - {The following call ensures that the first \ac{PE} to execute the - conditional swap will successfully write its \ac{PE} number to \VAR{race\_winner} - on \ac{PE} \CONST{0}.} - {./EXAMPLES/shmem_cswap_example.c} - {} -} -\eAPI -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Performs an atomic conditional swap to a remote -% data object. -% -% SYNOPSIS -% C or C++: -% -% int shmem_int_cswap(int *target, int cond, int value, int pe); -% -% long shmem_long_cswap(long *target, long cond, long value, int pe); -% -% long shmem_longlong_cswap(long long *target, long long cond, long long -% value, int pe); -% -% Fortran: -% -% INTEGER pe -% -% INTEGER(KIND=4) SHMEM_INT4_CSWAP -% ires = SHMEM_INT4_CSWAP(target, cond, value, pe) -% -% INTEGER(KIND=8) SHMEM_INT8_CSWAP -% ires = SHMEM_INT8_CSWAP(target, cond, value, pe) -% -% DESCRIPTION -% -% Arguments -% -% -% OUT target The remotely accessible integer data object to be updated on -% the remote PE. If you are using C/C++, the data type of -% target should match that implied in the SYNOPSIS section. If -% you are using Fortran, it must be of the following type: -% -% Routine Data Type -% -% SHMEM_INT4_CSWAP 4-byte integer -% -% SHMEM_INT8_CSWAP 8-byte integer -% -% IN cond cond is compared to the remote target value. If cond and the -% remote target are equal, then value is swapped into the -% remote target. Otherwise, the remote target is unchanged. -% In either case, the old value of the remote target is -% returned as the function return value. cond must be of the -% same data type as target. -% -% IN value The value to be atomically written to the remote PE. value -% must be the same data type as target. -% -% IN pe An integer that indicates the PE number upon which target is -% to be updated. If you are using Fortran, it must be a -% default integer value. -% API Description -% -% The conditional swap routines conditionally update a target data object -% on an arbitrary processing element (PE) and return the prior contents -% of the data object in one atomic operation. -% -% Return Value -% -% The contents that had been in the target data object on the remote PE -% prior to the conditional swap. Data type is the same as the target data type. -% -% -% NOTES -% -% -% EXAMPLES -% -% The following call ensures that the first PE to exectute the -% conditional swap will successfully write its PE number to race_winner -% on PE 0. -% -% \lstinputlisting[language=C]{shmem_cswap_example.c} diff --git a/_deprecated_sources/TEX_FILES/shmem_fadd.tex b/_deprecated_sources/TEX_FILES/shmem_fadd.tex deleted file mode 100644 index 919a9c386..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_fadd.tex +++ /dev/null @@ -1,113 +0,0 @@ -\bAPI{SHMEM\_FADD}{Performs an atomic fetch-and-add operation on a remote data object.} -\synC %Synopisis for C API - -int shmem_int_fadd(int *dest, int value, int pe); -long shmem_long_fadd(long *dest, long value, int pe); -long long shmem_longlong_fadd(long long *dest, long long value, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER pe -INTEGER*4 SHMEM_INT4_FADD, ires_i4, value_i4 -ires_i4 = SHMEM_INT4_FADD(dest, value_i4, pe) -INTEGER*8 SHMEM_INT8_FADD, ires_i8, value_i8 -ires_i8 = SHMEM_INT8_FADD(dest, value_i8, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{dest}{The remotely accessible integer data object to be updated on - the remote \ac{PE}. The type of \VAR{dest} should match that implied - in the SYNOPSIS section.} -\argRow{IN}{value}{The value to be atomically added to \VAR{dest}. The type of \VAR{value} should match that implied in the SYNOPSIS section.} -\argRow{IN}{pe}{An integer that indicates the \ac{PE} number on which \VAR{dest} is to be updated. If you are using \Fortran, it must be a default integer value.} -} -%API description -{ -\FUNC{shmem\_fadd} routines perform an atomic fetch-and-add operation. An -atomic fetch-and-add operation fetches the old \VAR{dest} and adds \VAR{value} to -\VAR{dest} without the possibility of another atomic operation on the \VAR{dest} -between the time of the fetch and the update. These routines add \VAR{value} -to \VAR{dest} on \VAR{pe} and return the previous -contents of \VAR{dest} as an atomic operation. -} -%API Description Table. -{ - \hfill \\ -\desTB {If you are using \Fortran, \VAR{dest} must be of the following type:} -{ -\cRow{SHMEM\_INT4\_FADD}{\CONST{4}-byte integer} -\cRow{SHMEM\_INT8\_FADD}{\CONST{8}-byte integer} -} - -%Return Values -\desR{The contents that had been at the \VAR{dest} address on the remote \ac{PE} prior to the atomic addition operation. The data type of the return value is the same as the \VAR{dest}.} -% Notes. If there are no notes, this field can be left empty. -\notesB{None.} -} - -\exampleB{ - \exampleITEM - {The following \FUNC{shmem\_fadd} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_fadd_example.c} - {} -} -\eAPI -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Performs an atomic fetch-and-add operation on a -% remote data object. -% -%SYNOPSIS -% -% C or C++: -% -% int shmem_int_fadd(int *target, int value, int pe); -% -% long shmem_long_fadd(long *target, long value, int pe); -% -% long long shmem_longlong_fadd(long long *target, long long value, -% int pe); -% -% Fortran: -% -% INTEGER pe -% -% INTEGER(KIND=4) SHMEM_INT4_FADD, ires, target, value -% ires = SHMEM_INT4_FADD(target, value, pe) -% -% INTEGER(KIND=8) SHMEM_INT8_FADD, ires, target, value -% ires = SHMEM_INT8_FADD(target, value, pe) -% -% -%DESCRIPTION -% -%Arguments -% -% OUT target The remotely accessible integer data object to be updated on -% the remote PE. The type of target should match that implied -% in the SYNOPSIS section. -% -% IN value The value to be atomically added to target. The type of -% value should match that implied in the SYNOPSIS section. -% -% IN pe An integer that indicates the PE number on which target is to -% be updated. If you are using Fortran, it must be a default -% integer value. -%API Description -% -% shmem_fadd functions perform an atomic fetch-and-add operation. An -% atomic fetch-and-add operation fetches the old target and adds value to -% target without the possibility of another atomic operation on the target -% between the time of the fetch and the update. These routines add value -% to target on Processing Element (PE) pe and return the previous -% contents of target as an atomic operation. -% -%Return Value -% -% The contents that had been at the target address on the remote PE prior -% to the atomic addition operation. The data type of return value is the same as the target. -% -% -%NOTES -% -%EXAMPLE -% -% \lstinputlisting[language=C]{shmem_fadd_example.c} diff --git a/_deprecated_sources/TEX_FILES/shmem_fence.tex b/_deprecated_sources/TEX_FILES/shmem_fence.tex deleted file mode 100644 index 4fda8b831..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_fence.tex +++ /dev/null @@ -1,43 +0,0 @@ -\bAPI{SHMEM\_FENCE}{Assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects.} -\synC %Synopisis for C API - -void shmem_fence(void); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_FENCE %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{None.}{}{} - } -%API description -{ -This routine assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects. -%This function ensures ordering of \PUT{}, \acp{AMO} and store operations on symmetric data objects. -All \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects issued to a particular remote \ac{PE} prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any subsequent \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, not completion. -% which follow the call to -% \FUNC{shmem\_fence}. -} -{ -%API Description Table. -\desR{ - %Return Values - None. -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ - \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does not guarantee completion of delivery. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} guarantees completion of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects which makes the updates visible to all other \acp{PE}. - - The \FUNC{shmem\_quiet} routine should be called if completion of PUT{}, \acp{AMO}, and memory store routines to symmetric data objects is desired when multiple remote \ac{PE}s are involved. -} -} % end of DesB - -\exampleB{ - \exampleITEM - { The following \FUNC{shmem\_fence} example is for \CorCpp{} programs: } - {./EXAMPLES/shmem_fence_example.c} - {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before - \VAR{put4}.} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_finalize.tex b/_deprecated_sources/TEX_FILES/shmem_finalize.tex deleted file mode 100644 index 01b0f7eee..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_finalize.tex +++ /dev/null @@ -1,57 +0,0 @@ -\bAPI{SHMEM\_FINALIZE}{A collective operation that releases resources used by -the \openshmem library. This only terminates the \openshmem portion of a -program, not the entire program.} -\synC -void shmem_finalize(void); %*\synCE -\synF -CALL SHMEM_FINALIZE %*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{None.}{}{} -} -%API Description -{ - \FUNC{shmem\_finalize} is a collective operation that ends the \openshmem - portion of a program previously initialized by \FUNC{shmem\_init} and - releases resources used by the \openshmem library. This collective - operation requires all \acp{PE} to participate in the call. There is an - implicit global barrier in \FUNC{shmem\_finalize} so that pending - communication is completed, and no resources can be released until all - \acp{PE} have entered \FUNC{shmem\_finalize}. \FUNC{shmem\_finalize} must be - the last \openshmem library call encountered in the \openshmem portion of a - program. A call to \FUNC{shmem\_finalize} will release any resources - initialized by a corresponding call to \FUNC{shmem\_init}. All processes and - threads that represent the \acp{PE} will still exist after the call to - \FUNC{shmem\_finalize} returns, but they will no longer have access to any - resources that have been released. -} -%API Description Table -{ -%Return Values -\desR{None.} -%NOTES -\notesB{ - \FUNC{shmem\_finalize} releases all resources used by the \openshmem library - including the symmetric memory heap and pointers initiated by - \FUNC{shmem\_ptr}. This collective operation requires all \acp{PE} to - participate in the call, not just a subset of the \acp{PE}. The - non-\openshmem portion of a program may continue after a call to - \FUNC{shmem\_finalize} by all \acp{PE}. There is an implicit - \FUNC{shmem\_finalize} at the end of main, so that having an explicit call - to \FUNC{shmem\_finalize} is optional. However, an explicit - \FUNC{shmem\_finalize} may be required as an entry point for wrappers used - by profiling or other tools that need to perform their own finalization. -} -} -%EXAMPLES -\exampleB{ - \exampleITEM - {The following finalize example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_finalize_example.c} - {} -} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_finc.tex b/_deprecated_sources/TEX_FILES/shmem_finc.tex deleted file mode 100644 index ac3d16005..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_finc.tex +++ /dev/null @@ -1,57 +0,0 @@ -\bAPI{SHMEM\_FINC}{Performs an atomic fetch-and-increment operation on a remote data object.} -\synC %Synopisis for C API - -int shmem_int_finc(int *dest, int pe); -long shmem_long_finc(long *dest, int pe); -long long shmem_longlong_finc(long long *dest, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -%\rcomment{Manju: Do we need the pe, ires4, ires8 ? } - -\synF %Synopsis for FORTRAN API - -INTEGER pe -INTEGER*4 SHMEM_INT4_FINC, ires_i4 -ires_i4 = SHMEM_INT4_FINC(dest, pe) -INTEGER*8 SHMEM_INT8_FINC, ires_i8 -ires_i8 = SHMEM_INT8_FINC(dest, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{dest}{The remotely accessible integer data object to be updated on - the remote \ac{PE}. The type of \dest{} should match that implied - in the SYNOPSIS section.} - \argRow{IN}{pe}{An integer that indicates the \ac{PE} number on which \dest{} is to - be updated. If you are using \Fortran, it must be a default - integer value.} - } -%API description -{ - These routines perform a fetch-and-increment operation. The \dest{} on - \ac{PE} \VAR{pe} is increased by one and the routine returns - the previous contents of \dest{} as an atomic operation. -} -%API Description Table. -{ \hfill \\ -\desTB {If you are using \Fortran, \VAR{dest} must be of the following type:} -{ -\cRow{SHMEM\_INT4\_FINC}{\CONST{4}-byte integer} -\cRow{SHMEM\_INT8\_FINC}{\CONST{8}-byte integer} -} - %Return Values -\desR{The contents that had been at the \dest{} address on the remote \ac{PE} prior to the increment. The data type of the return value is the same as the \dest.} -% Notes. If there are no notes, this field can be left empty. -\notesB{None.} -} -%\rcomment{Manju: Seems like the indent for notes and return depends on whether -%there is a newline before (\ac{API} Description Table) or not. We might have to fix -%it} -\exampleB{ - \exampleITEM - {The following \FUNC{shmem\_finc} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_finc_example.c} - {} -} -\eAPI - - - - diff --git a/_deprecated_sources/TEX_FILES/shmem_g.tex b/_deprecated_sources/TEX_FILES/shmem_g.tex deleted file mode 100644 index 502578975..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_g.tex +++ /dev/null @@ -1,49 +0,0 @@ -\bAPI{SHMEM\_G}{Transfers one data item from a remote \ac{PE}} -\synC %Synopisis for C API - -char shmem_char_g(char *addr, int pe); -short shmem_short_g(short *addr, int pe); -int shmem_int_g(int *addr, int pe); -long shmem_long_g(long *addr, int pe); -long long shmem_longlong_g(long long *addr, int pe); -float shmem_float_g(float *addr, int pe); -double shmem_double_g(double *addr, int pe); -long double shmem_longdouble_g(long double *addr, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{addr}{The remotely accessible array element or scalar data object.} - \argRow{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} - } -%API description -{ - These routines provide a very low latency get capability for single elements of most basic types. -} -%This newline is required -{ -%API Description Table. -\desR{ - %Return Values - {Returns a single element of type specified in the synopsis.} -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ None. - } -} -\exampleB{ - \exampleITEM - {The following \FUNC{shmem\_long\_g} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_g_example.c} - {} -} -\eAPI - - - - - - - - - - diff --git a/_deprecated_sources/TEX_FILES/shmem_get.tex b/_deprecated_sources/TEX_FILES/shmem_get.tex deleted file mode 100644 index 5e8cbed45..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_get.tex +++ /dev/null @@ -1,89 +0,0 @@ -\bAPI{SHMEM\_GET}{Copies data from a specified \ac{PE}.} -\synC %Synopisis for C API - -void shmem_double_get(double *dest, const double *source, size_t nelems, int pe); -void shmem_float_get(float *dest, const float *source, size_t nelems, int pe); -void shmem_get32(void *dest, const void *source, size_t nelems, int pe); -void shmem_get64(void *dest, const void *source, size_t nelems, int pe); -void shmem_get128(void *dest, const void *source, size_t nelems, int pe); -void shmem_getmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_int_get(int *dest, const int *source, size_t nelems, int pe); -void shmem_long_get(long *dest, const long *source, size_t nelems, int pe); -void shmem_longdouble_get(long double *dest, const long double *source, size_t nelems, int pe); -void shmem_longlong_get(long long *dest, const long long *source, size_t nelems, int pe); -void shmem_short_get(short *dest, const short *source, size_t nelems, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER nelems, pe -CALL SHMEM_CHARACTER_GET(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_GET(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_GET(dest, source, nelems, pe) -CALL SHMEM_GET4(dest, source, nelems, pe) -CALL SHMEM_GET8(dest, source, nelems, pe) -CALL SHMEM_GET32(dest, source, nelems, pe) -CALL SHMEM_GET128(dest, source, nelems, pe) -CALL SHMEM_GETMEM(dest, source, nelems, pe) -CALL SHMEM_INTEGER_GET(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_GET(dest, source, nelems, pe) -CALL SHMEM_REAL_GET(dest, source, nelems, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{OUT}{dest}{Local data object to be updated.} - \argRow{IN}{source}{Data object on the \ac{PE} identified by \VAR{pe} that contains the data to be copied. This data object must be remotely accessible.} - \argRow{IN}{nelems}{Number of elements in the \dest{} and \source{} arrays. \VAR{nelems} must be of type \VAR{size\_t} for \Clang. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} - \argRow{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} - } -%API description -{ - The get routines provide a method for copying a - contiguous symmetric data object from a different \ac{PE} to a contiguous data object - on the local \ac{PE}. The routines return after the data has been - delivered to the \dest{} array on the local \ac{PE}. -} -%API Description Table. -{ - \desTB{The \dest{} and \source{} data objects must conform to typing constraints, - which are as follows:} - { - \cRow{shmem\_getmem}{\Fortran: Any noncharacter type. \Clang: Any data type. - nelems is scaled in bytes.} - \cRow{ shmem\_get4, shmem\_get32}{Any noncharacter type that has a storage - size equal to \CONST{32} bits.} - \cRow{shmem\_get8, shmem\_get64}{Any noncharacter type that has a storage - size equal to \CONST{64} bits.} - \cRow{shmem\_get128}{Any noncharacter type that has a storage - size equal to \CONST{128} bits.} - \cRow{shmem\_short\_get}{Elements of type short.} - \cRow{shmem\_int\_get}{Elements of type int.} - \cRow{shmem\_long\_get}{Elements of type long.} - \cRow{shmem\_longlong\_get}{Elements of type long long.} - \cRow{shmem\_float\_get}{Elements of type float.} - \cRow{shmem\_double\_get}{Elements of type double.} - \cRow{shmem\_longdouble\_get}{Elements of type long double.} - \cRow{SHMEM\_CHARACTER\_GET}{Elements of type character. \VAR{nelems} is the - number of characters to transfer. The - actual character lengths of the \source{} - and \dest{} variables are ignored.} - \cRow{SHMEM\_COMPLEX\_GET}{Elements of type complex of default - size.} - \cRow{SHMEM\_DOUBLE\_GET}{\Fortran: Elements of type double precision.} - \cRow{SHMEM\_INTEGER\_GET}{Elements of type integer.} - \cRow{SHMEM\_LOGICAL\_GET}{Elements of type logical.} - \cRow{SHMEM\_REAL\_GET}{Elements of type real.} - } - %Return Values - \desR{None.} - \notesB{ - See Introduction for a definition of the term remotely accessible. If you are using \Fortran, data types must be of default size. For - example, a real variable must be declared as \CONST{REAL}, \CONST{REAL*4}, or - \CONST{REAL(KIND=KIND(1.0))}. - } -} -\exampleB{ - \exampleITEMF - {Consider this example for \Fortran.} - {./EXAMPLES/shmem_get_example.f90} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_global_exit.tex b/_deprecated_sources/TEX_FILES/shmem_global_exit.tex deleted file mode 100644 index 195c95470..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_global_exit.tex +++ /dev/null @@ -1,62 +0,0 @@ -\bAPI{SHMEM\_GLOBAL\_EXIT}{A routine that allows any \ac{PE} to force -termination of an entire program.} -%SYNOPSIS -\synC -void shmem_global_exit(int status); %*\synCE -\synF -INTEGER STATUS -CALL SHMEM_GLOBAL_EXIT(status) %*\synFE - -%DESCRIPTION - -%Arguments -\desB{ - \argRow{IN}{status}{The exit status from the main program.} -} -%API Description -{ - \FUNC{shmem\_global\_exit} is a non-collective routine that allows any one - \ac{PE} to force termination of an \openshmem program for all \acp{PE}, - passing an exit status to the execution environment. This routine terminates - the entire program, not just the \openshmem portion. When any \ac{PE} calls - \FUNC{shmem\_global\_exit}, it results in the immediate notification to all - \acp{PE} to terminate. \FUNC{shmem\_global\_exit} flushes I/O and releases - resources in accordance with C/C++/Fortran language requirements for normal - program termination. If more than one \ac{PE} calls - \FUNC{shmem\_global\_exit}, then the exit status returned to the environment - shall be one of the values passed to \FUNC{shmem\_global\_exit} as the - status argument. There is no return to the caller of - \FUNC{shmem\_global\_exit}; control is returned from the \openshmem program - to the execution environment for all \acp{PE}. -} -%API Description Table -{ -%Return Value -\desR{ -None.} -%NOTES -\notesB{ - \FUNC{shmem\_global\_exit} may be used in situations where one or more - \acp{PE} have determined that the program has completed and/or should - terminate early. Accordingly, the integer status argument can be used to - pass any information about the nature of the exit, e.g an encountered error - or a found solution. Since \FUNC{shmem\_global\_exit} is a non-collective - routine, there is no implied synchronization, and all \acp{PE} must - terminate regardless of their current execution state. While I/O must be - flushed for standard language I/O calls from C/C++/Fortran, it is - implementation dependent as to how I/O done by other means (e.g. third - party I/O libraries) is handled. Similarly, resources are released - according to C/C++/Fortran standard language requirements, but this may not - include all resources allocated for the \openshmem program. However, a - quality implementation will make a best effort to flush all I/O and clean - up all resources. -} -} -%EXAMPLES -\exampleB{ -\exampleITEM - {} - {./EXAMPLES/shmem_global_exit_example.c} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_iget.tex b/_deprecated_sources/TEX_FILES/shmem_iget.tex deleted file mode 100644 index c098596d5..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_iget.tex +++ /dev/null @@ -1,90 +0,0 @@ -\bAPI{SHMEM\_IGET}{Copies strided data from a specified \ac{PE}.} -\label{subsec:shmem_iget} -\synC %Synopisis for C API - -void shmem_double_iget(double *dest, const double *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_float_iget(float *dest, const float *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iget32(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iget64(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iget128(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_int_iget(int *dest, const int *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_long_iget(long *dest, const long *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_longdouble_iget(long double *dest, const long double *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_longlong_iget(long long *dest, const long long *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_short_iget(short *dest, const short *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER dst, sst, nelems, pe -CALL SHMEM_COMPLEX_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_DOUBLE_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET4(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET8(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET32(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET64(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET128(dest, source, dst, sst, nelems, pe) -CALL SHMEM_INTEGER_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_LOGICAL_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_REAL_IGET(dest, source, dst, sst, nelems, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{OUT}{dest}{Array to be updated on the local \ac{PE}. } - \argRow{IN}{source}{Array containing the data to be copied on the remote \ac{PE}.} - \argRow{IN}{dst}{The stride between consecutive elements of the \dest{} - array. The stride is scaled by the element size of the \dest{} array. - A value of \CONST{1} indicates contiguous data. \VAR{dst} must be of type - \textit{ptrdiff\_t}. If you are calling from \Fortran, it must be a default integer value.} - \argRow{IN}{sst}{The stride between consecutive elements of the \source{} array. - The stride is scaled by the element size of the \source{} array. - A value of \CONST{1} indicates contiguous data. \VAR{sst} must be of type - \textit{ptrdiff\_t}. If you are calling from \Fortran, it must be a default integer value.} - \argRow{IN}{nelems}{Number of elements in the \dest{} and \source{} arrays. \VAR{nelems} must - be of type \VAR{size\_t} for \Clang. If you are using \Fortran, it must be a - constant, variable, or array element of default integer type.} - \argRow{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or - array element of default integer type.} -} -%API description -{ - The \FUNC{iget} routines provide a method for copying strided data elements from a - symmetric array from a specified remote \ac{PE} to strided locations on a local array. - The routines return when the data has been copied into the local \VAR{dest} - array.} -%This newline is required -%API Description Table. -{ -\hfill \\ - \desTB{The \VAR{dest} and \VAR{source} data objects must conform to typing constraints, which are as follows:} - { - \cRow{shmem\_iget32, shmem\_iget4}{Any noncharacter type that has a storage - size equal to \CONST{32} bits.} - \cRow{shmem\_iget64, shmem\_iget8}{Any noncharacter type that has a storage - size equal to \CONST{64} bits.} - \cRow{shmem\_iget128}{Any noncharacter type that has a storage - size equal to \CONST{128} bits.} - \cRow{shmem\_short\_iget}{Elements of type short.} - \cRow{ shmem\_int\_iget}{Elements of type int.} - \cRow{shmem\_long\_iget}{Elements of type long.} - \cRow{shmem\_longlong\_iget}{Elements of type long long.} - \cRow{shmem\_float\_iget}{Elements of type float.} - \cRow{shmem\_double\_iget}{Elements of type double.} - \cRow{shmem\_longdouble\_iget}{Elements of type long double.} - \cRow{SHMEM\_COMPLEX\_IGET}{Elements of type complex of default size.} - \cRow{SHMEM\_DOUBLE\_IGET}{\Fortran: Elements of type double precision.} - \cRow{SHMEM\_INTEGER\_IGET}{Elements of type integer.} - \cRow{SHMEM\_LOGICAL\_IGET}{Elements of type logical.} - \cRow{SHMEM\_REAL\_IGET}{Elements of type real.} - } - %Return Values - \desR{None.} - \notesB{If you are using \Fortran, data types must be of default size. For - example, a real variable must be declared as \CONST{REAL}, \CONST{REAL*4}, or \CONST{REAL(KIND=KIND(1.0))}.} -} -\exampleB{ - \exampleITEMF - {The following example uses \FUNC{shmem\_logical\_iget} in a \Fortran{} - program.} - {./EXAMPLES/shmem_iget_example.f90} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_inc.tex b/_deprecated_sources/TEX_FILES/shmem_inc.tex deleted file mode 100644 index 551dd6dde..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_inc.tex +++ /dev/null @@ -1,52 +0,0 @@ -\bAPI{SHMEM\_INC}{Performs an atomic increment operation on a remote data object.} -\synC %Synopisis for C API - -void shmem_int_inc(int *dest, int pe); -void shmem_long_inc(long *dest, int pe); -void shmem_longlong_inc(long long *dest, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -INTEGER pe -CALL SHMEM_INT4_INC(dest, pe) -CALL SHMEM_INT8_INC(dest, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{dest}{The remotely accessible integer data object to be updated on - the remote \ac{PE}. The type of \dest{} should match that implied - in the SYNOPSIS section.} - \argRow{IN}{pe}{An integer that indicates the \ac{PE} number on which \dest{} is to - be updated. If you are using \Fortran{}, it must be a default - integer value.} - } -%API description -{ - These routines perform an atomic increment operation on the \VAR{dest} data object on \ac{PE}. -} -{ -%API Description Table. - \hfill \\ -\desTB {If you are using \Fortran, \VAR{dest} must be of the following type:} -{ -\cRow{SHMEM\_INT4\_INC}{\CONST{4}-byte integer} -\cRow{SHMEM\_INT8\_INC}{\CONST{8}-byte integer} -} - -\desR{ - %Return Values - None. -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ - The term remotely accessible is defined in the Introduction. -} -} % end of DesB - -\exampleB{ - \exampleITEM - { The following \FUNC{shmem\_int\_inc} example is for \CorCpp{} programs: } - {./EXAMPLES/shmem_inc_example.c} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_init.tex b/_deprecated_sources/TEX_FILES/shmem_init.tex deleted file mode 100644 index d35e042da..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_init.tex +++ /dev/null @@ -1,47 +0,0 @@ -\bAPI{SHMEM\_INIT}{A collective operation that allocates and initializes the -resources used by the \openshmem library.} -\synC -void shmem_init(void); %*\synCE -\synF -CALL SHMEM_INIT() %*\synFE - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{None.}{}{} -} -%API description -{ - \FUNC{shmem\_init} allocates and initializes resources used by the - \openshmem library. It is a collective operation that all \acp{PE} must - call before any other \openshmem routine may be called. At the end of the - \openshmem program which it initialized, the call to \FUNC{shmem\_init} - must be matched with a call to \FUNC{shmem\_finalize}. After a single - call to \FUNC{shmem\_init}, a subsequent call to \FUNC{shmem\_init} - in the same program results in undefined behavior. -} -%API Description Table. -{ -%Return Values -\desR{ None. } -\notesB{ - As of \openshmem Specification 1.2 the use of \FUNC{start\_pes} has been - deprecated and is replaced with \FUNC{shmem\_init}. While support for - \FUNC{start\_pes} is still required in \openshmem libraries, users are - encouraged to use \FUNC{shmem\_init}. Replacing \FUNC{start\_pes} with - \FUNC{shmem\_init} in \openshmem programs with no further changes is - possible; there is an implicit \FUNC{shmem\_finalize} at the end of main. - However, \FUNC{shmem\_init} differs slightly from \FUNC{start\_pes}: - multiple calls to \FUNC{shmem\_init} within a program results in undefined - behavior, while in the case of \FUNC{start\_pes}, any subsequent calls to - \FUNC{start\_pes} after the first one resulted in a no-op. -} -}%end of DesB -%Example -\exampleB{ -%For each example, you can enter it as an item. - \exampleITEMF - { This is a simple program that calls \FUNC{shmem\_init}:} - {./EXAMPLES/shmem_init_example.f90} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_iput.tex b/_deprecated_sources/TEX_FILES/shmem_iput.tex deleted file mode 100644 index 9fb1704fc..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_iput.tex +++ /dev/null @@ -1,86 +0,0 @@ -\bAPI{SHMEM\_IPUT}{Copies strided data to a specified \ac{PE}.} -\label{subsec:shmem_iput} -\synC -void shmem_double_iput(double *dest, const double *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_float_iput(float *dest, const float *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_int_iput(int *dest, const int *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iput32(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iput64(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iput128(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_long_iput(long *dest, const long *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_longdouble_iput(long double *dest, const long double *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_longlong_iput(long long *dest, const long long *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_short_iput(short *dest, const short *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER dst, sst, nelems, pe -CALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_DOUBLE_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_INTEGER_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT4(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT8(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT32(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT64(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT128(dest, source, dst, sst, nelems, pe) -CALL SHMEM_LOGICAL_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_REAL_IPUT(dest, source, dst, sst, nelems, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\desB{ -\argRow{OUT}{dest}{Array to be updated on the remote \ac{PE}. This data object must - be remotely accessible.} -\argRow{IN}{source}{Array containing the data to be copied.} -\argRow{IN}{dst}{The stride between consecutive elements of the \dest{} array. - The stride is scaled by the element size of the \dest{} array. - A value of \CONST{1} indicates contiguous data. \VAR{dst} must be of type - \textit{ptrdiff\_t}. If you are using \Fortran, it must be a default integer value.} -\argRow{IN}{sst}{The stride between consecutive elements of the \source{} array. - The stride is scaled by the element size of the \source{} array. - A value of \CONST{1} indicates contiguous data. \VAR{sst} must be of type - \textit{ptrdiff\_t}. If you are using \Fortran, it must be a default - integer value.} -\argRow{IN}{nelems}{Number of elements in the \dest{} and \source{} arrays. \VAR{nelems} must - be of type \VAR{size\_t} for \Clang. If you are using \Fortran, it must be a - constant, variable, or array element of default integer type.} -\argRow{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or - array element of default integer type.} -} -{ - - The \FUNC{iput} routines provide a method for copying strided data elements (specified by \VAR{sst}) of an array from a \source{} array on the local \ac{PE} to locations specified by stride \VAR{dst} on a \dest{} array on specified remote \ac{PE}. Both strides, \VAR{dst} and \VAR{sst} must be greater than or equal to \CONST{1}. The routines return when the data has been copied out of the \VAR{source} array on the local \ac{PE} but not necessarily before the data has been delivered to the remote data object. -}{ - \desTB{ - The \dest{} and \source{} data objects must conform to typing constraints, - which are as follows:} - { - \cRow{shmem\_iput32, shmem\_iput4}{Any noncharacter type that has a storage - size equal to \CONST{32} bits.} - \cRow{shmem\_iput64, shmem\_iput8}{Any noncharacter type that has a storage - size equal to \CONST{64} bits.} - \cRow{shmem\_iput128}{Any noncharacter type that has a storage - size equal to \CONST{128} bits.} - \cRow{shmem\_short\_iput}{Elements of type short.} - \cRow{shmem\_int\_iput}{Elements of type int.} - \cRow{shmem\_long\_iput}{Elements of type long.} - \cRow{shmem\_longlong\_iput}{Elements of type long long.} - \cRow{shmem\_float\_iput}{Elements of type float.} - \cRow{shmem\_double\_iput}{Elements of type double.} - \cRow{shmem\_longdouble\_iput}{Elements of type long double.} - \cRow{SHMEM\_COMPLEX\_IPUT}{Elements of type complex of default size.} - \cRow{SHMEM\_DOUBLE\_IPUT}{Elements of type double precision.} - \cRow{SHMEM\_INTEGER\_IPUT}{Elements of type integer.} - \cRow{SHMEM\_LOGICAL\_IPUT}{Elements of type logical.} - \cRow{SHMEM\_REAL\_IPUT}{Elements of type real.} - } -\desR{None.} -\notesB{ - If you are using \Fortran, data types must be of default size. For - example, a real variable must be declared as \CONST{REAL}, \CONST{REAL*4} or - \CONST{REAL(KIND=KIND(1.0))}. See Introduction for a definition of the term remotely accessible. -} -} -\exampleB{ - \exampleITEM - {Consider the following \FUNC{shmem\_short\_iput} example for \CorCpp{} - programs.} {./EXAMPLES/shmem_iput_example.c}{} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_lock.tex b/_deprecated_sources/TEX_FILES/shmem_lock.tex deleted file mode 100644 index 940009f36..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_lock.tex +++ /dev/null @@ -1,41 +0,0 @@ - \bAPI{SHMEM\_LOCK}{Releases, locks, and tests a mutual exclusion memory lock.} -\synC -void shmem_clear_lock(long *lock); -void shmem_set_lock(long *lock); -int shmem_test_lock(long *lock); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -INTEGER lock, SHMEM_TEST_LOCK -CALL SHMEM_CLEAR_LOCK(lock) -CALL SHMEM_SET_LOCK(lock) -I = SHMEM_TEST_LOCK(lock) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\desB{ - \argRow{IN}{lock}{ A symmetric data object that is a scalar variable or an array - of length \CONST{1}. This data object must be set to \CONST{0} on all - \ac{PE}s prior to the first use. \VAR{lock} must be of type \CONST{long}. If you are using \Fortran, it must be of default kind.} -} -{ - The \FUNC{shmem\_set\_lock} routine sets a mutual exclusion lock after waiting - for the lock to be freed by any other \ac{PE} currently holding the lock. - Waiting \ac{PE}s are assured of getting the lock in a first-come, - first-served manner. The \FUNC{shmem\_clear\_lock} routine releases a lock previously set by \FUNC{shmem\_set\_lock} after ensuring that all local and remote stores initiated in the critical region are complete. The \FUNC{shmem\_test\_lock} routine sets a mutual exclusion lock only if it is currently cleared. By using this routine, a \ac{PE} can avoid blocking on a set lock. If the lock is currently set, the routine returns without waiting. These routines are appropriate for protecting a critical region from simultaneous update by multiple \ac{PE}s. -} -{ -\desR{ - The \FUNC{shmem\_test\_lock} routine returns \CONST{0} if the lock was originally cleared and this call was able to set the lock. A value of \CONST{1} is - returned if the lock had been set and the call returned without waiting - to set the lock.} -\notesB{ - The term symmetric data object is defined in Introduction. The lock variable should always be initialized to zero and accessed only by the \openshmem locking \ac{API}. - Changing the value of the lock variable by other means without using the \openshmem \ac{API}, can lead to undefined behavior. -% Section 41, there was discussion on the list about putting in language about the opacity of the lock variable after the routines have touched it. Initialize to zero, then only the API should be allowed to use it, cannot %guarantee any value meaningful to the programmer and any reset could lead to bad things. Do we want to tighten this up in this version? (e.g. from Brian Barrett) -} -} - -\exampleB { -\exampleITEM - {The following example uses \FUNC{shmem\_lock} in a \Clang{} program.} - {./EXAMPLES/shmem_lock_example.c}{} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_name.tex b/_deprecated_sources/TEX_FILES/shmem_name.tex deleted file mode 100644 index 470678189..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_name.tex +++ /dev/null @@ -1,40 +0,0 @@ -\bAPI{SHMEM\_INFO\_GET\_NAME}{This routine returns the vendor defined character string.} -\synC %Synopisis for C API - -void shmem_info_get_name(char *name); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -SHMEM_INFO_GET_NAME(NAME) -CHARACTER *(*)NAME %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{OUT}{name}{The vendor defined string.} - } -%API description -{ - This routine returns the vendor defined character string of size defined by the - constant SHMEM\_MAX\_NAME\_LEN. The program calling this function - prepares the memory of size SHMEM\_MAX\_NAME\_LEN, and the implementation copies the - string of size at most SHMEM\_MAX\_NAME\_LEN. In C, the string is terminated by a null character. - In Fortran, the string of size less than SHMEM\_MAX\_NAME\_LEN is padded with blank characters up to - size SHMEM\_MAX\_NAME\_LEN. The implementation copying a string of size greater than SHMEM\_MAX\_NAME\_LEN results - in an undefined behavior. - Multiple invocations of the - routine in an \openshmem{} program always return the same string. - For a given library implementation, the major and minor version returned by these calls is consistent with the compile-time constants defined in its shmem.h. -} -%This newline is required -{ -%API Description Table. -\desR{ - %Return Values - None. -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ None. - } -} -\eAPI - diff --git a/_deprecated_sources/TEX_FILES/shmem_p.tex b/_deprecated_sources/TEX_FILES/shmem_p.tex deleted file mode 100644 index 2fdfb55f7..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_p.tex +++ /dev/null @@ -1,33 +0,0 @@ -\bAPI{SHMEM\_P}{Copies one data item to a remote \ac{PE}.} -\synC -void shmem_char_p(char *addr, char value, int pe); -void shmem_short_p(short *addr, short value, int pe); -void shmem_int_p(int *addr, int value, int pe); -void shmem_long_p(long *addr, long value, int pe); -void shmem_longlong_p(long long *addr, long long value, int pe); -void shmem_float_p(float *addr, float value, int pe); -void shmem_double_p(double *addr, double value, int pe); -void shmem_longdouble_p(long double *addr, long double value, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\desB{ - \argRow{IN}{addr}{The remotely accessible array element or scalar data object - which will receive the data on the remote \ac{PE}.} - \argRow{IN}{value}{The value to be transferred to \VAR{addr} on the remote \ac{PE}.} - \argRow{IN}{pe}{The number of the remote \ac{PE}.} -} -{ These routines provide a very low latency put capability for single - elements of most basic types. - - As with \FUNC{shmem\_put}, these routines start the remote transfer and may - return before the data is delivered to the remote \ac{PE}. Use - \FUNC{shmem\_quiet} to force completion of all remote \PUT{} transfers. -} -{ -\desR{None.} -\notesB{None.} -} -\exampleB { -\exampleITEM{The following example uses \FUNC{shmem\_double\_p} in a \Clang{} program.} - {./EXAMPLES/shmem_p_example.c}{} - } -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_pe_accessible.tex b/_deprecated_sources/TEX_FILES/shmem_pe_accessible.tex deleted file mode 100644 index 9ac497783..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_pe_accessible.tex +++ /dev/null @@ -1,29 +0,0 @@ -\bAPI{SHMEM\_PE\_ACCESSIBLE}{Determines whether a \ac{PE} is accessible via \openshmem's data transfer routines.} -\synC -int shmem_pe_accessible(int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF -LOGICAL LOG, SHMEM_PE_ACCESSIBLE -INTEGER pe -LOG = SHMEM_PE_ACCESSIBLE(pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\desB{ -\argRow{IN}{pe}{Specific \ac{PE} to be checked for accessibility from the local \ac{PE}.} -} -{ - \FUNC{shmem\_pe\_accessible} is a query routine that indicates whether a - specified \ac{PE} is accessible via \openshmem from the local \ac{PE}. The \FUNC{shmem\_pe\_accessible} routine returns \CONST{TRUE} only if the remote \ac{PE} is a process running from the same executable file as the local \ac{PE}, indicating that full \openshmem support for symmetric data objects (that reside in the static memory and symmetric heap) is available, otherwise it returns \CONST{FALSE}. This routine may be particularly useful for hybrid programming with other communication libraries (such as a \ac{MPI}) or parallel languages. For example, on SGI Altix series systems, \openshmem is supported across multiple partitioned hosts and InfiniBand connected hosts. When running multiple executable MPI programs using \openshmem on an Altix, full \openshmem support is available between processes running from the same executable file. However, \openshmem support between processes of different executable files is supported only for data objects on the symmetric heap, since static data objects are not symmetric between different executable files. -% The \FUNC{shmem\_pe\_accessible} function on Altix returns -% TRUE only if the remote \ac{PE} is a process running from the same -% executable file as the local \ac{PE}, indicating that full \openshmem support -% (static memory and symmetric heap) is available. -} -{ -\desR{\Clang: The return value is 1 if the specified \ac{PE} is a valid remote - \ac{PE} for \openshmem routines; otherwise, it is 0. \\ \\ - \Fortran: The return value is \CONST{.TRUE.} if the specified \ac{PE} is a valid - remote \ac{PE} for \openshmem routines; otherwise, it is \CONST{.FALSE.}. - } -\notesB{ None. } -} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_ptr.tex b/_deprecated_sources/TEX_FILES/shmem_ptr.tex deleted file mode 100644 index 313c273b8..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_ptr.tex +++ /dev/null @@ -1,45 +0,0 @@ -\bAPI{SHMEM\_PTR}{Returns a pointer to a data object on a specified - \ac{PE}.} -\synC -void *shmem_ptr(void *dest, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF -POINTER (PTR, POINTEE) -INTEGER pe -PTR = SHMEM_PTR(dest, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\desB{ -\argRow{IN}{dest}{The symmetric data object to be referenced.} -\argRow{IN}{pe}{An integer that indicates the \ac{PE} number on which \dest{} is to - be accessed. If you are using \Fortran, it must be a default - integer value.} -} -{ - \FUNC{shmem\_ptr} returns an address that may be used to directly reference - \dest{} on the specified \ac{PE}. This address can be assigned to a pointer. - After that, ordinary loads and stores to this remote address may be performed. - - When a sequence of loads (gets) and stores (puts) to a data object on a - remote \ac{PE} does not match the access pattern provided in an \openshmem data - transfer routine like \FUNC{shmem\_put32} or \FUNC{shmem\_real\_iget}, the - \FUNC{shmem\_ptr} routine can provide an efficient means to accomplish the - communication. -} -{ - \desR{ - The return value is a non-NULL address of the \dest{} data object when it is - accessible using memory loads and stores in addition to \openshmem{} operations. - Otherwise, a NULL address is returned. -} -\notesB{ - When calling \FUNC{shmem\_ptr}, \dest{} is the address of - the referenced symmetric data object on the calling \ac{PE}. - } -} - -\exampleB{ - \exampleITEM{This \Fortran{} program calls \FUNC{shmem\_ptr} and then \ac{PE} 0 writes to the \VAR{BIGD} - array on \ac{PE} 1:}{./EXAMPLES/shmem_ptr_example.f90}{} - \exampleITEM{This is the equivalent program written in \Clang:} - {./EXAMPLES/shmem_ptr_example.c}}{} - -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_put.tex b/_deprecated_sources/TEX_FILES/shmem_put.tex deleted file mode 100755 index 8341c63c9..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_put.tex +++ /dev/null @@ -1,87 +0,0 @@ -\bAPI{SHMEM\_PUT}{The put routines provide a method for copying data from a contiguous local data object to a data object on a specified \ac{PE}.} -\synC %Synopisis for C API - -void shmem_double_put(double *dest, const double *source, size_t nelems, int pe); -void shmem_float_put(float *dest, const float *source, size_t nelems, int pe); -void shmem_int_put(int *dest, const int *source, size_t nelems, int pe); -void shmem_long_put(long *dest, const long *source, size_t nelems, int pe); -void shmem_longdouble_put(long double *dest, const long double *source, size_t nelems, int pe); -void shmem_longlong_put(long long *dest, const long long *source, size_t nelems, int pe); -void shmem_put32(void *dest, const void *source, size_t nelems, int pe); -void shmem_put64(void *dest, const void *source, size_t nelems, int pe); -void shmem_put128(void *dest, const void *source, size_t nelems, int pe); -void shmem_putmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_short_put(short*dest, const short*source, size_t nelems, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_CHARACTER_PUT(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_PUT(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_PUT(dest, source, nelems, pe) -CALL SHMEM_INTEGER_PUT(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_PUT(dest, source, nelems, pe) -CALL SHMEM_PUT4(dest, source, nelems, pe) -CALL SHMEM_PUT8(dest, source, nelems, pe) -CALL SHMEM_PUT32(dest, source, nelems, pe) -CALL SHMEM_PUT64(dest, source, nelems, pe) -CALL SHMEM_PUT128(dest, source, nelems, pe) -CALL SHMEM_PUTMEM(dest, source, nelems, pe) -CALL SHMEM_REAL_PUT(dest, source, nelems, pe) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} - \argRow{OUT}{source}{Data object containing the data to be copied.} - \argRow{IN}{nelems}{Number of elements in the \VAR{dest} and \VAR{source} - arrays. \VAR{nelems} must be of type \VAR{size\_t} for \Clang. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} - \argRow{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. If you are using \Fortran, it must be a constant, variable, or array element of default integer type.} - } - %API description - { The routines return after the data has been copied out of the \source{} - array on the local \ac{PE}. - The delivery of data words into the data object on the destination \ac{PE} - may occur in any order. Furthermore, two successive put routines - may deliver data out of order unless a call to \FUNC{shmem\_fence} is - introduced between the two calls. - } - %API Description Table. -{ - % If there is no Description Table and return, this field can be - \hfill \\ - \desTB { - The \dest{} and \source{} data objects must conform to certain typing - constraints, which are as follows: } - { - \cRow{shmem\_putmem}{ \Fortran: Any noncharacter type. \Clang: Any - data type. \VAR{nelems} is scaled in bytes.} - \cRow{shmem\_put4, shmem\_put32}{Any noncharacter type that has a storage size equal to \CONST{32} bits. } - \cRow{shmem\_put8, shmem\_put64}{Any noncharacter type that has a storage size equal to \CONST{64} bits. } - \cRow{shmem\_put128}{Any noncharacter type that has a storage size equal to \CONST{128} bits. } - \cRow{shmem\_double\_put}{Elements of type double.} - \cRow{shmem\_longdouble\_put}{Elements of type long double.} - \cRow{SHMEM\_CHARACTER\_PUT}{Elements of type character. \VAR{nelems} is the number of characters to transfer. The actual character lengths of the \source{} and \dest{} variables are ignored. } - \cRow{SHMEM\_COMPLEX\_PUT}{Elements of type complex of default size.} - \cRow{SHMEM\_DOUBLE\_PUT}{Elements of type double precision. } - \cRow{SHMEM\_INTEGER\_PUT}{Elements of type integer.} - \cRow{SHMEM\_LOGICAL\_PUT}{Elements of type logical.} - \cRow{SHMEM\_REAL\_PUT}{Elements of type real.} - } - %Return Values -\desR{None.} -% Notes. If there are no notes, this field can be left empty. -\notesB{ If you are using \Fortran, data types must be of default size. For - example, a real variable must be declared as \CONST{REAL}, \CONST{REAL*4}, or - \CONST{REAL(KIND=KIND(1.0))}. The Fortran API routine \FUNC{SHMEM\_PUT} has - been deprecated, and either \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} should be used - in its place. -} -}%end of DesB -%Example -\exampleB{ -%For each example, you can enter it as an item. - \exampleITEM - { The following \FUNC{shmem\_put} example is for \CorCpp{} programs:} - {./EXAMPLES/shmem_put_example.c} - {} - } -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_quiet.tex b/_deprecated_sources/TEX_FILES/shmem_quiet.tex deleted file mode 100644 index 2483766d0..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_quiet.tex +++ /dev/null @@ -1,45 +0,0 @@ -\bAPI{SHMEM\_QUIET}{Waits for completion of all outstanding \PUT{}, \acp{AMO} and memory store routines to symmetric data objects issued by a \ac{PE}.} -\synC %Synopisis for C API - -void shmem_quiet(void); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_QUIET %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{None.}{}{} -} -%API description - { - The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \acp{AMO}, and memory store routines on symmetric data objects issued by the calling \ac{PE}. All \PUT{}, \acp{AMO}, memory store routines to symmetric data objects are guaranteed to be completed and visible to all \ac{PE}s when \FUNC{shmem\_quiet} returns. - %This also applies to all store operations to symmetric data issued by the calling \ac{PE}. - %SP: Removing confusing parts as according to SGI they are complete at the end of quiet. - %no later than any subsequent memory load or - %store, \PUT{} or \GET{}, \acp{AMO}, or synchronization operations that follow the call to \FUNC{shmem\_quiet}. -} - %API Description Table. -{ - %Return Values -\desR{None.} -% Notes. If there are no notes, this field can be left empty. -\notesB{ - \FUNC{shmem\_quiet} is most useful as a way of ensuring completion of - several \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects initiated by the calling \ac{PE}. For example, you might use \FUNC{shmem\_quiet} to await delivery of a block of data before issuing another \PUT{}, which sets a completion flag on another \ac{PE}. - - \FUNC{shmem\_quiet} is not usually needed if \FUNC{shmem\_barrier\_all} or - \FUNC{shmem\_barrier} are called. The barrier routines wait for the - completion of outstanding writes (\PUT{}, \ac{AMO}, memory stores) to symmetric data objects on all \acp{PE}. -} -} -%Example -\exampleB{ -%For each example, you can enter it as an item. - \exampleITEM - {The following example uses \FUNC{shmem\_quiet} in a \CorCpp{} program: } - {./EXAMPLES/shmem_quiet_example.c} - {\VAR{Put1} and \VAR{put2} will be completed and visible before \VAR{put3} and \VAR{put4}.} -} -\eAPI - diff --git a/_deprecated_sources/TEX_FILES/shmem_reductions.tex b/_deprecated_sources/TEX_FILES/shmem_reductions.tex deleted file mode 100644 index 604178158..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_reductions.tex +++ /dev/null @@ -1,302 +0,0 @@ -\bAPI{SHMEM\_REDUCTIONS}{Performs arithmetic and logical operations across a set of \ac{PE}s.} - -\textbf{AND} \newline -Performs a bitwise AND function across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_int_and_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_and_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_and_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_and_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_and_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_AND_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_AND_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{MAX} \newline -Performs a maximum function reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_double_max_to_all(double *dest, double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_max_to_all(float *dest, float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_max_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_max_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_max_to_all(long double *dest, long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_max_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_max_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{MIN} \newline -Performs a minimum function reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_double_min_to_all(double *dest, double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_min_to_all(float *dest, float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_min_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_min_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_min_to_all(long double *dest, long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_min_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_min_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{SUM} \newline -Performs a sum reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_complexd_sum_to_all(double complex *dest, double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long *pSync); -void shmem_complexf_sum_to_all(float complex *dest, float complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); -void shmem_double_sum_to_all(double *dest, double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_sum_to_all(float *dest, float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_sum_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_sum_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride,int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_sum_to_all(long double *dest, long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_sum_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_sum_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_COMP4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_COMP8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{PROD} \newline -Performs a product reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_complexd_prod_to_all(double complex *dest, double complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double complex *pWrk, long *pSync); -void shmem_complexf_prod_to_all(float complex *dest, float complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float complex *pWrk, long *pSync); -void shmem_double_prod_to_all(double *dest, double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_prod_to_all(float *dest, float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_int_prod_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_prod_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_prod_to_all(long double *dest, long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_prod_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_prod_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_COMP4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_COMP8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{OR} \newline -Performs a bitwise OR function reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_int_or_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_or_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_or_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_or_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\bigskip -\textbf{XOR}\newline -Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\ac{PE}s).\newline -\synC %Synopisis for C API - -void shmem_int_xor_to_all(int *dest, int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_xor_to_all(long *dest, long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_xor_to_all(long long *dest, long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); -void shmem_short_xor_to_all(short *dest, short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_XOR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_XOR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{dest}{A symmetric array, of length \VAR{nreduce} elements, to receive the result of the reduction routines. The data type of \dest{} varies with the version of the reduction routine being called. When calling from \CorCpp, refer to the SYNOPSIS section for data type information.} - \argRow{IN}{source}{ A symmetric array, of length \VAR{nreduce} elements, that contains one element for each separate reduction routine. The \source{} argument must have the same data type as \dest.} - \argRow{IN}{\VAR{nreduce}}{The number of elements in the \dest{} and \source{} arrays. \VAR{nreduce} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset{} of \ac{PE}s. \VAR{PE\_start} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{logPE\_stride}{The log (base 2) of the stride between consecutive \ac{PE} numbers in the \activeset. \VAR{logPE\_stride} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{PE\_size}{The number of \ac{PE}s in the \activeset. \VAR{PE\_size} must be of type integer. If you are using \Fortran, it must be a default integer value.} - \argRow{IN}{pWrk}{A symmetric work array. The \VAR{pWrk} argument must have the same data type as \dest. In \CorCpp, this contains max(\VAR{nreduce}/2 + 1, \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}) elements. In \Fortran, this contains max(\VAR{nreduce}/2 + 1, \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}) elements.} - \argRow{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be of type long and size \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE}. In \Fortran, \VAR{pSync} must be of type integer and size \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}. If you are using \Fortran, it must be a default integer value. Every element of this array must be initialized with the value \CONST{\_SHMEM\_SYNC\_VALUE} (in \CorCpp) or \CONST{SHMEM\_SYNC\_VALUE} (in \Fortran) before any of the \ac{PE}s in the \activeset{} enter the reduction routine.} - } - %API description - { - \openshmem reduction routines compute one or more - reductions across symmetric arrays on multiple \acp{PE}. A - reduction performs an associative binary routine across a set of - values. - - The \VAR{nreduce} argument determines the number of separate reductions to - perform. The \source{} array on all \ac{PE}s in the \activeset{} provides one - element for each reduction. The results of the reductions are placed - in the \dest{} array on all \ac{PE}s in the \activeset. The \activeset{} is - defined by the \VAR{PE\_start}, \VAR{logPE\_stride}, \VAR{PE\_size} triplet. - - The \source{} and \dest{} arrays may be the same array, but they may not be - overlapping arrays. - - As with all \openshmem{} collective routines, each of these routines assumes - that only \ac{PE}s in the \activeset{} call the routine. If a \ac{PE} not in the - \activeset{} calls an \openshmem collective routine, undefined behavior - results. - -The values of arguments \VAR{nreduce}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \ac{PE}s in the \activeset. The same \dest{} and \source{} arrays, and the same \VAR{pWrk} and \VAR{pSync} work arrays, must be passed to all \ac{PE}s in the \activeset. - - Before any \ac{PE} calls a reduction routine, you must ensure that the - following conditions exist (synchronization via a \OPR{barrier} or some other - method is often needed to ensure this): The \VAR{pWrk} and \VAR{pSync} arrays on - all \ac{PE}s in the \activeset{} are not still in use from a prior call to a - collective \openshmem{} routine. The \dest{} array on all \ac{PE}s in the \activeset{} - is ready to accept the results of the \OPR{reduction}. - - Upon return from a reduction routine, the following are true for the - local \ac{PE}: The \dest{} array is updated. The values in the \VAR{pSync} array - are restored to the original values. -} -{ -{ -\hfill \\ - \desTBC{ When calling from \Fortran, the \dest{} date types are as follows:} - {Routine}{Data Type}{ - \cRow{shmem\_int8\_and\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_\_int4\_and\_to\_all}{Integer, with an element size of 4 bytes.} - \cRow{shmem\_comp8\_max\_to\_all}{Complex, with an element size equal to two 8-byte real values.} - \cRow{shmem\_int4\_max\_to\_all}{Integer, with an element size of 4 bytes.} - \cRow{shmem\_int8\_max\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_real4\_max\_to\_all}{Real, with an element size of 4 bytes.} - \cRow{shmem\_real16\_max\_to\_all}{Real, with an element size of 16 bytes.} - \cRow{shmem\_int4\_min\_to\_all}{Integer, with an element size of 4 bytes.} - \cRow{shmem\_int8\_min\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_real4\_min\_to\_all}{Real, with an element size of 4 bytes.} - \cRow{shmem\_real8\_min\_to\_all}{Real, with an element size of 8 bytes.} - \cRow{shmem\_real16\_min\_to\_all}{Real,with an element size of 16 bytes.} - \cRow{shmem\_comp4\_sum\_to\_all}{Complex, with an element size equal to two 4-byte real values.} - \cRow{shmem\_comp8\_sum\_to\_all}{Complex, with an element size equal to two 8-byte real values.} - \cRow{shmem\_int4\_sum\_to\_all}{Integer, with an element size of 4 bytes.} - \cRow{shmem\_int8\_sum\_to\_all}{Integer, with an element size of 8 bytes..} - \cRow{shmem\_real4\_sum\_to\_all}{Real, with an element size of 4 bytes.} - \cRow{shmem\_real8\_sum\_to\_all}{Real, with an element size of 8 bytes.} - \cRow{shmem\_real16\_sum\_to\_all}{Real, with an element size of 16 bytes.} - \cRow{shmem\_comp4\_prod\_to\_all}{ Complex, with an element size equal to two 4-byte real values. } - \cRow{shmem\_comp8\_prod\_to\_all}{ Complex, with an element size equal to two 8-byte real values.} - \cRow{shmem\_int4\_prod\_to\_all}{Integer, with an element size of 4 bytes.} - \cRow{shmem\_int8\_prod\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_real4\_prod\_to\_all}{Real, with an element size of 4 bytes.} - \cRow{shmem\_real8\_prod\_to\_all}{Real, with an element size of 8 bytes.} - \cRow{shmem\_real16\_prod\_to\_all}{Real, with an element size of 16 bytes.} - \cRow{shmem\_int8\_or\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_int4\_or\_to\_all}{Integer, with an element size of 4 bytes.} -% \cRow{shmem\_comp8\_xor\_to\_all}{Complex, with an element size equal to two 8-byte real values.} -% \cRow{shmem\_comp4\_xor\_to\_all}{Complex, with an element size equal to two 4-byte real values.} - \cRow{shmem\_int8\_xor\_to\_all}{Integer, with an element size of 8 bytes.} - \cRow{shmem\_int4\_xor\_to\_all}{Integer, with an element size of 4 bytes.} -% \cRow{shmem\_real8\_xor\_to\_all}{Real, with an element size of 8 bytes.} -% \cRow{shmem\_real4\_xor\_to\_all}{Real, with an element size of 4 bytes.} - } -}%end of DesB -{%Return Values -\desR{None.} -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ - All \openshmem{} reduction routines reset the values in \VAR{pSync} before they - return, so a particular \VAR{pSync} buffer need only be initialized the first - time it is used. - - You must ensure that the \VAR{pSync} array is not being updated on any \ac{PE} in - the \activeset{} while any of the \ac{PE}s participate in processing of an - \openshmem{} reduction routine. Be careful to avoid the following situations: - If the \VAR{pSync} array is initialized at run time, some type of synchronization is needed to - ensure that all \ac{PE}s in the working set have initialized \VAR{pSync} before any of - them enter an \openshmem routine called - with the \VAR{pSync} synchronization array. A \VAR{pSync} or \VAR{pWrk} array can be - reused in a subsequent reduction routine call only if none of the \ac{PE}s - in the \activeset{} are still processing a prior reduction routine call - that used the same \VAR{pSync} or \VAR{pWrk} arrays. In general, this can be - assured only by doing some type of synchronization. -% However, in the -% special case of reduction routines being called with the same \activeset, -% you can allocate two \VAR{pSync} and \VAR{pWrk} arrays and alternate between -% them on successive calls. -} -} -%Example -\exampleB{ -%For each example, you can enter it as an item. - \exampleITEMF - { This \Fortran{} reduction example statically initializes the \VAR{pSync} array and finds the logical \OPR{AND} of the integer variable \VAR{FOO} across all even \ac{PE}s.} - {./EXAMPLES/shmem_and_example.f90} - {} - \exampleITEMF - {This \Fortran{} example statically initializes the \VAR{pSync} array - and finds the \OPR{maximum} value of real variable \VAR{FOO} across all even \ac{PE}s.} - {./EXAMPLES/shmem_max_example.f90} - {} - \exampleITEMF - { This \Fortran{} example statically initializes the \VAR{pSync} array - and finds the \OPR{minimum} value of real variable \VAR{FOO} across all the even - \ac{PE}s.} - {./EXAMPLES/shmem_min_example.f90} - {} - \exampleITEMF - {This \Fortran{} example statically initializes the \VAR{pSync} array - and finds the \OPR{sum} of the real variable \VAR{FOO} across all even \ac{PE}s.} - {./EXAMPLES/shmem_sum_example.f90} - {} - \exampleITEMF - {This \Fortran{} example statically initializes the \VAR{pSync} array - and finds the \OPR{product} of the real variable \VAR{FOO} across all the even \ac{PE}s.} - {./EXAMPLES/shmem_prod_example.f90} - {} - \exampleITEMF - {This \Fortran{} example statically initializes the \VAR{pSync} array - and finds the logical \OPR{OR} of the integer variable \VAR{FOO} across all even - \ac{PE}s.} - {./EXAMPLES/shmem_or_example.f90} - {} - \exampleITEMF - {This \Fortran{} example statically initializes the \VAR{pSync} array - and computes the exclusive \OPR{XOR} of variable \VAR{FOO} across all even \ac{PE}s.} - {./EXAMPLES/shmem_xor_example.f90} - {} - } -\eAPI - - - diff --git a/_deprecated_sources/TEX_FILES/shmem_swap.tex b/_deprecated_sources/TEX_FILES/shmem_swap.tex deleted file mode 100644 index d1c8977e2..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_swap.tex +++ /dev/null @@ -1,67 +0,0 @@ -\bAPI{SHMEM\_SWAP}{Performs an atomic swap to a remote data object.} -\synC - -double shmem_double_swap(double *dest, double value, int pe); -float shmem_float_swap(float *dest, float value, int pe); -int shmem_int_swap(int *dest, int value, int pe); -long shmem_long_swap(long *dest, long value, int pe); -long long shmem_longlong_swap(long long *dest, long long value, int pe); -long shmem_swap(long *dest, long value, int pe); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -INTEGER SHMEM_SWAP, value, pe -ires = SHMEM_SWAP(dest, value, pe) -INTEGER*4 SHMEM_INT4_SWAP, value_i4, ires_i4 -ires_i4 = SHMEM_INT4_SWAP(dest, value_i4, pe) -INTEGER*8 SHMEM_INT8_SWAP, value_i8, ires_i8 -ires_i8 = SHMEM_INT8_SWAP(dest, value_i8, pe) -REAL*4 SHMEM_REAL4_SWAP, value_r4, res_r4 -res_r4 = SHMEM_REAL4_SWAP(dest, value_r4, pe) -REAL*8 SHMEM_REAL8_SWAP, value_r8, res_r8 -res_r8 = SHMEM_REAL8_SWAP(dest, value_r8, pe)%*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -%ORIGINAL - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{dest}{The remotely accessible integer data object to be updated on - the remote \ac{PE}. If you are using \CorCpp, the type of \dest{} - should match that implied in the SYNOPSIS section.} -\argRow{IN}{value}{The value to be atomically written to the remote \ac{PE}. \VAR{value} is - the same type as \dest.} -\argRow{IN}{pe}{ An integer that indicates the \ac{PE} number on which \dest{} is to - be updated. If you are using \Fortran, it must be a default - integer value.} -} -%API description -{ \FUNC{shmem\_swap} performs an atomic swap operation. It writes \VAR{value} into \dest{} on \ac{PE} and returns the previous - contents of \dest{} as an atomic operation. -} -%API Description Table -{ -\hfill \\ -\desTB {If you are using \Fortran, \VAR{dest} must be of the following type:} -{ -\cRow{SHMEM\_SWAP}{Integer of default kind} -\cRow{SHMEM\_INT4\_SWAP}{\CONST{4}-byte integer} -\cRow{SHMEM\_INT8\_SWAP}{\CONST{8}-byte integer} -\cRow{SHMEM\_REAL4\_SWAP}{\CONST{4}-byte real} -\cRow{SHMEM\_REAL8\_SWAP}{\CONST{8}-byte real} -} - %Return Values -\desR{ - The content that had been at the \dest{} address on the remote \ac{PE} prior - to the swap is returned. -} -%end of DesB% Notes. If there are no notes, this field can be left empty. -\notesB{None.} -} -%Example -\exampleB{ - %For each example, you can enter it as an item. - \exampleITEM - {The example below swap values between odd numbered \acp{PE} and their right (modulo) neighbor and outputs the result of swap.} - {./EXAMPLES/shmem_swap_example.c} -{} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shmem_version.tex b/_deprecated_sources/TEX_FILES/shmem_version.tex deleted file mode 100644 index 3fd42e60d..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_version.tex +++ /dev/null @@ -1,34 +0,0 @@ -\bAPI{SHMEM\_INFO\_GET\_VERSION}{Returns the major and minor version of the library implementation.} -\synC %Synopisis for C API - -void shmem_info_get_version(int *major, int *minor); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -SHMEM_INFO_GET_VERSION(MAJOR, MINOR) -INTEGER MAJOR, MINOR %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{OUT}{major}{The major version of the \openshmem{} standard in use.} - \argRow{OUT}{minor}{The minor version of the \openshmem{} standard in use.} - } -%API description -{ - This routine returns the major and minor version of the \openshmem{} standard in use. - For a given library implementation, the major and minor version returned by these calls is consistent with the compile-time constants, SHMEM\_MAJOR\_VERSION and SHMEM\_MINOR\_VERSION, defined in its shmem.h. - The valid major version value is $1$, and the valid minor version value is $2$. -} -%This newline is required -{ -%API Description Table. -\desR{ - %Return Values - None. -} -% Notes. If there are no notes, this field can be left empty. -\notesB{ None. - } -} -\eAPI - diff --git a/_deprecated_sources/TEX_FILES/shmem_wait.tex b/_deprecated_sources/TEX_FILES/shmem_wait.tex deleted file mode 100644 index d2fcd3e89..000000000 --- a/_deprecated_sources/TEX_FILES/shmem_wait.tex +++ /dev/null @@ -1,127 +0,0 @@ -\bAPI{SHMEM\_WAIT}{Wait for a variable on the local \ac{PE} to change.} -\label{subsec:shmem_wait} -\synC %Synopisis for C API - -void shmem_int_wait(int *ivar, int cmp_value); -void shmem_int_wait_until(int *ivar, int cmp, int cmp_value); -void shmem_long_wait(long *ivar, long cmp_value); -void shmem_long_wait_until(long *ivar, int cmp, long cmp_value); -void shmem_longlong_wait(long long *ivar, long long cmp_value); -void shmem_longlong_wait_until(long long *ivar, int cmp, long long cmp_value); -void shmem_short_wait(short *ivar, short cmp_value); -void shmem_short_wait_until(short *ivar, int cmp, short cmp_value); -void shmem_wait(long *ivar, long cmp_value); -void shmem_wait_until(long *ivar, int cmp, long cmp_value);%*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT -% -%void shmem_int_wait(int *var, int value); -%void shmem_int_wait_until(int *var, int cond, int value); -%void shmem_long_wait(long *var, long value); -%void shmem_long_wait_until(long *var, int cond, long value); -%void shmem_longlong_wait(long long *var, long long value); -%void shmem_longlong_wait_until(long long *var, int cond, long long value); -%void shmem_short_wait(short *var, short value); -%void shmem_short_wait_until(short *var, int cond, short value); -%void shmem_wait(long *ivar, long cmp_value); -%void shmem_wait_until(long *ivar, int cmp, long value); %*\synCE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -\synF %Synopsis for FORTRAN API - -CALL SHMEM_INT4_WAIT(ivar, cmp_value) -CALL SHMEM_INT4_WAIT_UNTIL(ivar, cmp, cmp_value) -CALL SHMEM_INT8_WAIT(ivar, cmp_value) -CALL SHMEM_INT8_WAIT_UNTIL(ivar, cmp, cmp_value) -CALL SHMEM_WAIT(ivar, cmp_value) -CALL SHMEM_WAIT_UNTIL(ivar, cmp, cmp_value) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ -\argRow{OUT}{ivar}{A remotely accessible integer variable that is being updated by - another \ac{PE}. If you are using \CorCpp, the type of \VAR{ivar} should - match that implied in the SYNOPSIS section.} -\argRow{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. \VAR{cmp} - must be of type integer. If you are using \Fortran, it must be - of default kind. If you are using \CorCpp, the type of \VAR{cmp} - should match that implied in the SYNOPSIS section.} -\argRow{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. If you are using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS - section. If you are using \Fortran, cmp\_value must be an - integer of the same size and kind as \VAR{ivar}.} -} -%API description -{ - \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} wait for \VAR{ivar} to be changed by a remote - write or an atomic operation issued by a different \ac{PE}. - These routines can be used for point-to-point direct synchronization. A call to - \VAR{shmem\_wait} does not return until some other \ac{PE} writes a value, - not equal to \VAR{cmp\_value}, into \VAR{ivar} on the waiting \ac{PE}. A call to - \FUNC{shmem\_wait\_until} does not return until some other \ac{PE} changes - \VAR{ivar} to satisfy the condition implied by \VAR{cmp} and \VAR{cmp\_value}. - This mechanism is useful when a \ac{PE} needs to tell another \ac{PE} - that it has completed some action. - The \FUNC{shmem\_wait} routines return when \VAR{ivar} is no longer equal to - \VAR{cmp\_value}. The \FUNC{shmem\_wait\_until} routines return when the compare condition is true. The compare condition is defined by the \VAR{ivar} argument compared - with the \VAR{cmp\_value} using the comparison operator, \VAR{cmp}. - } - %API Description Table. -{ -\hfill \\ - % If there is no Description Table and return, this field can be - \desTBC{ If you are using \Fortran, \VAR{ivar} must be a specific sized integer type according to the routine being called, as follows:} - {Routine}{Type of \VAR{ivar}} - { - %\cRow{Function}{Type of ivar} - \cRow{shmem\_wait, shmem\_wait\_until}{default INTEGER} - \cRow{shmem\_int4\_wait, shmem\_int4\_wait\_until}{INTEGER*4} -\cRow{shmem\_int8\_wait, shmem\_int8\_wait\_until}{INTEGER*8} -} - -\desTBC{ The following \VAR{cmp} values are supported:}{CMP Value}{Comparison} - { -%\cRow{cmp Value}{Comparison} -\CorCpp:\\ -\cRow{\_SHMEM\_CMP\_EQ }{ Equal} -\cRow{\_SHMEM\_CMP\_NE}{Not equal} -\cRow{\_SHMEM\_CMP\_GT}{Greater than} -\cRow{\_SHMEM\_CMP\_LE}{Less than or equal to} -\cRow{\_SHMEM\_CMP\_LT}{Less than} -\cRow{\_SHMEM\_CMP\_GE}{Greater than or equal to} -\\ -\Fortran:\\ -\cRow{SHMEM\_CMP\_EQ }{ Equal} -\cRow{SHMEM\_CMP\_NE}{Not equal} -\cRow{SHMEM\_CMP\_GT}{Greater than} -\cRow{SHMEM\_CMP\_LE}{Less than or equal to} -\cRow{SHMEM\_CMP\_LT}{Less than} -\cRow{SHMEM\_CMP\_GE}{Greater than or equal to} -} -%Return Values -\desR{None.} -%end Description Table. -\notesImp{ - Implementations must ensure that \FUNC{shmem\_wait} and - \FUNC{shmem\_wait\_until} do not return before the update of the memory - indicated by \VAR{ivar} is fully complete. Partial updates to the memory - must not cause \FUNC{shmem\_wait} or \FUNC{shmem\_wait\_until} to return. -} -} -\exampleB{ -%For each example, you can enter it as an item. - \exampleITEMF - { The following call returns when variable ivar is not equal to 100:} -{./EXAMPLES/shmem_wait1_example.f90} - {} - \exampleITEMF - { The following call to \FUNC{SHMEM\_INT8\_WAIT\_UNTIL} is equivalent to the call to \FUNC{SHMEM\_INT8\_WAIT} in example 1:} -{./EXAMPLES/shmem_wait2_example.f90} - {} - \exampleITEMF - {The following \CorCpp{} call waits until the sign bit in ivar - is set by a transfer from a remote PE:} -{./EXAMPLES/shmem_wait3_example.f90} - {} - \exampleITEMF - {The following \Fortran{} example is in the context of a - subroutine:} -{./EXAMPLES/shmem_wait4_example.f90} - {} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shpalloc.tex b/_deprecated_sources/TEX_FILES/shpalloc.tex deleted file mode 100644 index 7152ff3dc..000000000 --- a/_deprecated_sources/TEX_FILES/shpalloc.tex +++ /dev/null @@ -1,55 +0,0 @@ -\bAPI{SHPALLOC}{Allocates a block of memory from the symmetric heap.} -\synF %Synopsis for FORTRAN API - -POINTER (addr, A(1)) -INTEGER length, errcode, abort -CALL SHPALLOC(addr, length, errcode, abort) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{OUT}{addr}{First word address of the allocated block.} - \argRow{IN}{length}{Number of words of memory requested. One word is 32 bits.} - \argRow{OUT}{errcode}{Error code is \CONST{0} if no error was detected; otherwise, it is a negative integer code for the type of error.} - \argRow{IN}{abort}{Abort code; nonzero requests abort on error; \CONST{0} requests - an error code.} -} - %API description - { - \FUNC{SHPALLOC} allocates a block of memory from the program's symmetric heap - that is greater than or equal to the size requested. To maintain symmetric heap - consistency, all \ac{PE}s in an program must call \FUNC{SHPALLOC} with the same value of length; if any \ac{PE}s are missing, the program will hang. - - By using the \Fortran{} \CONST{POINTER} mechanism in the following manner, you can use array \VAR{A} to refer to the block allocated by \FUNC{SHPALLOC}: \CONST{POINTER} (\VAR{addr}, - \VAR{A}()) - } - %API Description Table. -{ -{ - %Return Values -\desR{ } -\cRow{Error Code} {Condition} -\cRow{ \CONST{-1} } {Length is not an integer greater than \CONST{0}} -\cRow{\CONST{-2}} { No more memory is available from the system (checked if the request cannot be satisfied from the available blocks on the symmetric heap).} -}%end of DesR -\notesB{ - The total size of the symmetric heap is determined at job startup. One - may adjust the size of the heap using the \CONST{SMA\_SYMMETRIC\_SIZE} - environment variable (if available). -} - \notesImp{ - The symmetric heap allocation functions always return a pointer to - corresponding symmetric objects across all PEs. The \openshmem{} - specification does not require that the virtual addresses are equal across - all \acp{PE}. Nevertheless, the implementation must avoid costly address - translation operations in the communication path, including order $N$ (where - $N$ is the number of \acp{PE}) memory translation tables. - In order to avoid address translations, the implementation may - re-map the allocated block of memory based on agreed virtual address. - Additionally, some operating systems provide an option to disable - virtual address randomization, which enables predictable allocation - of virtual memory addresses. - } -} -%Example -%\exampleB{} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shpclmove.tex b/_deprecated_sources/TEX_FILES/shpclmove.tex deleted file mode 100644 index a9cddd195..000000000 --- a/_deprecated_sources/TEX_FILES/shpclmove.tex +++ /dev/null @@ -1,42 +0,0 @@ -\bAPI{SHPCLMOVE}{Extends a symmetric heap block or copies the contents of the block into a larger block.} -\synF %Synopsis for FORTRAN API - -POINTER (addr, A(1)) -INTEGER length, status, abort -CALL SHPCLMOVE (addr, length, status, abort) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{INOUT}{addr}{On entry, first word address of the block to change; on - exit, the new address of the block if it was moved.} - \argRow{IN}{length}{Requested new total length in words. One word - is \CONST{32} bits.} - \argRow{OUT}{status}{Status is \CONST{0} if the block was extended in place, \CONST{1} if it - was moved, and a negative integer for the type of error detected.} - \argRow{IN}{abort}{Abort code. Nonzero requests abort on error; \CONST{0} requests - an error code.} -} -%API description - { The \FUNC{SHPCLMOVE} routine either extends a symmetric heap block if the - block is followed by a large enough free block or copies the contents - of the existing block to a larger block and returns a status code - indicating that the block was moved. This routine also can reduce the - size of a block if the new length is less than the old length. All - \ac{PE}s in a program must call \FUNC{SHPCLMOVE} with the - same value of \VAR{addr} to maintain symmetric heap consistency; if any \ac{PE}s - are missing, the program hangs. - } - %API Description Table. -{ - %Return Values -\desR{ -\cRow{Error Code} {Condition} -\cRow{\CONST{-1} } {Length is not an integer greater than \CONST{0}} -\cRow{\CONST{-2}} { No more memory is available from the system (checked if the request cannot be satisfied from the available blocks on the symmetric heap).} -\cRow{\CONST{-3}}{ Address is outside the bounds of the symmetric heap.} -\cRow{\CONST{-4}}{Block is already free.} -\cRow{\CONST{-5}}{Address is not at the beginning of a block.} -}%end of DesB -\notesB{None.} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/shpdeallc.tex b/_deprecated_sources/TEX_FILES/shpdeallc.tex deleted file mode 100644 index 85a15df40..000000000 --- a/_deprecated_sources/TEX_FILES/shpdeallc.tex +++ /dev/null @@ -1,35 +0,0 @@ -\bAPI{SHPDEALLC}{Returns a memory block to the symmetric heap.} -\synF %Synopsis for FORTRAN API - -POINTER (addr, A(1)) -INTEGER errcode, abort -CALL SHPDEALLC(addr, errcode, abort) %*\synFE %DO NOT DELETE. THIS LINE IS NOT A COMMENT - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{IN}{addr}{ First word address of the block to deallocate.} - \argRow{OUT}{errcode}{Error code is 0 if no error was detected; otherwise, it is a negative integer code for the type of error.} - \argRow{IN}{abort}{Abort code. Nonzero requests abort on error; \CONST{0} requests - an error code.} - } -%API description - { - SHPDEALLC returns a block of memory (allocated using \FUNC{SHPALLOC}) to the - list of available space in the symmetric heap. To maintain symmetric - heap consistency, all \ac{PE}s in a program must call - \FUNC{SHPDEALLC} with the same value of \VAR{addr}; if any \ac{PE}s are missing, the program hangs. - } -%API Description Table. -{ - %Return Values -\desR{ -\cRow{Error Code} {Condition} -\cRow{ \CONST{-1} } {Length is not an integer greater than 0} -\cRow{\CONST{-2}} { No more memory is available from the system (checked if the request cannot be satisfied from the available blocks on the symmetric heap).} -\cRow{\CONST{-3}}{ Address is outside the bounds of the symmetric heap.} -\cRow{\CONST{-4}}{Block is already free.} -\cRow{\CONST{-5}}{Address is not at the beginning of a block.} -}%end of DesB -\notesB{None.} -} -\eAPI diff --git a/_deprecated_sources/TEX_FILES/start_pes.tex b/_deprecated_sources/TEX_FILES/start_pes.tex deleted file mode 100644 index d55739661..000000000 --- a/_deprecated_sources/TEX_FILES/start_pes.tex +++ /dev/null @@ -1,47 +0,0 @@ -\bAPI{START\_PES}{ Called at the beginning of an \openshmem program to -initialize the execution environment. (This routine is deprecated and is -provided for backwards compatibility. Implementations must include it, and the -routines should function properly while notifying the user about deprecation -of its use.)} -\synC -void start_pes(int npes); %*\synCE -\synF -CALL START_PES(npes) %*\synFE - -% Arguments table. If no arguments you can use \argRow{None}{}{} -\desB{ - \argRow{npes}{Unused}{ Should be set to \CONST{0}.} -} - %API description - { - The \FUNC{start\_pes} routine initializes the \openshmem execution - environment. An \openshmem program must call - \FUNC{start\_pes} before calling any other \openshmem routine. - } - %API Description Table. -{ - %Return Values -\desR{ None. } -\notesB{ - If any other \openshmem call occurs before \FUNC{start\_pes}, the - behavior is undefined. Although it is recommended to set \VAR{npes} to - \CONST{0} for \FUNC{start\_pes}, this is not mandated. The value is ignored. - Calling \FUNC{start\_pes} more than once has no subsequent - effect. -} -}%end of DesB -% Notes. If there are no notes, this field can be left empty. - \notesB{ - As of \openshmem Specification 1.2 the use of \FUNC{start\_pes} has - been deprecated. Although \openshmem libraries are required to support the - call, program users are encouraged to use \FUNC{shmem\_init} instead. -} -%Example -\exampleB{ -%For each example, you can enter it as an item. -\exampleITEMF - { This is a simple program that calls \FUNC{start\_pes}:} - {./EXAMPLES/shmem_startpes_example.f90} - {} -} -\eAPI diff --git a/_deprecated_sources/coverpage.tex b/_deprecated_sources/coverpage.tex deleted file mode 100644 index 9aabd73dc..000000000 --- a/_deprecated_sources/coverpage.tex +++ /dev/null @@ -1,99 +0,0 @@ -\thispagestyle{empty} -\begin{center} -\textbf{\Huge \openshmem} -\par -\end{center} - -\begin{center} -\textbf{\LARGE Application Programming Interface}\\ -\includegraphics[scale=0.65]{OpenSHMEM_Pound}\\ -\url{http://www.openshmem.org/} -\par -\end{center} - -\begin{center} -Version \insertDocVersion -\par -\end{center} - -\vspace{0.5in} -\begin{center} -\today -\end{center} - -\vspace{0.5in} - -%\begin{center} -%\textbf{{\large The comment period for \textcolor{red}{Version \insertDocVersion{}} ended on \textcolor{red}{January 31, 2012}}} -%\par -%\textbf{{\large The comment period for \textcolor{blue}{Version 1.1} started on \textcolor{blue}{February 1, 2012}}} -%\par -%\end{center} - -\vfill{} - -\section*{Developed by} -\begin{itemize} -\item High Performance Computing Tools group at the University of Houston\\ - \url{http://www.cs.uh.edu/~hpctools/} -\item Extreme Scale Systems Center, Oak Ridge National Laboratory\\ - \url{http://www.csm.ornl.gov/essc/} -\end{itemize} -\pagebreak{} - -\section*{Sponsored by} -\begin{itemize} -\item \ac{DoD}\\ - \url{http://www.defense.gov/ } -\item \ac{ORNL}\\ - \url{http://www.ornl.gov/} -\end{itemize} - -\section*{Authors and Collaborators} -\begin{itemize} -\item Monika ten Bruggencate, Cray Inc. -\item David Knaak, Cray Inc. -\item Jens Manser, \ac{DoD} -\item Nick Park, \ac{DoD} -\item Lauren Smith, \ac{DoD} -\item James Dinan, Intel -\item Jeff Hammond, Intel -\item Jeff Kuehn, \ac{LANL} -\item Swaroop Pophale, Mellanox -\item Eduardo D'Azevedo, \ac{ORNL} -\item Manjunath Gorentla Venkata, \ac{ORNL} -\item Oscar Hernandez, \ac{ORNL} -\item Gregory Koenig, \ac{ORNL} -\item Graham Lopez, \ac{ORNL} -\item Pavel Shamis, \ac{ORNL} -\item Steve Poole, OSSS -\item Karl Feind, SGI -\item Michael Raymond, SGI -\item Barbara Chapman, \ac{UH} -\item Tony Curtis, \ac{UH} -\item Sameer Shende, \ac{UO} -\end{itemize} - -\date{\today} - -\section*{Acknowledgements} -The \openshmem specification belongs to Open Source Software Solutions, Inc. (OSSS), a non-profit organization, under an agreement with SGI. The development work of the specification is supported by the Oak Ridge National Laboratory Extreme Scale Systems Center and the Department of Defense.\\ -\\ -We would also like to acknowledge the contribution of the members of the \openshmem mailing list for their ideas, discussions, suggestions, and constructive criticism which has helped us improve this document. - - -%The following people (listed alphabetically) have contributed ideas, -%criticisms and suggestions on the openshmem mailing list and in other -%fora: -% -%Vikas Aggarwal; Brian W. Barrett; Christian Bell; Max Billingsley -%III; Mark Debbage; Mike Dubman; Dick Foster; Hal Finkel; Roger A. -%Golliver; Jeff Hammond; Alistair Hart; Tsai-yang Jea; Daniel Kidger; -%Rishi Khan; David LaFrance-Linden; John Leidel; Alexander Mikheev; -%Chen Qi; Duncan Roweth; Sameer Shende; Marc Snir; Lawrence Stewart; -%Keith D. Underwood; Brian Wibecan. -% -%Apologies to people who have contributed but who are not acknowledged -%here: it is not intentional. - -{\large \pagebreak{}} diff --git a/_deprecated_sources/diagrams/fence.png b/_deprecated_sources/diagrams/fence.png deleted file mode 100644 index d8e53d5104797aaaffba3742f5f39af7473a4928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138243 zcmeFYQ-ChpvL#%$ZQHhOuEHv>vTfU|w92+^+qP}n?ArI-+h_0pKQH~(5B>P%{Bq`; zF(XEd5s?|DASVtBg#`rw001i~A)*8T0E!I&0F(j&^nIlX%%T+l0IkzZSXe<)SeQV; z-p1I>(g*-R9kN2*NgZ{oRi`d(V$;#Z#YMtJlAS2+5)4uj(VKvlz+a+Rf+AEZ)Hj|e zH=ZaoG@B?p7lVSx4xHD1(ks*Bv(18^`L5Dt^J60QVM0R}p!qUxrT;{I~a>qsN*ze9sH^p+PC|Ll_`m z;uwh?K7g3$KKn{jczkv67cKydR6Y4FJpfY$2Gyr)Qa7OPd}xP$e}ADzJBrAl^)KP* zDIYzgkq-g#uzd&LuXgBn`RATiZ^RtG{N=5TuPJ2(Jro|@E^Kg5G7%8xnyRFk&I#`^Vd930PyH?l;db7_VsH4Jgn!pv`=3C9Ys~}yKPiU z4~CFTl8t~C&_V(DV<5V0;CBIrYal^ikSE6-9S{gmKU;dXS!&}iY)~%3oSGePzRp-J zjqC7hq&+66#~6gYxY)Qv;I}i2EZ}anvaK^PeT=sznp|jrg%8G#_ond%K;K8RXJng? zrbv1a03s~k$~rv7of)6|oJV?7*9j#cu5K6(0D1(VT>&r(0F`XW=uM1dVC-!OEkE$< zpdoy?D8D@d(EI>p0(_JJCIv`3UoKlzE%1wM=zBj8J&?!%%4-}NU(##5@_?&tbPz%H zP>30!aRl;y_%I=+7^Hl-6T!k5)P0B+K|Tcr6j0m{If0^Vp<Z9spiTiz2oitaY~gBR5QI1g(m=FckY52D{?~$mgu4i4p;{u8xnOpnGr`BgkpzVZ z(4kMEup|O;#F#Pb5_b7WO5kQujzaFleX(J~G=`A1U@L*=B5;KG#ON{jG5m@cD74|w zq)|$un7NjUc*P7qh^Vktf=h)Pa=;X$6(fqB=IK&HjfEp}Ri?#E!Rz5)F}QHG{VPSA za<6iWrlpUsFkpfKi9;3pG4yd5Ka*W$*b0H>B2NZn^mGi^s?}+jRZ+@1PW0xJz zf1abBA?Kid<^kOpxGI;biYojf&Ei>koh1YtA{%w1 zYa_HJ{0iGL=Q8ZF@XAyze6`QE-uCqV^%2GH@s9dI{=tu<`#qZ7_P&>>h)n4S>X@>4 zix`WHwBKtn+~IAh9`SGJ(FD=7@>KH7Q_wm*RY+CrHi$O-S6ukyS(saPonoCoy_vj8 zy>&mC--X}#K|nyyL76~SK~+IgKz@Vlfnb9k1%?V?3H=gc6_O8R?3L;T>_zR}BZ5G5 zL)4A6k7ZO0EcP$XG7UNo#L$rWNuypaW~q@*P)UkMyGhYW(L?ZyDwb-7?nW_Aepa$p zz+S>$O-hGK;WT&N!3@jH;N-`N+zCAs5fdKM0h7F8SnX@AWG!xO)`7@D`~KwE#PHl` z+K9>U)7TXS1yvw53uQUgEoCcZrgFM!u5zuysA_9fr0SxooYJMzXGv~0Qi;9x!JpD* zb6@j-(^0}6VVw{B^Tu?CEe-mMFO*V)Arf@h5PyP1+7J-#oMLU z+y_NXDQ>McmA8gIo7qbUR;K#u zdK^~$*89JH*wkB>o2KjWm|Adizyn zp=;W;O>h#k&9FPXdwjIK6X;ayQ0la5yXZjYtYaVRBI)AhE^;j~9{WoTZAoD1GA~|S zQrxCFXXAVWYrRqOFdu6+xGnaL^T`PwH<}smikFo)f=8`mz8$I~v16efxC5eZGT~ z!=rtNgZLfF?c|ZcZNOa?nkmXWsuKDjYA2tSb8AIt8AaK#=FQCR4pK|pDDyM3q6wOm ztTgxJZN>zDoA#k5n@Xkjrf1ZJ)?o`iY9{KRBi1Q)m0GpT()H5YveXi`V(T)*V#*fZ z76h-I3(>X+;iP!Fg{9j0%+ie(98b5L$x`cTotn;0zY4-C#2Ji*X7_=E(Px#7GF;hR z*@X$1iK0qB3&o|)hUNyI4r}|4ui)9=g=z2XQw_6?#tnj2HCAUAofpu!QMkxWkv0!5 zrOu6;iOpUu5p8AdX`S3v;9Gwd>s-h$C&g?`uR{2;I+s4g-?HF2V0bX=ad0{;?4Le) zKRkeiHH2L*%QmjCR53dr1Wp9sLVG3FgkM4`qWAF|qNpMpe^W*|MN&t*$l;_Or_3jx zdz8ODZzAWB6Dx-lk!7y(Wu!Q#=p^5y|8zrpKEJcPKd(9(aX4-%NB==Db+~e9p##-r zsiUBNtTV6e`8@i%aJPh4wbd2oTGtW(nE2dinBvglEoxj~q2lB8o^jV!@RW1q<0YY+ zr^EfEc)T|upPGeN$z4wG1^3ndMEXX3w=}l3-}zvpZaMA)|N40*zDRawydhtZC9L_V zIo1_rWzZz;66nI^BI|tg=>PaAB)OBnRRe&;N8H{4_-v0Eg^UB39ki#*Gm!QC#10G> zO_&U9z#WR-8f+^vOT3k>G0mAwP)>S@fXSa3mLBX&oJ&z1KmX%?9*0H0{?sw##0z5= z!y%a}B~9JBX4Al9@-yX+zjWMMIC&&{M3sNn&+W!-?Hs!u%viS>(Hhbll`#1@-2(5C zY(q$U$J=r!o^T+k-cfz3-O}9fjUd3e@3BtB0J(R-Pg zIxm|Ad<&fq-V>izfK9+20hgfB!Q+9IfmY(vqEaH5B7dR=hEN9B24VZB@O0%x$QenY z3x%IxQAyYmM7#+*2YUF zoMkwaLh$+I)|Q{TKjfu8p^wl(E}rT>mP?mZSst6Gx7=2Q)&9Irm5P{gI>U})*Vf!v zYhU}|_O}Ug65EWr3_poFlWhJoo3`Ro_;o9=wEetM;K6@|9MXb69Cgg^=(^92#h%Eh z!=T9Ic4#;A=e?x7$ZQUhd1lJrq$8_sa;1YIZOOyURM1=THsRQ!huu?J%Vs4hMGZsM zY*Vq5{L5Ecxbnh#{k^{N^W5PnskUlo3x;i(z0({2Q?Uc{Zq75p$Kq{i-+4oBw{jwL zcoWakN09*nwePV=a8n#LhnPWCT@VNJ5_`qr9pZ&xhppy!Za{6oDcb|V1jL0ytIPcs zrlQP`@o^fQavn>f^KhIH&X1P3mZ|IcyT+S`J9y|ws3=HT2>I^LtJvkx=a_z9!>k`w zj#V;QmRVX^@3=v919Amy2WSam3(z5>^H2-StZ^*F4M6o9j+TxO5AhG8u*OUwf2pTwTz7mjmou2w%ZPd&bhW?95&76I4KSp99-vY5?Hof zM~vq$!xpn|B~#2>oLz2TNr2FP5rS3zNkW@J-moD=rbI7!D0#o5TKYi-$OaDvv-rJP zcbs=W@`pyIl+l!vGnG&b!nG5epBgFpiwFE z8fculv*pvY@O){hh>pE{j+T_Vunt3?qbJa>EClOLmXuZDo4U?C?@<~35vV(5twSq1 z(_sg)32qv!C#^4XHeBagNO5^{RFic1DSwc$x|!Iy`8nd3(6iy;C`|Ok8ghXL5=p{O zvyClC=Q>0Ic&Di<%71I?W z+&O-Dj6gY|w8Ek(-96SJULy*+jB%72(Gf{DL{^wI3Uhql50?@T(^k{Alh)%lOfZa) z6tZO9n)6z_T5LNJhecahhpJnm7xiaR(0P#GL6$+$;m_g0;i3^k()kj`5=PSKqv;71 zacwj{qC2U(vIWiua0$)}jl%2;l_k0h#S7(&RCAL{Bh#|;&`VE@woELnO3aBYI}D_$ z)@dF5JQjTVGgd45Dkj=y4ufn%mw{g8!qs_ge=_QFB1RDz)h6@mtzD5;aZmiNMci{b z82Qw7%kc;CaebjgK>V^dwliWn7-Tq%KrHfYpUj6!TNf*)bc-B_8M`MKp<%VxG#R z<5u%NSzicmymO%nDa%x)UwUtsXzy2{c3H`uEa59AEMfeTdRRy-+&ql6h}JZ&oZ3w8 z;GE;yc+B^zH8@|)n*?tPX$5P0^LV|ye}a4X{nUk_j=kO@&e(6KtFM0HcM^Ih+$BCF zCLehal_V1{o9UtTxqtp+WG?sQJtf^FrH(wSXp*!uG%MN-vksvv`Sx`FY?i%2ntcn7 zCc0|8s?(?G1+YWxF81!vbL*hV8vQR_=+2GhhdfZ^XBeVdMO#t0pP;c zeZ#!*L{vBnks89%*?rR&$J&vAg#gU(CTe!eh&bSMKu^Ar(KIQRcvXH?ghR0*aZ^b5 zkQE}{`jnutyCeg6MnDH}DoCuUTp__>he#DX7YG^58|1GnV8+1~kz$cH$x111DOWWh zwX=1PH9^%5HS+f9`#<)z4ycaU_WWGAT>D-~p82lXAp;?)AO(fsgQP{JzpdGM2cdA&)yft*8vbCqj=Gt1?Kzt%IpSJrR; zFmrF_;$e-`MR$Uy##87oU+JKL7YIl6^iu{=5k^C%wJ?LX` z!|@?Z-4MeWNC)txucyB3ffegPaThN&dHdSC&yg(@c%% z$5McelPcKeSrxB_%X@8WZ1YI{LgU`G$Cto+BR{PkFpvP6DIjz+5)$AN%BUc8Gd$Xk zJ0LI#^iKgo1wKbycPK03XM_;Mno#Lb$bL8_m=phTQ8!>5b{3o9sED|L{-EL2(ys&k)1MzGQY>s#?xrf)oGUj)?l6a;qao+(~Y#?*6-K< z@U*m(dAfFjzjFdD`j>xaVr!_Pu;qyGFv0=j0Zo!w(u{nPe8pJ@Cac;Y`(L-JP*CBP zQl8f_FQA^8|Cs1iS*-y~ko1&&L1BR0=|MMk@)!ay1xV%4nIifLOAz89 zjD))PljvhphSm#a3N#X_DW+3^{~$Dnk@aH}N6#%{#KF)Vho$j7qf%L>w}m~x!HG@& z!@7I(4DgQ80`%erlxZ7TE#ycR)wl3lusL%^zCfH+$V#|F09gjwG~!s~1ngwvxCwI< zBLTxCc{iCeB}Bbfol{+WMQIszWr?%W_SFv3p4Lux+ive*-)lr|;)<4luo`lxYM_^o zC`9B$WT`*6zl=nmgf>4gpK$rJ$#7~EH;J4QgL0J0j#{}a`$waS58kS(xVeJ4z4?eK z_Gxn;Ub)a$R1Y?>e~o`wn;9EU&t&SAy8X`+^|zjzGpjZgaAR@hq8~?VbX(d+(ZMaO zv8ue!JR9v)?YhtQ&u-7`AfB+ZFq6=ylwE1%oO9E8ISZ;0E#7@+PA{M}dOf&9WlVrkv0{}&M@&kk_gHjbZ||_L zpnOSPaLP#wU3_`G)J$laYX!bke=32!-Wb^Q@aTFHTuj= zqVP#+OTJ(A8S(t7kNRc(($^84v{cs_=`CvvDV}h*i;U4&a)jyDu_+T zKY4ZGg$e+m3DGUrv$2#ZClF-E?~2rwff43DGVx*1LWU#n&naG@(B7>_5t6J zV9=gUzjXruAOIjKBKX4<@H_)rKv{h8xrj}o`gb^1nJIC2v#BWKeDJF0&)@JG@wr5N zXh{p+n#H`D(cTGzwT>e8c{?=luJj+0@^2UP7^! z2mE^#{~iUPHGhZw=Mw*W@EGcQ&Nd;~v;R0M5P{_b{QukCU$?dj0nnaSD)e#v$I-vG z_n!^(|F-v^&gcJ~-hXtz|I3~8x)_0>m}+jRJQw7wryWZ zc@?!wB|$W8u{>0xrbOc?d^bl%VjGdnjImJDS}9RvZ1owh7B1q$nYdP3ml%JHK?9|%Md z6ZVqnbmxP)z*=4n5RT}?)?(VfBT#pqWVh{2h)}io5*aOGttxW}x%%VMenm^&7;~5E z5EL&ajhCBM!HQwkE7{HZuJ_K#bG1mPkH9&_e^WMr?c(pdEsC}Ji*{WG;l_3%schuco*vL{s6P8H3$dpQ1=F< zp6+I}Y-tf+8Wc^!qrW-Y8pE7wq`Zqz$4|4yQ{BA4r=zMwY0-ce0P2Z1Lz$bI2`bj)1mSA&m2{(@OPRrF?%eVKxa^8c5R;IG z-wL<)J`DBY$BXcT;B@c>n8FCi-T!|3%}eWOoZ}JistWSs;$QUsr34Y zW2(6jY2@*gw<*?$4XzpVVM6{d!gV|b7Bu?w=IL2#Lc+8tLt136r1f=jv2TyD706Bs z;29VC`>10AJ!WhX$-s+ zLYo{|2!oJN8+(*s!QHg)0K?oY3{B}YD>Q zy~opaw(UxfFKcLT^Ovq?j4%S~6BbLqQvm3x^4eI*zK=GUKkv3@*L1$D?UwKQ^t!4& zwj_h!x67pn41HNn3^4frJ68WIrE&vSQt)`&xV8)CSr_wb>Nq=UdP;FpM#8L@E0FrD zc;Y6;=z9BkWn=xgV8?(_w^bJd#(}El0^y89AH+791#TZio|TY3$-z*xzJ{eiib1n= z5Q`u0yzcu_B9|{58gZ=x9B2PEe(zhYIJjU}w=ju!aa`9hvD}OMG~g^|VU~s!AGv=h zUiy(_WuXH$WlWvkM8*pIi+fQ1`!LEOvqi0Bf%pEA?|J`xL)OOij+51h5VI9H)YxeC;z;P4^j`M-$oaRcEZtqiOd`!BgE=@?fHsmgAZ_{sO)E%D|% z13ImB^QFC7S{{NE&#-?SK1#DsWOdw(?5UKQP6ouTud|EA2t*V3PANWx&V@?-OYZ8IM_h-)dVJl(^VjdE?=#Iy+8VkEEjQyod?l*9HcTE5VXD z{dTiR>@Syoz2zTwZ^#pC&0H$zZ1%3(PFNqkAC?tum~JSwUrPPGU37lp9e|g;uf2q6 zK?JBq;%hNq>8h$g_I(Eb&J`XqzGq)OJrh9=yY`Eshvju<9u6~Kej$vx3w>0M5tHpn zX~%1(V6tac@SL)@M4#>CMYg|G-_OfkmC^lGe4s+mWi419V&;q)j9k)L5^6shPnz;N ztrvwwrFF9*^D!sdcf;9=K!>crRB zCgi;Y5SEem=4J1!lu#yt7nqE@^J@gX6v*~!8kmz=tQNlz%_DQ`u9C`_G}e0moM@)) zaqV|YH6$c7TI~d-bcFm_hYphR zUIv12!@D{x<_?LZGzWw;t{^127pp2-Qc1f`T&f;sAW=CA`geaHmQFH#7Xa z)&f#AAwBI+D&q#*%~W7X2Iy~Ij{J=-vLx5o|D@DP{t*Wf*=fkfPvhb2?Ilmu&O4A-0xU&qiajtS*VmBS zSPy;t;1vIf?K_GC9iO#vXR^j){&N-o4)7HQfo2rngJuSzToE zd!tMmBZXy?Y4{xcRjH$8CEPeoj3@o16$>|Q;i`un{D$L!W<7Prpz_GF_o$T;HZ1EZ z0qU5Lj?h4+iY^gzfkH(8-T?q)GXY=|^#apM3AHsHMJjPD$9}jBWm|61t$QTQ#AYlm z+i0I+kKEBoDRWUrqL4)QYX+$Jqmc+Gf|0e*eB-Pfdmw6zfD5tjRoIite&%;|4+8QKysbx^@yxqI= zUTA{Ux9b?uh#(+36uo*=9NNtCFFyJwb=VsWCQcfj<*hNTr5e|M1zLV*gZZi<%+Hsm z`i{%ErMv(y$KMH{;P7g!^|7BHgJ5zQv=1S0^9|wpKUwP^Kf-`S@lOH)t>s-G@rU!Y z=kyd%k32so;AJ(UKYL5=`Udzc=~y;-Brxvh|3Q(A_l=^`_$F~afO0M14@Dw)2#MA; z75L2?&m)vi)yb@=g102Hj}W_`6rb81!m<7q^x5D@3i*@C4VCMvHNKIx0XaaGVzFFI z9AOB6gi_DzK5{oQvV}Ib=}tQ;+^AtacxgaG)(Ua;afP<{#=j)vYRg;}-_13f7%V1vP#wgk|phSACO;gBcFu>kUx}S$f_bGbpE@E~@!_(J)HhrS)=is*R4s@TN1Cwb%n?=7!}zUNvzLhesSsqpFzMG}>vFDjdD^XbNGHhfj;(4$A6 zACbY&Lzz??El_X+=P|mW(1vY$v#{H(?I7lIA>RyBZeiW=@wpU0DYMhl!HyVb&#e!f zFz%ZtYMF9XspA9P8Xsgey6_yLXO?q79o7q$#Gs>JXw=x!Ek83t=bOqgKVRpOBY$HX zd6xG4-+_oXvb%J{tcOpp&`xybY{`Fs@(svRlno-6sdl&T!wbY(g{c~zbR=sKtS_8$ zXpEo72pnTJXe)CDqCcX$n`WF7P?btOPS-0HXz-$T#hdF$C9(p%TpOSEVc(X=iv$sx z;Hp(ezWJNinNK`opP!8EX;~DCYI?UX7c<&==2P#3KcUcIh~Aa^-}YNq@8mh}(;(jx zrqOF9*5MldIq=Fel!nZ$|SERZ}zRrS)+-!Fn zvMclo@awyK1jcTrzsqMgNnX-BHVS-Vpj$d!k>5x;*LnrHPgFMtaNzks=3fIgRp#T< z7fZ{)x|%w&Z}u;4Udjd?gfls4c$+_m%WShXvxHlot0!hDzIfKF1^+88fM@>r0r@u! z=Z)=ls`e(2DvUm1>Txg!Q6K6*M;(7t+dTJ+Fgcm)t!14v9!G%!4(d%|4y-a1oIEJQ z+T~7Xo!L#xiXotFinsW{`XzfR|jJ)IQJnxCAM>r zt6RArri}yv|Cvh##6iGdjJ0AJMPW+EDym;cHNsemCNMe{)!`{e{4sVIa*cH04j8GM z@y#5Tg#D?1YsuQPpVKQtWpRK|my~(41Ix_7l}$IU{9a%I+aXI{z5r&w2M!{tJr?*i zbK~{1wzvGYx4aqD481XEjn8hqGgnsb;{f}RrEE$$;MI{LbAzk;)~gdibyHG6Vtkae z6B&3UteL}|e}_)Uclphkivo3^$i}sUlaxvOP6jLwSY81(|7$FxR(d_r9?N-47j{_JjZ)mbV1qqyN0- z^_0Wnx7_~?$5Okld|M zz-*a?H1;p@no1T2D&S0~^pu+12I`a`r-s zA$ofwfY^cp)HvTJq7~5jwI6m+3%1BI7xpih2~m49++_?FFRAn9tZg$tw}8Y-^yU#X zZ$Ok!0@i<4jc*iW*Os8P5$Ob=8jg%9>!q>69%$|=MOYB#R!&N1XZ8taJ{@edxPo2C z9w)9hPx1g&l+j3iAlIF}1y9xoV599q0@oXGgeL2 zYJLU>$N^oYpbLJc=g;dG>Izrz@J2mi->gGueq_uKS&~e9L9XBYF1joul8XAbSO6rM zHh`e0GnNNIj)z4QM+!J`RE4*3CVSwTGp{J(uo90vPN>H?QMbJq02|?6%P$N`&C;%p zw**X!eSdm4`5nStoI4Y+u&!^N{wT(rJjo-@PflvY{V59+_X4!g^E$Zj5+ z>~fU$%JL}enj7t0m04{nYd~M4^+eno!j5scF+3jBIkzjI`=K*>2mDGFVM2aePg-8@;iGXap_~mtO|DN`vt| z@FdgBklSy?9*1tC6@LSP={|@bg;QCLha3W2L37s+|r?Ib^gq$Nc)E5f1sEXwkaW09qO(U8ii8;q&!VDSij}P_*UvglKP= z+Abxf2c)ppyC+1iGEHJBSuW2=n9uL$3_g4%iTK03_fF6^7}Gxe^Dl_{_z_L?XLC7< ziI=Nh^*g1Dd0kiIqB}%lma;~#5@!DU6_NarrTovbxI1tecWYbHvKc~7Hb@YvT(L!%d0$a4>RkbR4k|6o%FG*(V~@2cvMR5P)N*Ni<6gAb48 z7GbBDZ*nwU27VS?`ZpR00C~>m7{-__l!+o%s0ADx?5A;WnFX zIe~Be)A@#Me^*DcwKXuQzi&;z>v|_e;&&&e+X!O2(k6)$l>*}LRH=Xg{(-HtC5q?Xjv2-XD zkiX5#8|y2m+-5PCirS?at6Omr_R2Xcsh!e7sZu$=g71)Mqg&}w;8fstQgY&UvCyH( z3UewYTCi%{G@<83VypWN>R!4x`hTyuxXweyTSbR%Bqu5-I~1&Sp-KJeGX8vLb!+Ni z%r4Pa<5gO!oIiz7OJRQ(3Uo_##2wPsB|xAq}}lFG>s=^u}b6J zp1(zogSg7P@XD#bevk-JzCG5Df)FUfBKms7ryf4!!l{(YJ_m+2Rkfr{^X65bdj~(@ z^~~#Y{upp6?C+3F1&0jCY^}Zfv!2SvWca*aJh>MQ{{}IRxqhdTVZvwkndtZbn@G1VE=S>TV05HOB@#4?31gGxWw9u zxrq_KfX2p6^ADmPE^w$W)kPsuGukzCl{hQIS4U;#`{{Ry6p0b&jdVs;$K3VTLeHt{tCpcW`ZMvofS|`(&oODD6e%9qL(vmV}vo zd&u8?x?-ZxW%FXI?q{kwK`@$n+u7`8^*{K$`hH={rku`|6g&6S)G7=o*2Qk3!^)hw zlwRfksSp^vJcp6tShqb(+%QvNYL%ffE7;ZMG4t7N%xsr{uTSJqIwj#X#IIK&C6|_x zV)~TuFkxIp?_oi*#RPiBX&BqO69Dw!0yHw)#P?y>#h?i6!t8q6qjRf}G#H#3s+@J! zk(C+J-hNYbWZMH;Rs{LWUII^q+b@Sd-B3`~;<(45ZxRnq z4oLJ8-nEqLO0B232?O`XrH1pC_>A{h2mwn(QDu{;*ys@ulyu~X9^)5SGpMy`{fw@7 zzs#R}D@G*)z?8E**SlT zFy+jH8I5V0jY`_@g8l&W6)BURS}adLF8MT}vy@6~uRHQDZTac615rWow!}Fmyx7i% zcRG7tu0>)>kk@zn9Itc!_-)E5IiWVbb4skthv8mbjoMcmNPL1Ahf zuWjuZdm%NBjAOGmQO)-nPZ0e}VtDAM&;HEC20=L;^T8kdju?aqd+S=U4B3eXuI}RPe+#7UCAJs4+IRO~PV>Mfl;MnK*Fr z?Uos#X8N3e%aLA4)X9`3z^R+G~uXMg6DR3%REtbt8p^eC)W zPII>CKOYYrza_O{5-!YxU3D8K&D38V34lISk%11dhLVNyk{2PcAK(2BG-2FK0uHM! z^VM3fV}YLrGb(L!{$6@{9BL>Xnf?i0c47w24qk3}!fGT{Q~A$@`*iKEtwV806~iBU%abvOXrtqfF{O zMS#jlQiMbfVv|WveM{VO80Rb={2Igl1b+Hd!hLuwCdW|Q8L&2>+H#!L`t6e$9k>ZI z4z^7T-fSw-?Ys?*egNP;Vdu%CsuDcu;9nu1t>ASukL<^N-2nF~o6iJ1x<} zQB1!8up4k#crA&Zds5tSnM!T*U?SoW%qgt?kl!f)Sp_C$e7sL+9UPlP$q(vV{=O*R zTIB=6@tQvOjWPg<*zZzQK>3MRD}`hPGN-U4ut@hh(W?yVs33k(OXqM%3-s-=kh`qu z>a}OkBy1%^a&A%{?z@x?hZtN1fo@(J;d1Eh@VhxWgNtA5+@Nr0{Y?U$x08W(jXUk; z*L#NJa*|J-<(A@r(X7w&{L3$W{5zvf1#M4)ue4G&+7t5hRu(NwzU^w(IvtFE)vo+5 zC9`d^qKvcUHK-Q~o7^z%uxlhWk{t2aS%=fAd87!&MxT@1Pki_SK2`~Ll)Dv-*v+7c za*yDNHH>wW#jj($MTW2qb*!xG)Y}$2;tMCUI^bX&irdUvuGHx#{F0q)^VX>#gmMSJ zVpNjR?vhS)$)qaal5+v|uO1uO<}^PV$_j-7nU_6ylAjM9#S#D1){p!4ps5*xEg0D% zEG^}a;GUF~O%t z)Ny46XNH+28PC*Q$^2_9n7(PWiS{PI%Jfzi`eg4{VfC*GKmWR)MDn>6+*mJAJST>b zW}41m)8g~XF>on-W@mg^d$mLnB&Lo zDp60e*XRh?JL42|%35Dp6*%DOChM%gdzdi0tR|iI-dvPrhh2bwf@U?iT`4$l8CspR zkX^IX;o(fh+YBogbDK{{K}7zm6CvP2)}8jirG+?({%Nets!g>xqO4oQU5PFd)%Kh9 zOy*>b<(QL@1gdz^Gm z^}vH$W~vOciuYF)*p2MU%7m&9eD|zYL8A{-_H~@6uQ56Ig@`|&pye~%Q0p@ec{}FG z_o`$Ma-|kD+HdCmdErfpXr&|_t&R1ujf$x)Y>?ez6S!j+ft{~xt-X7Fzis}lc(X+}n5U@C7i1wI;-(U; zbub0#nWTO$Cgvv>IEW&PL#Y||YFjHaywVWje73742^A(3$sfj$Cs8L81&yIY{?+)V zrwgIidIyv31zv7?;+vI>rYFluw$c2y_B#5`Ye>+HCV;M26jXr7+A zacUnaD1!Y|DKE_~O14}*pnvHitz>`(AxY}CE%hz1F!#AlgI!YX6hv6;e6~>Wox8;@!QWd?$DLY2>OS~Jie~q zO-daAXXiN6`53`>!rg*-202-6p`{Q^%u`w+*C=l|y4AmG6<^YnZhTBYi+<>GIB-)K zZ(tLkeTYJFPxYqaG z>8=#)p4nhuih(H*0Ez|y%$%z2w;DrIW-T2|^-=TkqTr_NP)NZ>XEi@hy4k}3Qst9A z->6Q8XG}`{tGRz+en=fX@FwBwThD;qFnXf0vTIdPho_5^g>oFT7S4*LBDiTZy@B8z8rt23)9v{V0ErJnVum&E_03oyxxnla&l&=iqT>*A@ zb}G+oMc2*Qi`yJh*8MQ==ozq~$igJv$@FnvVHKT1Xo8)W;ENT;;3=Ikw_d9wYN5}@ zJy)-Yp_q}m4>}r8qdw(!J~F?FEnEs{b^@WtbghE%i82KXaMvz`2lM7`SHKQsubtd? zm6gx&a^YaxsEGHG*9t)GAJ_?U9|#1s?9ON%9R0ePd+7{=GD zRPuq1s-B+Eq>zJDgC=IU7m~;khRDJv79iwtux+F?^0p&{Ws5MN?m%*nU1JLp84oF; z8aYj(ykXc9tTnp}S;%6#g^9Ke@!n$cd#q!-iAA?HKALK^RxXVYZ?-AMQJRSdBSR*X z`Zwb3)V5qMz4j|xe^I#<&~FZ-1Bc2uH;bXu8eW1QmokTZsjZi0kcaR?{&wz>AKy6h zqy28aPs2j2w>p(!ORUKC58-)~YvUOc_&tKSA_r`rCX=PRc{>F*Uz}Y~236Zon-|ho zdCf#Q9G7KgtXp3-6XAKqfGh)6d^}I{b)~_1;r6jmZ|ZDCQMXRc=u{FzN%@1|u>$>7 zf~T@cMvkSdT0DjU3y|ATPr-X5;}IrHHd;M!R#V{G`CjyEPD0ya(ougB={3Tt=GB3s zI9=-MJgePzHNAg$@;NML!{9GzGeZKv%)s`(OVLf(y?Z>&JI4IrGgc|;@R{ePqj1(n zLJ&SR;!Q54pws+IR!E8vGE9e_|1C$?1jf9{&j1wApr?*KSlrL|fx#5F2|EeT5UIbK z%qGbYzG2ET%U~mPY|!ras*yY_)Z!haYq-wF-QrCUwvpXk|9lh+xZt=+RgVrO?88qX zobN1xwI)0n7x@%h->h}rDD+WY?f1}_dlENUM)WY>YvY%nH_IfRsYARDfU3q4s|U@YbWNyxIoih7)R<`Bs0#t8 z(%`9kxp`$#pAUb7!EhRsq?1m{){1XcPD7{c)Xy!kpy5h4HMCZO=`j&pQ&ch0>k zssEhtf8I|iDWkF9wi?JT<@+(qVOJRcpxjFaY$DaMys=a|nnz0IFuT%XS{|RY@FzQ| z-!m`NWgeZwq$1I0VVjLj9fVJWu=v1@GX!NpgGtYy#L}#~>qIqcZ!sM*;N@F9IqCu( zp6I=upm;zes;XZQnBkg4r2!?S#Vpd9C1x!Qx8}bf{Po)4@h_0= zt+qa&^TXH)9KRX(UCY{!BI#ehSpDTy8NH8rE;30sU-i*0&21APJTKMhTXfuC6*AARyTp^^RcK2Er#)%I3tqV2a0y(DWw1dQ2M5?Q{7 zLLkromS;!77X5xsZ3ClRr=iq3jvOiNNIe&#X zdr8jr{UdE5#w@kOpPpp7Lb{NrT=8mvTQ^n9<<^~NReUZT``DW@`pFFbn2ISO7=++a#2rTT(oH?hmJnySoPc(-0{Rf_f3= zT$LT7%f;ppnOZ{lT%`r&OGt(qH8w}U>5C2R!^e1W$Y8sj9yeKDzkkFEV4OP_`1j{x zG*U|LN!Kjsm#vXSPCDn)%bY|g)N2B`@A#xfLpUDs_^6KrlAqY7^xF3Q-bmKoPAVR~lR zo?jNI+P;RLc(yC*RU+HkKl)q^`Ji&w^;|6@zVkJXuZ-M-LiBjQJ$5#}R=zFF23kFa z)8D?l_eRLbM4kXTH&^VVTYDwMg+gm?o#q*lXip(u9Q(Tdx6$O!{i8?rr!U+4MzwDD z8lmM?Nt6@@7bQQZEr6#|Wqrv7waMzyWskv=Z8OE4xngK07#j)CWSZrW38S&9wr+cS zr|b{gT=&*WPicMOXN0*lzCPPOK-$^(h@zF%+Gyl@R6jgW9Wgm4SWvn3?hceyX6>_U z-j{I7H!ennff&^Mkyv zj`8diXdTYn7CWg!ZOkiQ;V;%l>{>{8C`qh%e?#8(;h z8l}^tRoQ&#O7>7w-*I8HC?Yi@OILu*xz>3)Hr}ze=t?vwY{!wsbZd%VCeqPabvHsf zt{9|1=4F!Sm9CHbd$P`g+o7EgFg1=CkIOM=qPFS%S&&Cj-Z!8w0`iZ${I6-`A0p$I z`KymYx?Yd%<*EDYqrcl{g)+RYmWBT69$n`OK(1^9=vei0+uPe`jV%yH z^mNMoQy!Qe`ZKjGsF=lnSp!ZbFbbBeHTy`;$u+qL^Y@SV!OE2sJ1zHp2iNf9I~<-6=#&UW;d{zfl&*07!C#Nuxlx3Sa=r9Pzn8r_@U*Enru&VADGbEhYH+yb zPb5HY5rdo7i|EZG2i6O>t-VtUjtfFLhORgntut{ytaeTo{h)?TLj}!bIreK3_@OXH z^IOy^(N=R8(wcQlkzxWADyharSF~cKU#B|kOZ_f@V^U+_AFhvQ|;gCbILN#$VhHjJFv%P2$IVShu1IJyKq zwX2tnzwbZX8;@pW*VPk${6u>fHyN%YV6e%7Xa5^ys{muT?*)R|nU~|=tg#m^ra66M z0J5+^FZNaX*gstIy)O{(H$6%+R1bfRm*c~}T|i>Tx=QipVnFHR!fdNXGa*4EbiANPtD7N(+(oJlJe9CP3=S&xJ>otkw#mNmqd5OF% zcArCk$2B^eh-ocQ5;oL8_UUYmkUC$~Q$Lp~lgc(EC)87#8z*#*lj7%3a!<0A1>Ro& zZh)Bqe>NpGZp>N|PpQ2bPD)a_s9a(yn#8uv zvhoY4q)5Gl_`G2#S?VP|Y-SIeJxh8t7`1GuUiJy%V(T5S8}b|;E5o6)%w#vCf^N`k zSc6bm^N;_0UKOqUbWn#N;|YA3ZAt=a_75blEuL@--7zU%t_AbxI_yk_r8UzmYtoR- zjtp(4BQ%uVy4UiEYB0{8b!4I3S)o0`7o=ofSLy89W%dZzzUrheyKiownD>!-lPRxx z56YXP`<=%BJ;lh%)@N3aOGNI8)*D^ec5bO(c}?>*9KAInpu4h$UyFT09D8m9qBo0;r_hErM81j_mEpL@exszD@XL-+}Xc z-p2d=%ufIC-*96JIUmj6AfS56%8SvBjYreEW;QlmE*Cg(eiLF@Y*_EyR@0)0kEeOW zQH%e1ygj7=xt&YP$xJJrUK+Pk88-^$mQ+-zn8Q8QX3W-j zW>$SRHuS3*;RAr|AR)qyto|kx(|>7};-K)%zX5><0Qr+4^}3lL*4DP%NNH=PHB+-v z*$Kha&mB&7ZZc;zEl!puVLYHew>unYP*31j>wcZI9lknirz4QZa;+fvpt1$cD^tp6 zRQ7=|s`}O-%j(@9PI5=lqxM;J^!DtyzX6M!6>Ea8mfn1N(S=Zl{`G`6%2#4J`kNqv zl-Ow>hO|_}^U;TRsdXT4^{{%SpU7b{97X2Tn7v1sm4T11r#-hLX8(VCHeLGv>Dg2o zIJ1E%V5{HkeDc+>zPa4~f6&65#4``xom+^z6U6*2Jvljo8j!BV`=?WvTn+x;@Xwk7>PODGy@tThu}!e&FoA4*DkEKTZFM z=n@5FdzxI6-RwENc6Qm#=J3;0vsP$HNG-$>9LJz^TWCx@(TM9hY!lc#V#g+&I3)k6 zE(o;$W4c&ee48#!6nCc1g5>W2)e8W+>@>1!i_zjM60rHpH1-ib_8F6vJ6_aRN1;+% z%tEv92S*Tf7AmEmQ958DxL`Zqj2`1#;Smy3Fd7au6m7g`&N zpB4w~9!zNDZ}tbKI|*+0-E{eKm5#Z2t4n1ff>+uZdjoq3uuOKac_1(ni!r2tSq*m^ z8E7s37j?IzfEvno&Y1ior+n&7#>mC!v3SR4vsWgh%0uRu@b$}FyaP?l;vWoA<9f#F zrZRbov+CUOXJ}%D)4p|rCdHi0{Hto>07-ZwflmuAt!q?chFmJ)FI2>zcS87 zQpT`Fq07_sK+Gr$M}NUdkFWTmqJM1yHQofEGvdi2VY zu%FcqdoZI)vJb_ud0ZJEF3W%BUV837Lr(LxpG@C1XVt9Lomm&Yefv2>39CYL3mFjH z>bKPM^-V!=*ElxHgD92U&Uh#vkeVx=FMWT!N-loh|9K->-T|5xr+H!gm<~5d&=@t+ z?)`3e6&Z=&3Tpz>cMCk(%=g@21jlTgsr=zgueL5Jrtp3dA>N2J2i6wgOPh5AT{_4l z_#wv+irZl6&fvYz0*6_Efj6YXsiv7({S^@DvGiY zC!T~5ZP|-=7afiMrL`8k?Q_d7WbCoz+0J*Dj_Kf;+Fd=x;nHn9YwScyHhvJydLUTF+Pv{i)7NoeYvJT*NuhETip>vpk z`@lCc@7s)9%wi?p-wL+3Ehy+@w0?KQO!6DYf%~r4S{Q(bN(xYa9e&Zt{p|H(;7Y@g zj+GdJNX;Cpw8qKom9d?fcVI9%-Q;oGaGB2|jw^WhsJbV|Y^svfKTL9|+%QLhJ59H4 z(`@!=-&*Jg*pxshN(o;9&Ye(nMquuw<*`jtb3TPxiv?K@-n{f-ydZ-HDztXF8Dla+ z!^i99SOm^DZSb7W3~i6hY)dLm)$+U{c#S0)YArE+YNk%kY`TK5PpNle*zss(GWk96 zGlT_2?#m9k3_DpM4VKU~mg_XWIwIelDA(|8e&fzd`gI+Cclu~~&;Mg=-9TWAI(m&r zrL8z|o%i(i>tdiEj2M|8)HOH{6$fNG=})V5oaxu_NJ!ON zwDQkihR7j4vSmZ2wdL#eW4zC)V-#W=0yh4fgII|(e;Pz|`n@qqwR}^!(BBkp?hDui z%%%9+#sg8)2mR#l%Knr{EBwqS1Wk8&Nd0Y4N1R?R|LXrU3t%Xy%GGTdH0N@c(`CiW z{#4{S*v=~;0Q`RG_Y2|?%RntNr|BHP3N%my))nTY2a=n5V-tR1k{xRSLOyP7A%}+f zp4+l_@DBeI*1;J=4wkH*6FD96#s zeU)uIU1iz0h1*)c087Z0ZvPZ4h1(M|esC^@dEdNb5-G9eH|-nz7#NoPlSKneSkCxn zQ+=Uk5|`)3kDuVsnlbuoV;#RJ<{E+)kq$GdQoj}=Ay^p)YUu}WLQC$=y-tl*K9j6B z(wHo2_%9oJsAW$tsPnOp*R3|Q_$#wjQesl}zaCJ*FMPzaA$@wlWe+VGTh2_|mNU!1^HMY|0u`8;1h)$CfNw`b6{p zG)A{kibFWY?pb}S2vA=1t-Rcv-q`}FY@O|-lg`g@8f!MM#x#J6;Q_TL8@9(pW;K_2 zX*Etzt!_;q4kCtTU1T+;1y=4`~0D*1Qc3*zl+RC2JY_8ymxyG}-j$*sIazca$m3p*9;K zyWsPulFO;0-5C~uEwLHzFZyve-JG&4kGtqQ^5%3YLXpmNE^i(m4E^7@uIbWjpPH?n zv5t(=;OxfQNw-!d2`yEC{U>9up~8Lj0~>&KUU3)eDoynlUsMD=oCM#eG0Q@L9>?vG zI%BKR-6-sM#~HrL4)VopVyt9RD`aI7nw)m!DXcGHeH6inI%d2h{6+|0CYPg7oH|@w z(*5e%-ww66OfHMTzl`eD}-g;MoQPh+zKv_(+oUDjpYk0^U0AVCYPu?G=TJgiOGM{Pg2 zpAj2qUq!iPU7|R|%i0ne7-W>+%_`e`+#F{ukU6y4XjglVxwSW(3K;L}H`fZO1WKz< z4lO6|xZ&~SQGvPdHx^w#KdQ;leD3Uu@6y>M=!r^48i2d3?^{VRtBmn+A$NUEd()N6 z?9{+D^59JwgoZKHmCVjZxuIK5qr*9U&a*CtRdsc@@E9dG0{iaS(rs#Oe~ODcna`V> zWTm3Nx=tVV4B_q(ut)}npw(SAi%g)ZP3?Q-d;HKW2#z?kK7GL**PSn_`prL_j~$pQ zDfoK9fiPgV}_Dn6M29Xg}N*B?NBygz?dO3fJvIP~77qK8Db$ubB z!+`?hA6Zq5SDhs(_qU-J#5+y2Z&O~W74g<7@z?Js-QQu(+&zDw=e6Hp{*W~OK?jLN z;~Myp>PCYq0CDZX<>!`sdYc7t#^)mJ;8F_Dur!PxVIQ@xTP_ED*1Yo*ucavF3Nv`Rul`p?OSxh2I>W8_gpXI`trV^rmSFyCEnwr zR<^XHP96`o&pLe`r@!pn)Yl6k9iE)T?~v%R!C%Skhx@easE=$HdI@3EX%D#l35wD} z4PtX?^-yv#oUSyMMZycLPzixl&)GJ8(U%-?_ z&zc0x^_0>7P8Y2(Am$U0y)>LfZMITt^tggdp6?w+oC?A*%cUk?WBcXvX#4c}Vt8)N ztT^j=?G37RvoRAO$8;?QF|DMiYs79FpsM){Hhoz06bty(l8&GCBp_ypszo@u29!4u z`EY=UGeF2^P3Z}%`p*<7#Br$4ib-M{C#m*mQ%`Qi?u}gOAgn?$ua?2>BV=K+BW|Z? z@A`;@srrI^Tj~oY5CN_O+A)a~IU_GA%sPNu+eWL

|;9QrMUVk#|z9ZSb;xgJvM#E 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%0DgT;iVR?9=p6?_7O1i3i3j@8`){ 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 diff --git a/_deprecated_sources/diagrams/mp_lc_unicos_shmem_fence.graffle b/_deprecated_sources/diagrams/mp_lc_unicos_shmem_fence.graffle deleted file mode 100755 index da3aa17dae3b6ef14b0af3ef9dc8ff0915730d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 zcmV-m37_^KiwFP!000030PS1rQ`<-q|7`vW9iKK;V9)5SEMbdR2z3Np*deu7uG$); zvC$z*jx@&MQvC1NdRZfBWQ$j_n~(=Gp6;H}O!u!JYVG{-b?QmCG>qK9f47OdXj7uT z9XPH(dAIp#_-CP#Hl@vL#%6DOy~SeDB{6x|4yG|-)a!@AjE3y)6r^qgL)T%> zCd`*kQ(6~%>$o=C-RSJx(7W9|o4L32l-$wq#CPb|onHJc47xs}6B_QKonHPiXMwq0 zn=lZ0nMz(VkuW6jht5vKLb&%`SYbDq`tBqQ=CkfOd^!%vcD+S`>^c9PM{GGK3+J?#j~@{KmP7}E7lccK>~>RvMgDa$Wob5kZ&G3Bp*wMl zTg+&`p)CpB^Q;BOz$PADGK7?P@g&JLrwhFK)Zg>miC^1rT-)%JdN3n4OjVYv=oP{6 zOMEbggwg7fWrWOaByY=#gv__9`c|`~ZKNSoyNg%|w}IK{;M$!{iN7Ts!|nOf$8MGH z(2Zsuxhvm(zRQy9OYfxkQe^{;m|Y(R_IyfxR@JC{E413KBy6r7#X2ug!2Hxx;{9Om zJJIs&i(~vI>vC7yl2r44OZtX213t?4{J~}t4m=VG1Prdpj5^s`>Rj(#Hl$x!o$t@1 zfq>cz7Io4K8oB?Yb?TEtjyB&M)#5iQqf8bl5^OW#PdtI_0lV{fj^%Eq!(-R;icx+z z(}a*LxXmi2JUcJVRTx~(8C?^H--KtC&BEY@KDTWCW6W4N@5&m=qlF%hLN>;uDX~Yy zk6e2;!3h40?7$8P44JZ;eval>@T;n#jc=oI;4^mRjmBs+juvhdjmGvh2_wo3L;66y zTgm{Zf4>J(J4QsH{e2WtN7l5_B&5`jKU{fp3Rj>S%}D5s*jG(Q@DpP>x#(tmk!3Zx zm?*v|N{xPz;;1^*JvC%~)j=g}4@Ro$t zf3g?QzK0k1*|EA5pYhv^D(d^|BD**G(g5npn+(@sr~ZPZ<~N5%Y)gtl8-9Q$gT=jh zLFnG|z=}@E74;4wH{!&Mi5DgL!n0$%`e=-|AeoRAoZ!zYoL4l|)l~dLv3>xWcax3Q zK|f|K#sA4jngVrI+0+bV!4FGCx}h#pmq&Skf}>$V*eia9XY&|}($%!sL+EPPLROMD z;2-KSg!-r`0)33tx>+@NIh-I}1b64-F~AW|pKP^kc1;X_!KbP+oHy1>XOP-NfP7C2;GHB18`T`|lW^F_dtxNmqjqb;DhiYc!?@YM%?KOZQ+;d2}5w?>Ee&eO!}NlfWXbN86+F3F0;U`k~<${?$qliu|M! z1Xi_r#8Ig<>)LDe;pM9j|NOAO!Jn)0(*kqVQsSqz7^z*YIfl-tRD^$t@LBMr<>}Eg zdQ{A;wTzJqVUNoVRb^Ff_~-~+H2?;!Bmz?nK>+rWk@qDHV~^@RB>EOaWNYkCdB%9U zb|;kx#9wn(cFvw+eqpkNpc;Vgc{r~1yOOk6y&G%EKhVS z*wk7$mW)cV(5qwlIUUQ(_!X?nKeu0bbt``tw}PM5tu%O*N>}c2=sG9sG&iw#8r#@AwMO<%V=H@ejL_W9-l;dVcbdD(J8SyN zJIyWPc?8(w$;$B6DU`M&0+}`US3{1~rYt}YL5;ACAZz0AGLAHtrA1h>8coD_vi9jt z8B5#CY1jeIPN%m1!&!yCe~XF|1|NNCaEC$@K;UF0!G{W z1%XzGbt0z*v}`Y2pg>LPlVw#Cx(|nb6SW9$5=*Q3)8*?-XM_EKv0(a9z}i{DqgY@5A&c6}#UGy}oG zJPctYO0jQKRJwe2O~WC%s=W}I0a{6E3XadN!>$XSwCNLBg&Ru?3n3p=aD@;v?r}g# zB?QZ|z9pHKUM_}Y0Yiem7j#m>g{7QrS;kw^wq>M(;`Up^lm&wR69m)BYPokYGYcrL S$qTc)8~+D`dZn$DC9D;@fcLD@%iM)^G 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 VzyD3;KL^5J^~251&i+$B{|hS<3Mv2q diff --git a/_deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.graffle b/_deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.graffle deleted file mode 100755 index c304675f898a385b78a83a871b99caee13c1d5e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 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 S@m_Dc8~+C!%q#4RP5=PpQRV&s diff --git a/_deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.pdf b/_deprecated_sources/diagrams/mp_lc_unicos_shmem_quiet.pdf deleted file mode 100755 index 0224f0931e44b886ff5df7d49b134b8c54a13ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21837 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 diff --git a/_deprecated_sources/diagrams/mpi_fence.graffle b/_deprecated_sources/diagrams/mpi_fence.graffle deleted file mode 100755 index 9ad1adf6026c6f03564f91e597c40377ce40f7d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2559 zcmV|vViwFP!000030PS3BZ`-&M{p|b--F(^tj!aVTZkk12O@o^@Mx3_T3j+&A zq8;7Hl1tHXbBp}SZ@3bqvz zx{>FH<2TzMFW>Ii+kfnB?f&cN{P6P6{;@I*{Fo{Ij|XR`hsyR&ueU#)21GfGCes-s zwAVYjJW~2+r-Ms{8|(FsKWr=8*NjbH_j>dBT*ZmF>PC}9Fz)qfG$oYXopGx>TtW4i zx6RwjnyK}Rf9v@!+uQ2w-jKV!eV6&SuxXkmS6NkM#hBhf!$tlTBz{0 zeHSxs@>6Dcp@b>L$w_B7W|ZIi9`B(VO+tT6quEqF=VvDrk46FEJ>Ko*LKS(492MG? zE4#hIX4dwMMf=`=XE9r}$>@yqitC3syv6Zh6hw3(kl$`5FfYC?o2<1~9h=P9IrYbW zd5gL1H_%nUeO0y87`Qkf3k6DWkTjAW3%MwmO~U=aABU|0hphq6qz6;%@}}x`HM3!u ze@G_g2s6^`G6KNf0cZzl3b0@6`fI~cc7Opu>n;)_l>yAJ4zB&_1czPagx_AMyjPog zM}9mF@Lm1(i&0kmP$6Mp zm9_Q$JRY>APmd~sivcjJBalm;`5~#uF7CN)r(#I28_HzQN28dqs(k8J$X0F0|8m#S z5wZ7v3Oz={ z%W8{6q$@|Q0(|(F^_!@SPsL>ofK(Ie9M(;!nwEXvxU-5Rry!Z6X0MQ3*i2NOB3ZJW zjs&Pg!`uRthEO?O`;^vDt~yJB3*`B=jLoPzj|CQR_}|V4lK+FERHzcv2YZ$LySM3uwnCH5tXR^9 za7i~}`l_g&YklS;^5Do>F1jVWORM!#itBQQiFB>2=uSHCj@eZV^Lr7?`b3xG8vFkv zYtm5N5zx?Qr(q+$$X|$r{p1Aim!xcNYTBm~-d3Y+!>uVLw>;B~m852pW*>?++#1nn zqC~fZGJL~Fta1?!w{Ykw;~A!ydp?O3N+uB_iW^O)0ZC+JEKr0^;wgV9UzBmQB`enw ztlTDlsXGV1W(TMJts*|9$29O-p?My~TJm34i;6C6kcO%OA}NJ zJc=+IYZBzr*y9pIU0aqIKK>UX7KcFxB)m(v1hnfVDfcHrlQ z+Qu4zC70R+mY+7Tyi8nyCi=PK$|kJ*C}9OYYgmy)mBwDM6Y6`X;V7zY^jho$JDK@B z-#&}n8{#!LBh^yriu5Nx_OIG|m+B>|4CeZHOyV{6Zk@T~^&rcJ;+8_eLdSw5r^YNq)c+LG>(cMuBbdKL5CG#qX0(<|{>I zp1^w$&6wO5cx=CsO>TQ&-{Wye*hA!FKDmQyQa+k4gtJSvv1zKTo*&s3%_UEu#aksi zFhENHWv9K3vLoNi*jcfg zu_ND@STMj|RjdwQoziJLB9K{ee=X!#zLW*%A*d175o84quj7ck7%jq*X@=bd|7~MV@rFYxTlja`;CZTwnXL8^BD_x!qF^S=AAmgv8eib5zQas@mzducTb_{ z(r2RH2tX{?`WX6OW@L>Jp3ld6{wzcJ_mSt1@{Q-K_BT7P4ed2R;{DB;A@cAI&L1L1 z){hGUuMqo0AhcE8$cVk5dC`g$*iZ3BU>z>E-scGj9i+L8+;;m}W)UB)!q4@D;NIw`X$HcGMc`C_4+FoE(rF{!{BbU!#BZi35jk4pZH}7ZO~i%upp%(ZQeGR z@O&=qM)IzLENRH-*&2%~Rpz{c=b$cmpl%asm)!lwm>h@9rzBbN;_qk V0?K3hnwGt-{{x^!;$22Y003h<2DktK diff --git a/_deprecated_sources/diagrams/mpi_fence.pdf b/_deprecated_sources/diagrams/mpi_fence.pdf deleted file mode 100755 index 4fc5bc9408bcfdcafd812fc44284b25aefb2d4c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22183 zcmeFYb9iN2x;L6sY?~F^wr$(CE4Gu0Q!y*HQ8B7w+qUiGrfS#j?%mz@JEzZi?)~e_ z^Q_D<=NkIWSL4MZmJ<@8rl(FDHOtZxnJx|pG|WP`;D@3p5oYzW=U z6!NKkR@x7kY<(K^Q4h^8r%W;b8(U4>v-em`OPoraaU&{`V{`fuMrMlbb!_{@_Z_6E z?Xcub5~F@c0zAfyA%mF-AZ;z@Qt`W{S8v|0GsuXpmgn|<{)Bso(z}P7FX;z!#xqS` zX9Ra(;9$pgo%KLg+@pt9ar&Fcb-4JH5`TQE0NFuDBZikFg;P=0JLpVp?%%;alDv~P<1>Hu`{8njZPnrRcWzorHR z_RTGuRrM@%Y=4)st;NrxAS=ytC9ZFew&!kryKIUW(PMRXeSZ>z z8ArQSCsNU{&5KTxpB4WERIHuz>ssZi&$q|+c8{yN)Ykm5m8nN+^YXLN25>z5<|DhX zPUm?2|yNzL3Wz0VrHY`-p7cJ~^WnzMz4(Y1a_>87A zm&Mo1(BGEJ%BZ2bjj23}#3n(+~<3y$Yr1Wv@U~@{aG1-tdFjUsLh>U& zC5ppw+h{}>Y)sJ;`HdpIhSgJOv$j>j2k>rq85JAdldY1c3F=wdI?rR3E4w?qs z*N>qt8;G`c7k&?!w;?kQGDCPP7G7^-P8Y^~;BTUY>!(KabnES>Sk1bg1+;5ts&^62 zbKE(0yF<>R@jK7){kHOm1rA2!3*%#f8915JP`

H8e75 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 Ot^WhT9?ogSP5=NGkR%8I diff --git a/_deprecated_sources/diagrams/q_unicos_shmem_quiet.pdf b/_deprecated_sources/diagrams/q_unicos_shmem_quiet.pdf deleted file mode 100755 index 2986e0d9711ea80369d72298548a7f390d2660ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22022 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 diff --git a/_deprecated_sources/diagrams/quiet.png b/_deprecated_sources/diagrams/quiet.png deleted file mode 100644 index 6d1c1f34766b71fadb5cba1d65b05452347874c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163192 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 X@@7eg)zsZ!tgkAJ9fU> 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

me<)t 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 "OpenSHMEM" --- example_code/hello-openshmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_code/hello-openshmem.c b/example_code/hello-openshmem.c index 488b97651..8432b20dd 100644 --- a/example_code/hello-openshmem.c +++ b/example_code/hello-openshmem.c @@ -1,5 +1,5 @@ #include -#include /* The shmem header file */ +#include /* The OpenSHMEM header file */ int main (void) { From c47e8c183f1e0aa93abb7f32a9223425afefedf8 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 09:43:51 -0400 Subject: [PATCH 344/583] Annex A: Commas not necessary --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 10b94433e..056a4dbe3 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -21,7 +21,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} To write a ``Hello World" \openshmem program, the user must: \begin{itemize} -\item Add the include file \HEADER{shmem.h}, for \Cstd, or \HEADER{shmem.fh}, for \Fortran. +\item Add the include file \HEADER{shmem.h} for \Cstd or \HEADER{shmem.fh} for \Fortran. \item Add the initialization call \FUNC{shmem\_init} (line 9). \item Use OpenSHMEM calls to query the total number of \acp{PE} (line 10) and \ac{PE} id (line 11). From bf6f73b21f5bd2bb56101fe1f55cd73fc9496919 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 09:44:14 -0400 Subject: [PATCH 345/583] Annex A: Removed incorrect line numbers --- content/backmatter.tex | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 056a4dbe3..9c44e1ee1 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -22,10 +22,9 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \begin{itemize} \item Add the include file \HEADER{shmem.h} for \Cstd or \HEADER{shmem.fh} for \Fortran. -\item Add the initialization call \FUNC{shmem\_init} (line 9). -\item Use OpenSHMEM calls to query the total number of \acp{PE} (line 10) and \ac{PE} - id (line 11). -\item Add the finalization call \FUNC{shmem\_finalize} (line 13). +\item Add the initialization call \FUNC{shmem\_init}. +\item Use OpenSHMEM calls to query the total number of \acp{PE} and \ac{PE} id. +\item Add the finalization call \FUNC{shmem\_finalize}. \item In \openshmem the order in which lines appear in the output is not fixed as \acp{PE} execute asynchronously in parallel. \end{itemize} From 3490bd5c4ba0cf5b9d047951a718662e5b9deaa6 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 29 Aug 2017 06:58:09 -0700 Subject: [PATCH 346/583] Update PEs to \acp{PE} Signed-off-by: James Dinan --- content/shmem_malloc.tex | 2 +- content/shpalloc.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 0645b3f64..dca7c3dff 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -92,7 +92,7 @@ \apiimpnotes{ The symmetric heap allocation routines always return a pointer to corresponding - symmetric objects across all PEs. The \openshmem specification does not + symmetric objects across all \acp{PE}. The \openshmem specification does not require that the virtual addresses are equal across all \acp{PE}. Nevertheless, the implementation must avoid costly address translation operations in the communication path, including order $N$ (where $N$ is the number of \acp{PE}) diff --git a/content/shpalloc.tex b/content/shpalloc.tex index d9f310b48..a77bacf45 100644 --- a/content/shpalloc.tex +++ b/content/shpalloc.tex @@ -44,7 +44,7 @@ \apiimpnotes{ The symmetric heap allocation routines always return a pointer to corresponding - symmetric objects across all PEs. The \openshmem specification does not + symmetric objects across all \acp{PE}. The \openshmem specification does not require that the virtual addresses are equal across all \acp{PE}. Nevertheless, the implementation must avoid costly address translation operations in the communication path, including order $N$ (where $N$ is the number of \acp{PE}) From 91f9964afdda63b1a2e281880aa0aa4cf28e11fa Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Tue, 29 Aug 2017 10:26:18 -0400 Subject: [PATCH 347/583] PEs -> \acp{PE} --- content/shmem_barrier.tex | 2 +- content/shmem_barrier_all.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 6e9b527d0..5ac219d4d 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -72,7 +72,7 @@ The \FUNC{shmem\_barrier} routine can be used to portably ensure that memory access operations observe remote updates in the order - enforced by initiator PEs. + enforced by initiator \acp{PE}. } \begin{apiexamples} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index d7d939880..992d2ecf4 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -41,7 +41,7 @@ \apinotes{ The \FUNC{shmem\_barrier\_all} routine can be used to portably ensure that memory access operations observe remote updates in the order - enforced by initiator PEs. + enforced by initiator \acp{PE}. } \begin{apiexamples} From 1f2137b5b69d533abcba1332b1fd6891ba5332eb Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Tue, 29 Aug 2017 11:17:58 -0400 Subject: [PATCH 348/583] openshmem{} -> openshmem --- content/shmem_barrier_all.tex | 2 +- content/shmem_collect.tex | 2 +- content/shmem_reductions.tex | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 992d2ecf4..97b7ea36e 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -29,7 +29,7 @@ Prior to synchronizing with other \acp{PE}, \FUNC{shmem\_barrier\_all} ensures completion of all previously issued memory stores and remote memory - updates issued via \openshmem{} \acp{AMO} and \ac{RMA} routine calls such + updates issued via \openshmem \acp{AMO} and \ac{RMA} routine calls such as \FUNC{shmem\_int\_add}, \FUNC{shmem\_put32}, \FUNC{shmem\_put\_nbi}, and \FUNC{shmem\_get\_nbi}. } diff --git a/content/shmem_collect.tex b/content/shmem_collect.tex index e3812c5b4..ed8a5b549 100644 --- a/content/shmem_collect.tex +++ b/content/shmem_collect.tex @@ -62,7 +62,7 @@ \end{apiarguments} \apidescription{ - \openshmem{} \FUNC{collect} and \FUNC{fcollect} routines concatenate \VAR{nelems} + \openshmem \FUNC{collect} and \FUNC{fcollect} routines concatenate \VAR{nelems} \CONST{64}-bit or \CONST{32}-bit data items from the \source{} array into the \dest{} array, over the set of \acp{PE} defined by \VAR{PE\_start}, \VAR{log2PE\_stride}, and \VAR{PE\_size}, in processor number order. The diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 09edd5b07..6a3184f33 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -190,7 +190,7 @@ The \source{} and \dest{} arrays may be the same array, but they may not be overlapping arrays. - As with all \openshmem{} collective routines, each of these routines assumes + As with all \openshmem collective routines, each of these routines assumes that only \acp{PE} in the \activeset{} call the routine. If a \ac{PE} not in the \activeset{} calls an \openshmem collective routine, undefined behavior results. @@ -204,7 +204,7 @@ following conditions must be met (synchronization via a \OPR{barrier} or some other method is often needed to ensure this): The \VAR{pWrk} and \VAR{pSync} arrays on all \acp{PE} in the \activeset{} are not still in use from a prior call to a - collective \openshmem{} routine. The \dest{} array on all \acp{PE} in the + collective \openshmem routine. The \dest{} array on all \acp{PE} in the \activeset{} is ready to accept the results of the \OPR{reduction}. Upon return from a reduction routine, the following are true for the local @@ -260,11 +260,11 @@ } \apinotes{ - All \openshmem{} reduction routines reset the values in \VAR{pSync} before they + All \openshmem reduction routines reset the values in \VAR{pSync} before they return, so a particular \VAR{pSync} buffer need only be initialized the first time it is used. The user must ensure that the \VAR{pSync} array is not being updated on any \ac{PE} in the \activeset{} while any of the \acp{PE} participate in processing of an - \openshmem{} reduction routine. Be careful to avoid the following situations: If + \openshmem reduction routine. Be careful to avoid the following situations: If the \VAR{pSync} array is initialized at run time, some type of synchronization is needed to ensure that all \acp{PE} in the working set have initialized \VAR{pSync} before any of them enter an \openshmem routine called with the From 66a3790a515998f667a7aa7fd1ecb30b427cb965 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 19:38:25 -0400 Subject: [PATCH 349/583] Undo capitalization of "Collective Routines" from #105 --- content/collective_intro.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 591c50c2b..93520478f 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -1,4 +1,4 @@ -\emph{Collective Routines} are defined as communication or synchronization +\emph{Collective routines} are defined as communication or synchronization operations on a group of \acp{PE} called an active set. The collective routines require all \acp{PE} in the active set to simultaneously call the routine. A \ac{PE} that is not a part of the active set calling the collective From f2a225f983ff08046df19b970f63fcd76da9db64 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 20:02:45 -0400 Subject: [PATCH 350/583] Remove defs only used in `collective_intro.tex` --- content/collective_intro.tex | 20 ++++++++++---------- utils/defs.tex | 8 -------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 93520478f..fec4cc68c 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -20,7 +20,7 @@ restored to its original contents. The user is permitted to reuse a \VAR{pSync} array if all previous collective routines using the \VAR{pSync} array have been completed by all participating \acp{PE}. One can use a synchronization -collective routine such as \barrier to ensure completion of previous collective +collective routine such as \FUNC{shmem\_barrier} to ensure completion of previous collective routines. The \FUNC{shmem\_barrier} routine allows the same \VAR{pSync} array to be used on consecutive calls as long as the \acp{PE} in the active set does not change. @@ -29,12 +29,12 @@ the \openshmem specification are: \begin{itemize} -\item[] \broadcast -\item[] \barrier -\item[] \barrierall -\item[] \collect -\item[] \fcollect -\item[] \reduction -\item[] \alltoall -\item[] \alltoalls -\end{itemize} +\item \FUNC{shmem\_barrier\_all} +\item \FUNC{shmem\_barrier} +\item \FUNC{shmem\_broadcast\{32, 64\}} +\item \FUNC{shmem\_collect\{32, 64\}} +\item \FUNC{shmem\_fcollect\{32, 64\}} +\item Reductions for the following operations: AND, MAX, MIN, SUM, PROD, OR, XOR +\item \FUNC{shmem\_alltoall\{32, 64\}} +\item \FUNC{shmem\_alltoalls\{32, 64\}} +\end{itemize} diff --git a/utils/defs.tex b/utils/defs.tex index cb52c2b4d..365719c85 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -55,14 +55,6 @@ \newcommand{\PUT}{\textit{Put}} \newcommand{\GET}{\textit{Get}} \newcommand{\OPR}[1]{\textit{#1}} -\newcommand{\barrier}{\FUNC{SHMEM\_BARRIER}\xspace} % why here an not others? -\newcommand{\barrierall}{\FUNC{SHMEM\_BARRIER\_ALL}\xspace} % why here an not others? -\newcommand{\broadcast}{\FUNC{SHMEM\_BROADCAST}} -\newcommand{\collect}{\FUNC{SHMEM\_COLLECT}} -\newcommand{\fcollect}{\FUNC{SHMEM\_FCOLLECT}} -\newcommand{\reduction}{\textit{Reduction Operations}} -\newcommand{\alltoall}{\FUNC{SHMEM\_ALLTOALL}} -\newcommand{\alltoalls}{\FUNC{SHMEM\_ALLTOALLS}} \newcommand{\shmemprefix}{\textit{SHMEM\_}} \newcommand{\shmemprefixLC}{\textit{shmem\_}} \newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} From 0366557256e1b1e805d597daa262e4fa50ae6673 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 22:54:13 -0400 Subject: [PATCH 351/583] Added reduction operations to Table of Contents - Increased TOC depth level up to `\paragraph` - Changed `\paragraph` styling to bold face - Converted inline reduction-operation headers to `\paragraph` --- content/frontmatter.tex | 2 +- content/shmem_reductions.tex | 20 +++++++------------- utils/defs.tex | 9 +++++++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/content/frontmatter.tex b/content/frontmatter.tex index 3cca04d82..72cdca489 100644 --- a/content/frontmatter.tex +++ b/content/frontmatter.tex @@ -15,7 +15,7 @@ \input{content/coverpage} \setcounter{tocdepth}{4} -\setcounter{secnumdepth}{3} +\setcounter{secnumdepth}{4} \tableofcontents \mainmatter % included for use of documenttype 'book' diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 52d1a7c64..8030d06f9 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -4,7 +4,7 @@ \begin{apidefinition} -\textbf{AND} \newline +\paragraph{AND} Performs a bitwise AND function across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); @@ -18,8 +18,7 @@ CALL SHMEM_INT8_AND_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} -\bigskip -\textbf{MAX} \newline +\paragraph{MAX} Performs a maximum function reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); @@ -39,8 +38,7 @@ CALL SHMEM_REAL16_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} -\bigskip -\textbf{MIN} \newline +\paragraph{MIN} Performs a minimum function reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); @@ -60,8 +58,7 @@ CALL SHMEM_REAL16_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} -\bigskip -\textbf{SUM} \newline +\paragraph{SUM} Performs a sum reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| @@ -85,8 +82,7 @@ CALL SHMEM_REAL16_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} -\bigskip -\textbf{PROD} \newline +\paragraph{PROD} Performs a product reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| @@ -110,8 +106,7 @@ CALL SHMEM_REAL16_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} -\bigskip -\textbf{OR} \newline +\paragraph{OR} Performs a bitwise OR function reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); @@ -125,8 +120,7 @@ CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, |\mbox{pSync)}| \end{Fsynopsis} -\bigskip -\textbf{XOR}\newline +\paragraph{XOR} Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); diff --git a/utils/defs.tex b/utils/defs.tex index 365719c85..48fcaa9b3 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -138,6 +138,10 @@ % % Use Sans Serif font for sections, etc. % +% FIXME? `\bf` should be `\textbf` if you want to preserve the sans-serif font +% at subsubsection and paragraph. In my opinion, the serif font looks better +% anyway. -- Bryant Lam +% \makeatletter \def\section{\@startsection {section}{1}{\z@}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus .2ex}{\Large\sf}} @@ -145,8 +149,9 @@ -.2ex}{1.5ex plus .2ex}{\large\sf}} \def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-3.25ex plus -1ex minus -.2ex}{1.5ex plus .2ex}{\normalsize\sf\bf}} -\def\paragraph{\@startsection {paragraph}{4}{\z@}{3.25ex plus 1ex -minus .2ex}{-1em}{\normalsize\sf}} +\def\paragraph{\@startsection {paragraph}{4}{\z@}{3.25ex plus 1ex minus .2ex} +{-1em}{\normalsize\sf\bf}} % Indent after \paragraph +%{.1pt}{\normalsize\sf\bf}} % Newline after \paragraph \makeatother % % End use Sans Serif font for sections, etc. S. Otto From 3eb24eed5081388a046276656a1ffde3ca502910 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 23:05:36 -0400 Subject: [PATCH 352/583] Consistency for reduction-operation descriptions --- content/shmem_reductions.tex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 8030d06f9..c58c3d50b 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -5,7 +5,7 @@ \begin{apidefinition} \paragraph{AND} -Performs a bitwise AND function across a set of processing elements (\acp{PE}).\newline +Performs a bitwise AND reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_and_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -19,7 +19,7 @@ \end{Fsynopsis} \paragraph{MAX} -Performs a maximum function reduction across a set of processing elements (\acp{PE}).\newline +Performs a maximum-function reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -39,7 +39,7 @@ \end{Fsynopsis} \paragraph{MIN} -Performs a minimum function reduction across a set of processing elements (\acp{PE}).\newline +Performs a minimum-function reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -107,7 +107,7 @@ \end{Fsynopsis} \paragraph{OR} -Performs a bitwise OR function reduction across a set of processing elements (\acp{PE}).\newline +Performs a bitwise OR reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_or_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -121,7 +121,7 @@ \end{Fsynopsis} \paragraph{XOR} -Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\acp{PE}).\newline +Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_xor_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); From cf56a2e5785511de66dbe8d7ed7e1ea00214696f Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 29 Aug 2017 23:41:53 -0400 Subject: [PATCH 353/583] Reword `collectives_intro.tex` --- content/collective_intro.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index fec4cc68c..b5b585d02 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -1,10 +1,10 @@ \emph{Collective routines} are defined as communication or synchronization operations on a group of \acp{PE} called an active set. The collective routines require all \acp{PE} in the active set to simultaneously call the -routine. A \ac{PE} that is not a part of the active set calling the collective -routines results in an undefined behavior. All collective routines have an -active set as an input parameter except \FUNC{shmem\_barrier\_all}. -The \FUNC{shmem\_barrier\_all} has to be called by all \acp{PE} of the +routine. A \ac{PE} that is not in the active set calling the collective +routine results in undefined behavior. All collective routines have an +active set as an input parameter except \FUNC{shmem\_barrier\_all}; +\FUNC{shmem\_barrier\_all} has to be called by all \acp{PE} of the \openshmem program. The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, From 60e8783651056790ba373fac48a9161f4c4e5cc2 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 00:02:37 -0400 Subject: [PATCH 354/583] Typo --- content/shmem_reductions.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index c58c3d50b..08ac2a5f9 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -216,7 +216,7 @@ } \apidesctable{ - When calling from \Fortran, the \dest{} date types are as follows: + When calling from \Fortran, the \dest{} data types are as follows: }{Routine}{Data type} \apitablerow{shmem\_int8\_and\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_and\_to\_all}{Integer, with an element size of 4 bytes.} From d45bbe1ee7ba1336401ba8e42f57f5c987e16ecf Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 00:08:17 -0400 Subject: [PATCH 355/583] Reword: 'has to' --> 'must' --- content/collective_intro.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index b5b585d02..c627a03ed 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -4,7 +4,7 @@ routine. A \ac{PE} that is not in the active set calling the collective routine results in undefined behavior. All collective routines have an active set as an input parameter except \FUNC{shmem\_barrier\_all}; -\FUNC{shmem\_barrier\_all} has to be called by all \acp{PE} of the +\FUNC{shmem\_barrier\_all} must be called by all \acp{PE} of the \openshmem program. The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, From 921ad44dfac4342d123dd59e458524140f4a3623 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 30 Aug 2017 06:44:16 -0700 Subject: [PATCH 356/583] Edits from @nspark Signed-off-by: James Dinan --- content/shmem_calloc.tex | 4 ++-- content/shmem_info_get_name.tex | 2 +- content/shmem_init.tex | 4 ++-- content/shmem_malloc.tex | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/shmem_calloc.tex b/content/shmem_calloc.tex index 0701a4cc5..70e0ab028 100644 --- a/content/shmem_calloc.tex +++ b/content/shmem_calloc.tex @@ -23,7 +23,7 @@ If the allocation succeeds, the pointer returned shall be suitably aligned so that it may be assigned to a pointer to any type of object. If the allocation does not succeed, or either \VAR{count} or \VAR{size} is - \CONST{0}, the return value is a \const{NULL} pointer. + \CONST{0}, the return value is a null pointer. The values for \VAR{count} and \VAR{size} shall each be equal across all \acp{PE} calling \FUNC{shmem\_calloc}; otherwise, the behavior is @@ -35,7 +35,7 @@ \apireturnvalues{ The \FUNC{shmem\_calloc} routine returns a pointer to the lowest byte - address of the allocated space; otherwise, it returns a \const{NULL} pointer. + address of the allocated space; otherwise, it returns a null pointer. } \apinotes{ diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index cc50b380f..776d50c5b 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -24,7 +24,7 @@ this function provides the \VAR{name} memory buffer of at least size \CONST{SHMEM\_MAX\_NAME\_LEN}. The implementation copies the vendor defined string of size at most \CONST{SHMEM\_MAX\_NAME\_LEN} to \VAR{name}. In - \CorCpp{}, the string is terminated by a null character. In \Fortran{}, + \CorCpp, the string is terminated by a null character. In \Fortran, the string of size less than \CONST{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size \CONST{SHMEM\_MAX\_NAME\_LEN}. If the \VAR{name} memory buffer is provided with size less than diff --git a/content/shmem_init.tex b/content/shmem_init.tex index 93af5e37e..f901fcc46 100644 --- a/content/shmem_init.tex +++ b/content/shmem_init.tex @@ -33,7 +33,7 @@ } \apinotes{ - As of \openshmem 1.2, the use of \FUNC{start\_pes} has been + As of \openshmem[1.2], the use of \FUNC{start\_pes} has been deprecated and is replaced with \FUNC{shmem\_init}. While support for \FUNC{start\_pes} is still required in \openshmem libraries, users are encouraged to use \FUNC{shmem\_init}. An important difference between @@ -46,7 +46,7 @@ \begin{apiexamples} \apifexample - { The following \FUNC{shmem\_init} example is for \Cstd{11} programs: } +{ The following \FUNC{shmem\_init} example is for \Cstd[11] programs: } { example_code/shmem_init_example.c } {} diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index dca7c3dff..d9ed2040a 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -31,7 +31,7 @@ The \FUNC{shmem\_free} routine causes the block to which \VAR{ptr} points to be deallocated, that is, made available for further allocation. If \VAR{ptr} is a - \const{NULL} pointer, no action occurs. + null pointer, no action occurs. The \FUNC{shmem\_realloc} routine changes the size of the block to which \VAR{ptr} points to the size (in bytes) specified by \VAR{size}. The contents @@ -74,7 +74,7 @@ } \apinotes{ - As of Specification 1.2 the use of \FUNC{shmalloc}, \FUNC{shmemalign}, + As of \openshmem[1.2] the use of \FUNC{shmalloc}, \FUNC{shmemalign}, \FUNC{shfree}, and \FUNC{shrealloc} has been deprecated. Although OpenSHMEM libraries are required to support the calls, users are encouraged to use \FUNC{shmem\_malloc}, \FUNC{shmem\_align}, \FUNC{shmem\_free}, and From 8947dee2ae61e9ed032315aa2688dabcc25662a3 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 30 Aug 2017 06:56:47 -0700 Subject: [PATCH 357/583] Reference 1.2 spec using \openshmem[1.2] macro Signed-off-by: James Dinan --- content/shmem_my_pe.tex | 4 ++-- content/shmem_n_pes.tex | 2 +- content/start_pes.tex | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/shmem_my_pe.tex b/content/shmem_my_pe.tex index 48d44e0b5..831df9a55 100644 --- a/content/shmem_my_pe.tex +++ b/content/shmem_my_pe.tex @@ -29,8 +29,8 @@ } \apinotes{ - Each \ac{PE} has a unique number or identifier. As of \openshmem Specification - 1.2 the use of \FUNC{\_my\_pe} has been deprecated. Although \openshmem + Each \ac{PE} has a unique number or identifier. As of \openshmem[1.2] + the use of \FUNC{\_my\_pe} has been deprecated. Although \openshmem libraries are required to support the call, users are encouraged to use \FUNC{shmem\_my\_pe} instead. The behavior and signature of the routine \FUNC{shmem\_my\_pe} remains unchanged from the deprecated \FUNC{\_my\_pe} diff --git a/content/shmem_n_pes.tex b/content/shmem_n_pes.tex index 433d89b6d..94285f7cc 100644 --- a/content/shmem_n_pes.tex +++ b/content/shmem_n_pes.tex @@ -26,7 +26,7 @@ } \apinotes{ - As of \openshmem Specification 1.2 the use of \FUNC{\_num\_pes} has been + As of \openshmem[1.2] the use of \FUNC{\_num\_pes} has been deprecated. Although \openshmem libraries are required to support the call, users are encouraged to use \FUNC{shmem\_n\_pes} instead. The behavior and signature of the routine \FUNC{shmem\_n\_pes} remains unchanged from the diff --git a/content/start_pes.tex b/content/start_pes.tex index 6b9b08e3f..e029cb230 100644 --- a/content/start_pes.tex +++ b/content/start_pes.tex @@ -43,7 +43,7 @@ Calling \FUNC{start\_pes} more than once has no subsequent effect. - As of \openshmem Specification 1.2 the use of \FUNC{start\_pes} has + As of \openshmem[1.2] the use of \FUNC{start\_pes} has been deprecated. Although \openshmem libraries are required to support the call, program users are encouraged to use \FUNC{shmem\_init} instead. } From bd8d0e89994b0101fd7a289d7bf5d57cab918dc9 Mon Sep 17 00:00:00 2001 From: Swen Boehm Date: Wed, 30 Aug 2017 10:39:51 -0400 Subject: [PATCH 358/583] Some cleanup in shmem reductions --- content/shmem_reductions.tex | 59 +++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 6a3184f33..f59592255 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -1,5 +1,7 @@ \apisummary{ - Performs arithmetic and logical operations across a set of \acp{PE}. + %Performs arithmetic and logical operations across a set of \acp{PE}. + The following functions perform reduction operations across all + \acp{PE} in a set of \acp{PE}. } \begin{apidefinition} @@ -173,57 +175,61 @@ must be initialized with the value \CONST{SHMEM\_SYNC\_VALUE} (in \CorCpp) or \CONST{SHMEM\_SYNC\_VALUE} (in \Fortran) before any of the \acp{PE} in the \activeset{} enter the reduction routine.} - \end{apiarguments} \apidescription{ \openshmem reduction routines compute one or more reductions across symmetric arrays on multiple \acp{PE}. A reduction performs an associative binary routine - across a set of values. - + across a set of values. + The \VAR{nreduce} argument determines the number of separate reductions to perform. The \source{} array on all \acp{PE} in the \activeset{} provides one element for each reduction. The results of the reductions are placed in the \dest{} array on all \acp{PE} in the \activeset. The \activeset{} is defined by the \VAR{PE\_start}, \VAR{logPE\_stride}, \VAR{PE\_size} triplet. - + The \source{} and \dest{} arrays may be the same array, but they may not be overlapping arrays. - + As with all \openshmem collective routines, each of these routines assumes - that only \acp{PE} in the \activeset{} call the routine. If a \ac{PE} not in - the \activeset{} calls an \openshmem collective routine, undefined behavior - results. - + that only \acp{PE} in the \activeset{} call the routine. + %If a \ac{PE} not in the \activeset{} calls an \openshmem collective routine, undefined behavior results. + A call to an \openshmem collective routine by a \ac{PE} not in the + active set results in undefined behavior. + The values of arguments \VAR{nreduce}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \acp{PE} in the \activeset. The same \dest{} - and \source{} arrays, and the same \VAR{pWrk} and \VAR{pSync} work arrays, must + and \source{} arrays, and the same \VAR{pWrk} and \VAR{pSync} arrays, must be passed to all \acp{PE} in the \activeset. %FIXME: Reword 'the following conditions must be met.' Before any \ac{PE} calls a reduction routine, the following conditions must be met (synchronization via a \OPR{barrier} or some other method is often needed to ensure this): The \VAR{pWrk} and \VAR{pSync} arrays on all \acp{PE} in the \activeset{} are not still in use from a prior call to a - collective \openshmem routine. The \dest{} array on all \acp{PE} in the - \activeset{} is ready to accept the results of the \OPR{reduction}. - + collective \openshmem routine. Additionally, the \dest{} array on + all \acp{PE} in the \activeset{} is ready to accept the results of + the \OPR{reduction}. + Upon return from a reduction routine, the following are true for the local - \ac{PE}: The \dest{} array is updated and the \source{} array may be safely reused. + \ac{PE}: The \dest{} array is updated and the \source{} array may be safely reused. The values in the \VAR{pSync} array are restored to the original values. - The sum and product reduction routines include complex-typed interfaces - for the \Cstd API only. - When the \Cstd translation environment does not support complex types% - \footnote{That is, under \Cstd language standards prior to \Cstd[99] or - under \Cstd[11] when \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, - an \openshmem implementation is not required to provide support for - these complex-typed interfaces. + The sum and product reduction routines include complex-typed + interfaces. When the \Cstd translation environment does not support + complex types\footnote{That is, under \Cstd language standards prior + to \Cstd[99] or under \Cstd[11] when + \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, an \openshmem + implementation is not required to provide support for these + complex-typed interfaces. } + +{ +\deprecationstart \apidesctable{ When calling from \Fortran, the \dest{} date types are as follows: -}{Routine}{Data type} +}{Routine}{Data type}{ \apitablerow{shmem\_int8\_and\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_and\_to\_all}{Integer, with an element size of 4 bytes.} \apitablerow{shmem\_comp8\_max\_to\_all}{Complex, with an element size equal to two 8-byte real values.} @@ -243,8 +249,8 @@ \apitablerow{shmem\_real4\_sum\_to\_all}{Real, with an element size of 4 bytes.} \apitablerow{shmem\_real8\_sum\_to\_all}{Real, with an element size of 8 bytes.} \apitablerow{shmem\_real16\_sum\_to\_all}{Real, with an element size of 16 bytes.} - \apitablerow{shmem\_comp4\_prod\_to\_all}{ Complex, with an element size equal to two 4-byte real values. } - \apitablerow{shmem\_comp8\_prod\_to\_all}{ Complex, with an element size equal to two 8-byte real values.} + \apitablerow{shmem\_comp4\_prod\_to\_all}{Complex, with an element size equal to two 4-byte real values.} + \apitablerow{shmem\_comp8\_prod\_to\_all}{Complex, with an element size equal to two 8-byte real values.} \apitablerow{shmem\_int4\_prod\_to\_all}{Integer, with an element size of 4 bytes.} \apitablerow{shmem\_int8\_prod\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_real4\_prod\_to\_all}{Real, with an element size of 4 bytes.} @@ -254,6 +260,9 @@ \apitablerow{shmem\_int4\_or\_to\_all}{Integer, with an element size of 4 bytes.} \apitablerow{shmem\_int8\_xor\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_xor\_to\_all}{Integer, with an element size of 4 bytes.} +} +\deprecationend +} \apireturnvalues{ None. From ecd9ba862b958779b369533abd4c661a3703a071 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 11:33:43 -0400 Subject: [PATCH 359/583] Reword: "maximum-function" --> "maximum-value" --- content/shmem_reductions.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 08ac2a5f9..8d49be9ce 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -19,7 +19,7 @@ \end{Fsynopsis} \paragraph{MAX} -Performs a maximum-function reduction across a set of processing elements (\acp{PE}).\newline +Performs a maximum-value reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -39,7 +39,7 @@ \end{Fsynopsis} \paragraph{MIN} -Performs a minimum-function reduction across a set of processing elements (\acp{PE}).\newline +Performs a minimum-value reduction across a set of processing elements (\acp{PE}).\newline \begin{Csynopsis} void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); From ed79051418a8269b500233ee5a5c70f1aa1f66c1 Mon Sep 17 00:00:00 2001 From: "David M. Ozog" Date: Wed, 30 Aug 2017 11:45:01 -0400 Subject: [PATCH 360/583] adding Fortran var cond for cswap --- content/shmem_atomic_compare_swap.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index 9382324b3..d4a7e8a40 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -46,8 +46,8 @@ atomic operation. } \apidesctable{ - When using \Fortran, \VAR{dest} and \VAR{value} must be of the following type: -}{Routine}{Data type of \VAR{dest} and \VAR{value}} + When using \Fortran, \VAR{dest}, \VAR{cond}, and \VAR{value} must be of the following type: +}{Routine}{Data type of \VAR{dest}, \VAR{cond}, and \VAR{value}} \apitablerow{SHMEM\_INT4\_CSWAP}{\CONST{4}-byte integer.} \apitablerow{SHMEM\_INT8\_CSWAP}{\CONST{8}-byte integer.} From b310e00719419d8f224e6e322e7fb56306267417 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 30 Aug 2017 10:43:09 -0700 Subject: [PATCH 361/583] Fix labels for threads section Signed-off-by: James Dinan --- main_spec.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main_spec.tex b/main_spec.tex index dd1037709..33553a225 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -102,15 +102,15 @@ \subsubsection{\textbf{SHPDEALLOC}}\label{subsec:shpdealloc} \input{content/shpdealloc.tex} \subsection{Thread Support} -\input{content/threads_intro.tex} \label{subsec:thread_support} +\input{content/threads_intro.tex} \subsubsection{\textbf{SHMEM\_INIT\_THREAD}} -\input{content/shmem_init_thread} \label{subsec:shmem_init_thread} +\input{content/shmem_init_thread} \subsubsection{\textbf{SHMEM\_QUERY\_THREAD}} -\input{content/shmem_query_thread} \label{subsec:shmem_query_thread} +\input{content/shmem_query_thread} \subsection{Remote Memory Access Routines}\label{sec:rma} \input{content/rma_intro.tex} From f9814df3edaafc9fbf53d027c1bc400fa17e6f53 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Wed, 30 Aug 2017 10:47:51 -0700 Subject: [PATCH 362/583] Move threading section to follow library setup, etc. Signed-off-by: James Dinan --- main_spec.tex | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/main_spec.tex b/main_spec.tex index 33553a225..141ce8978 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -79,6 +79,18 @@ \subsubsection{\textbf{SHMEM\_INFO\_GET\_NAME}}\label{subsec:shmem_info_get_name \subsubsection{\textbf{START\_PES}}\label{subsec:start_pes} \input{content/start_pes} +\subsection{Thread Support} +\label{subsec:thread_support} +\input{content/threads_intro.tex} + +\subsubsection{\textbf{SHMEM\_INIT\_THREAD}} +\label{subsec:shmem_init_thread} +\input{content/shmem_init_thread} + +\subsubsection{\textbf{SHMEM\_QUERY\_THREAD}} +\label{subsec:shmem_query_thread} +\input{content/shmem_query_thread} + \subsection{Memory Management Routines} \label{sec:mem_routines} @@ -101,17 +113,6 @@ \subsubsection{\textbf{SHPCLMOVE}}\label{subsec:shpclmove} \subsubsection{\textbf{SHPDEALLOC}}\label{subsec:shpdealloc} \input{content/shpdealloc.tex} -\subsection{Thread Support} -\label{subsec:thread_support} -\input{content/threads_intro.tex} - -\subsubsection{\textbf{SHMEM\_INIT\_THREAD}} -\label{subsec:shmem_init_thread} -\input{content/shmem_init_thread} -\subsubsection{\textbf{SHMEM\_QUERY\_THREAD}} -\label{subsec:shmem_query_thread} -\input{content/shmem_query_thread} - \subsection{Remote Memory Access Routines}\label{sec:rma} \input{content/rma_intro.tex} From a88d5f34c103b30b9c6666b77e3fa3f1dd0a3b72 Mon Sep 17 00:00:00 2001 From: swaroop Date: Wed, 30 Aug 2017 14:06:14 -0400 Subject: [PATCH 363/583] Changes to collectives chapter. --- content/collective_intro.tex | 21 +++++++++++---------- content/shmem_barrier.tex | 21 +++++++++++---------- content/shmem_barrier_all.tex | 4 ++-- content/shmem_broadcast.tex | 22 +++++++++++----------- content/shmem_collect.tex | 15 ++++++++------- 5 files changed, 43 insertions(+), 40 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index d8736467c..0d3893fd9 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -1,16 +1,16 @@ -\emph{Collective routines} are defined as communication or synchronization -operations on a group of \acp{PE} called an \activeset. The collective -routines require all \acp{PE} in the \activeset to simultaneously call the -routine. A \ac{PE} that is not a part of the \activeset calling the collective +\emph{Collective Routines} are defined as communication or synchronization +operations on a group of \acp{PE} called an active set. The collective +routines require all \acp{PE} in the active set to simultaneously call the +routine. A \ac{PE} that is not a part of the active set calling the collective routines results in an undefined behavior. All collective routines have an -\activeset as an input parameter except \FUNC{shmem\_barrier\_all}. -The \FUNC{shmem\_barrier\_all} has to be called by all \acp{PE} of the -\openshmem program. +active set as an input parameter except \FUNC{shmem\_barrier\_all}. The \FUNC{shmem\_barrier\_all} must be +called by all \acp{PE} of the \openshmem program. + The \activeset is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}. \VAR{PE\_start} is the starting \ac{PE} number, a log (base 2) of \VAR{logPE\_stride} is the stride between \acp{PE}, and \VAR{PE\_size} is -the number of \acp{PE} participating in the \activeset. All \acp{PE} +the number of \acp{PE} participating in the active set. All \acp{PE} participating in the collective routine must provide the same values for these arguments. @@ -20,9 +20,10 @@ restored to its original contents. The user is permitted to reuse a \VAR{pSync} array if all previous collective routines using the \VAR{pSync} array have been completed by all participating \acp{PE}. One can use a synchronization -collective routine such as \barrier to ensure completion of previous collective +collective routine such as \FUNC{shmem\_barrier} to ensure completion of previous collective routines. The \FUNC{shmem\_barrier} routine allows the same \VAR{pSync} array to -be used on consecutive calls as long as the \acp{PE} in the \activeset does not change. +be used on consecutive calls as long as the \acp{PE} in the active set does not change. + All collective routines defined in the specification are blocking. The collective routines return on completion. The collective routines defined in diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 5ac219d4d..df2a749d5 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -1,6 +1,6 @@ \apisummary{ Performs all operations described in the \FUNC{shmem\_barrier\_all} interface - but with respect to a subset of \acp{PE} defined by the \activeset. + but with respect to a subset of \acp{PE} defined by the active set. } \begin{apidefinition} @@ -37,21 +37,22 @@ \apidescription{ \FUNC{shmem\_barrier} is a collective synchronization routine over an - \activeset. Control returns from \FUNC{shmem\_barrier} after all \acp{PE} in - the \activeset (specified by \VAR{PE\_start}, \VAR{logPE\_stride}, and + active set. Control returns from \FUNC{shmem\_barrier} after all \acp{PE} in + the active set (specified by \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}) have called \FUNC{shmem\_barrier}. As with all \openshmem collective routines, each of these routines assumes that - only \acp{PE} in the \activeset call the routine. If a \ac{PE} not in the - \activeset calls an \openshmem collective routine, undefined behavior results. + only \acp{PE} in the active set call the routine. If a \ac{PE} not in the + active set calls an \openshmem collective routine, undefined behavior results. The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} - must be equal on all \acp{PE} in the \activeset. The same work array must be - passed in \VAR{pSync} to all \acp{PE} in the \activeset. + must be the same value on all \acp{PE} in the active set. The same work array must be + passed in \VAR{pSync} to all \acp{PE} in the active set. \FUNC{shmem\_barrier} ensures that all previously issued stores and remote - memory updates, including \acp{AMO} and \ac{RMA} operations, done by any of the - \acp{PE} in the \activeset are complete before returning. + memory updates, including \acp{AMO} and \ac{RMA} operations, issued by any of the + \acp{PE} in the active set are complete before returning. + The same \VAR{pSync} array may be reused on consecutive calls to \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. @@ -66,7 +67,7 @@ synchronization, for example, a call to \FUNC{shmem\_barrier\_all}, before calling \FUNC{shmem\_barrier} for the first time. - If the \activeset does not change, \FUNC{shmem\_barrier} can be called + If the active set does not change, \FUNC{shmem\_barrier} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization beyond that implied by \FUNC{shmem\_barrier} itself is necessary in this case. diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 97b7ea36e..259bc2ca2 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -22,9 +22,9 @@ \apidescription{ The \FUNC{shmem\_barrier\_all} routine registers the arrival of a \ac{PE} at - a barrier. Barriers are a fast mechanism for synchronizing all \acp{PE} at + a barrier. Barriers are a mechanism for synchronizing all \acp{PE} at once. This routine causes a \ac{PE} to suspend execution until all \acp{PE} - have called \FUNC{shmem\_barrier\_all}. This routine must be used with + have called \FUNC{shmem\_barrier\_all}. This routine must be called by all \acp{PE} started by \FUNC{shmem\_init}. Prior to synchronizing with other \acp{PE}, \FUNC{shmem\_barrier\_all} diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index 2961d05b2..91b64bfa9 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -58,24 +58,24 @@ on the root \ac{PE}. As with all \openshmem collective routines, each of these routines assumes that - only \acp{PE} in the \activeset{} call the routine. If a \ac{PE} not in the - \activeset{} calls an \openshmem collective routine, undefined behavior results. + only \acp{PE} in the active set call the routine. If a \ac{PE} not in the + active set calls an \openshmem collective routine, undefined behavior results. The values of arguments \VAR{PE\_root}, \VAR{PE\_start}, \VAR{logPE\_stride}, - and \VAR{PE\_size} must be equal on all \acp{PE} in the \activeset. The same + and \VAR{PE\_size} must be the same value on all \acp{PE} in the active set. The same \dest{} and \source{} data objects and the same \VAR{pSync} work array must be - passed to all \acp{PE} in the \activeset. + passed to all \acp{PE} in the active set. Before any \ac{PE} calls a broadcast routine, the following conditions must be met: (synchronization via a barrier or some other method is often needed to ensure this): The \VAR{pSync} array on all \acp{PE} in the - \activeset{} is not still in use from a prior call to a broadcast routine. The - \dest{} array on all \acp{PE} in the \activeset{} is ready to accept the + active set is not still in use from a prior call to a broadcast routine. The + \dest{} array on all \acp{PE} in the active set is ready to accept the broadcast data. Upon return from a broadcast routine, the following are true for the local \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object - is updated. The \source{} data object may be safely reused. + is updated. The \source{} data object on the root \ac{PE} may be safely reused. The values in the \VAR{pSync} array are restored to the original values. } @@ -101,14 +101,14 @@ require that \VAR{pSync} be reinitialized after the first call. The user must ensure that the \VAR{pSync} array is not being updated by any - \ac{PE} in the \activeset{} while any of the \acp{PE} participates in processing + \ac{PE} in the active set while any of the \acp{PE} participates in processing of an \openshmem broadcast routine. Be careful to avoid these situations: If the - \VAR{pSync} array is initialized at run time, some type of synchronization is - needed to ensure that all \acp{PE} in the \activeset{} have initialized + \VAR{pSync} array is initialized at run time, before its first use, some type of synchronization is + needed to ensure that all \acp{PE} in the active set have initialized \VAR{pSync} before any of them enter an \openshmem routine called with the \VAR{pSync} synchronization array. A \VAR{pSync} array may be reused on a subsequent \openshmem broadcast routine only if none of the \acp{PE} in the - \activeset{} are still processing a prior \openshmem broadcast routine call that + active set are still processing a prior \openshmem broadcast routine call that used the same \VAR{pSync} array. In general, this can be ensured only by doing some type of synchronization. } diff --git a/content/shmem_collect.tex b/content/shmem_collect.tex index ed8a5b549..60b2377cf 100644 --- a/content/shmem_collect.tex +++ b/content/shmem_collect.tex @@ -29,7 +29,7 @@ \begin{apiarguments} \apiargument{OUT}{dest}{A symmetric array. The \dest{} argument must be large enough - to accept the concatenation of the \source{} arrays on all \acp{PE}. The data + to accept the concatenation of the \source{} arrays on all participating \acp{PE}. The data types are as follows: For \FUNC{shmem\_collect8}, \FUNC{shmem\_collect64}, \FUNC{shmem\_fcollect8}, and \FUNC{shmem\_fcollect64}, any data type with an element size of 64 bits. \Fortran derived types, \Fortran character type, @@ -69,18 +69,19 @@ resultant \dest{} array contains the contribution from \ac{PE} \VAR{PE\_start} first, then the contribution from \ac{PE} \VAR{PE\_start} + \VAR{PE\_stride} second, and so on. The collected result is written to the \dest{} array for all - \acp{PE} in the \activeset. + \acp{PE} in the active set. The \FUNC{fcollect} routines require that \VAR{nelems} be the same value in all participating \acp{PE}, while the \FUNC{collect} routines allow \VAR{nelems} to vary from \ac{PE} to \ac{PE}. As with all \openshmem collective routines, each of these routines assumes that - only \acp{PE} in the \activeset{} call the routine. If a \ac{PE} not in the - \activeset{} and calls this collective routine, the behavior is undefined. + only \acp{PE} in the active set call the routine. If a \ac{PE} not in the + active set and calls this collective routine, the behavior is undefined. The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} - must be equal on all \acp{PE} in the \activeset. The same \dest{} and \source{} + must be the same value on all \acp{PE} in the active set. The same \dest{} and \source{} + arrays and the same \VAR{pSync} work array must be passed to all \acp{PE} in the \activeset. @@ -100,14 +101,14 @@ time it is used. The user must ensure that the \VAR{pSync} array is not being updated on any \ac{PE} - in the \activeset{} while any of the \acp{PE} participate in processing of an + in the active set while any of the \acp{PE} participate in processing of an \openshmem collective routine. Be careful to avoid these situations: If the \VAR{pSync} array is initialized at run time, some type of synchronization is needed to ensure that all \acp{PE} in the working set have initialized \VAR{pSync} before any of them enter an \openshmem routine called with the \VAR{pSync} synchronization array. A \VAR{pSync} array can be reused on a subsequent \openshmem collective routine only if none of the \acp{PE} in the - \activeset{} are still processing a prior \openshmem collective routine call + active set are still processing a prior \openshmem collective routine call that used the same \VAR{pSync} array. In general, this may be ensured only by doing some type of synchronization. From 3949c47f6379b02eb1e60b40541d3ece67934d58 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 14:29:00 -0400 Subject: [PATCH 364/583] Annex A: Made captions more precise --- content/backmatter.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index d54ba49dc..ab196cf04 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -31,9 +31,9 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{caption={``Hello World'' example program (C)},label=openshmem-hello,language=OSH2+C} +\numberedlisting{caption={``Hello World'' example program in \Cstd},label=openshmem-hello,language=OSH2+C} {example_code/hello-openshmem.c} -\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello} (4 processors)}} +\outputlisting{language=bash,caption={Possible ordering of expected output with 4 \acp{PE} from the program in Listing~\ref{openshmem-hello}}} {example_code/hello-openshmem-c.output} \vspace{0.1in} \end{minipage} @@ -42,9 +42,9 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{caption={``Hello World'' example program (Fortran)},label=openshmem-hello-f90,language=OSH2+F} +\numberedlisting{caption={``Hello World'' example program in \Fortran},label=openshmem-hello-f90,language=OSH2+F} {example_code/hello-openshmem.f90} -\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello-f90} (4 processors)}} +\outputlisting{language=bash,caption={Possible ordering of expected output with 4 \acp{PE} from the program in Listing~\ref{openshmem-hello-f90}}} {example_code/hello-openshmem-f90.output} \vspace{0.1in} \end{minipage} @@ -64,9 +64,9 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \begin{minipage}{\linewidth} \vspace{0.1in} -\numberedlisting{caption={Symmetric data objects example program},label=openshmem-hello-symmetric,language=OSH2+C} +\numberedlisting{caption={Example program with symmetric data objects},label=openshmem-hello-symmetric,language=OSH2+C} {example_code/writing_shmem_example.c} -\outputlisting{language=bash,caption={Expected output from the program in Listing~\ref{openshmem-hello-symmetric} (4 processors)}} +\outputlisting{language=bash,caption={Possible ordering of expected output with 4 \acp{PE} from the program in Listing~\ref{openshmem-hello-symmetric}}} {example_code/writing_shmem_example.output} \vspace{0.1in} \end{minipage} From 29131e9ee8e363f096ba37a523dd1f8d32e27da4 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 14:34:56 -0400 Subject: [PATCH 365/583] Annex A: Deprecate Fortran section --- content/backmatter.tex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index ab196cf04..71ecc6135 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -38,6 +38,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \vspace{0.1in} \end{minipage} +\begin{deprecate} \openshmem also has a \Fortran API, therefore listing~\ref{openshmem-hello-f90} provides the same program written in \Fortran: \begin{minipage}{\linewidth} @@ -48,6 +49,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} {example_code/hello-openshmem-f90.output} \vspace{0.1in} \end{minipage} +\end{deprecate} The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex \openshmem program that illustrates the use of symmetric data objects. Note the declaration of the \VAR{static From a922af93fd54080c90c846474ec5eb61985d8cd9 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 14:35:33 -0400 Subject: [PATCH 366/583] Annex A: \newpage breaks --- content/backmatter.tex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 71ecc6135..14bfc2faa 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -38,6 +38,8 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \vspace{0.1in} \end{minipage} +\newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% + \begin{deprecate} \openshmem also has a \Fortran API, therefore listing~\ref{openshmem-hello-f90} provides the same program written in \Fortran: @@ -51,6 +53,8 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \end{minipage} \end{deprecate} +\newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% + The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex \openshmem program that illustrates the use of symmetric data objects. Note the declaration of the \VAR{static short dest} array and its use as the remote destination in \openshmem short From 609e5eabf247cc92f4ef435f2cc149db2c3a7cff Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 14:35:59 -0400 Subject: [PATCH 367/583] Annex A: Reword --- content/backmatter.tex | 48 ++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 14bfc2faa..ace6d8e75 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -18,17 +18,20 @@ \chapter{Writing OpenSHMEM Programs} \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} The following section describes how to write a ``Hello World" \openshmem program. -To write a ``Hello World" \openshmem program, the user must: +To write a ``Hello World" \openshmem program, the user must: \begin{itemize} -\item Add the include file \HEADER{shmem.h} for \Cstd or \HEADER{shmem.fh} for \Fortran. -\item Add the initialization call \FUNC{shmem\_init}. -\item Use OpenSHMEM calls to query the total number of \acp{PE} and \ac{PE} id. -\item Add the finalization call \FUNC{shmem\_finalize}. -\item In \openshmem the order in which lines appear in the output is not fixed - as \acp{PE} execute asynchronously in parallel. +\item Include the header file \HEADER{shmem.h} for \Cstd or \HEADER{shmem.fh} for \Fortran. +\item Add the initialization call \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}}. +\item Use OpenSHMEM calls to query the local PE number + (\hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}}) and the total number + of PEs (\hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}}). +\item Add the finalization call \hyperref[subsec:shmem_finalize]{\FUNC{shmem\_finalize}}. \end{itemize} +In \openshmem, the order in which lines appear in the output is not +deterministic because \acp{PE} execute asynchronously in parallel. + \begin{minipage}{\linewidth} \vspace{0.1in} \numberedlisting{caption={``Hello World'' example program in \Cstd},label=openshmem-hello,language=OSH2+C} @@ -41,7 +44,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% \begin{deprecate} -\openshmem also has a \Fortran API, therefore listing~\ref{openshmem-hello-f90} provides the same program written in \Fortran: +\openshmem also provides a \Fortran API. Listing~\ref{openshmem-hello-f90} shows a similar program written in \Fortran. \begin{minipage}{\linewidth} \vspace{0.1in} @@ -55,18 +58,23 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% -The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex \openshmem program that illustrates -the use of symmetric data objects. Note the declaration of the \VAR{static -short dest} array and its use as the remote destination in \openshmem short -\PUT. The use of the \VAR{static} keyword results in the \VAR{dest} array being -symmetric on \ac{PE} \CONST{0} and \ac{PE} \CONST{1}. Each \ac{PE} is able to -transfer data to the \dest{} array by simply specifying the local address of the -symmetric data object which is to receive the data. This aids programmability, -as the address of the \dest{} need not be exchanged with the active side -(\ac{PE} \CONST{0}) prior to the RMA (Remote Memory Access) routine. -Conversely, the declaration of the \VAR{short source} array is asymmetric. -Because the \PUT{} handles the references to the \VAR{source} array only on the -active (local) side, the asymmetric \source{} object is handled correctly. +The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex +\openshmem program that illustrates the use of symmetric data objects. +Note the declaration of the \VAR{static short dest} array and its use as the +remote destination in \hyperref[subsec:shmem_put]{\FUNC{shmem\_put}}. + +The \VAR{static} keyword makes the \VAR{dest} array symmetric on all \acp{PE}. +%% FIXME: The following sentence is not *technically* correct. +Each \ac{PE} is able to transfer data to the \dest{} array by simply specifying +the local address of the symmetric data object that will receive the data. +This local address resolution aids programmability because the address of the +\dest{} need not be exchanged with the active side (\ac{PE} \CONST{0}) prior to +the RMA (Remote Memory Access) routine. + +Conversely, the declaration of the \VAR{short source} array is asymmetric +(local only). +The \source{} object does not need to be symmetric because \PUT{} handles the +references to the \VAR{source} array only on the active (local) side. \begin{minipage}{\linewidth} \vspace{0.1in} From 8d96252bd46938091bb3212aebdcb3a41bd9dcef Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 14:52:22 -0400 Subject: [PATCH 368/583] Annex B: Rewording and consistency edits - Reworded intro to be more direct - "could" --> "may" --- content/backmatter.tex | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index ace6d8e75..5ea2d431d 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -89,7 +89,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \chapter{Compiling and Running Programs}\label{sec:compiling} -As of this writing, the \openshmem specification is silent regarding how +The specification does not specify how \openshmem programs are compiled, linked, and run. This section shows some examples of how wrapper programs are utilized in the \openshmem Reference Implementation to compile and launch programs. @@ -98,21 +98,21 @@ \section{Compilation} \subsection*{Programs written in \Cstd} The \openshmem Reference Implementation provides a wrapper program, named -\textbf{oshcc}, to aid in the compilation of \Cstd programs. The wrapper -could be called as follows: +\textbf{oshcc}, to aid in the compilation of \Cstd programs. +The wrapper may be called as follows: \begin{lstlisting}[language=bash] oshcc -o myprogram myprogram.c \end{lstlisting} Where the $\langle\mbox{compiler options}\rangle$ are options understood by the -underlying \Cstd compiler. +underlying \Cstd compiler called by \textbf{oshcc}. \subsection*{Programs written in \Cpp} -The \openshmem Reference Implementation provides a wrapper program, named -\textbf{oshCC}, to aid in the compilation of \Cpp programs. The wrapper could -be called as follows: +The \openshmem Reference Implementation provides a wrapper program, named +\textbf{oshCC}, to aid in the compilation of \Cpp programs. +The wrapper may be called as follows: \begin{lstlisting}[language=bash] oshCC -o myprogram myprogram.cpp @@ -121,12 +121,12 @@ \subsection*{Programs written in \Cpp} underlying \Cpp compiler called by \textbf{oshCC}. -\subsection*{Programs written in Fortran} +\subsection*{Programs written in \Fortran} \begin{deprecate} The \openshmem Reference Implementation provides a wrapper program, named -\textbf{oshfort}, to aid in the compilation of \Fortran programs. The wrapper -could be called as follows: +\textbf{oshfort}, to aid in the compilation of \Fortran programs. +The wrapper may be called as follows: \begin{lstlisting}[language=bash] oshfort -o myprogram myprogram.f @@ -138,8 +138,8 @@ \subsection*{Programs written in Fortran} \section{Running Programs} The \openshmem Reference Implementation provides a wrapper program, named -\textbf{oshrun}, to launch \openshmem programs. The wrapper could be called as -follows: +\textbf{oshrun}, to launch \openshmem programs. +The wrapper may be called as follows: \begin{lstlisting}[language=bash] oshrun -np <#> From f892d9b58d7debf4d30a15814c66fcc1aff04762 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 15:23:34 -0400 Subject: [PATCH 369/583] Annex C: Reword --- content/backmatter.tex | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 5ea2d431d..c66c84647 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -156,11 +156,10 @@ \section{Running Programs} - \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} -The specification provides guidelines to the expected behavior of -various library routines. In cases where routines are improperly used +The specification formalizes the expected behavior of +its library routines. In cases where routines are improperly used or the input is not in accordance with the specification, undefined behavior may be observed. Depending on the implementation there are many interpretations of undefined behavior. @@ -173,26 +172,27 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \textbf{Inappropriate Usage} & \textbf{Undefined Behavior}\tabularnewline \hline \hline +%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). Uninitialized library & If \openshmem is not initialized through a call to -\FUNC{shmem\_init}, subsequent accesses to \openshmem routines have undefined -results. An implementation may choose, for example, to try to continue or abort +\FUNC{shmem\_init}, subsequent calls to \openshmem routines have undefined +behavior. For example, an implementation may try to continue or may abort immediately upon the first call to an uninitialized routine.\tabularnewline \hline Accessing non-existent \acp{PE} & If a communications routine accesses a non-existent \ac{PE}, then the \openshmem library can choose to handle this -situation in an implementation-defined way. For example, the library may issue +situation in an implementation-defined way. For example, the library may report an error message saying that the \ac{PE} accessed is outside the range of accessible \acp{PE}, or may exit without a warning.\tabularnewline \hline Use of non-symmetric variables & Some routines require remotely accessible -variables to perform their function. A \PUT{} to a non-symmetric variable can -be trapped where possible and the library can abort the program. Another -implementation may choose to continue either with a warning or -silently.\tabularnewline +variables to perform their function. For example, a \PUT{} to a non-symmetric variable may +be trapped where possible and the library may abort the program. Another +implementation may choose to continue execution with or without a warning. +\tabularnewline \hline -Non-symmetric variables & The symmetric memory management routines are -collectives, which means that all \acp{PE} in the program must issue the same -\FUNC{shmem\_malloc} call with the same size request. Program behavior after a +Non-symmetric memory allocation & The symmetric memory management routines are +collectives. For example, all \acp{PE} in the program must call +\FUNC{shmem\_malloc} with the same \VAR{size} argument. Program behavior after a mismatched \FUNC{shmem\_malloc} call is undefined.\tabularnewline \hline Use of null pointers with non-zero \VAR{len} specified & In any \openshmem routine @@ -208,8 +208,9 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \end{itemize} \tabularnewline \hline +%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). Multiple calls to \FUNC{shmem\_init} & In an OpenSHMEM program where -\FUNC{shmem\_init} has already be called, any subsequent calls to +\FUNC{shmem\_init} has already been called, any subsequent calls to \FUNC{shmem\_init} result in undefined behavior.\tabularnewline \hline \end{tabular} From 15eeb24f8ba6ab1db33acbe1fac80f404d46920c Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 15:29:24 -0400 Subject: [PATCH 370/583] Annex A: \newpage (a922af9) --> \clearpage --- content/backmatter.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index c66c84647..8bdd6c579 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -1,4 +1,4 @@ -\clearpage +\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix @@ -41,7 +41,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \vspace{0.1in} \end{minipage} -\newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% +\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{deprecate} \openshmem also provides a \Fortran API. Listing~\ref{openshmem-hello-f90} shows a similar program written in \Fortran. @@ -56,7 +56,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \end{minipage} \end{deprecate} -\newpage %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% NEW PAGE %% +\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The example in Listing~\ref{openshmem-hello-symmetric} shows a more complex \openshmem program that illustrates the use of symmetric data objects. @@ -263,7 +263,7 @@ \section{\ac{MPI} Interoperability} of \ac{MPI} memory placement environment variables is required when using non-default memory placement options. -\clearpage +\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 0d7bc734a557e6e150ddd27d7876bd09eade7ceb Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 17:49:41 -0400 Subject: [PATCH 371/583] Annex C: Reordered entries --- content/backmatter.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3707e1280..ac3d9e581 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -177,7 +177,12 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \FUNC{shmem\_init}, subsequent calls to \openshmem routines have undefined behavior. For example, an implementation may try to continue or may abort immediately upon the first call to an uninitialized routine.\tabularnewline -\hline +\hline +%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). +Multiple calls to \FUNC{shmem\_init} & In an OpenSHMEM program where +\FUNC{shmem\_init} has already been called, any subsequent calls to +\FUNC{shmem\_init} result in undefined behavior.\tabularnewline +\hline Accessing non-existent \acp{PE} & If a communications routine accesses a non-existent \ac{PE}, then the \openshmem library can choose to handle this situation in an implementation-defined way. For example, the library may report @@ -208,11 +213,6 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \end{itemize} \tabularnewline \hline -%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). -Multiple calls to \FUNC{shmem\_init} & In an OpenSHMEM program where -\FUNC{shmem\_init} has already been called, any subsequent calls to -\FUNC{shmem\_init} result in undefined behavior.\tabularnewline -\hline \end{tabular} From ad9bcaeadfa04992586cd98b5359eddd645c3b64 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 17:54:36 -0400 Subject: [PATCH 372/583] Annex C: Modified text to accomodate `shmem_init_thread` --- content/backmatter.tex | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index ac3d9e581..af44d528c 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -172,16 +172,17 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \textbf{Inappropriate Usage} & \textbf{Undefined Behavior}\tabularnewline \hline \hline -%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). -Uninitialized library & If \openshmem is not initialized through a call to -\FUNC{shmem\_init}, subsequent calls to \openshmem routines have undefined +Uninitialized library & If the \openshmem library is not initialized, +calls to non-initializing \openshmem routines have undefined behavior. For example, an implementation may try to continue or may abort -immediately upon the first call to an uninitialized routine.\tabularnewline +immediately upon an \openshmem call into the uninitialized library. +\tabularnewline \hline -%% FIXME: shmem_init or another appropriate init routine (shmem_init_thread). -Multiple calls to \FUNC{shmem\_init} & In an OpenSHMEM program where -\FUNC{shmem\_init} has already been called, any subsequent calls to -\FUNC{shmem\_init} result in undefined behavior.\tabularnewline +Multiple calls to initialization routines & In an OpenSHMEM program where +an initialization routine (\FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}) +has already been called, any subsequent calls to an initialization routine +result in undefined behavior. +\tabularnewline \hline Accessing non-existent \acp{PE} & If a communications routine accesses a non-existent \ac{PE}, then the \openshmem library can choose to handle this From a53c1d7fc370af348581ad20e8b7a963a43642ab Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 18:00:38 -0400 Subject: [PATCH 373/583] Annex C: Use more precise words --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index af44d528c..df7403e61 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -161,7 +161,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} The specification formalizes the expected behavior of its library routines. In cases where routines are improperly used or the input is not in accordance with the specification, undefined -behavior may be observed. Depending on the implementation there are +behavior is observed. Depending on the implementation, there are many interpretations of undefined behavior. $\;$ From bf5e8c1305058a13e4293d23423ea5522c592479 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 18:14:54 -0400 Subject: [PATCH 374/583] Added `longtable` to packages --- utils/packages.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/packages.tex b/utils/packages.tex index 30b0c5173..c29088b8b 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -49,5 +49,6 @@ \usepackage{draftcopy} \usepackage{draftwatermark} \usepackage{wrapfig} +\usepackage{longtable} \usepackage{caption} \usepackage{subcaption} From 9d1f7255411bc652d44dabaedd435c3c91eb75f8 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 19:04:29 -0400 Subject: [PATCH 375/583] Annex D: Reword --- content/backmatter.tex | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index df7403e61..fae86c7b0 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -219,41 +219,38 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} - - - \chapter{Interoperability with other Programming Models}\label{sec:mpi} \section{\ac{MPI} Interoperability} \begin{sloppypar} % to prevent constants from running into margins. % -\openshmem routines can be used in conjunction with \ac{MPI} routines in the +\openshmem routines may be used in conjunction with \ac{MPI} routines in the same program. For example, on SGI systems, programs that use both \ac{MPI} and \openshmem routines call \FUNC{MPI\_Init} and \FUNC{MPI\_Finalize} but omit the call to the \FUNC{shmem\_init} routine. \openshmem \ac{PE} numbers are equal to the \ac{MPI} rank within the \CONST{MPI\_COMM\_WORLD} environment variable. -Note that this precludes use of \openshmem routines between processes in -different \CONST{MPI\_COMM\_WORLD}s. \ac{MPI} processes started using the -\FUNC{MPI\_Comm\_spawn} routine, for example, cannot use \openshmem routines to +Note that this indexing precludes use of \openshmem routines between processes in +different \CONST{MPI\_COMM\_WORLD}s. For example, \ac{MPI} processes started using the +\FUNC{MPI\_Comm\_spawn} routine cannot use \openshmem routines to communicate with their parent \ac{MPI} processes. % \end{sloppypar} % On SGI systems where \ac{MPI} jobs use TCP/sockets for inter-host communication, -\openshmem routines can be used to communicate with processes running on the -same host. The \FUNC{shmem\_pe\_accessible} routine can be used to determine if +\openshmem routines may be used to communicate with processes running on the +same host. The \FUNC{shmem\_pe\_accessible} routine should be used to determine if a remote \ac{PE} is accessible via \openshmem communication from the local \ac{PE}. When running an \ac{MPI} program involving multiple executable files, -\openshmem routines can be used to communicate with processes running from the +\openshmem routines may be used to communicate with processes running from the same or different executable files, provided that the communication is limited -to symmetric data objects. On these systems, static memory such as a -\Fortran common block or \Cstd global variable, is symmetric between +to symmetric data objects. On these systems, static memory---such as a +\Fortran common block or \Cstd global variable---is symmetric between processes running from the same executable file, but is not symmetric between processes running from different executable files. Data allocated from the -symmetric heap (\FUNC{shmem\_malloc} or \FUNC{shpalloc}) is symmetric across the -same or different executable files. The routine \FUNC{shmem\_addr\_accessible} -can be used to determine if a local address is accessible via \openshmem +symmetric heap (e.g., \FUNC{shmem\_malloc}, \FUNC{shpalloc}) is symmetric across the +same or different executable files. The \FUNC{shmem\_addr\_accessible} routine +should be used to determine if a local address is accessible via \openshmem communication from a remote \ac{PE}. Another important feature of these systems is that the @@ -261,13 +258,8 @@ \section{\ac{MPI} Interoperability} \ac{PE} is a process running from the same executable file as the local \ac{PE}, indicating that full \openshmem support (static memory and symmetric heap) is available. When using \openshmem routines within an \ac{MPI} program, the use -of \ac{MPI} memory placement environment variables is required when using -non-default memory placement options. - -\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - +of \ac{MPI} memory-placement environment variables is required when using +non-default memory-placement options. From 64d116f9a386cb7c290d42ff56dc262af35ad576 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 19:04:46 -0400 Subject: [PATCH 376/583] Added acronym: TCP --- content/backmatter.tex | 2 +- utils/defs.tex | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index fae86c7b0..e8397234b 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -237,7 +237,7 @@ \section{\ac{MPI} Interoperability} % \end{sloppypar} % -On SGI systems where \ac{MPI} jobs use TCP/sockets for inter-host communication, +On SGI systems where \ac{MPI} jobs use \ac{TCP}/sockets for inter-host communication, \openshmem routines may be used to communicate with processes running on the same host. The \FUNC{shmem\_pe\_accessible} routine should be used to determine if a remote \ac{PE} is accessible via \openshmem communication from the local diff --git a/utils/defs.tex b/utils/defs.tex index cb52c2b4d..a649c30e3 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -82,6 +82,7 @@ \acro{API}{\emph{Application Programming Interface}} \acro{MPI}{\emph{Message Passing Interface}} \acro{SPMD}{\emph{Single Program Multiple Data}} +\acro{TCP}{\emph{Transmission Control Protocol}} \acro{UH}{University of Houston} \acro{UO}{University of Oregon} \acro{ORNL}{Oak Ridge National Laboratory} From 0b2fc34b89b8bf7236f349f08a766b1916f24fe7 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 19:05:10 -0400 Subject: [PATCH 377/583] Annex C: Reword --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index e8397234b..53737d7c9 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -185,7 +185,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \tabularnewline \hline Accessing non-existent \acp{PE} & If a communications routine accesses a -non-existent \ac{PE}, then the \openshmem library can choose to handle this +non-existent \ac{PE}, then the \openshmem library may handle this situation in an implementation-defined way. For example, the library may report an error message saying that the \ac{PE} accessed is outside the range of accessible \acp{PE}, or may exit without a warning.\tabularnewline From c995a7f082c146c968758ceec23c5c2242b09939 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 19:46:30 -0400 Subject: [PATCH 378/583] Annex F: Reordering --- content/backmatter.tex | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 53737d7c9..9a19f3524 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -423,17 +423,17 @@ \subsection{\CorCpp: start\_pes} \openshmem users are encouraged to use \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} instead. +\subsection{Implicit Finalization} +Implicit finalization has been replaced with explicit finalization using the +\FUNC{shmem\_finalize} routine. Explicit finalization improves portability and +also improves interoperability with profiling and debugging tools. + \subsection{\CorCpp: \_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} The \CorCpp routines \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, \FUNC{shfree}, \FUNC{shrealloc}, and \FUNC{shmemalign} were deprecated in order to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard prefix for all routines. -\subsection{Implicit Finalization} -Implicit finalization has been replaced with explicit finalization using the -\FUNC{shmem\_finalize} routine. Explicit finalization improves portability and -also improves interoperability with profiling and debugging tools. - \subsection{Fortran: START\_PES, MY\_PE, NUM\_PES} The \Fortran routines \FUNC{START\_PES}, \FUNC{MY\_PE}, and \FUNC{NUM\_PES} were deprecated in order to minimize the API differences from the deprecation @@ -479,18 +479,6 @@ \subsection{\_SHMEM\_* Library Constants} with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran naming conventions. -\subsection{\FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, - \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, - \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} - -The \CorCpp interfaces for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, -\FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, -\FUNC{shmem\_fadd}, and \FUNC{shmem\_add} were deprecated and replaced with -similarly-named interfaces within the \FUNC{shmem\_atomic\_*} namespace -in order to more clearly identify these calls as performing atomic operations. -In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were -expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. - \subsection{SMA\_* Environment Variables} The environment variables \begin{center} @@ -504,6 +492,26 @@ \subsection{SMA\_* Environment Variables} were deprecated in order to normalize the \openshmem \ac{API} to use \shmemprefix{} as the standard prefix for all environment variables. +\subsection{\FUNC{shmem\_wait}} +The \FUNC{shmem\_wait} interface was identified as unintuitive with respect to +the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially +replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is +\CONST{SHMEM\_CMP\_NE}, the \FUNC{shmem\_wait} interface was deprecated in +favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation +explicit and better communicates the developer's intent. + +\subsection{\FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, + \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, + \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} + +The \CorCpp interfaces for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, +\FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, +\FUNC{shmem\_fadd}, and \FUNC{shmem\_add} were deprecated and replaced with +similarly-named interfaces within the \FUNC{shmem\_atomic\_*} namespace +in order to more clearly identify these calls as performing atomic operations. +In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were +expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. + \subsection{Fortran API}\label{subsec:deprecate-fortran} The entire \openshmem \Fortran API was deprecated because of a general lack of use and a lack of conformance with legacy \Fortran standards. In lieu of an @@ -513,14 +521,6 @@ \subsection{Fortran API}\label{subsec:deprecate-fortran} \Fortran[2003]% \footnote{Formally, \Fortran[2003] is known as ISO/IEC~1539-1:2004(E).}. -\subsection{\FUNC{shmem\_wait}} -The \FUNC{shmem\_wait} interface was identified as unintuitive with respect to -the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially -replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is -\CONST{SHMEM\_CMP\_NE}, the \FUNC{shmem\_wait} interface was deprecated in -favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation -explicit and better communicates the developer's intent. - From 9ce2a1cbdf9f4233f3064bc82e699766e5b74b69 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 30 Aug 2017 20:34:40 -0400 Subject: [PATCH 379/583] Specify environment variable precedence w.r.t. deprecated variables --- content/environment_variables.tex | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/content/environment_variables.tex b/content/environment_variables.tex index 7e88168d8..93514a8f7 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -3,9 +3,12 @@ the implementation. The implementations of the specification are free to define additional variables. Currently, the specification defines four environment variables. All environment variables that start with \VAR{SMA\_*} are -deprecated, but currently supported for backwards compatibility. Refer to the -\hyperref[subsec:deprecate-sma-env]{SMA\_* Environment Variables} deprecation -rationale for more details. +deprecated, but currently supported for backwards compatibility. +If both \VAR{SHMEM\_}- and \VAR{SMA\_}-prefixed environment variables +are set, then the value in the \VAR{SHMEM\_}-prefixed environment variable +establishes the controlling value. Refer to the +\hyperref[subsec:deprecate-sma-env]{\VAR{SMA\_*} Environment Variables} +deprecation rationale for more details. \medskip{} From 92826455763760d71a2dc9928c55e26a99be9126 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 20:28:30 -0400 Subject: [PATCH 380/583] Annex F: Reword --- content/backmatter.tex | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 9a19f3524..d7b8561e3 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -323,13 +323,14 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \chapter{OpenSHMEM Specification and Deprecated API}\label{sec:dep_api} \section{Overview}\label{subsec:dep_overview} -For the \openshmem Specification(s), deprecation is the process of identifying +For the \openshmem specification, deprecation is the process of identifying API that is supported but no longer recommended for use by program users. For \openshmem library users, said API \textbf{must} be supported until clearly -indicated as otherwise by the Specification. This chapter records the -API that has been deprecated, the \openshmem Specification that effected the -deprecation, and if the feature is supported in the current version of the -specification. +indicated as otherwise by the specification. +This chapter records the API or functionality that have been deprecated, the +\openshmem specification version that effected the deprecation, and the +\openshmem specification version that the feature was last supported before +removal. \begin{center} \scriptsize @@ -420,8 +421,7 @@ \subsection{\CorCpp: start\_pes} longer reflects the requirements of modern \openshmem implementations. Furthermore, the naming of \FUNC{start\_pes} does not include the standardized \shmemprefixLC{} naming prefix. This routine has been deprecated and -\openshmem users are encouraged to use -\hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} instead. +\openshmem users are encouraged to use \FUNC{shmem\_init} instead. \subsection{Implicit Finalization} Implicit finalization has been replaced with explicit finalization using the @@ -440,8 +440,8 @@ \subsection{Fortran: START\_PES, MY\_PE, NUM\_PES} of \CorCpp routines \FUNC{start\_pes}, \FUNC{\_my\_pe}, and \FUNC{\_num\_pes}. \subsection{Fortran: SHMEM\_PUT} -The \Fortran function \FUNC{SHMEM\_PUT} is defined only for the \Fortran -\ac{API} and is semantically identical to \Fortran functions +The \Fortran routine \FUNC{SHMEM\_PUT} is defined only for the \Fortran +\ac{API} and is semantically identical to \Fortran routines \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64} have defined equivalents in the \CorCpp interface, \FUNC{SHMEM\_PUT} is ambiguous and has been deprecated. @@ -459,7 +459,7 @@ \subsection{SHMEM\_CACHE} shmem\_clear\_cache\_line\_inv \\ \end{tabular} \end{center} -was originally implemented for systems with cache management instructions. +was originally implemented for systems with cache-management instructions. This API has largely gone unused on cache-coherent system architectures. \FUNC{SHMEM\_CACHE} has been deprecated. @@ -493,7 +493,7 @@ \subsection{SMA\_* Environment Variables} \shmemprefix{} as the standard prefix for all environment variables. \subsection{\FUNC{shmem\_wait}} -The \FUNC{shmem\_wait} interface was identified as unintuitive with respect to +The \CorCpp interface for \FUNC{shmem\_wait} was identified as unintuitive with respect to the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is \CONST{SHMEM\_CMP\_NE}, the \FUNC{shmem\_wait} interface was deprecated in @@ -507,7 +507,7 @@ \subsection{\FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, The \CorCpp interfaces for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, and \FUNC{shmem\_add} were deprecated and replaced with -similarly-named interfaces within the \FUNC{shmem\_atomic\_*} namespace +similarly named interfaces within the \FUNC{shmem\_atomic\_*} namespace in order to more clearly identify these calls as performing atomic operations. In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. From b8a7b4862c31ef5d34755ba09b712bcb276edd83 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 20:38:05 -0400 Subject: [PATCH 381/583] Annex F: Styling --- content/backmatter.tex | 60 ++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index d7b8561e3..1c84d59d7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -370,16 +370,16 @@ \section{Overview}\label{subsec:dep_overview} \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline - \_SHMEM\_SYNC\_VALUE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_SYNC\_VALUE} \\ \hline - \_SHMEM\_BARRIER\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_BARRIER\_SYNC\_SIZE} \\ \hline - \_SHMEM\_BCAST\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_BCAST\_SYNC\_SIZE} \\ \hline - \_SHMEM\_COLLECT\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_COLLECT\_SYNC\_SIZE} \\ \hline - \_SHMEM\_REDUCE\_SYNC\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_REDUCE\_SYNC\_SIZE} \\ \hline - \_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} \\ \hline - \_SHMEM\_MAJOR\_VERSION & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAJOR\_VERSION} \\ \hline - \_SHMEM\_MINOR\_VERSION & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MINOR\_VERSION} \\ \hline - \_SHMEM\_MAX\_NAME\_LEN & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_MAX\_NAME\_LEN} \\ \hline - \_SHMEM\_VENDOR\_STRING & 1.3 & Current & \hyperref[subsec:library_constants]{SHMEM\_VENDOR\_STRING} \\ \hline + \CONST{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline + \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline + \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BCAST\_SYNC\_SIZE}} \\ \hline + \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_COLLECT\_SYNC\_SIZE}} \\ \hline + \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_SYNC\_SIZE}} \\ \hline + \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} \\ \hline + \CONST{\_SHMEM\_MAJOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAJOR\_VERSION}} \\ \hline + \CONST{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline + \CONST{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline + \CONST{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline SMA\_VERSION & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_VERSION} \\ \hline SMA\_INFO & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_INFO} \\ \hline SMA\_SYMMETRIC\_SIZE & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_SYMMETRIC\_SIZE} \\ \hline @@ -415,7 +415,7 @@ \subsection{Header Directory: \HEADER{mpp}} \end{lstlisting} for backwards compatibility with SGI SHMEM. -\subsection{\CorCpp: start\_pes} +\subsection{\CorCpp: \FUNC{start\_pes}} The \CorCpp routine \FUNC{start\_pes} includes an unnecessary initialization argument that is remnant of historical \emph{SHMEM} implementations and no longer reflects the requirements of modern \openshmem implementations. @@ -428,18 +428,19 @@ \subsection{Implicit Finalization} \FUNC{shmem\_finalize} routine. Explicit finalization improves portability and also improves interoperability with profiling and debugging tools. -\subsection{\CorCpp: \_my\_pe, \_num\_pes, shmalloc, shfree, shrealloc, shmemalign} +\subsection{\CorCpp: \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, + \FUNC{shfree}, \FUNC{shrealloc}, \FUNC{shmemalign}} The \CorCpp routines \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, \FUNC{shfree}, \FUNC{shrealloc}, and \FUNC{shmemalign} were deprecated in order to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard prefix for all routines. -\subsection{Fortran: START\_PES, MY\_PE, NUM\_PES} +\subsection{\Fortran: \FUNC{START\_PES}, \FUNC{MY\_PE}, \FUNC{NUM\_PES}} The \Fortran routines \FUNC{START\_PES}, \FUNC{MY\_PE}, and \FUNC{NUM\_PES} were deprecated in order to minimize the API differences from the deprecation of \CorCpp routines \FUNC{start\_pes}, \FUNC{\_my\_pe}, and \FUNC{\_num\_pes}. -\subsection{Fortran: SHMEM\_PUT} +\subsection{\Fortran: \FUNC{SHMEM\_PUT}} The \Fortran routine \FUNC{SHMEM\_PUT} is defined only for the \Fortran \ac{API} and is semantically identical to \Fortran routines \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and @@ -451,27 +452,27 @@ \subsection{SHMEM\_CACHE} \begin{center} \begin{tabular}{ll} \CorCpp: & \Fortran: \\ - shmem\_clear\_cache\_inv & SHMEM\_CLEAR\_CACHE\_INV \\ - shmem\_set\_cache\_inv & SHMEM\_SET\_CACHE\_INV \\ - shmem\_set\_cache\_line\_inv & SHMEM\_SET\_CACHE\_LINE\_INV \\ - shmem\_udcflush & SHMEM\_UDCFLUSH \\ - shmem\_udcflush\_line & SHMEM\_UDCFLUSH\_LINE \\ - shmem\_clear\_cache\_line\_inv \\ + \FUNC{shmem\_clear\_cache\_inv} & \FUNC{SHMEM\_CLEAR\_CACHE\_INV} \\ + \FUNC{shmem\_set\_cache\_inv} & \FUNC{SHMEM\_SET\_CACHE\_INV} \\ + \FUNC{shmem\_set\_cache\_line\_inv} & \FUNC{SHMEM\_SET\_CACHE\_LINE\_INV} \\ + \FUNC{shmem\_udcflush} & \FUNC{SHMEM\_UDCFLUSH} \\ + \FUNC{shmem\_udcflush\_line} & \FUNC{SHMEM\_UDCFLUSH\_LINE} \\ + \FUNC{shmem\_clear\_cache\_line\_inv} \\ \end{tabular} \end{center} was originally implemented for systems with cache-management instructions. This API has largely gone unused on cache-coherent system architectures. \FUNC{SHMEM\_CACHE} has been deprecated. -\subsection{\_SHMEM\_* Library Constants} +\subsection{\CONST{\_SHMEM\_*} Library Constants} The library constants \begin{center} \begin{tabular}{ll} - \_SHMEM\_SYNC\_VALUE & \_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE \\ - \_SHMEM\_BARRIER\_SYNC\_SIZE & \_SHMEM\_MAJOR\_VERSION \\ - \_SHMEM\_BCAST\_SYNC\_SIZE & \_SHMEM\_MINOR\_VERSION \\ - \_SHMEM\_COLLECT\_SYNC\_SIZE & \_SHMEM\_MAX\_NAME\_LEN \\ - \_SHMEM\_REDUCE\_SYNC\_SIZE & \_SHMEM\_VENDOR\_STRING \\ + \CONST{\_SHMEM\_SYNC\_VALUE} & \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} \\ + \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAJOR\_VERSION} \\ + \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & \CONST{\_SHMEM\_MINOR\_VERSION} \\ + \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAX\_NAME\_LEN} \\ + \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \CONST{\_SHMEM\_VENDOR\_STRING} \\ \end{tabular} \end{center} do not adhere to the \Cstd standard's reserved identifiers and the \Cpp @@ -483,6 +484,7 @@ \subsection{SMA\_* Environment Variables} The environment variables \begin{center} \begin{tabular}{ll} + %% TODO: Styling. SMA\_VERSION \\ SMA\_INFO \\ SMA\_SYMMETRIC\_SIZE \\ @@ -492,7 +494,7 @@ \subsection{SMA\_* Environment Variables} were deprecated in order to normalize the \openshmem \ac{API} to use \shmemprefix{} as the standard prefix for all environment variables. -\subsection{\FUNC{shmem\_wait}} +\subsection{\CorCpp: \FUNC{shmem\_wait}} The \CorCpp interface for \FUNC{shmem\_wait} was identified as unintuitive with respect to the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is @@ -500,7 +502,7 @@ \subsection{\FUNC{shmem\_wait}} favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation explicit and better communicates the developer's intent. -\subsection{\FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, +\subsection{\CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} @@ -512,7 +514,7 @@ \subsection{\FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. -\subsection{Fortran API}\label{subsec:deprecate-fortran} +\subsection{\Fortran API}\label{subsec:deprecate-fortran} The entire \openshmem \Fortran API was deprecated because of a general lack of use and a lack of conformance with legacy \Fortran standards. In lieu of an extensive update of the \Fortran API, \Fortran users are encouraged to From 8f3fc637d7dd9a7b0d2f386150b59c2d8ea74001 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 20:43:30 -0400 Subject: [PATCH 382/583] Annex F Table: Left-align column for replacements --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 1c84d59d7..c95221138 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -334,7 +334,7 @@ \section{Overview}\label{subsec:dep_overview} \begin{center} \scriptsize -\begin{tabular}{|l|c|c|c|} +\begin{tabular}{|l|c|c|l|} \hline \textbf{Deprecated API} & \textbf{Deprecated Since} From d2c4de09fae97f655e644abbef0f0a49071ac0e7 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 30 Aug 2017 21:09:26 -0400 Subject: [PATCH 383/583] Add syntax highlighting for ptrdiff_t and shmem_cmp_t --- utils/defs.tex | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 5816a2133..3a19f76cd 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -361,19 +361,20 @@ { \textbf{C++11:} \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, noreturn}, aboveskip=0pt, belowskip=0pt}}{} + morekeywords={size_t, ptrdiff_t, TYPE, noreturn}, + aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{C11synopsis} { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, _Noreturn, shmem_cmp}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_cmp_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, TYPENAME, SIZE, shmem_cmp}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -381,7 +382,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, TYPE, TYPENAME, SIZE, shmem_cmp}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -389,7 +390,8 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t}, aboveskip=0pt, belowskip=0pt}} + morekeywords={size_t, ptrdiff_t}, + aboveskip=0pt, belowskip=0pt}} } {} @@ -469,7 +471,8 @@ \newcommand{\apicexample}[3]{ ##1 \lstinputlisting[language={C}, tabsize=2, - basicstyle=\ttfamily\footnotesize, morekeywords={size_t}]{##2} + basicstyle=\ttfamily\footnotesize, + morekeywords={size_t, shmem_cmp_t}]{##2} ##3 } \newcommand{\apifexample}[3]{ ##1 From 96f81e7369df9881f9b1f462695290264908d528 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 30 Aug 2017 21:23:37 -0400 Subject: [PATCH 384/583] section/rma-amo: "\openshmem{}" -> "\openshmem" --- content/atomics_intro.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index a24f44e64..66df3aad2 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -2,7 +2,7 @@ operations with atomicity guarantees described in Section \ref{subsec:amo_guarantees}. Similar to the \ac{RMA} routines, described in Section \ref{sec:rma}, the \acp{AMO} are performed only on symmetric objects. -\openshmem{} defines the two types of \ac{AMO} routines: +\openshmem defines the two types of \ac{AMO} routines: \begin{itemize} \item The \textit{fetching} routines return the original value of, and optionally @@ -19,13 +19,13 @@ operation and may return before the operation executes on the remote \ac{PE}. To force completion for these non-fetching atomic routines, \FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can -be used by an \openshmem{} program. +be used by an \openshmem program. The non-fetching operations include: \FUNC{shmem\_atomic\_\{set, inc, add, and, or, xor\}}. \end{itemize} -Where appropriate compiler support is available, \openshmem{} provides +Where appropriate compiler support is available, \openshmem provides type-generic \ac{AMO} interfaces via \Cstd[11] generic selection. The type-generic support for the \ac{AMO} routines is as follows: From 8154be5e5db4493e80dc3165af4512f472f25145 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 30 Aug 2017 22:17:22 -0400 Subject: [PATCH 385/583] Update styling of library constants and env. variables for consistency --- content/environment_variables.tex | 8 +-- content/library_constants.tex | 86 +++++++++++++++---------------- utils/defs.tex | 1 - 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/content/environment_variables.tex b/content/environment_variables.tex index 7e88168d8..1fccfb76a 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -14,16 +14,16 @@ Variable & Value & Purpose\tabularnewline \hline \hline -\texttt{SHMEM\_VERSION} & any & print the library version at +\VAR{SHMEM\_VERSION} & any & print the library version at start-up\tabularnewline \hline -\texttt{SHMEM\_INFO} & any & print helpful text about all these environment +\VAR{SHMEM\_INFO} & any & print helpful text about all these environment variables\tabularnewline \hline -\texttt{SHMEM\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to +\VAR{SHMEM\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to allocate for symmetric heap\tabularnewline \hline -\texttt{SHMEM\_DEBUG} & any & enable debugging messages\tabularnewline +\VAR{SHMEM\_DEBUG} & any & enable debugging messages\tabularnewline \hline \end{tabular} diff --git a/content/library_constants.tex b/content/library_constants.tex index 299720264..9e2054056 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -1,5 +1,5 @@ The constants that start with \CONST{SHMEM\_*} are for both \Fortran -and \CorCpp, and they are compile-time constants. +and \CorCpp, and they are compile-time constants. All constants that start with \CONST{\_SHMEM\_*} are deprecated and provided for backwards compatibility. \newline @@ -8,40 +8,40 @@ \hline \textbf{Constant} & \textbf{Description} \tabularnewline -\hline +\hline \hline %new \vspace{3mm} \vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_SIZE}}} +\hbox{\hspace*{12mm} \CONST{SHMEM\_SYNC\_SIZE}}} & Length of a work array that can be used with any SHMEM collective communication operation. The value of this constant is implementation specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information about the usage of this constant. Work arrays sized for specific operations may consume less memory.\tabularnewline %new -\hline +\hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_BCAST\_SYNC\_SIZE}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_BCAST\_SYNC\_SIZE}}} +& Length of the \VAR{pSync} arrays needed for broadcast routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_broadcast]{Broadcast Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant. \tabularnewline -\hline +\hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_SYNC\_VALUE}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_SYNC\_VALUE}}} +& The value used to initialize the elements of \VAR{pSync} arrays. The value of this constant is implementation specific.\tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_SYNC\_SIZE}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}}} +& Length of the work arrays needed for reduction routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_reductions]{Reduction Routines} section under @@ -49,9 +49,9 @@ about the usage of this constant.\tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_BARRIER\_SYNC\_SIZE}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}}} +& Length of the work array needed for barrier routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_barrier]{Barrier Synchronization Routines} section under @@ -60,8 +60,8 @@ \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_COLLECT\_SYNC\_SIZE}}} -& +\hbox{\hspace*{12mm} \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}}} +& Length of the work array needed for collect routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_collect]{Collect Routines} section under @@ -70,8 +70,8 @@ \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_ALLTOALL\_SYNC\_SIZE}}} -& +\hbox{\hspace*{12mm} \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE}}} +& Length of the work array needed for \FUNC{shmem\_alltoall} routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_alltoall]{Alltoall @@ -84,8 +84,8 @@ \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_ALLTOALLS\_SYNC\_SIZE}}} -& +\hbox{\hspace*{12mm} \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE}}} +& Length of the work array needed for \FUNC{shmem\_alltoalls} routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_alltoalls]{Alltoalls @@ -93,44 +93,44 @@ for more information about the usage of this constant.\tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}}} +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}}} & Minimum length of work arrays used in various collective routines.\tabularnewline \hline \vspace{3mm} %\color{red} -%\vtop{\hbox{} -%\hbox{\hspace*{12mm} \const{}} -%\hbox{} -%\hbox{\hspace*{12mm} \const{}}} +%\vtop{\hbox{} +%\hbox{\hspace*{12mm} \CONST{}} +%\hbox{} +%\hbox{\hspace*{12mm} \CONST{}}} %& \color{red} %Ticket \#107 \tabularnewline -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_MAJOR\_VERSION}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_MAJOR\_VERSION}}} +& Integer representing the major version of \openshmem standard in use. \tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_MINOR\_VERSION}}} -& +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_MINOR\_VERSION}}} +& Integer representing the minor version of \openshmem standard in use. \tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_MAX\_NAME\_LEN}}} +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_MAX\_NAME\_LEN}}} & -Integer representing the maximum length of \const{SHMEM\_VENDOR\_STRING}. \tabularnewline +Integer representing the maximum length of \CONST{SHMEM\_VENDOR\_STRING}. \tabularnewline \hline \vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \const{SHMEM\_VENDOR\_STRING}}} +\vtop{\hbox{\CorCppFor:} +\hbox{\hspace*{12mm} \CONST{SHMEM\_VENDOR\_STRING}}} & String representing vendor defined information of size at most -\const{SHMEM\_MAX\_NAME\_LEN}. +\CONST{SHMEM\_MAX\_NAME\_LEN}. In \CorCpp{}, the string is terminated by a null character. In \Fortran, the -string of size less than \const{SHMEM\_MAX\_NAME\_LEN} is padded with blank -characters up to size \const{SHMEM\_MAX\_NAME\_LEN}. \tabularnewline +string of size less than \CONST{SHMEM\_MAX\_NAME\_LEN} is padded with blank +characters up to size \CONST{SHMEM\_MAX\_NAME\_LEN}. \tabularnewline \hline \end{tabular} diff --git a/utils/defs.tex b/utils/defs.tex index cb52c2b4d..c05ac713b 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -37,7 +37,6 @@ \newcommand{\CTYPE}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} -\newcommand{\const}[1]{\protect\gb\protect{\textsf{\small #1}}\index{CONST:#1}} % Only library_constants.tex table. \newcommand{\CorCpp}{\textit{C/C++}\xspace} \newcommand{\CorCppFor}{\textit{C/C++/Fortran}\xspace} \newcommand{\Fortran}[1][]{% From 6ef1ca790f65fb1b422be85316a118a9be079734 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 22:22:01 -0400 Subject: [PATCH 386/583] Changelog: SHMEM_SYNC_SIZE from `\VAR` to `\CONST` --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index c95221138..57f908f6a 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -544,7 +544,7 @@ \section{Version 1.4} \FUNC{shmem\_finalize}. \\See Sections \ref{subsec:shmem_init} and \ref{subsec:shmem_finalize}. % -\item Added the \VAR{SHMEM\_SYNC\_SIZE} constant. +\item Added the \CONST{SHMEM\_SYNC\_SIZE} constant. \\See Section \ref{subsec:library_constants}. % \item Added type-generic interfaces for \FUNC{SHMEM\_WAIT}. From 8b78507b0e0f9240c569c3a10b048f3d3e50f3c8 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 30 Aug 2017 21:38:25 -0400 Subject: [PATCH 387/583] section/rma-amo: Consistency improvements for atomics intro --- content/atomics_intro.tex | 52 ++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 66df3aad2..86005e1b3 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -1,28 +1,34 @@ -An \ac{AMO} is a one-sided communication mechanism that combines memory update -operations with atomicity guarantees described in Section +An \ac{AMO} is a one-sided communication mechanism that combines memory read, +update, or write operations with atomicity guarantees described in Section~% \ref{subsec:amo_guarantees}. Similar to the \ac{RMA} routines, described in -Section \ref{sec:rma}, the \acp{AMO} are performed only on symmetric objects. -\openshmem defines the two types of \ac{AMO} routines: +Section~\ref{sec:rma}, the \acp{AMO} are performed only on symmetric objects. +\openshmem defines two types of \ac{AMO} routines: + \begin{itemize} + \item -The \textit{fetching} routines return the original value of, and optionally -update, the remote data object in a single atomic operation. The routines -return after the data has been fetched and delivered to the local \ac{PE}. + The \textit{fetching} routines return the original value of, and optionally + update, the remote data object in a single atomic operation. The routines + return after the data has been fetched from the target \ac{PE} and delivered + to the calling \ac{PE}. + The data type of the returned value is the same as the type of + the remote data object. -The fetching operations include: -\FUNC{shmem\_atomic\_\{fetch, compare\_swap, swap\}} and -\FUNC{shmem\_atomic\_fetch\_\{inc, add, and, or, xor\}}. + The fetching routines include: + \FUNC{shmem\_atomic\_\{fetch, compare\_swap, swap\}} and + \FUNC{shmem\_atomic\_fetch\_\{inc, add, and, or, xor\}}. \item -The \textit{non-fetching} atomic routines update the remote memory in a single -atomic operation. A call to a non-fetching atomic routine issues the atomic -operation and may return before the operation executes on the remote \ac{PE}. -To force completion for these non-fetching atomic routines, -\FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} can -be used by an \openshmem program. + The \textit{non-fetching} routines update the remote data object in a single + atomic operation. A call to a non-fetching atomic routine issues the atomic + operation and may return before the operation executes on the target \ac{PE}. + The \FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} + routines can be used to force completion for these non-fetching + atomic routines. + + The non-fetching routines include: + \FUNC{shmem\_atomic\_\{set, inc, add, and, or, xor\}}. -The non-fetching operations include: -\FUNC{shmem\_atomic\_\{set, inc, add, and, or, xor\}}. \end{itemize} Where appropriate compiler support is available, \openshmem provides @@ -30,15 +36,15 @@ The type-generic support for the \ac{AMO} routines is as follows: \begin{itemize} -\item \FUNC{shmem\_atomic\_\{compare\_swap, fetch\_inc, inc, fetch\_add, add\}} support - the ``standard \ac{AMO} types'' listed in Table~\ref{stdamotypes}, +\item \FUNC{shmem\_atomic\_\{compare\_swap, fetch\_inc, inc, fetch\_add, add\}} + support the ``standard \ac{AMO} types'' listed in Table~\ref{stdamotypes}, \item \FUNC{shmem\_atomic\_\{fetch, set, swap\}} support - the ``extended \ac{AMO} types'' listed in Table~\ref{extamotypes}, and + the ``extended \ac{AMO} types'' listed in Table~\ref{extamotypes}, and \item \FUNC{shmem\_atomic\_\{fetch\_and, and, fetch\_or, or, fetch\_xor, xor\}} - support the ``bitwise \ac{AMO} types'' listed in Table~\ref{bitamotypes}. + support the ``bitwise \ac{AMO} types'' listed in Table~\ref{bitamotypes}. \end{itemize} -The standard and extended \ac{AMO} types include some of the exact-width +The standard, extended, and bitwise \ac{AMO} types include some of the exact-width integer types defined in \HEADER{stdint.h} by \Cstd[99]~\S7.18.1.1 and \Cstd[11]~\S7.20.1.1. When the \Cstd translation environment does not provide exact-width integer types with \HEADER{stdint.h}, an From a3b0ddf03d052804a3f94321dad29e227f780cf3 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 22:45:35 -0400 Subject: [PATCH 388/583] Changelog: Reword preamble paragraphs for each OpenSHMEM version - Also, \Fortran. --- content/backmatter.tex | 66 +++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 57f908f6a..a6e5bbad1 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -530,14 +530,16 @@ \subsection{\Fortran API}\label{subsec:deprecate-fortran} \chapter{Changes to this Document}\label{sec:changelog} \section{Version 1.4} +%Major changes in \openshmem[1.4] include ... +The following list describes the specific changes in \openshmem[1.4]: \begin{itemize} \item Clarified that the \openshmem extensions header files are required, even when empty. \\See Section~\ref{subsec:bindings}. % \item Clarified that the \FUNC{SHMEM\_GET64} and \FUNC{SHMEM\_GET64\_NBI} - routines are included in the Fortran language bindings.\\ + routines are included in the \Fortran language bindings.\\ See Sections \ref{subsec:shmem_get} and \ref{subsec:shmem_get_nbi}. % \item Clarified that \FUNC{shmem\_init} must be matched with a call to @@ -637,14 +639,17 @@ \section{Version 1.4} % \end{itemize} -\section{Version 1.3} -This section summarizes the changes from the \openshmem specification Version -1.2 to Version 1.3. Many major changes to the specification were introduced in Version 1.3. This includes non-blocking RMA operations, -generic interfaces for various OpenSHMEM interfaces, atomic \FUNC{Put} and \FUNC{Get} operations, and Alltoall interfaces. -The following list describes the specific changes in 1.3: +\section{Version 1.3} +Major changes in \openshmem[1.3] include the addition of +\Cstd[11] type-generic interfaces for \ac{RMA} and \ac{AMO} operations, +non-blocking RMA operations, +atomic \PUT{} and \GET{} operations, +and all-to-all collectives. + +The following list describes the specific changes in \openshmem[1.3]: \begin{itemize} % \item Clarified implementation of \acp{PE} as threads. @@ -692,21 +697,21 @@ \section{Version 1.3} \section{Version 1.2} -This section summarizes the changes from the \openshmem specification Version -1.1 to Version 1.2. A major change in this version is that it improves upon the -execution model described in 1.1 by introducing an explicit -\FUNC{shmem\_finalize} library call. This provides a collective mechanism of -exiting an \openshmem program and releasing resources used by the library. - - -The following list describes the specific changes in 1.2: - +Major changes in \openshmem[1.2] include +a new initialization routine (\FUNC{shmem\_init}), +improvements to the execution model with the addition of an explicit +library-finalization routine (\FUNC{shmem\_finalize}), +an early-exit routine (\FUNC{shmem\_global\_exit}), +namespace standardization, +and clarifications to several API descriptions. + +The following list describes the specific changes in \openshmem[1.2]: \begin{itemize} % \item Added specification of \VAR{pSync} initialization for all routines that use it. % \item Replaced all placeholder variable names \VAR{target} with \VAR{dest} to - avoid confusion with Fortran `target' keyword. + avoid confusion with \Fortran `target' keyword. % \item New Execution Model for exiting/finishing OpenSHMEM programs. \\See Section \ref{subsec:execution_model}. @@ -743,7 +748,7 @@ \section{Version 1.2} \item Notes and clarifications added to \FUNC{shmem\_malloc}. \\See Section \ref{subsec:shfree}. % -\item Deprecation of Fortran API routine \FUNC{SHMEM\_PUT}. +\item Deprecation of \Fortran API routine \FUNC{SHMEM\_PUT}. \\See Section \ref{subsec:shmem_put}. % \item Clarification related to \FUNC{shmem\_wait}. @@ -762,18 +767,14 @@ \section{Version 1.2} \section{Version 1.1} -This section summarizes the changes from the \openshmem specification Version -1.0 to the Version 1.1. A major change in this version is that it provides an -accurate description of \openshmem interfaces so that they are in agreement with -the SGI specification. This version also explains \openshmem's programming, -memory, and execution model. The document was thoroughly changed to improve the -readability of specification and usability of interfaces. The code examples -were added to demonstrate the usability of API. Additionally, diagrams were -added to help understand the subtle semantic differences of various operations. - - -The following list describes the specific changes in 1.1: - +Major changes from \openshmem[1.0] to \openshmem[1.1] include +the introduction of the \HEADER{shmemx.h} header file for non-standard API +extensions, +clarifications to completion semantics and API descriptions in agreement with +the SGI SHMEM specification, +and general readabilty and usability improvements to the document structure. + +The following list describes the specific changes in \openshmem[1.1]: \begin{itemize} % \item Clarifications of the completion semantics of memory synchronization @@ -820,7 +821,7 @@ \section{Version 1.1} \FUNC{shmem\_char\_get}. \\See Sections \ref{subsec:shmem_put} and \ref{subsec:shmem_get}. % -\item The usage of \VAR{ptrdiff\_t}, \VAR{size\_t}, and \VAR{int} in the +\item The usage of \CTYPE{ptrdiff\_t}, \CTYPE{size\_t}, and \CTYPE{int} in the interface signature was made consistent with the description. \\See Sections \ref{subsec:coll}, \ref{subsec:shmem_iput}, and \ref{subsec:shmem_iget}. % @@ -831,7 +832,7 @@ \section{Version 1.1} \FUNC{shmem\_barrier}.\\ See Section \ref{subsec:shmem_barrier}. % \item Clarification of the expected behavior when multiple \FUNC{start\_pes} -calls are encountered has been clarified. +calls are encountered. \\See Section \ref{subsec:start_pes}. % \item Corrected the definition of atomic increment operation. @@ -867,7 +868,7 @@ \section{Version 1.1} language. \\See Sections \ref{subsec:shfree} and Annex \ref{sec:undefined}. % -\item Fortran programming fixes for examples.\\ See Sections +\item \Fortran programming fixes for examples.\\ See Sections \ref{subsec:shmem_reductions} and \ref{subsec:shmem_wait}. % \item Clarifications of the reuse \VAR{pSync} and \VAR{pWork} across @@ -883,5 +884,4 @@ \section{Version 1.1} - } %end of setlength command that was started in frontmatter.tex From 558014826a981126ca0e20c3da82250442128caf Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 30 Aug 2017 22:48:04 -0400 Subject: [PATCH 389/583] Added acronym for SGI --- content/backmatter.tex | 28 ++++++++++++++-------------- utils/defs.tex | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index a6e5bbad1..3e127e81f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -226,7 +226,7 @@ \section{\ac{MPI} Interoperability} \begin{sloppypar} % to prevent constants from running into margins. % \openshmem routines may be used in conjunction with \ac{MPI} routines in the -same program. For example, on SGI systems, programs that use both \ac{MPI} and +same program. For example, on \ac{SGI} systems, programs that use both \ac{MPI} and \openshmem routines call \FUNC{MPI\_Init} and \FUNC{MPI\_Finalize} but omit the call to the \FUNC{shmem\_init} routine. \openshmem \ac{PE} numbers are equal to the \ac{MPI} rank within the \CONST{MPI\_COMM\_WORLD} environment variable. @@ -237,7 +237,7 @@ \section{\ac{MPI} Interoperability} % \end{sloppypar} % -On SGI systems where \ac{MPI} jobs use \ac{TCP}/sockets for inter-host communication, +On \ac{SGI} systems where \ac{MPI} jobs use \ac{TCP}/sockets for inter-host communication, \openshmem routines may be used to communicate with processes running on the same host. The \FUNC{shmem\_pe\_accessible} routine should be used to determine if a remote \ac{PE} is accessible via \openshmem communication from the local @@ -268,7 +268,7 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} SHMEM has a long history as a parallel programming model, having been used extensively on a number of products since 1993, including Cray T3D, Cray X1E, -the Cray XT3/4, SGI Origin, SGI Altix, clusters based on the Quadrics +the Cray XT3/4, \ac{SGI} Origin, \ac{SGI} Altix, clusters based on the Quadrics interconnect, and, to a very limited extent, Infiniband based clusters. \begin{itemize} @@ -277,18 +277,18 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \item Cray SHMEM \begin{itemize} \item SHMEM first introduced by Cray Research Inc. in 1993 for Cray T3D - \item Cray is acquired by SGI in 1996 + \item Cray is acquired by \ac{SGI} in 1996 \item Cray is acquired by Tera in 2000 (MTA) \item Platforms: Cray T3D, T3E, C90, J90, SV1, SV2, X1, X2, XE, XMT, XT \end{itemize} - \item SGI SHMEM + \item \ac{SGI} SHMEM \begin{itemize} - \item SGI purchases Cray Research Inc. and SHMEM was integrated into - SGI's Message Passing Toolkit (MPT) - \item SGI currently owns the rights to SHMEM and \openshmem + \item \ac{SGI} purchases Cray Research Inc. and SHMEM was integrated into + \ac{SGI}'s Message Passing Toolkit (MPT) + \item \ac{SGI} currently owns the rights to SHMEM and \openshmem \item Platforms: Origin, Altix 4700, Altix XE, ICE, UV - \item SGI was purchased by Rackable Systems in 2009 - \item SGI and Open Source Software Solutions, Inc. (OSSS) signed a + \item \ac{SGI} was purchased by Rackable Systems in 2009 + \item \ac{SGI} and Open Source Software Solutions, Inc. (OSSS) signed a SHMEM trademark licensing agreement, in 2010 \end{itemize} \item Other Implementations @@ -305,7 +305,7 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \end{itemize} \item OpenSHMEM Implementations \begin{itemize} - \item SGI \openshmem + \item \ac{SGI} \openshmem \item University of Houston - \openshmem Reference Implementation \item Mellanox ScalableSHMEM \item Portals-SHMEM @@ -413,7 +413,7 @@ \subsection{Header Directory: \HEADER{mpp}} include 'mpp/shmem.fh' include 'mpp/shmemx.fh' \end{lstlisting} -for backwards compatibility with SGI SHMEM. +for backwards compatibility with \ac{SGI} SHMEM. \subsection{\CorCpp: \FUNC{start\_pes}} The \CorCpp routine \FUNC{start\_pes} includes an unnecessary initialization @@ -771,7 +771,7 @@ \section{Version 1.1} the introduction of the \HEADER{shmemx.h} header file for non-standard API extensions, clarifications to completion semantics and API descriptions in agreement with -the SGI SHMEM specification, +the \ac{SGI} SHMEM specification, and general readabilty and usability improvements to the document structure. The following list describes the specific changes in \openshmem[1.1]: @@ -876,7 +876,7 @@ \section{Version 1.1} \\See Sections \ref{subsec:coll}, \ref{subsec:shmem_broadcast}, \ref{subsec:shmem_collect} and \ref{subsec:shmem_reductions}. % -\item Name changes for UV and ICE for SGI systems. +\item Name changes for UV and ICE for \ac{SGI} systems. \\See Annex \ref{sec:openshmem_history}. % \end{itemize} diff --git a/utils/defs.tex b/utils/defs.tex index a649c30e3..48f77165b 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -88,6 +88,7 @@ \acro{ORNL}{Oak Ridge National Laboratory} \acro{LANL}{Los Alamos National Laboratory} \acro{ESSC}{Extreme Scale Systems Center} +\acro{SGI}{Silicon Graphics International} \acro{OSSS}{Open Software System Solutions} \acro{DoD}{U.S. Department of Defense} \end{acronym} From 677505fc6c7015fc6cb187cb456e4e70775b5822 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 31 Aug 2017 11:02:16 -0400 Subject: [PATCH 390/583] Format SHMEM_SYMMETRIC_SIZE using \VAR Signed-off-by: James Dinan --- content/shmem_malloc.tex | 2 +- content/shpalloc.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index d9ed2040a..aedbfeb48 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -82,7 +82,7 @@ remains unchanged from the deprecated versions. The total size of the symmetric heap is determined at job startup. One can - adjust the size of the heap using the \CONST{SHMEM\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \VAR{SHMEM\_SYMMETRIC\_SIZE} environment variable (where available). The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines diff --git a/content/shpalloc.tex b/content/shpalloc.tex index a77bacf45..1cb4c0ab3 100644 --- a/content/shpalloc.tex +++ b/content/shpalloc.tex @@ -38,7 +38,7 @@ \apinotes{ The total size of the symmetric heap is determined at job startup. One may - adjust the size of the heap using the \CONST{SHMEM\_SYMMETRIC\_SIZE} environment + adjust the size of the heap using the \VAR{SHMEM\_SYMMETRIC\_SIZE} environment variable (if available). } From 6eca93095dffb7316693301ae714c33f56a5cad8 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 31 Aug 2017 17:05:14 -0400 Subject: [PATCH 391/583] Merge shmem_barrier_all updates into shmem_sync_all Signed-off-by: James Dinan --- content/shmem_sync_all.tex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/shmem_sync_all.tex b/content/shmem_sync_all.tex index 8c2a498b9..981771ece 100644 --- a/content/shmem_sync_all.tex +++ b/content/shmem_sync_all.tex @@ -19,8 +19,9 @@ \apidescription{ The \FUNC{shmem\_sync\_all} routine registers the arrival of a \ac{PE} at a barrier. Barriers are a fast mechanism for synchronizing all \acp{PE} at - once. This routine causes a \ac{PE} to suspend execution until all - \acp{PE} have called \FUNC{shmem\_sync\_all}. + once. This routine blocks the \ac{PE} until all \acp{PE} have called + \FUNC{shmem\_sync\_all}. In a multithreaded \openshmem + program, only the calling thread is blocked. In contrast with the \FUNC{shmem\_barrier\_all} routine, \FUNC{shmem\_sync\_all} only ensures completion and visibility of previously issued memory From fd3a6627f7a8b26d2d1e496b9d01eb000f5b6ba3 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 31 Aug 2017 17:08:51 -0400 Subject: [PATCH 392/583] Remove change highlighting Signed-off-by: James Dinan --- content/backmatter.tex | 4 ++-- content/shmem_sync.tex | 2 -- content/shmem_sync_all.tex | 2 -- main_spec.tex | 4 ---- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 333592ea9..7d9cc42b7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -524,9 +524,9 @@ \section{Version 1.4} \begin{itemize} -\item \newtext{New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide PE +\item New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide PE synchronization without completing pending communication operations. - \\See Sections \ref{subsec:shmem_sync_all} and \ref{subsec:shmem_sync}.} + \\See Sections \ref{subsec:shmem_sync_all} and \ref{subsec:shmem_sync}. % \item Clarified that the \openshmem extensions header files are required, even when empty. \\See Section~\ref{subsec:bindings}. diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index e8ceed2d6..bf606a7ad 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -1,4 +1,3 @@ -\color{ForestGreen} \apisummary{ Performs all operations described in the \FUNC{shmem\_sync\_all} interface but with respect to a subset of \acp{PE} defined by the \activeset. @@ -80,4 +79,3 @@ \end{apiexamples} \end{apidefinition} -\color{black} diff --git a/content/shmem_sync_all.tex b/content/shmem_sync_all.tex index 981771ece..aa9873706 100644 --- a/content/shmem_sync_all.tex +++ b/content/shmem_sync_all.tex @@ -1,4 +1,3 @@ -\color{ForestGreen} \apisummary{ Registers the arrival of a \ac{PE} at a barrier and suspends \ac{PE} execution until all other \acp{PE} arrive at the barrier. @@ -42,4 +41,3 @@ } \end{apidefinition} -\color{black} diff --git a/main_spec.tex b/main_spec.tex index 342d06ba4..b660d691e 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -217,14 +217,10 @@ \subsubsection{\textbf{SHMEM\_BARRIER}}\label{subsec:shmem_barrier} \input{content/shmem_barrier.tex} \subsubsection{\textbf{SHMEM\_SYNC\_ALL}}\label{subsec:shmem_sync_all} -\newtext{ \input{content/shmem_sync_all.tex} -} \subsubsection{\textbf{SHMEM\_SYNC}}\label{subsec:shmem_sync} -\newtext{ \input{content/shmem_sync.tex} -} \subsubsection{\textbf{SHMEM\_BROADCAST}}\label{subsec:shmem_broadcast} \input{content/shmem_broadcast.tex} From fe8df9d1282a5e827ba4496d7a43d0e4a3133117 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 31 Aug 2017 17:10:03 -0400 Subject: [PATCH 393/583] Replace \activeset macro with "active set" Signed-off-by: James Dinan --- content/shmem_sync.tex | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index bf606a7ad..2bee1247f 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -1,6 +1,6 @@ \apisummary{ Performs all operations described in the \FUNC{shmem\_sync\_all} interface - but with respect to a subset of \acp{PE} defined by the \activeset. + but with respect to a subset of \acp{PE} defined by the active set. } \begin{apidefinition} @@ -11,34 +11,34 @@ \begin{apiarguments} -\apiargument{IN}{PE\_start}{The lowest \ac{PE} number of the \activeset of +\apiargument{IN}{PE\_start}{The lowest \ac{PE} number of the active set of \acp{PE}. \VAR{PE\_start} must be of type integer.} \apiargument{IN}{logPE\_stride}{The log (base 2) of the stride between - consecutive \ac{PE} numbers in the \activeset. \VAR{logPE\_stride} must be + consecutive \ac{PE} numbers in the active set. \VAR{logPE\_stride} must be of type integer.} -\apiargument{IN}{PE\_size}{The number of \acp{PE} in the \activeset. +\apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer.} \apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be of type long and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. Every element of this array must be initialized to \CONST{SHMEM\_SYNC\_VALUE} before any of the - \acp{PE} in the \activeset enter \FUNC{shmem\_sync} the first time.} + \acp{PE} in the active set enter \FUNC{shmem\_sync} the first time.} \end{apiarguments} \apidescription{ \FUNC{shmem\_sync} is a collective synchronization routine over an - \activeset. Control returns from \FUNC{shmem\_sync} after all \acp{PE} in - the \activeset (specified by \VAR{PE\_start}, \VAR{logPE\_stride}, and + active set. Control returns from \FUNC{shmem\_sync} after all \acp{PE} in + the active set (specified by \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}) have called \FUNC{shmem\_sync}. As with all \openshmem collective routines, each of these routines assumes - that only \acp{PE} in the \activeset call the routine. If a \ac{PE} not in - the \activeset calls an \openshmem collective routine, undefined behavior + that only \acp{PE} in the active set call the routine. If a \ac{PE} not in + the active set calls an \openshmem collective routine, undefined behavior results. The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and - \VAR{PE\_size} must be equal on all \acp{PE} in the \activeset. The same - work array must be passed in \VAR{pSync} to all \acp{PE} in the \activeset. + \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same + work array must be passed in \VAR{pSync} to all \acp{PE} in the active set. In contrast with the \FUNC{shmem\_barrier} routine, \FUNC{shmem\_sync} only ensures completion and visibility of previously issued memory stores and does not ensure @@ -57,7 +57,7 @@ synchronization, for example, a call to \FUNC{shmem\_sync\_all}, before calling \FUNC{shmem\_sync} for the first time. - If the \activeset does not change, \FUNC{shmem\_sync} can be called + If the active set does not change, \FUNC{shmem\_sync} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization beyond that implied by \FUNC{shmem\_sync} itself is necessary in this case. From be9d61eafc2838b5064ec6a671e70595bbe23748 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 31 Aug 2017 21:01:30 -0400 Subject: [PATCH 394/583] Annex F: Styling on SMA environment variables --- content/backmatter.tex | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3e127e81f..cb2fe0704 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -380,10 +380,10 @@ \section{Overview}\label{subsec:dep_overview} \CONST{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline \CONST{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \CONST{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline - SMA\_VERSION & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_VERSION} \\ \hline - SMA\_INFO & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_INFO} \\ \hline - SMA\_SYMMETRIC\_SIZE & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_SYMMETRIC\_SIZE} \\ \hline - SMA\_DEBUG & 1.4 & Current & \hyperref[subsec:environment_variables]{SHMEM\_DEBUG} \\ \hline + \VAR{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline + \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline + \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline + \VAR{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline \CorCpp: \FUNC{shmem\_wait} & 1.4 & Current & See ``Notes'' for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline \CorCpp: \FUNC{shmem\_fetch} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline \CorCpp: \FUNC{shmem\_set} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline @@ -480,17 +480,9 @@ \subsection{\CONST{\_SHMEM\_*} Library Constants} with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran naming conventions. -\subsection{SMA\_* Environment Variables} -The environment variables -\begin{center} -\begin{tabular}{ll} - %% TODO: Styling. - SMA\_VERSION \\ - SMA\_INFO \\ - SMA\_SYMMETRIC\_SIZE \\ - SMA\_DEBUG \\ -\end{tabular} -\end{center} +\subsection{\VAR{SMA\_*} Environment Variables} +The environment variables \VAR{SMA\_VERSION}, \VAR{SMA\_INFO}, +\VAR{SMA\_SYMMETRIC\_SIZE}, and \VAR{SMA\_DEBUG} were deprecated in order to normalize the \openshmem \ac{API} to use \shmemprefix{} as the standard prefix for all environment variables. From ec9bf46ca452ae8c690639fe4f98bdcf9c343b3d Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 31 Aug 2017 21:11:50 -0400 Subject: [PATCH 395/583] Annex C, F: Break long tables across multiple pages --- content/backmatter.tex | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index cb2fe0704..7abaed590 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -164,14 +164,11 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} behavior is observed. Depending on the implementation, there are many interpretations of undefined behavior. -$\;$ - -$ $% -\begin{tabular}{|>{\raggedright}p{0.3\textwidth}|>{\raggedright}p{0.6\textwidth}|} +\begin{longtable}{|>{\raggedright}p{0.3\textwidth}|>{\raggedright}p{0.6\textwidth}|} \hline \textbf{Inappropriate Usage} & \textbf{Undefined Behavior}\tabularnewline \hline -\hline +\endhead Uninitialized library & If the \openshmem library is not initialized, calls to non-initializing \openshmem routines have undefined behavior. For example, an implementation may try to continue or may abort @@ -214,7 +211,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \end{itemize} \tabularnewline \hline -\end{tabular} +\end{longtable} @@ -334,13 +331,14 @@ \section{Overview}\label{subsec:dep_overview} \begin{center} \scriptsize -\begin{tabular}{|l|c|c|l|} +\begin{longtable}{|l|c|c|l|} \hline \textbf{Deprecated API} & \textbf{Deprecated Since} & \shortstack{\textbf{Last Version Supported}} & \textbf{Replaced By} \\ \hline + \endhead Header Directory: \hyperref[subsec:dep_rationale:mpp]{\HEADER{mpp}} & 1.1 & Current & (none) \\ \hline \CorCpp: \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline \Fortran: \hyperref[subsec:start_pes]{\FUNC{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline @@ -394,7 +392,7 @@ \section{Overview}\label{subsec:dep_overview} \CorCpp: \FUNC{shmem\_fadd} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline \CorCpp: \FUNC{shmem\_add} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline - \end{tabular} + \end{longtable} \end{center} \section{Deprecation Rationale}\label{subsec:dep_rationale} From d18a7ea0933685453cb9e714f34787767842a236 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 31 Aug 2017 23:07:50 -0400 Subject: [PATCH 396/583] Undo section header styling that use \Fortran Affected by #66. Note: Annex B uses the \Fortran (and related) commands on its subsection headings, but these headings are not visible in the PDF bookmarks, so it's okay. --- content/backmatter.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 7abaed590..e92e715d6 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -433,12 +433,12 @@ \subsection{\CorCpp: \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard prefix for all routines. -\subsection{\Fortran: \FUNC{START\_PES}, \FUNC{MY\_PE}, \FUNC{NUM\_PES}} +\subsection{Fortran: \FUNC{START\_PES}, \FUNC{MY\_PE}, \FUNC{NUM\_PES}} The \Fortran routines \FUNC{START\_PES}, \FUNC{MY\_PE}, and \FUNC{NUM\_PES} were deprecated in order to minimize the API differences from the deprecation of \CorCpp routines \FUNC{start\_pes}, \FUNC{\_my\_pe}, and \FUNC{\_num\_pes}. -\subsection{\Fortran: \FUNC{SHMEM\_PUT}} +\subsection{Fortran: \FUNC{SHMEM\_PUT}} The \Fortran routine \FUNC{SHMEM\_PUT} is defined only for the \Fortran \ac{API} and is semantically identical to \Fortran routines \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and @@ -504,7 +504,7 @@ \subsection{\CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap} In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. -\subsection{\Fortran API}\label{subsec:deprecate-fortran} +\subsection{Fortran API}\label{subsec:deprecate-fortran} %% WARNING: Issue #66. The entire \openshmem \Fortran API was deprecated because of a general lack of use and a lack of conformance with legacy \Fortran standards. In lieu of an extensive update of the \Fortran API, \Fortran users are encouraged to From e20417bb0c763faa1fd77b032ee1bcc14e8d5257 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 1 Sep 2017 10:31:54 -0400 Subject: [PATCH 397/583] Remove change markers Signed-off-by: James Dinan --- content/backmatter.tex | 4 ++-- content/library_constants.tex | 16 +++------------- content/programming_model_overview.tex | 2 -- content/shmem_atomic_add.tex | 2 -- content/shmem_atomic_compare_swap.tex | 2 -- content/shmem_atomic_fetch.tex | 2 -- content/shmem_atomic_fetch_add.tex | 2 -- content/shmem_atomic_fetch_inc.tex | 2 -- content/shmem_atomic_inc.tex | 2 -- content/shmem_atomic_set.tex | 2 -- content/shmem_atomic_swap.tex | 2 -- content/shmem_barrier.tex | 6 +++--- content/shmem_barrier_all.tex | 9 ++++----- content/shmem_ctx.tex | 3 --- content/shmem_fence.tex | 4 +--- content/shmem_finalize.tex | 4 ++-- content/shmem_g.tex | 2 -- content/shmem_get.tex | 2 -- content/shmem_get_nbi.tex | 2 -- content/shmem_iget.tex | 2 -- content/shmem_iput.tex | 2 -- content/shmem_malloc.tex | 6 +++--- content/shmem_p.tex | 2 -- content/shmem_put.tex | 2 -- content/shmem_put_nbi.tex | 2 -- content/shmem_quiet.tex | 5 +---- 26 files changed, 19 insertions(+), 72 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3c0c984a8..6e6cbf4b7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -524,10 +524,10 @@ \section{Version 1.4} \begin{itemize} -\item \newtext{New communication management API, including \FUNC{shmem\_ctx\_create}; +\item New communication management API, including \FUNC{shmem\_ctx\_create}; \FUNC{shmem\_ctx\_destroy}; and additional RMA, AMO, and memory ordering routines that accept \CTYPE{shmem\_ctx\_t} arguments. -\\See Section \ref{sec:ctx}.} +\\See Section \ref{sec:ctx}. % \item New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide PE synchronization without completing pending communication operations. diff --git a/content/library_constants.tex b/content/library_constants.tex index 760c5902f..cd93f9c76 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -12,14 +12,13 @@ \hline \vspace{3mm} \vtop{\hbox{\CorCpp:} -\hbox{\hspace*{12mm} \newtext{\const{SHMEM\_CTX\_DEFAULT}}}} -& \newtext{Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the +\hbox{\hspace*{12mm} \const{SHMEM\_CTX\_DEFAULT}}} +& Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the default communication context. All point-to-point communication operations and synchronizations that do not specify a context are performed on the default context. Refer to \hyperref[sec:ctx]{Communication Management Routines} for more information about the usage of this -constant.}\tabularnewline -%new +constant.\tabularnewline \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} @@ -29,7 +28,6 @@ specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information about the usage of this constant. Work arrays sized for specific operations may consume less memory.\tabularnewline -%new \hline \vspace{3mm} \vtop{\hbox{\CorCppFor:} @@ -108,13 +106,6 @@ & Minimum length of work arrays used in various collective routines.\tabularnewline \hline \vspace{3mm} -%\color{red} -%\vtop{\hbox{} -%\hbox{\hspace*{12mm} \const{}} -%\hbox{} -%\hbox{\hspace*{12mm} \const{}}} -%& \color{red} -%Ticket \#107 \tabularnewline \vtop{\hbox{\CorCppFor:} \hbox{\hspace*{12mm} \const{SHMEM\_MAJOR\_VERSION}}} & @@ -144,4 +135,3 @@ \hline \end{tabular} -\color{black} diff --git a/content/programming_model_overview.tex b/content/programming_model_overview.tex index c98c0a1e3..430e7458f 100644 --- a/content/programming_model_overview.tex +++ b/content/programming_model_overview.tex @@ -52,7 +52,6 @@ reallocation of the same symmetric data object with identical arguments. \end{enumerate} -\newtext{ \item \textbf{Communication Management} \begin{enumerate} \item \OPR{Contexts}: Contexts are containers for communication operations. @@ -60,7 +59,6 @@ that context are ordered and completed independently of other operations performed by the application. \end{enumerate} -} \item \textbf{Remote Memory Access} \begin{enumerate} diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index a338e8804..d4dd6bcdd 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -27,10 +27,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. When using \CorCpp, the type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index 86f9cbdd1..34074297d 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -27,10 +27,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. } \apiargument{IN}{cond}{\VAR{cond} is compared to the remote \VAR{dest} diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 98c7e5a65..59dc1bc4c 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -32,10 +32,8 @@ \begin{apiarguments} -\newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -} \apiargument{IN}{dest}{The remotely accessible data object to be fetched from the remote \ac{PE}.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number from which diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index e353d1ea7..cb63bde1c 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -28,10 +28,8 @@ \begin{apiarguments} -\newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -} \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \VAR{dest} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 98185947c..cab8d56a0 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -29,10 +29,8 @@ \begin{apiarguments} -\newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -} \apiargument{IN}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index 42dde3fbf..60f945720 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -26,10 +26,8 @@ \begin{apiarguments} -\newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -} \apiargument{IN}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 5bb7732da..d5ce546b3 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -32,10 +32,8 @@ \begin{apiarguments} -\newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -} \apiargument{IN}{dest}{The remotely accessible data object to be set on the remote \ac{PE}.} \apiargument{IN}{value}{The value to be atomically written to the remote \ac{PE}.} diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index 3a5604608..3d447dc1b 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -30,10 +30,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. When using \CorCpp, the type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 2df1f6981..5a146d941 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -51,7 +51,7 @@ \FUNC{shmem\_barrier} ensures that all previously issued stores and remote memory updates, including \acp{AMO} and \ac{RMA} operations, done by any of the - \acp{PE} in the active set \newtext{on the default context} are complete before returning. + \acp{PE} in the active set on the default context are complete before returning. The same \VAR{pSync} array may be reused on consecutive calls to \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. @@ -74,9 +74,9 @@ portably ensure that memory access operations observe remote updates in the order enforced by initiator PEs. - \newtext{Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior + Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior to calling the barrier routine to ensure completion of operations issued on - additional contexts.} + additional contexts. } \begin{apiexamples} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index d92e95f5b..284b260c5 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -1,8 +1,7 @@ \apisummary{ Registers the arrival of a \ac{PE} at a barrier and blocks the \ac{PE} until all other \acp{PE} arrive at the barrier and all local - \newtext{updates} and remote memory updates \newtext{on the default - context} are completed. + updates and remote memory updates on the default context are completed. } \begin{apidefinition} @@ -30,7 +29,7 @@ Prior to synchronizing with other \acp{PE}, \FUNC{shmem\_barrier\_all} ensures completion of all previously issued memory stores and remote memory - updates issued \newtext{on the default context} via \openshmem \acp{AMO} and + updates issued on the default context via \openshmem \acp{AMO} and \ac{RMA} routine calls such as \FUNC{shmem\_int\_add}, \FUNC{shmem\_put32}, \FUNC{shmem\_put\_nbi}, and \FUNC{shmem\_get\_nbi}. @@ -45,9 +44,9 @@ portably ensure that memory access operations observe remote updates in the order enforced by initiator PEs. - \newtext{Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior + Calls to \FUNC{shmem\_ctx\_quiet} can be performed prior to calling the barrier routine to ensure completion of operations issued on - additional contexts.} + additional contexts. } \begin{apiexamples} diff --git a/content/shmem_ctx.tex b/content/shmem_ctx.tex index 4f3ae22aa..7c81b49b5 100644 --- a/content/shmem_ctx.tex +++ b/content/shmem_ctx.tex @@ -1,5 +1,3 @@ -\color{ForestGreen} - All \openshmem RMA, AMO, and memory ordering routines are performed on a communication context. The communication context defines an independent ordering and completion environment, allowing users to manage the @@ -150,4 +148,3 @@ \subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} \end{apiexamples} \end{apidefinition} -\color{black} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 047e5bc49..55a543103 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -15,17 +15,15 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \end{apiarguments} \apidescription{ This routine assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects. All \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects issued to a particular remote \ac{PE} - \newtext{on the given context} prior + on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any subsequent \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index d8e1bb113..e54d1384b 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -26,10 +26,10 @@ implicit global barrier in \FUNC{shmem\_finalize} so that pending communications are completed, and no resources can be released until all \acp{PE} have entered \FUNC{shmem\_finalize}. - \newtext{This routine destroys all shareable contexts. The user is + This routine destroys all shareable contexts. The user is responsible for destroying all contexts with the \CONST{SHMEM\_CTX\_PRIVATE} option enabled prior to calling this routine. - Otherwise, the behavior is undefined.} + Otherwise, the behavior is undefined. \FUNC{shmem\_finalize} must be the last \openshmem library call encountered in the \openshmem portion of a program. A call to \FUNC{shmem\_finalize} will release any resources diff --git a/content/shmem_g.tex b/content/shmem_g.tex index bdffb3861..dd770c222 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -17,10 +17,8 @@ where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{IN}{addr}{The remotely accessible array element or scalar data object.} \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} \end{apiarguments} diff --git a/content/shmem_get.tex b/content/shmem_get.tex index 12f55fa4f..1daa2149d 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -44,10 +44,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{Local data object to be updated.} \apiargument{IN}{source}{Data object on the \ac{PE} identified by \VAR{pe} that contains the data to be copied. This data object must be remotely diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index faff3638c..50b8101a5 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -45,10 +45,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{Local data object to be updated.} \apiargument{IN}{source}{Data object on the \ac{PE} identified by \VAR{pe} that contains the data to be copied. This data object must be remotely diff --git a/content/shmem_iget.tex b/content/shmem_iget.tex index b6e718802..1529a109b 100644 --- a/content/shmem_iget.tex +++ b/content/shmem_iget.tex @@ -37,10 +37,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{Array to be updated on the local \ac{PE}. } \apiargument{IN}{source}{Array containing the data to be copied on the remote \ac{PE}.} \apiargument{IN}{dst}{The stride between consecutive elements of the \dest{} diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index 6d8f8210a..f73e7f806 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -37,10 +37,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{Array to be updated on the remote \ac{PE}. This data object must be remotely accessible.} \apiargument{IN}{source}{Array containing the data to be copied.} diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index d0840f545..eb5a3a6a1 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -55,12 +55,12 @@ This ensures that all \acp{PE} participate in the memory allocation, and that the memory on other \acp{PE} can be used as soon as the local \ac{PE} returns. - \newtext{The implicit barriers performed by these routines quiet the + The implicit barriers performed by these routines quiet the default context. It is the user's responsibility to ensure that no communication operations involving the given memory block are pending on other contexts prior to calling - the \FUNC{shmem\_free} and \FUNC{shmem\_realloc} routines.} - The user is \newtext{also} + the \FUNC{shmem\_free} and \FUNC{shmem\_realloc} routines. + The user is also responsible for calling these routines with identical argument(s) on all \acp{PE}; if differing \VAR{size} arguments are used, the behavior of the call and any subsequent \openshmem calls becomes undefined. diff --git a/content/shmem_p.tex b/content/shmem_p.tex index edad8e9f4..92350947a 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -17,10 +17,8 @@ where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{IN}{addr}{The remotely accessible array element or scalar data object which will receive the data on the remote \ac{PE}.} \apiargument{IN}{value}{The value to be transferred to \VAR{addr} on the diff --git a/content/shmem_put.tex b/content/shmem_put.tex index 38bc2180b..7bc4dfa16 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -44,10 +44,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{IN}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} \apiargument{OUT}{source}{Data object containing the data to be copied.} diff --git a/content/shmem_put_nbi.tex b/content/shmem_put_nbi.tex index 4c776e8f9..c4bdbe1dd 100644 --- a/content/shmem_put_nbi.tex +++ b/content/shmem_put_nbi.tex @@ -44,10 +44,8 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \apiargument{OUT}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} \apiargument{IN}{source}{Data object containing the data to be copied.} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index af7c86460..78bb66b1e 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -16,18 +16,15 @@ \end{Fsynopsis} \begin{apiarguments} - \newtext{ \apiargument{IN}{ctx}{Context on which to perform the operation. When this argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - } \end{apiarguments} \apidescription{ The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines on symmetric data objects issued by the calling \ac{PE} - \newtext{on the given context}. - All \PUT{}, \acp{AMO}, + on the given context. All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. From fa40c108ebc144e97af66209a0da18aa62fd73ce Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 1 Sep 2017 10:41:44 -0400 Subject: [PATCH 398/583] Split shmem_ctx.tex into create/destroy files Split the shmem_ctx.tex file into shmem_ctx_create.tex and shmem_ctx_destroy.tex to follow document structure convention. Only text movement and structural updates in this commit, no edits. Signed-off-by: James Dinan --- content/shmem_ctx.tex | 150 ---------------------------------- content/shmem_ctx_create.tex | 66 +++++++++++++++ content/shmem_ctx_destroy.tex | 64 +++++++++++++++ main_spec.tex | 25 +++++- 4 files changed, 154 insertions(+), 151 deletions(-) delete mode 100644 content/shmem_ctx.tex create mode 100644 content/shmem_ctx_create.tex create mode 100644 content/shmem_ctx_destroy.tex diff --git a/content/shmem_ctx.tex b/content/shmem_ctx.tex deleted file mode 100644 index 7c81b49b5..000000000 --- a/content/shmem_ctx.tex +++ /dev/null @@ -1,150 +0,0 @@ -All \openshmem RMA, AMO, and memory ordering routines are -performed on a communication context. The communication context defines an -independent ordering and completion environment, allowing users to manage the -overlap of communication with computation and also to manage communication -operations performed by separate threads within a multithreaded \ac{PE}. For -example, in single-threaded environments, contexts may be used to pipeline -communication and computation. In multithreaded environments, contexts may -additionally provide thread isolation, eliminating overheads resulting from -thread interference. - -Context handles are of type \CTYPE{shmem\_ctx\_t} and are valid for -language-level assignment and equality comparison. A handle to the desired context is -passed as an argument in the \Cstd \CTYPE{shmem\_ctx\_*} and type-generic API -routines. API routines that do not accept a context argument operate on the -default context. The default context can be used explicitly through the -\CONST{SHMEM\_CTX\_DEFAULT} handle. - -\subsubsection{\textbf{SHMEM\_CTX\_CREATE}} -\label{subsec:shmem_ctx_create} -\apisummary{ - Create a communication context. -} - -\begin{apidefinition} - -\begin{Csynopsis} -int shmem_ctx_create(long options, shmem_ctx_t *ctx); -\end{Csynopsis} - -\begin{apiarguments} - \apiargument{IN}{options}{The set of options requested for the given context. - Multiple options may be requested by combining them with a bitwise - OR operation. Otherwise, \CONST{0} can be given if no options are - requested.} - \apiargument{OUT}{ctx}{A handle to the newly created context.} -\end{apiarguments} - -\apidescription{ - The \FUNC{shmem\_ctx\_create} routine creates a new communication context - and returns its handle through the \VAR{ctx} argument. If the context was - created successfully, a value of zero is returned; otherwise a nonzero - value is returned. An unsuccessful context - creation call is not treated as an error and the \openshmem library remains - in a correct state. The creation call can be reattempted with different - options or after additional resources become available. - - By default, contexts are {\em shareable} and, when it is allowed by the - threading model provided by the \openshmem library, they can be used concurrently by - multiple threads within the PE where they were created. - % - The following options can be supplied during context creation to restrict - this usage model and enable performance optimizations. When using a given - context, the application must comply with the requirements of all options - set on that context. Otherwise the behavior is undefined. - No options are enabled on the default context. - - \apitablerow{\CONST{SHMEM\_CTX\_SERIALIZED}}{ - The given context is shareable; however, it will not be used by multiple threads - concurrently. When the \CONST{SHMEM\_CTX\_SERIALIZED} option is - set, the user must ensure that operations involving the given - context are serialized by the application.} - - \apitablerow{\CONST{SHMEM\_CTX\_PRIVATE}}{ - The given context will be used only by the thread that created it.} - - \apitablerow{\CONST{SHMEM\_CTX\_NOSTORE}}{ - Quiet and fence operations performed on the given context are not - required to enforce completion and ordering of memory store - operations. - When ordering of store operations is needed, the application must - perform a synchronization operation on a context without the - \CONST{SHMEM\_CTX\_NOSTORE} option enabled.} - -} - -\apireturnvalues{ - Zero on success and nonzero otherwise. -} - -\apinotes{ - None. -} - -\end{apidefinition} - -\subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} -\label{subsec:shmem_ctx_create} -\apisummary{ - Destroy a communication context. -} - -\begin{apidefinition} - -\begin{Csynopsis} -void shmem_ctx_destroy(shmem_ctx_t ctx); -\end{Csynopsis} - -\begin{apiarguments} - \apiargument{IN}{ctx}{Handle to the context that will be destroyed.} -\end{apiarguments} - -\apidescription{ - \FUNC{shmem\_ctx\_destroy} destroys a context that was created by a call to - \FUNC{shmem\_ctx\_create}. It is the user's responsibility to ensure that - the context is not used after it has been destroyed, for example when the - destroyed context is used by multiple threads. This function - performs an implicit quiet operation on the given context before it is freed. -} - -\apireturnvalues{ - None. -} - -\apinotes{ - It is invalid to pass \CONST{SHMEM\_CTX\_DEFAULT} to this routine. - - Destroying a context makes it impossible for the user to complete - communication operations that are pending on that context. This includes - nonblocking communication operations, whose local buffers are only returned - to the user after the operations have been completed. An implicit quiet is - performed when freeing a context to avoid this ambiguity. - - A context with the \CONST{SHMEM\_CTX\_PRIVATE} option enabled must be - destroyed by the thread that created it. -} - -\begin{apiexamples} - - \apicexample - {The following example demonstrates the use of contexts in a multithreaded - \Cstd[11] program that uses OpenMP for threading. This example shows the - shared counter load balancing method and illustrates the use of contexts - for thread isolation.} - {./example_code/shmem_ctx.c} - {} - - \apicexample - {The following example demonstrates the use of contexts in a - single-threaded \Cstd[11] program that performs a summation reduction where - the data contained in the \VAR{in\_buf} arrays on all PEs is reduced into - the \VAR{out\_buf} arrays on all PEs. The buffers are divided into - segments and processing of the segments is pipelined. Contexts are used - to overlap an all-to-all exchange of data for segment \VAR{p} with the - local reduction of segment \VAR{p-1}.} - {./example_code/shmem_ctx_pipelined_reduce.c} - {} - -\end{apiexamples} - -\end{apidefinition} diff --git a/content/shmem_ctx_create.tex b/content/shmem_ctx_create.tex new file mode 100644 index 000000000..1d813fd78 --- /dev/null +++ b/content/shmem_ctx_create.tex @@ -0,0 +1,66 @@ +\apisummary{ + Create a communication context. +} + +\begin{apidefinition} + +\begin{Csynopsis} +int shmem_ctx_create(long options, shmem_ctx_t *ctx); +\end{Csynopsis} + +\begin{apiarguments} + \apiargument{IN}{options}{The set of options requested for the given context. + Multiple options may be requested by combining them with a bitwise + OR operation. Otherwise, \CONST{0} can be given if no options are + requested.} + \apiargument{OUT}{ctx}{A handle to the newly created context.} +\end{apiarguments} + +\apidescription{ + The \FUNC{shmem\_ctx\_create} routine creates a new communication context + and returns its handle through the \VAR{ctx} argument. If the context was + created successfully, a value of zero is returned; otherwise a nonzero + value is returned. An unsuccessful context + creation call is not treated as an error and the \openshmem library remains + in a correct state. The creation call can be reattempted with different + options or after additional resources become available. + + By default, contexts are {\em shareable} and, when it is allowed by the + threading model provided by the \openshmem library, they can be used concurrently by + multiple threads within the PE where they were created. + % + The following options can be supplied during context creation to restrict + this usage model and enable performance optimizations. When using a given + context, the application must comply with the requirements of all options + set on that context. Otherwise the behavior is undefined. + No options are enabled on the default context. + + \apitablerow{\CONST{SHMEM\_CTX\_SERIALIZED}}{ + The given context is shareable; however, it will not be used by multiple threads + concurrently. When the \CONST{SHMEM\_CTX\_SERIALIZED} option is + set, the user must ensure that operations involving the given + context are serialized by the application.} + + \apitablerow{\CONST{SHMEM\_CTX\_PRIVATE}}{ + The given context will be used only by the thread that created it.} + + \apitablerow{\CONST{SHMEM\_CTX\_NOSTORE}}{ + Quiet and fence operations performed on the given context are not + required to enforce completion and ordering of memory store + operations. + When ordering of store operations is needed, the application must + perform a synchronization operation on a context without the + \CONST{SHMEM\_CTX\_NOSTORE} option enabled.} + +} + +\apireturnvalues{ + Zero on success and nonzero otherwise. +} + +\apinotes{ + None. +} + +\end{apidefinition} + diff --git a/content/shmem_ctx_destroy.tex b/content/shmem_ctx_destroy.tex new file mode 100644 index 000000000..1066fd4ed --- /dev/null +++ b/content/shmem_ctx_destroy.tex @@ -0,0 +1,64 @@ +\apisummary{ + Destroy a communication context. +} + +\begin{apidefinition} + +\begin{Csynopsis} +void shmem_ctx_destroy(shmem_ctx_t ctx); +\end{Csynopsis} + +\begin{apiarguments} + \apiargument{IN}{ctx}{Handle to the context that will be destroyed.} +\end{apiarguments} + +\apidescription{ + \FUNC{shmem\_ctx\_destroy} destroys a context that was created by a call to + \FUNC{shmem\_ctx\_create}. It is the user's responsibility to ensure that + the context is not used after it has been destroyed, for example when the + destroyed context is used by multiple threads. This function + performs an implicit quiet operation on the given context before it is freed. +} + +\apireturnvalues{ + None. +} + +\apinotes{ + It is invalid to pass \CONST{SHMEM\_CTX\_DEFAULT} to this routine. + + Destroying a context makes it impossible for the user to complete + communication operations that are pending on that context. This includes + nonblocking communication operations, whose local buffers are only returned + to the user after the operations have been completed. An implicit quiet is + performed when freeing a context to avoid this ambiguity. + + A context with the \CONST{SHMEM\_CTX\_PRIVATE} option enabled must be + destroyed by the thread that created it. +} + +\begin{apiexamples} + + \apicexample + {The following example demonstrates the use of contexts in a multithreaded + \Cstd[11] program that uses OpenMP for threading. This example shows the + shared counter load balancing method and illustrates the use of contexts + for thread isolation.} + {./example_code/shmem_ctx.c} + {} + + \apicexample + {The following example demonstrates the use of contexts in a + single-threaded \Cstd[11] program that performs a summation reduction where + the data contained in the \VAR{in\_buf} arrays on all PEs is reduced into + the \VAR{out\_buf} arrays on all PEs. The buffers are divided into + segments and processing of the segments is pipelined. Contexts are used + to overlap an all-to-all exchange of data for segment \VAR{p} with the + local reduction of segment \VAR{p-1}.} + {./example_code/shmem_ctx_pipelined_reduce.c} + {} + +\end{apiexamples} + +\end{apidefinition} + diff --git a/main_spec.tex b/main_spec.tex index e4d8d737a..ee570da14 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -116,7 +116,30 @@ \subsubsection{\textbf{SHPDEALLOC}}\label{subsec:shpdealloc} \subsection{Communication Management Routines} \label{sec:ctx} -\input{content/shmem_ctx.tex} +All \openshmem RMA, AMO, and memory ordering routines are +performed on a communication context. The communication context defines an +independent ordering and completion environment, allowing users to manage the +overlap of communication with computation and also to manage communication +operations performed by separate threads within a multithreaded \ac{PE}. For +example, in single-threaded environments, contexts may be used to pipeline +communication and computation. In multithreaded environments, contexts may +additionally provide thread isolation, eliminating overheads resulting from +thread interference. + +Context handles are of type \CTYPE{shmem\_ctx\_t} and are valid for +language-level assignment and equality comparison. A handle to the desired context is +passed as an argument in the \Cstd \CTYPE{shmem\_ctx\_*} and type-generic API +routines. API routines that do not accept a context argument operate on the +default context. The default context can be used explicitly through the +\CONST{SHMEM\_CTX\_DEFAULT} handle. + +\subsubsection{\textbf{SHMEM\_CTX\_CREATE}} +\label{subsec:shmem_ctx_create} +\input{content/shmem_ctx_create.tex} + +\subsubsection{\textbf{SHMEM\_CTX\_DESTROY}} +\label{subsec:shmem_ctx_destroy} +\input{content/shmem_ctx_destroy.tex} \subsection{Remote Memory Access Routines}\label{sec:rma} From 9488b76a1d9b45baa1ff24d0fd277e7d1aa00c31 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 1 Sep 2017 10:52:38 -0400 Subject: [PATCH 399/583] Add ctx versions of new AMOs Signed-off-by: James Dinan --- content/shmem_atomic_and.tex | 4 ++++ content/shmem_atomic_fetch_and.tex | 4 ++++ content/shmem_atomic_fetch_or.tex | 4 ++++ content/shmem_atomic_fetch_xor.tex | 4 ++++ content/shmem_atomic_or.tex | 4 ++++ content/shmem_atomic_xor.tex | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/content/shmem_atomic_and.tex b/content/shmem_atomic_and.tex index 3047c6870..a633d7dde 100644 --- a/content/shmem_atomic_and.tex +++ b/content/shmem_atomic_and.tex @@ -7,18 +7,22 @@ \begin{C11synopsis} void shmem_atomic_and(TYPE *dest, TYPE value, int pe); +void shmem_atomic_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} void shmem__atomic_and(TYPE *dest, TYPE value, int pe); +void shmem_ctx__atomic_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise AND operation.} diff --git a/content/shmem_atomic_fetch_and.tex b/content/shmem_atomic_fetch_and.tex index 2c1e6d422..04c6fdb8b 100644 --- a/content/shmem_atomic_fetch_and.tex +++ b/content/shmem_atomic_fetch_and.tex @@ -6,18 +6,22 @@ \begin{C11synopsis} TYPE shmem_atomic_fetch_and(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} TYPE shmem__atomic_fetch_and(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx__atomic_fetch_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise AND operation.} diff --git a/content/shmem_atomic_fetch_or.tex b/content/shmem_atomic_fetch_or.tex index fc9220e49..746b6031a 100644 --- a/content/shmem_atomic_fetch_or.tex +++ b/content/shmem_atomic_fetch_or.tex @@ -6,18 +6,22 @@ \begin{C11synopsis} TYPE shmem_atomic_fetch_or(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} TYPE shmem__atomic_fetch_or(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx__atomic_fetch_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise OR operation.} diff --git a/content/shmem_atomic_fetch_xor.tex b/content/shmem_atomic_fetch_xor.tex index 5e9d9d006..84f91d8b8 100644 --- a/content/shmem_atomic_fetch_xor.tex +++ b/content/shmem_atomic_fetch_xor.tex @@ -7,18 +7,22 @@ \begin{C11synopsis} TYPE shmem_atomic_fetch_xor(TYPE *dest, TYPE value, int pe); +TYPE shmem_atomic_fetch_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} TYPE shmem__atomic_fetch_xor(TYPE *dest, TYPE value, int pe); +TYPE shmem_ctx__atomic_fetch_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise XOR operation.} diff --git a/content/shmem_atomic_or.tex b/content/shmem_atomic_or.tex index 3a32738e4..6996beb98 100644 --- a/content/shmem_atomic_or.tex +++ b/content/shmem_atomic_or.tex @@ -7,18 +7,22 @@ \begin{C11synopsis} void shmem_atomic_or(TYPE *dest, TYPE value, int pe); +void shmem_atomic_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} void shmem__atomic_or(TYPE *dest, TYPE value, int pe); +void shmem_ctx__atomic_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise OR operation.} diff --git a/content/shmem_atomic_xor.tex b/content/shmem_atomic_xor.tex index c6d30dde6..287a3868e 100644 --- a/content/shmem_atomic_xor.tex +++ b/content/shmem_atomic_xor.tex @@ -7,18 +7,22 @@ \begin{C11synopsis} void shmem_atomic_xor(TYPE *dest, TYPE value, int pe); +void shmem_atomic_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} void shmem__atomic_xor(TYPE *dest, TYPE value, int pe); +void shmem_ctx__atomic_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. \begin{apiarguments} + \apiargument{IN}{ctx}{Context on which to perform the operation. When this + argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise XOR operation.} From 317c4f8a50defa23a5fc89a903deb43c527fa41c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 1 Sep 2017 11:27:02 -0400 Subject: [PATCH 400/583] Simplify and update the makefile The existing makefile doesn't run pdflatex enough times: LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. Update the makefile to fix the above (run standard 3 times), improve build dependencies, and remove bit rotted DVI/PS build. Signed-off-by: James Dinan --- Makefile | 17 +++++++++++++++++ makefile | 38 -------------------------------------- 2 files changed, 17 insertions(+), 38 deletions(-) create mode 100644 Makefile delete mode 100644 makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..0c595dac9 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +TARGET = main_spec +SOURCES = $(shell find . -name '*.tex' -print) +FIGURES = $(shell find figures -name '*.pdf' -print) +EXAMPLES = $(shell find example_code -name '*.[c,f]*' -print) + +.PHONY: all +all: ${TARGET}.pdf + +${TARGET}.pdf: ${SOURCES} ${FIGURES} ${EXAMPLES} + pdflatex $(LATEXOPT) ${TARGET} + pdflatex $(LATEXOPT) ${TARGET} + pdflatex $(LATEXOPT) ${TARGET} + +.PHONY: clean +clean: + rm -f ${TARGET}.{log,aux,ps,dvi,bbl,blg,log,idx,out,toc,pdf,out} chappage.txt + diff --git a/makefile b/makefile deleted file mode 100644 index abbd9c385..000000000 --- a/makefile +++ /dev/null @@ -1,38 +0,0 @@ -TARGET=main_spec - -# make pdf by default -all: ${TARGET}.pdf - -# it doesn't really need the .dvi, but this way all the refs are right -%.pdf : %.dvi - pdflatex $(LATEXOPT) $* - -${TARGET}.bbl: ${TARGET}.bib -# in case we don't already have a .aux file listing citations -# this should probably be a separate makefile target/dependency instead -# of doing it every time... but *shrug* - pdflatex $(LATEXOPT) ${TARGET}.tex -# get the citations out of the bibliography - bibtex $(TARGET) -# do it again in case there are out-of-order cross-references - @pdflatex $(LATEXOPT) ${TARGET}.tex - -#${TARGET}.dvi: ${TARGET}.bbl ${TARGET}.tex -${TARGET}.dvi: ${TARGET}.tex - @pdflatex $(LATEXOPT) ${TARGET}.tex - -# shortcut, so we can say "make ps" -ps: ${TARGET}.ps - -${TARGET}.ps: ${TARGET}.dvi - @dvips -t a4 ${TARGET}.dvi - -clean: - rm -f ${TARGET}.{log,aux,ps,dvi,bbl,blg,log,idx,out,toc} chappage.txt - -veryclean: clean - rm -f ${TARGET}.{ps,pdf,out} - - -PHONY : ps all clean reallyclean - From feb87a252e20e46030b8f423580cdd8099162c86 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 1 Sep 2017 21:27:46 -0400 Subject: [PATCH 401/583] Used longtable for Library Constants --- content/library_constants.tex | 129 ++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 59 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 9e2054056..75321492b 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -2,28 +2,29 @@ and \CorCpp, and they are compile-time constants. All constants that start with \CONST{\_SHMEM\_*} are deprecated and provided for backwards compatibility. -\newline -\newline -\begin{tabular}{|p{0.4\textwidth}|p{0.5\textwidth}|} + +\begin{longtable}{|p{0.45\textwidth}|p{0.5\textwidth}|} \hline \textbf{Constant} & \textbf{Description} \tabularnewline \hline -\hline -%new -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_SYNC\_SIZE}}} +\endhead +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_SYNC\_SIZE} +\\~} & Length of a work array that can be used with any SHMEM collective communication operation. The value of this constant is implementation specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information about the usage of this constant. Work arrays sized for specific operations may consume less memory.\tabularnewline -%new \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_BCAST\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_BCAST\_SYNC\_SIZE} +\\~} & Length of the \VAR{pSync} arrays needed for broadcast routines. The value of this constant is implementation specific. Refer to the @@ -31,16 +32,20 @@ \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant. \tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_SYNC\_VALUE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_SYNC\_VALUE} +\\~} & The value used to initialize the elements of \VAR{pSync} arrays. The value of this constant is implementation specific.\tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_REDUCE\_SYNC\_SIZE} +\\~} & Length of the work arrays needed for reduction routines. The value of this constant is implementation specific. Refer to the @@ -48,9 +53,11 @@ \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_BARRIER\_SYNC\_SIZE} +\\~} & Length of the work array needed for barrier routines. The value of this constant is implementation specific. Refer to the @@ -58,9 +65,11 @@ \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_COLLECT\_SYNC\_SIZE} +\\~} & Length of the work array needed for collect routines. The value of this constant is implementation specific. Refer to the @@ -68,9 +77,11 @@ \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE} +\\~} & Length of the work array needed for \FUNC{shmem\_alltoall} routines. The value of this constant is implementation @@ -78,13 +89,11 @@ routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline \hline -\end{tabular} - -\begin{tabular}{|p{0.4\textwidth}|p{0.5\textwidth}|} -\hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE} +\\~} & Length of the work array needed for \FUNC{shmem\_alltoalls} routines. The value of this constant is implementation @@ -92,39 +101,42 @@ routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} for more information about the usage of this constant.\tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} +\\~} & Minimum length of work arrays used in various collective routines.\tabularnewline \hline -\vspace{3mm} -%\color{red} -%\vtop{\hbox{} -%\hbox{\hspace*{12mm} \CONST{}} -%\hbox{} -%\hbox{\hspace*{12mm} \CONST{}}} -%& \color{red} -%Ticket \#107 \tabularnewline -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_MAJOR\_VERSION}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_MAJOR\_VERSION} +\\~} & Integer representing the major version of \openshmem standard in use. \tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_MINOR\_VERSION}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_MINOR\_VERSION} +\\~} & Integer representing the minor version of \openshmem standard in use. \tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_MAX\_NAME\_LEN}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_MAX\_NAME\_LEN} +\\~} & Integer representing the maximum length of \CONST{SHMEM\_VENDOR\_STRING}. \tabularnewline \hline -\vspace{3mm} -\vtop{\hbox{\CorCppFor:} -\hbox{\hspace*{12mm} \CONST{SHMEM\_VENDOR\_STRING}}} +%% +\parbox[t]{0pt}{~\\[-4pt] + \CorCppFor: \\\hspace*{8mm} + \CONST{SHMEM\_VENDOR\_STRING} +\\~} & String representing vendor defined information of size at most \CONST{SHMEM\_MAX\_NAME\_LEN}. @@ -132,6 +144,5 @@ string of size less than \CONST{SHMEM\_MAX\_NAME\_LEN} is padded with blank characters up to size \CONST{SHMEM\_MAX\_NAME\_LEN}. \tabularnewline \hline - -\end{tabular} -\color{black} +%% +\end{longtable} From 85675f70994acbc2f307460e78513d0ad4af4915 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 1 Sep 2017 21:56:29 -0400 Subject: [PATCH 402/583] Uniformity changes to Environment-Variables table --- content/environment_variables.tex | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/content/environment_variables.tex b/content/environment_variables.tex index 0164f106f..cabda16a4 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -14,19 +14,18 @@ \begin{tabular}{|l|l|l|} \hline -Variable & Value & Purpose\tabularnewline +\textbf{Variable} & \textbf{Value} & \textbf{Description}\tabularnewline \hline -\hline -\VAR{SHMEM\_VERSION} & any & print the library version at +\VAR{SHMEM\_VERSION} & Any & Print the library version at start-up\tabularnewline \hline -\VAR{SHMEM\_INFO} & any & print helpful text about all these environment +\VAR{SHMEM\_INFO} & Any & Print helpful text about all these environment variables\tabularnewline \hline -\VAR{SHMEM\_SYMMETRIC\_SIZE} & non-negative integer & number of bytes to +\VAR{SHMEM\_SYMMETRIC\_SIZE} & Non-negative integer & Number of bytes to allocate for symmetric heap\tabularnewline \hline -\VAR{SHMEM\_DEBUG} & any & enable debugging messages\tabularnewline +\VAR{SHMEM\_DEBUG} & Any & Enable debugging messages\tabularnewline \hline \end{tabular} From 1b77d17a0881a6aafb2c2c5910440dc7e4fb34e8 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 5 Sep 2017 20:35:41 -0400 Subject: [PATCH 403/583] Reword --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index e92e715d6..a2e7709a3 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -689,7 +689,7 @@ \section{Version 1.3} \section{Version 1.2} Major changes in \openshmem[1.2] include a new initialization routine (\FUNC{shmem\_init}), -improvements to the execution model with the addition of an explicit +improvements to the execution model with an explicit library-finalization routine (\FUNC{shmem\_finalize}), an early-exit routine (\FUNC{shmem\_global\_exit}), namespace standardization, From 8fcd15e65f3e3c746dff4e2950b226f066963d76 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 5 Sep 2017 20:35:59 -0400 Subject: [PATCH 404/583] Reword: Reduce ambiguity --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index a2e7709a3..3928366e2 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -634,10 +634,10 @@ \section{Version 1.4} \section{Version 1.3} Major changes in \openshmem[1.3] include the addition of -\Cstd[11] type-generic interfaces for \ac{RMA} and \ac{AMO} operations, non-blocking RMA operations, atomic \PUT{} and \GET{} operations, -and all-to-all collectives. +all-to-all collectives, +and \Cstd[11] type-generic interfaces for \ac{RMA} and \ac{AMO} operations. The following list describes the specific changes in \openshmem[1.3]: \begin{itemize} From f96aae18666e42829344f0fa0dbad0c342e8940f Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 5 Sep 2017 20:51:59 -0400 Subject: [PATCH 405/583] Nitpick --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3928366e2..7b537f27b 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -524,7 +524,7 @@ \section{Version 1.4} The following list describes the specific changes in \openshmem[1.4]: \begin{itemize} - +% \item Clarified that the \openshmem extensions header files are required, even when empty. \\See Section~\ref{subsec:bindings}. % From d3f2dbf02366a7e0422c5054c30a459ac4f4ea85 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 5 Sep 2017 21:41:40 -0400 Subject: [PATCH 406/583] Threading: Apply Max's edits and a few of my own Signed-off-by: James Dinan --- content/shmem_init.tex | 4 ++-- content/shmem_init_thread.tex | 11 ++++++----- content/shmem_query_thread.tex | 6 +++--- content/threads_intro.tex | 27 ++++++++++++++------------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/content/shmem_init.tex b/content/shmem_init.tex index f901fcc46..b1b83a763 100644 --- a/content/shmem_init.tex +++ b/content/shmem_init.tex @@ -24,8 +24,8 @@ other \openshmem routine may be called. At the end of the \openshmem program which it initialized, the call to \FUNC{shmem\_init} must be matched with a call to \FUNC{shmem\_finalize}. After the first call to \FUNC{shmem\_init}, a - subsequent call to \FUNC{shmem\_init} in the same program results in undefined - behavior. + subsequent call to \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread} in the + same program results in undefined behavior. } \apireturnvalues{ diff --git a/content/shmem_init_thread.tex b/content/shmem_init_thread.tex index 5f331fcc0..17fb1a471 100644 --- a/content/shmem_init_thread.tex +++ b/content/shmem_init_thread.tex @@ -22,11 +22,12 @@ thread support. The argument \VAR{provided} returns the support level provided by the library. The allowed values for \VAR{provided} and \VAR{requested} are \CONST{SHMEM\_THREAD\_SINGLE}, \CONST{SHMEM\_THREAD\_FUNNELED}, -\CONST{SHMEM\_THREAD\_SERIALIZED}, or \CONST{SHMEM\_THREAD\_MULTIPLE}. +\CONST{SHMEM\_THREAD\_SERIALIZED}, and \CONST{SHMEM\_THREAD\_MULTIPLE}. -An \openshmem program is initialized either by \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. -Similar to \FUNC{shmem\_init}, the \FUNC{shmem\_init\_thread} routine may not -be called multiple times in an \openshmem program. If the call to \FUNC{shmem\_init\_thread} +An \openshmem program is initialized either by \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. +Once an \openshmem library initialization call has been performed, a subsequent +initialization call in the same program results in undefined behavior. +If the call to \FUNC{shmem\_init\_thread} is unsuccessful in allocating and initializing resources for the \openshmem library, then the behavior of any subsequent call to the \openshmem library is undefined. @@ -41,7 +42,7 @@ The \openshmem library can be initialized either by \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. If the \openshmem library is initialized by \FUNC{shmem\_init}, the library implementation can choose to -support one of the defined thread levels. +support any one of the defined thread levels. } \end{apidefinition} diff --git a/content/shmem_query_thread.tex b/content/shmem_query_thread.tex index 591b73eee..a90349351 100644 --- a/content/shmem_query_thread.tex +++ b/content/shmem_query_thread.tex @@ -14,10 +14,10 @@ \apidescription{ The \FUNC{shmem\_query\_thread} call returns the level of thread support -currently being provided. The value returned will be same as \VAR{provided} -returned in the \FUNC{shmem\_init\_thread}, if the \openshmem library was +currently being provided. The value returned will be same as was returned in \VAR{provided} +by a call to \FUNC{shmem\_init\_thread}, if the \openshmem library was initialized by \FUNC{shmem\_init\_thread}. If the library was initialized by -\FUNC{shmem\_init}, the implementation can choose to provide one of the defined +\FUNC{shmem\_init}, the implementation can choose to provide any one of the defined thread levels, and \FUNC{shmem\_query\_thread} returns this thread level. } diff --git a/content/threads_intro.tex b/content/threads_intro.tex index 7b80db7fc..56b7bdd54 100644 --- a/content/threads_intro.tex +++ b/content/threads_intro.tex @@ -1,7 +1,7 @@ -This section specifies the interaction between \openshmem interfaces and the -user threads, and also describes the routines that can be used for initializing and -querying the thread environment. There are four levels of threading supported by -the \openshmem implementation. +This section specifies the interaction between the \openshmem interfaces and +user threads. It also describes the routines that can be used for initializing and +querying the thread environment. There are four levels of threading defined by +the \openshmem specification. \begin{itemize} \item {\bf \CONST{SHMEM\_THREAD\_SINGLE}} The \openshmem program may not be multithreaded. @@ -25,7 +25,7 @@ \begin{itemize} \item -In \CONST{SHMEM\_THREAD\_FUNNELED}, \CONST{SHMEM\_THREAD\_SERIALIZED}, and +In the \CONST{SHMEM\_THREAD\_FUNNELED}, \CONST{SHMEM\_THREAD\_SERIALIZED}, and \CONST{SHMEM\_THREAD\_MULTIPLE} thread levels, the \FUNC{shmem\_init} and \FUNC{shmem\_finalize} calls may only be invoked by the same thread. @@ -44,20 +44,21 @@ only one thread in the \ac{PE} is participating in the collective call. \item Blocking \openshmem calls will only block the calling thread, allowing -other threads, if available, to continue the execution. The calling thread will -be blocked until the event on which it is waiting occurs. Once the blocked communication is -completed, the thread is ready for continuing the execution. A blocked thread -will not prevent progress of other threads on the same \ac{PE}, and will not +other threads, if available, to continue executing. The calling thread will +be blocked until the event on which it is waiting occurs. Once the blocking call is +completed, the thread is ready to continue execution. A blocked thread +will not prevent progress of other threads on the same \ac{PE} and will not prevent them from executing other \openshmem calls when the thread level permits. -Also, a blocked thread will not prevent the progress of \openshmem calls on other \acp{PE}. +In addition, a blocked thread will not prevent the progress of \openshmem calls +performed on other \acp{PE}. \item In the \CONST{SHMEM\_THREAD\_MULTIPLE} thread level, all \openshmem calls are thread-safe, i.e., two concurrently running threads may make \openshmem calls and the outcome will be as if the calls executed in some order, even if their execution is interleaved. \item In the \CONST{SHMEM\_THREAD\_SERIALIZED} and \CONST{SHMEM\_THREAD\_MULTIPLE} thread levels, -if multiple threads call the collective calls, it is the programmer's responsibility -to ensure the correct ordering of collective calls, including the symmetric -heap management functions. +if multiple threads call collective routines, including the symmetric heap +management routines, it is the programmer's responsibility to ensure the +correct ordering of collective calls. \end{itemize} From 07c6a6d75fac4682cdeb59e408bd2de78ac2c536 Mon Sep 17 00:00:00 2001 From: Swen Boehm Date: Wed, 6 Sep 2017 11:03:09 -0400 Subject: [PATCH 407/583] Revert change to Complex type in stdc only --- content/shmem_reductions.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index fca0840a1..f23d46c33 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -209,9 +209,9 @@ restored to the original values. The sum and product reduction routines include complex-typed - interfaces. When the \Cstd translation environment does not support - complex types\footnote{That is, under \Cstd language standards prior - to \Cstd[99] or under \Cstd[11] when + interfaces for the \Cstd API only. When the \Cstd translation + environment does not support complex types\footnote{That is, under + \Cstd language standards prior to \Cstd[99] or under \Cstd[11] when \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, an \openshmem implementation is not required to provide support for these complex-typed interfaces. From 2714d508d3d97680a6cdee2d5c32d1a99a05be18 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 6 Sep 2017 13:24:45 -0400 Subject: [PATCH 408/583] Fix label name to resolve undefined reference --- main_spec.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main_spec.tex b/main_spec.tex index e9735454b..e66afdc94 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -93,7 +93,7 @@ \subsubsection{\textbf{SHMEM\_QUERY\_THREAD}} \subsection{Memory Management Routines} -\label{sec:mem_routines} +\label{sec:memory_management} \openshmem provides a set of \acp{API} for managing the symmetric heap. The \acp{API} allow one to dynamically allocate, deallocate, reallocate and align From 51fb5641624eb04d2fa23eb39e5f29126d80a508 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Wed, 6 Sep 2017 13:32:29 -0400 Subject: [PATCH 409/583] add text to mention that PEs may be multithreaded --- content/execution_model.tex | 5 +++-- content/programming_model_overview.tex | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/content/execution_model.tex b/content/execution_model.tex index 571551a08..cde97a971 100644 --- a/content/execution_model.tex +++ b/content/execution_model.tex @@ -1,9 +1,10 @@ An \openshmem program consists of a set of \openshmem processes called \acp{PE} that execute in a \ac{SPMD}-like model where each \ac{PE} can take a different execution path. For example, a \ac{PE} can be implemented using an OS -process. The \acp{PE} progress asynchronously, and can communicate/synchronize +process. The \acp{PE} may be either single or multithreaded. +The \acp{PE} progress asynchronously, and can communicate/synchronize via the \openshmem interfaces. All \acp{PE} in an \openshmem program should -start by calling the initialization routine \FUNC{shmem\_init} +start by calling the initialization routine \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread} \footnote{\textbf{start\_pes} has been deprecated as of Specification 1.2} before using any of the other \openshmem library routines. An \openshmem program concludes its use of the \openshmem library when all \acp{PE} call diff --git a/content/programming_model_overview.tex b/content/programming_model_overview.tex index 2a5d4445d..c74ea7f49 100644 --- a/content/programming_model_overview.tex +++ b/content/programming_model_overview.tex @@ -33,7 +33,8 @@ \item \textbf{Library Setup and Query} \begin{enumerate} - \item \OPR{Initialization}: The \openshmem library environment is initialized. + \item \OPR{Initialization}: The \openshmem library environment is initialized, + where the \acp{PE} are either single or multithreaded. \item \OPR{Query}: The local \ac{PE} may get the number of \acp{PE} running the same program and its unique integer identifier. \item \OPR{Accessibility}: The local \ac{PE} can find out if a remote \ac{PE} is From b92009e88ac0d53ad77b77db94a03a8ec6939286 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Wed, 6 Sep 2017 13:40:09 -0400 Subject: [PATCH 410/583] Minor edit: Moving footnote to right place --- content/execution_model.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/execution_model.tex b/content/execution_model.tex index cde97a971..e91638bd1 100644 --- a/content/execution_model.tex +++ b/content/execution_model.tex @@ -4,10 +4,10 @@ process. The \acp{PE} may be either single or multithreaded. The \acp{PE} progress asynchronously, and can communicate/synchronize via the \openshmem interfaces. All \acp{PE} in an \openshmem program should -start by calling the initialization routine \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread} +start by calling the initialization routine \FUNC{shmem\_init} \footnote{\textbf{start\_pes} has been deprecated as of Specification 1.2} -before using any of the other \openshmem library routines. An \openshmem -program concludes its use of the \openshmem library when all \acp{PE} call +or \FUNC{shmem\_init\_thread} before using any of the other \openshmem library routines. +An \openshmem program concludes its use of the \openshmem library when all \acp{PE} call \FUNC{shmem\_finalize}. An \openshmem program can also be terminated when any \ac{PE} calls \FUNC{shmem\_global\_exit}. During a call to \FUNC{shmem\_finalize}, the \openshmem library must From f4cb9777d88bb2417c0665ad6f324c9c89d9da0e Mon Sep 17 00:00:00 2001 From: Swaroop Pophale Date: Wed, 6 Sep 2017 14:47:53 -0400 Subject: [PATCH 411/583] Update shmem_broadcast.tex Undoing semantic change. --- content/shmem_broadcast.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index b87423102..a6f53a138 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -75,7 +75,7 @@ Upon return from a broadcast routine, the following are true for the local \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object - is updated. The \source{} data object on the root \ac{PE} may be safely reused. + is updated. The \source{} data object may be safely reused. The values in the \VAR{pSync} array are restored to the original values. } From b70e35984ce8ba512729f3d3de146f3d7d398b7d Mon Sep 17 00:00:00 2001 From: Swaroop Pophale Date: Wed, 6 Sep 2017 14:49:33 -0400 Subject: [PATCH 412/583] Update collective_intro.tex Removing extra line. --- content/collective_intro.tex | 1 - 1 file changed, 1 deletion(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 8f1c85305..4b883843c 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -7,7 +7,6 @@ \FUNC{shmem\_barrier\_all} must be called by all \acp{PE} of the \openshmem program. - The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}. \VAR{PE\_start} is the starting \ac{PE} number, a log (base 2) of \VAR{logPE\_stride} is the stride between \acp{PE}, and \VAR{PE\_size} is From cc81de8dad2d2d21eb09333e929342688d6ee38a Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 6 Sep 2017 15:36:22 -0400 Subject: [PATCH 413/583] Update the OpenSHMEM library constants table This commit: - Adds the SHMEM_CTX_* option flags - Adds the SHMEM_THREAD_* threading modes - Adds the SHMEM_CMP_* comparison flags - Macro-izes the table formatting for maintainability - Re-adds the deprecated _SHMEM_* constants - Rewords the opening paragraph Reference: openshmem-org/specification/issues/143 --- content/library_constants.tex | 288 +++++++++++++++++++++++----------- utils/defs.tex | 2 + 2 files changed, 196 insertions(+), 94 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index b60e11302..e4113cfa9 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -1,161 +1,261 @@ -The constants that start with \CONST{SHMEM\_*} are for both \Fortran -and \CorCpp, and they are compile-time constants. -All constants that start with -\CONST{\_SHMEM\_*} are deprecated and provided for backwards compatibility. +The \openshmem library provides a set of compile-time constants that may +be used to specify options to API routines, provide implementation-specific +parameters, or return information about the implementation. +All constants that start with \CONST{\_SHMEM\_*} are deprecated, +but provided for backwards compatibility. \begin{longtable}{|p{0.45\textwidth}|p{0.5\textwidth}|} \hline \textbf{Constant} & \textbf{Description} -\tabularnewline -\hline +\tabularnewline \hline \endhead %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_CTX\_DEFAULT} -\\~} -& +\LibConstDecl[\CorCpp]{SHMEM\_THREAD\_SINGLE} & +The \openshmem thread support level which specifies that the program +may not be multithreaded. +See Section~\ref{subsec:thread_support} for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_THREAD\_FUNNELED} & +The \openshmem thread support level which specifies that the program +may be multithreaded but must ensure that only the main thread invokes +the \openshmem interfaces. +See Section~\ref{subsec:thread_support} for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_THREAD\_SERIALIZED} & +The \openshmem thread support level which specifies that the program +may be multithreaded but must ensure that the \openshmem interfaces +are not invoked concurrently by multiple threads. +See Section~\ref{subsec:thread_support} for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_THREAD\_MULTIPLE} & +The \openshmem thread support level which specifies that the program +may be multithreaded and any thread may invoke the \openshmem interfaces. +See Section~\ref{subsec:thread_support} for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the default communication context. All point-to-point communication operations and synchronizations that do not specify a context are performed on the default context. Refer to \hyperref[sec:ctx]{Communication Management Routines} for more information about the usage of this -constant.\tabularnewline -\hline +constant. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZE} & +The context creation option which specifies that the given context +is shareable but will not be used by multiple threads concurrently. +See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} +for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_PRIVATE} & +The context creation option which specifies that the given context +will be used only by the thread that created it. +See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} +for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_NOSTORE} & +The context creation option which specifies that quiet and fence operations +performed on the given context are not required to enforce completion and +ordering of memory store operations. +See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} +for more detail about its use. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_SYNC\_SIZE} -\\~} -& Length of a work array that can be used with any SHMEM collective +\LibConstDecl{SHMEM\_SYNC\_SIZE} & +Length of a work array that can be used with any SHMEM collective communication operation. The value of this constant is implementation specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information about the usage of this constant. Work arrays sized for specific operations may -consume less memory.\tabularnewline -\hline +consume less memory. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_BCAST\_SYNC\_SIZE} -\\~} +\LibConstDecl{SHMEM\_BCAST\_SYNC\_SIZE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_BCAST\_SYNC\_SIZE} +\end{DeprecateBlock} & Length of the \VAR{pSync} arrays needed for broadcast routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_broadcast]{Broadcast Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant. \tabularnewline -\hline +about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_SYNC\_VALUE} -\\~} +\LibConstDecl{SHMEM\_SYNC\_VALUE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_SYNC\_VALUE} +\end{DeprecateBlock} & The value used to initialize the elements of \VAR{pSync} arrays. The -value of this constant is implementation specific.\tabularnewline -\hline +value of this constant is implementation specific. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_REDUCE\_SYNC\_SIZE} -\\~} +\LibConstDecl{SHMEM\_REDUCE\_SYNC\_SIZE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_REDUCE\_SYNC\_SIZE} +\end{DeprecateBlock} & Length of the work arrays needed for reduction routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_reductions]{Reduction Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant.\tabularnewline -\hline +about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_BARRIER\_SYNC\_SIZE} -\\~} +\LibConstDecl{SHMEM\_BARRIER\_SYNC\_SIZE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_BARRIER\_SYNC\_SIZE} +\end{DeprecateBlock} & Length of the work array needed for barrier routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_barrier]{Barrier Synchronization Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant.\tabularnewline -\hline +for more information about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_COLLECT\_SYNC\_SIZE} -\\~} +\LibConstDecl{SHMEM\_COLLECT\_SYNC\_SIZE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_COLLECT\_SYNC\_SIZE} +\end{DeprecateBlock} & Length of the work array needed for collect routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_collect]{Collect Routines} section under \hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant.\tabularnewline -\hline +about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE} -\\~} -& +\LibConstDecl{SHMEM\_ALLTOALL\_SYNC\_SIZE} & Length of the work array needed for \FUNC{shmem\_alltoall} routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_alltoall]{Alltoall routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant.\tabularnewline -\hline +for more information about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE} -\\~} -& +\LibConstDecl{SHMEM\_ALLTOALLS\_SYNC\_SIZE} & Length of the work array needed for \FUNC{shmem\_alltoalls} routines. The value of this constant is implementation specific. Refer to the \hyperref[subsec:shmem_alltoalls]{Alltoalls routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant.\tabularnewline -\hline +for more information about the usage of this constant. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} -\\~} -& Minimum length of work arrays used in various collective routines.\tabularnewline -\hline +\LibConstDecl{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} +\end{DeprecateBlock} +& +Minimum length of work arrays used in various collective routines. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_MAJOR\_VERSION} -\\~} +\LibConstDecl{SHMEM\_MAJOR\_VERSION} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_MAJOR\_VERSION} +\end{DeprecateBlock} & -Integer representing the major version of \openshmem standard in use. \tabularnewline -\hline +Integer representing the major version of \openshmem standard in use. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_MINOR\_VERSION} -\\~} +\LibConstDecl{SHMEM\_MINOR\_VERSION} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_MINOR\_VERSION} +\end{DeprecateBlock} & -Integer representing the minor version of \openshmem standard in use. \tabularnewline -\hline +Integer representing the minor version of \openshmem standard in use. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_MAX\_NAME\_LEN} -\\~} +\LibConstDecl{SHMEM\_MAX\_NAME\_LEN} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_MAX\_NAME\_LEN} +\end{DeprecateBlock} & -Integer representing the maximum length of \CONST{SHMEM\_VENDOR\_STRING}. \tabularnewline -\hline +Integer representing the maximum length of \CONST{SHMEM\_VENDOR\_STRING}. +\tabularnewline \hline %% -\parbox[t]{0pt}{~\\[-4pt] - \CorCppFor: \\\hspace*{8mm} - \CONST{SHMEM\_VENDOR\_STRING} -\\~} +\LibConstDecl{SHMEM\_VENDOR\_STRING} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_VENDOR\_STRING} +\end{DeprecateBlock} & String representing vendor defined information of size at most \CONST{SHMEM\_MAX\_NAME\_LEN}. In \CorCpp{}, the string is terminated by a null character. In \Fortran, the string of size less than \CONST{SHMEM\_MAX\_NAME\_LEN} is padded with blank -characters up to size \CONST{SHMEM\_MAX\_NAME\_LEN}. \tabularnewline -\hline +characters up to size \CONST{SHMEM\_MAX\_NAME\_LEN}. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_EQ} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_EQ} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``equal to'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_NE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_NEEQ} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``not equal to'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_LT} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_LT} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``less than'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_LE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_LE} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``less than or equal to'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_GT} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_GT} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``greater than'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_CMP\_GE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_GE} +\end{DeprecateBlock} +& +An integer constant expression corresponding to the +``greater than or equal to'' comparison operation. +See Section~\ref{subsec:p2p_intro} for more detail about its use and +language-specific type constraints. +\tabularnewline \hline %% \end{longtable} diff --git a/utils/defs.tex b/utils/defs.tex index be6d03f40..9da54b89e 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -45,6 +45,8 @@ \textit{C\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} +\newcommand{\LibConstDecl}[2][\CorCppFor]{% + \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \CONST{#2} \\~}} \newcommand{\TYPE}{\emph{TYPE}} \newcommand{\TYPENAME}{\emph{TYPENAME}} \newcommand{\SIZE}{\emph{SIZE}} From a83c1c25699a75e99a363d0438d0058ced970110 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 6 Sep 2017 15:57:38 -0400 Subject: [PATCH 414/583] Simplify the cross-references from the library constants table This commit simplifies the text that cross-references the library constants to their points of use in the specification. In particular, this section used named \hyperref references, while numbered \ref references were more common in the specification. This commit uses \ref for all library constant cross-references. --- content/library_constants.tex | 106 ++++++++++++++-------------------- 1 file changed, 43 insertions(+), 63 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index e4113cfa9..c0a3da296 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -40,39 +40,45 @@ Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the default communication context. All point-to-point communication operations and synchronizations that do not specify a context are performed on the -default context. Refer to \hyperref[sec:ctx]{Communication Management -Routines} for more information about the usage of this -constant. +default context. +See Section~\ref{sec:ctx} for more detail about its use. \tabularnewline \hline %% \LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZE} & The context creation option which specifies that the given context is shareable but will not be used by multiple threads concurrently. -See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} -for more detail about its use. +See Section~\ref{subsec:shmem_ctx_create} for more detail about its use. \tabularnewline \hline %% \LibConstDecl[\CorCpp]{SHMEM\_CTX\_PRIVATE} & The context creation option which specifies that the given context will be used only by the thread that created it. -See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} -for more detail about its use. +See Section~\ref{subsec:shmem_ctx_create} for more detail about its use. \tabularnewline \hline %% \LibConstDecl[\CorCpp]{SHMEM\_CTX\_NOSTORE} & The context creation option which specifies that quiet and fence operations performed on the given context are not required to enforce completion and ordering of memory store operations. -See \hyperref[subsec:shmem_ctx_create]{\FUNC{shmem\_ctx\_create}} -for more detail about its use. +See Section~\ref{subsec:shmem_ctx_create} for more detail about its use. +\tabularnewline \hline +%% +\LibConstDecl{SHMEM\_SYNC\_VALUE} +\begin{DeprecateBlock} + \LibConstDecl[\CorCpp]{\_SHMEM\_SYNC\_VALUE} +\end{DeprecateBlock} +& +The value used to initialize the elements of \VAR{pSync} arrays. +The value of this constant is implementation specific. +See Section~\ref{subsec:coll} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_SYNC\_SIZE} & Length of a work array that can be used with any SHMEM collective -communication operation. The value of this constant is implementation -specific. Refer to the individual \hyperref[subsec:coll]{Collective Routines} for more information -about the usage of this constant. Work arrays sized for specific operations may -consume less memory. +communication operation. +Work arrays sized for specific operations may consume less memory. +The value of this constant is implementation specific. +See Section~\ref{subsec:coll} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_BCAST\_SYNC\_SIZE} @@ -81,19 +87,8 @@ \end{DeprecateBlock} & Length of the \VAR{pSync} arrays needed for broadcast routines. The value -of this constant is implementation specific. Refer to the -\hyperref[subsec:shmem_broadcast]{Broadcast Routines} section under -\hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant. -\tabularnewline \hline -%% -\LibConstDecl{SHMEM\_SYNC\_VALUE} -\begin{DeprecateBlock} - \LibConstDecl[\CorCpp]{\_SHMEM\_SYNC\_VALUE} -\end{DeprecateBlock} -& -The value used to initialize the elements of \VAR{pSync} arrays. The -value of this constant is implementation specific. +of this constant is implementation specific. +See Section~\ref{subsec:shmem_broadcast} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_REDUCE\_SYNC\_SIZE} @@ -101,11 +96,9 @@ \LibConstDecl[\CorCpp]{\_SHMEM\_REDUCE\_SYNC\_SIZE} \end{DeprecateBlock} & -Length of the work arrays needed for reduction routines. The value -of this constant is implementation specific. Refer to the -\hyperref[subsec:shmem_reductions]{Reduction Routines} section under -\hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant. +Length of the work arrays needed for reduction routines. +The value of this constant is implementation specific. +See Section~\ref{subsec:shmem_reductions} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_BARRIER\_SYNC\_SIZE} @@ -113,11 +106,10 @@ \LibConstDecl[\CorCpp]{\_SHMEM\_BARRIER\_SYNC\_SIZE} \end{DeprecateBlock} & -Length of the work array needed for barrier routines. The value -of this constant is implementation specific. Refer to the -\hyperref[subsec:shmem_barrier]{Barrier Synchronization Routines} section under -\hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant. +Length of the work array needed for barrier routines. +The value of this constant is implementation specific. +See Section~\ref{subsec:shmem_barrier} for more detail about its use. + \tabularnewline \hline %% \LibConstDecl{SHMEM\_COLLECT\_SYNC\_SIZE} @@ -125,27 +117,21 @@ \LibConstDecl[\CorCpp]{\_SHMEM\_COLLECT\_SYNC\_SIZE} \end{DeprecateBlock} & -Length of the work array needed for collect routines. The value -of this constant is implementation specific. Refer to the -\hyperref[subsec:shmem_collect]{Collect Routines} section under -\hyperref[sec:openshmem_library_api]{Library Routines} for more information -about the usage of this constant. +Length of the work array needed for collect routines. +The value of this constant is implementation specific. +See Section~\ref{subsec:shmem_collect} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_ALLTOALL\_SYNC\_SIZE} & -Length of the work array needed for \FUNC{shmem\_alltoall} -routines. The value of this constant is implementation -specific. Refer to the \hyperref[subsec:shmem_alltoall]{Alltoall -routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant. +Length of the work array needed for \FUNC{shmem\_alltoall} routines. +The value of this constant is implementation specific. +See Section~\ref{subsec:shmem_alltoall} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_ALLTOALLS\_SYNC\_SIZE} & -Length of the work array needed for \FUNC{shmem\_alltoalls} -routines. The value of this constant is implementation -specific. Refer to the \hyperref[subsec:shmem_alltoalls]{Alltoalls -routines} sections under \hyperref[sec:openshmem_library_api]{Library Routines} -for more information about the usage of this constant. +Length of the work array needed for \FUNC{shmem\_alltoalls} routines. +The value of this constant is implementation specific. +See Section~\ref{subsec:shmem_alltoalls} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} @@ -199,8 +185,7 @@ & An integer constant expression corresponding to the ``equal to'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_CMP\_NE} @@ -210,8 +195,7 @@ & An integer constant expression corresponding to the ``not equal to'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_CMP\_LT} @@ -221,8 +205,7 @@ & An integer constant expression corresponding to the ``less than'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_CMP\_LE} @@ -232,8 +215,7 @@ & An integer constant expression corresponding to the ``less than or equal to'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_CMP\_GT} @@ -243,8 +225,7 @@ & An integer constant expression corresponding to the ``greater than'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_CMP\_GE} @@ -254,8 +235,7 @@ & An integer constant expression corresponding to the ``greater than or equal to'' comparison operation. -See Section~\ref{subsec:p2p_intro} for more detail about its use and -language-specific type constraints. +See Section~\ref{subsec:p2p_intro} for more detail about its use. \tabularnewline \hline %% \end{longtable} From 3ddccf5e9d21873a9797446755f8715ca035ada5 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 6 Sep 2017 16:31:05 -0400 Subject: [PATCH 415/583] Tweak wording around use of SHMEM_CTX_DEFAULT when not provided This commit changes: > Context on which to perform the operation. When this argument > is not provided, SHMEM_CTX_DEFAULT is used. to: > The context on which to perform the operation. When this argument > is not provided, the operation is performed on SHMEM_CTX_DEFAULT. See https://github.com/openshmem-org/specification/pull/63#discussion_r137287345 --- content/shmem_atomic_add.tex | 5 +++-- content/shmem_atomic_and.tex | 5 +++-- content/shmem_atomic_compare_swap.tex | 5 +++-- content/shmem_atomic_fetch.tex | 9 +++++---- content/shmem_atomic_fetch_add.tex | 5 +++-- content/shmem_atomic_fetch_and.tex | 5 +++-- content/shmem_atomic_fetch_inc.tex | 5 +++-- content/shmem_atomic_fetch_or.tex | 5 +++-- content/shmem_atomic_fetch_xor.tex | 5 +++-- content/shmem_atomic_inc.tex | 5 +++-- content/shmem_atomic_or.tex | 5 +++-- content/shmem_atomic_set.tex | 5 +++-- content/shmem_atomic_swap.tex | 21 +++++++++++---------- content/shmem_atomic_xor.tex | 5 +++-- content/shmem_fence.tex | 5 +++-- content/shmem_g.tex | 9 +++++---- content/shmem_get.tex | 5 +++-- content/shmem_get_nbi.tex | 5 +++-- content/shmem_iget.tex | 5 +++-- content/shmem_iput.tex | 7 ++++--- content/shmem_p.tex | 11 ++++++----- content/shmem_put.tex | 5 +++-- content/shmem_put_nbi.tex | 13 +++++++------ content/shmem_quiet.tex | 5 +++-- 24 files changed, 92 insertions(+), 68 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 13dfbcb37..e2ffcb2d3 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -27,8 +27,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. When using \CorCpp, the type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_and.tex b/content/shmem_atomic_and.tex index a633d7dde..5bfafdbb4 100644 --- a/content/shmem_atomic_and.tex +++ b/content/shmem_atomic_and.tex @@ -21,8 +21,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise AND operation.} diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index 4e5e4c7b0..bae9f2463 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -27,8 +27,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. } \apiargument{IN}{cond}{\VAR{cond} is compared to the remote \VAR{dest} diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 59dc1bc4c..015c6a981 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -32,11 +32,12 @@ \begin{apiarguments} -\apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} -\apiargument{IN}{dest}{The remotely accessible data object to be fetched from + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} + \apiargument{IN}{dest}{The remotely accessible data object to be fetched from the remote \ac{PE}.} -\apiargument{IN}{pe}{An integer that indicates the \ac{PE} number from which + \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number from which \VAR{dest} is to be fetched.} \end{apiarguments} diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index 13da066e3..20ae949e3 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -28,8 +28,9 @@ \begin{apiarguments} -\apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +\apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \VAR{dest} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_fetch_and.tex b/content/shmem_atomic_fetch_and.tex index 04c6fdb8b..15c37cf13 100644 --- a/content/shmem_atomic_fetch_and.tex +++ b/content/shmem_atomic_fetch_and.tex @@ -20,8 +20,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise AND operation.} diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 0b528e5e3..6e6619893 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -29,8 +29,9 @@ \begin{apiarguments} -\apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +\apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{IN}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_fetch_or.tex b/content/shmem_atomic_fetch_or.tex index 746b6031a..d4574d708 100644 --- a/content/shmem_atomic_fetch_or.tex +++ b/content/shmem_atomic_fetch_or.tex @@ -20,8 +20,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise OR operation.} diff --git a/content/shmem_atomic_fetch_xor.tex b/content/shmem_atomic_fetch_xor.tex index 84f91d8b8..05b1d0efa 100644 --- a/content/shmem_atomic_fetch_xor.tex +++ b/content/shmem_atomic_fetch_xor.tex @@ -21,8 +21,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise XOR operation.} diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index f8aa8884c..a807f9e43 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -26,8 +26,9 @@ \begin{apiarguments} -\apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +\apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{IN}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} diff --git a/content/shmem_atomic_or.tex b/content/shmem_atomic_or.tex index 6996beb98..42b16037e 100644 --- a/content/shmem_atomic_or.tex +++ b/content/shmem_atomic_or.tex @@ -21,8 +21,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise OR operation.} diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index d5ce546b3..1e9e10c4d 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -32,8 +32,9 @@ \begin{apiarguments} -\apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} +\apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{IN}{dest}{The remotely accessible data object to be set on the remote \ac{PE}.} \apiargument{IN}{value}{The value to be atomically written to the remote \ac{PE}.} diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index 6ca3d4eb1..160635e39 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -30,16 +30,17 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - \apiargument{OUT}{dest}{The remotely accessible integer data object to be - updated on the remote \ac{PE}. When using \CorCpp, the type of - \dest{} should match that implied in the SYNOPSIS section.} - \apiargument{IN}{value}{The value to be atomically written to the remote - \ac{PE}. \VAR{value} is the same type as \dest.} - \apiargument{IN}{pe}{ An integer that indicates the \ac{PE} number on which - \dest{} is to be updated. When using \Fortran, it must be a default - integer value.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} + \apiargument{OUT}{dest}{The remotely accessible integer data object to be + updated on the remote \ac{PE}. When using \CorCpp, the type of + \dest{} should match that implied in the SYNOPSIS section.} + \apiargument{IN}{value}{The value to be atomically written to the remote + \ac{PE}. \VAR{value} is the same type as \dest.} + \apiargument{IN}{pe}{ An integer that indicates the \ac{PE} number on which + \dest{} is to be updated. When using \Fortran, it must be a default + integer value.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_atomic_xor.tex b/content/shmem_atomic_xor.tex index 287a3868e..2d7fe5a57 100644 --- a/content/shmem_atomic_xor.tex +++ b/content/shmem_atomic_xor.tex @@ -21,8 +21,9 @@ \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{A pointer to the remotely accessible data object to be updated.} \apiargument{IN}{value}{The operand to the bitwise XOR operation.} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 55a543103..dcd2f2955 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -15,8 +15,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_g.tex b/content/shmem_g.tex index 77059ab76..1eec9813f 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -17,10 +17,11 @@ where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - \apiargument{IN}{addr}{The remotely accessible array element or scalar data object.} - \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} + \apiargument{IN}{addr}{The remotely accessible array element or scalar data object.} + \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_get.tex b/content/shmem_get.tex index 1daa2149d..6368be8de 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -44,8 +44,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{Local data object to be updated.} \apiargument{IN}{source}{Data object on the \ac{PE} identified by \VAR{pe} that contains the data to be copied. This data object must be remotely diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index 50b8101a5..c52958122 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -45,8 +45,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{Local data object to be updated.} \apiargument{IN}{source}{Data object on the \ac{PE} identified by \VAR{pe} that contains the data to be copied. This data object must be remotely diff --git a/content/shmem_iget.tex b/content/shmem_iget.tex index 1529a109b..b8bd5ec1b 100644 --- a/content/shmem_iget.tex +++ b/content/shmem_iget.tex @@ -37,8 +37,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{Array to be updated on the local \ac{PE}. } \apiargument{IN}{source}{Array containing the data to be copied on the remote \ac{PE}.} \apiargument{IN}{dst}{The stride between consecutive elements of the \dest{} diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index 4bddca9e8..1f71f238c 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -24,7 +24,7 @@ \begin{Fsynopsis} INTEGER dst, sst, nelems, pe -CALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) +nCALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_DOUBLE_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_INTEGER_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_IPUT4(dest, source, dst, sst, nelems, pe) @@ -37,8 +37,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{OUT}{dest}{Array to be updated on the remote \ac{PE}. This data object must be remotely accessible.} \apiargument{IN}{source}{Array containing the data to be copied.} diff --git a/content/shmem_p.tex b/content/shmem_p.tex index 92350947a..cc241bdbf 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -17,13 +17,14 @@ where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - \apiargument{IN}{addr}{The remotely accessible array element or scalar data object + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} + \apiargument{IN}{addr}{The remotely accessible array element or scalar data object which will receive the data on the remote \ac{PE}.} - \apiargument{IN}{value}{The value to be transferred to \VAR{addr} on the + \apiargument{IN}{value}{The value to be transferred to \VAR{addr} on the remote \ac{PE}.} - \apiargument{IN}{pe}{The number of the remote \ac{PE}.} + \apiargument{IN}{pe}{The number of the remote \ac{PE}.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_put.tex b/content/shmem_put.tex index b6124f7a2..2f6d9efeb 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -44,8 +44,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \apiargument{IN}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} \apiargument{OUT}{source}{Data object containing the data to be copied.} diff --git a/content/shmem_put_nbi.tex b/content/shmem_put_nbi.tex index c4bdbe1dd..4bd0c68c0 100644 --- a/content/shmem_put_nbi.tex +++ b/content/shmem_put_nbi.tex @@ -44,16 +44,17 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} - \apiargument{OUT}{dest}{Data object to be updated on the remote \ac{PE}. This + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} + \apiargument{OUT}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} - \apiargument{IN}{source}{Data object containing the data to be copied.} - \apiargument{IN}{nelems}{Number of elements in the \VAR{dest} and \VAR{source} + \apiargument{IN}{source}{Data object containing the data to be copied.} + \apiargument{IN}{nelems}{Number of elements in the \VAR{dest} and \VAR{source} arrays. \VAR{nelems} must be of type \VAR{size\_t} for \Cstd. When using \Fortran, it must be a constant, variable, or array element of default integer type.} - \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be + \apiargument{IN}{pe}{\ac{PE} number of the remote \ac{PE}. \VAR{pe} must be of type integer. When using \Fortran, it must be a constant, variable, or array element of default integer type.} \end{apiarguments} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 78bb66b1e..cb7442362 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -16,8 +16,9 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + \apiargument{IN}{ctx}{The context on which to perform the operation. + When this argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ From 66e49d7ced3c44bf697b17353bbd66dac21b3be4 Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 17:19:36 -0500 Subject: [PATCH 416/583] Typo fix in sync section ("no PE my"->"no PE shall"). --- content/synchronization_model.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 641d67aa1..3a713f180 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -77,7 +77,7 @@ & {All local and remote memory operations issued by all \acp{PE} within the active set are guaranteed to be completed before any \ac{PE} in the -active set returns from the call. Additionally, no \ac{PE} my return from the +active set returns from the call. Additionally, no \ac{PE} shall return from the barrier until all \acp{PE} in the active set have entered the same barrier call. This routine should be used when synchronization as well as completion of all stores and remote memory updates via \openshmem is required over a sub set From 54733b930606609c7c3d7d0f1781aac1431346de Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Wed, 30 Aug 2017 16:50:54 -0700 Subject: [PATCH 417/583] fixing mislabled PEs in quiet.pdf addressing github issue #81 --- figures/quiet.graffle | 2706 +++++++++++++++++++++-------------------- figures/quiet.pdf | Bin 63074 -> 46593 bytes 2 files changed, 1397 insertions(+), 1309 deletions(-) diff --git a/figures/quiet.graffle b/figures/quiet.graffle index d01f3f254..9749d29ee 100644 --- a/figures/quiet.graffle +++ b/figures/quiet.graffle @@ -1,1309 +1,1397 @@ - - - - - ActiveLayerIndex - 0 - ApplicationVersion - - com.omnigroup.OmniGraffle - 139.18.0.187838 - - AutoAdjust - - BackgroundGraphic - - Bounds - {{0, 0}, {1152, 733}} - Class - SolidGraphic - ID - 2 - Style - - shadow - - Draws - NO - - stroke - - Draws - NO - - - - BaseZoom - 0 - CanvasOrigin - {0, 0} - ColumnAlign - 1 - ColumnSpacing - 36 - CreationDate - 2014-02-04 18:37:20 +0000 - Creator - Pavel Shamis - DisplayScale - 1 0/72 in = 1.0000 in - GraphDocumentVersion - 8 - GraphicsList - - - Bounds - {{70.096904063309495, 405.61554727051521}, {76.921333312988281, 15}} - Class - ShapedGraphic - ID - 65 - Rotation - 153.57574462890625 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{70.121753001297776, 163.67627997882585}, {77.871635437011719, 15}} - Class - ShapedGraphic - ID - 54 - Rotation - 153.82313537597656 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Class - LineGraphic - Head - - ID - 45 - - ID - 77 - Points - - {16, 264} - {224, 264.21963500976562} - - Style - - stroke - - HeadArrow - 0 - Legacy - - Pattern - 24 - TailArrow - 0 - - - - - Bounds - {{548.94970253341262, 123}, {198, 125.83084106445312}} - Class - ShapedGraphic - ID - 70 - Shape - Rectangle - Style - - fill - - Color - - b - 0.999991 - g - 0.999974 - r - 1 - - - stroke - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs30 \cf0 PE K is any PE in the system.\ -\ -value1, value2, and value3\ -are delivered to target PEs and visible for PE K after the shmem_quiet() call.} - - - - Bounds - {{45.999997409511252, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 76 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{16, 11}, {70, 39}} - Class - ShapedGraphic - ID - 75 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE 2} - VerticalPad - 0 - - - - Bounds - {{45.999997409511252, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 74 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{765.69970444076125, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 62 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{735.69970703125, 11}, {70, 39}} - Class - ShapedGraphic - ID - 61 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE K} - VerticalPad - 0 - - - - Bounds - {{765.69970444076125, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 60 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{432.95552725825144, 360.83631934136469}, {79.163833618164062, 15}} - Class - ShapedGraphic - ID - 57 - Rotation - 29.242952346801758 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Class - LineGraphic - ID - 56 - Points - - {352.099853515625, 264.21963500976562} - {805.69970703125, 263} - - Style - - stroke - - HeadArrow - 0 - Legacy - - Pattern - 24 - TailArrow - 0 - - - Tail - - ID - 45 - Info - 3 - - - - Bounds - {{429.58094966987062, 193.41368125253854}, {77.487899780273438, 15}} - Class - ShapedGraphic - ID - 55 - Rotation - 24.251314163208008 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{520.19970444076125, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 53 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{283.099853515625, 420.54342651367188}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 52 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{156.54992416732375, 377.10272216796875}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 51 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr5, value5, PE 2)} - - - - Bounds - {{156.54992416732375, 333.66201782226562}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 50 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr4, value4, PE 0)} - - - - Bounds - {{283.099853515625, 290.557861328125}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 49 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{156.54992416732375, 172.49285888671875}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 48 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr3, value3, PE 0)} - - - - Bounds - {{156.54992416732375, 136.35284042358398}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 47 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr2, value2, PE 2)} - - - - Bounds - {{224, 250.38165283203125}, {128.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 45 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_quiet()} - - - - Bounds - {{156.54992416732375, 102.67642211914062}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 36 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr1, value1, PE 0)} - - - - Bounds - {{283.099853515625, 210.20545196533203}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 35 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{283.09985092513625, 62.500228881835938}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 33 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{432.56935019526316, 127.00000037163812}, {73.461151123046875, 15}} - Class - ShapedGraphic - ID - 27 - Rotation - 24.960399627685547 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{490.19970703125, 11}, {70, 39}} - Class - ShapedGraphic - ID - 30 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs28 \cf0 PE 1} - VerticalPad - 0 - - - - Bounds - {{253.09985092513625, 11}, {70, 39}} - Class - ShapedGraphic - ID - 28 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE 0} - VerticalPad - 0 - - - - Bounds - {{520.19970444076125, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 1 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - GridInfo - - GuidesLocked - NO - GuidesVisible - YES - HPages - 2 - ImageCounter - 1 - KeepToScale - - Layers - - - Lock - NO - Name - Layer 1 - Print - YES - View - YES - - - LayoutInfo - - Animate - NO - circoMinDist - 18 - circoSeparation - 0.0 - layoutEngine - dot - neatoSeparation - 0.0 - twopiSeparation - 0.0 - - LinksVisible - NO - MagnetsVisible - NO - MasterSheets - - ModificationDate - 2014-02-21 22:17:58 +0000 - Modifier - Shamis, Pavel - NotesVisible - NO - Orientation - 2 - OriginVisible - NO - PageBreaks - YES - PrintInfo - - NSBottomMargin - - float - 41 - - NSHorizonalPagination - - coded - BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG - - NSLeftMargin - - float - 18 - - NSPaperSize - - size - {612, 792} - - NSPrintReverseOrientation - - int - 0 - - NSRightMargin - - float - 18 - - NSTopMargin - - float - 18 - - - PrintOnePage - - ReadOnly - NO - RowAlign - 1 - RowSpacing - 36 - SheetTitle - Canvas 1 - SmartAlignmentGuidesActive - YES - SmartDistanceGuidesActive - YES - UniqueID - 1 - UseEntirePage - - VPages - 1 - WindowInfo - - CurrentSheet - 0 - ExpandedCanvases - - - name - Canvas 1 - - - Frame - {{108, 206}, {1434, 902}} - ListView - - OutlineWidth - 142 - RightSidebar - - Sidebar - - SidebarWidth - 120 - VisibleRegion - {{-81, -37}, {1314, 808}} - Zoom - 1 - ZoomValues - - - Canvas 1 - 1 - 1 - - - - - + + + + + ApplicationVersion + + com.omnigroup.OmniGraffle7 + 179.14.0.293243 + + CreationDate + 2014-02-04 18:37:20 +0000 + Creator + Pavel Shamis + GraphDocumentVersion + 14 + GuidesLocked + NO + GuidesVisible + YES + ImageCounter + 1 + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2014-02-21 22:17:58 +0000 + Modifier + Shamis, Pavel + MovementHandleVisible + NO + NotesVisible + NO + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {611.99999332427979, 792} + + NSPrintReverseOrientation + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + ReadOnly + NO + Sheets + + + ActiveLayerIndex + 0 + AutoAdjust + 6 + AutosizingMargin + 72 + BackgroundGraphic + + Bounds + {{0, 0}, {1152, 733}} + Class + GraffleShapes.CanvasBackgroundGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasDimensionsOrigin + {0, 0} + CanvasOrigin + {0, 0} + CanvasSizingMode + 1 + ColumnAlign + 1 + ColumnSpacing + 36 + DisplayScale + 1 in = 1.00000 in + GraphicsList + + + Bounds + {{70.096904063309495, 405.61554727051521}, {76.921333312988281, 15}} + Class + ShapedGraphic + ID + 3 + Rotation + 153.57574462890625 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{70.121753001297776, 163.67627997882585}, {77.871635437011719, 15}} + Class + ShapedGraphic + ID + 4 + Rotation + 153.82313537597656 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Class + LineGraphic + Head + + ID + 23 + + ID + 5 + Points + + {16, 264} + {224, 264.21963500976562} + + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + HeadArrow + 0 + Legacy + + Pattern + 24 + TailArrow + 0 + + + + + Bounds + {{548.94970253341262, 123}, {198, 125.83084106445312}} + Class + ShapedGraphic + ID + 6 + Style + + fill + + Color + + b + 0.99999970197677612 + g + 0.99999970197677612 + r + 0.9999966025352478 + space + srgb + + + stroke + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs30 \cf0 PE K is any PE in the system.\ +\ +value1, value2, and value3\ +are delivered to target PEs and visible for PE K after the shmem_quiet() call.} + + + + Bounds + {{45.999997409511252, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 7 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{16, 11}, {70, 39}} + Class + ShapedGraphic + ID + 8 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE 2} + VerticalPad + 0.0 + + + + Bounds + {{45.999997409511252, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 9 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{765.69970444076125, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{735.69970703125, 11}, {70, 39}} + Class + ShapedGraphic + ID + 11 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE K} + VerticalPad + 0.0 + + + + Bounds + {{765.69970444076125, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 12 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{432.95552725825144, 360.83631934136469}, {79.163833618164062, 15}} + Class + ShapedGraphic + ID + 13 + Rotation + 29.242952346801758 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Class + LineGraphic + ID + 14 + Points + + {352.099853515625, 264.21963500976562} + {805.69970703125, 263} + + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + HeadArrow + 0 + Legacy + + Pattern + 24 + TailArrow + 0 + + + Tail + + ID + 23 + Info + 3 + + + + Bounds + {{429.58094966987062, 193.41368125253854}, {77.487899780273438, 15}} + Class + ShapedGraphic + ID + 15 + Rotation + 24.251314163208008 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{520.19970444076125, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 16 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{283.099853515625, 420.54342651367188}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 17 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{156.54992416732375, 377.10272216796875}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 18 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr5, value5, PE 2)} + + + + Bounds + {{156.54992416732375, 333.66201782226562}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 19 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr4, value4, PE 1)} + + + + Bounds + {{283.099853515625, 290.557861328125}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 20 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{156.54992416732375, 172.49285888671875}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 21 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr3, value3, PE 1)} + + + + Bounds + {{156.54992416732375, 136.35284042358398}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 22 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr2, value2, PE 2)} + + + + Bounds + {{224, 250.38165283203125}, {128.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 23 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_quiet()} + + + + Bounds + {{156.54992416732375, 102.67642211914062}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 24 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr1, value1, PE 1)} + + + + Bounds + {{283.099853515625, 210.20545196533203}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 25 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{283.09985092513625, 62.500228881835938}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 26 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{432.56935019526316, 127.00000037163812}, {73.461151123046875, 15}} + Class + ShapedGraphic + ID + 27 + Rotation + 24.960399627685547 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{490.19970703125, 11}, {70, 39}} + Class + ShapedGraphic + ID + 28 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs28 \cf0 PE 1} + VerticalPad + 0.0 + + + + Bounds + {{253.09985092513625, 11}, {70, 39}} + Class + ShapedGraphic + ID + 29 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE 0} + VerticalPad + 0.0 + + + + Bounds + {{520.19970444076125, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 30 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + GridInfo + + HPages + 2 + KeepToScale + + Layers + + + Artboards + + Lock + + Name + Layer 1 + Print + + View + + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoLineLength + 0.20000000298023224 + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + Orientation + 2 + PrintOnePage + + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + UniqueID + 1 + VPages + 1 + VisibleVoidKey + 1 + + + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UseEntirePage + + WindowInfo + + CurrentSheet + 0 + Frame + {{0, 0}, {1276, 777}} + ShowInfo + + Sidebar + + SidebarWidth + 200 + Sidebar_Tab + 0 + VisibleRegion + {{0, -127}, {774, 667}} + ZoomValues + + + Canvas 1 + 1 + 1 + + + + compressOnDiskKey + + copyLinkedImagesKey + + createSinglePDFKey + + exportAreaKey + 0 + exportQualityKey + 100 + exportSizesKey + + 1 + + + fileFormatKey + 0 + htmlImageTypeKey + 0 + includeBackgroundGraphicKey + + includeNonPrintingLayersKey + + lastExportTypeKey + 8 + marginWidthKey + 0.0 + previewTypeKey + 0 + readOnlyKey + + resolutionForBMPKey + 1 + resolutionForGIFKey + 1 + resolutionForHTMLKey + 1 + resolutionForJPGKey + 1 + resolutionForPNGKey + 1 + resolutionForTIFFKey + 1 + resolutionUnitsKey + 0 + saveAsFlatFileOptionKey + 3 + useArtboardsKey + + useMarginKey + + useNotesKey + + + diff --git a/figures/quiet.pdf b/figures/quiet.pdf index 3f674f23829b6d6d47ce57c332afd2027427a1dc..fed7f1d52b31985081e068b6d2989bbece8bad02 100644 GIT binary patch literal 46593 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 From a5e4439df2595faa76f36c7bed38b220becb06d4 Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 21:25:36 -0500 Subject: [PATCH 418/583] Use consistent param name for wait/test routines. --- content/shmem_test.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_test.tex b/content/shmem_test.tex index 3396a61ed..f8705da17 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE value); +int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE value); +int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. @@ -20,21 +20,21 @@ \apiargument{OUT}{ivar}{A pointer to a remotely accessible data object.} \apiargument{IN}{cmp}{The comparison operator that compares \VAR{ivar} with - \VAR{value}.} - \apiargument{IN}{value}{The value against which the object pointed to + \VAR{cmp\_value}.} + \apiargument{IN}{cmp\_value}{The value against which the object pointed to by \VAR{ivar} will be compared.} \end{apiarguments} \apidescription{ \FUNC{shmem\_test} tests the numeric comparison of the symmetric object - pointed to by \VAR{ivar} with the value \VAR{value} according to the + pointed to by \VAR{ivar} with the value \VAR{cmp\_value} according to the comparison operator \VAR{cmp}. } \apireturnvalues{ \FUNC{shmem\_test} returns 1 if the comparison of the symmetric object - pointed to by \VAR{ivar} with the value \VAR{value} according to the + pointed to by \VAR{ivar} with the value \VAR{cmp\_value} according to the comparison operator \VAR{cmp} evalutes to true; otherwise, it returns 0. } From 2f79ac192956e5cadcfc6af8ea135824ec85178a Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 22:36:46 -0500 Subject: [PATCH 419/583] Add nb put/get in fence/quiet description. --- content/shmem_fence.tex | 14 +++++++------- content/synchronization_model.tex | 8 ++++---- main_spec.tex | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 55a543103..c0d30fdf1 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines + Assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects. } @@ -20,12 +20,12 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store - routines to symmetric data objects. All \PUT{}, \acp{AMO}, and memory store - routines to symmetric data objects issued to a particular remote \ac{PE} + This routine assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects. All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \acp{AMO}, and memory store routines to symmetric data + subsequent \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, not completion. } @@ -43,12 +43,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \acp{AMO}, and memory store routines to + guarantees completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \acp{AMO}, and memory store routines to symmetric data objects is desired + \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. } diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 3a713f180..51771f6f2 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,6 +1,6 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of -communication become critical. The updates via \PUT{} routines, \acp{AMO} and -store routines on symmetric data cannot be guaranteed until some form of +communication become critical. The updates via \PUT{}, \acp{AMO}, store, and +nonblocking \PUT{} and \GET{} routines on symmetric data cannot be guaranteed until some form of synchronization or ordering is introduced by the program user. The table below gives the different synchronization and ordering choices, and the situations where they may be useful.\\ @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued to +All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued by a +{All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local diff --git a/main_spec.tex b/main_spec.tex index ee570da14..adf26cf69 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -285,8 +285,8 @@ \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} \subsection{Memory Ordering Routines}\label{subsec:memory_order} The following section discusses \openshmem \acp{API} that provide mechanisms to -ensure ordering and/or delivery of \OPR{Put}, \ac{AMO}, and memory store -routines to symmetric data objects. +ensure ordering and/or delivery of \OPR{Put}, \ac{AMO}, memory store, +and non-blocking \PUT{} and \GET{} routines to symmetric data objects. \subsubsection{\textbf{SHMEM\_FENCE}}\label{subsec:shmem_fence} \input{content/shmem_fence.tex} From 81f02c64ec57967fa5c3087783fcee947755324d Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 22:48:49 -0500 Subject: [PATCH 420/583] Change AMOs to AMO in sync section. Because "AMOs" is always followed by "routines" in the sync section, e.g., delivery of Put, AMOs,...routines, it should be changed to AMO. --- content/shmem_fence.tex | 12 ++++++------ content/shmem_quiet.tex | 9 ++++----- content/synchronization_model.tex | 6 +++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index c0d30fdf1..df50b692c 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines + Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects. } @@ -20,12 +20,12 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} - routines to symmetric data objects. All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data + subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, not completion. } @@ -43,12 +43,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to + guarantees completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired + \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. } diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 78bb66b1e..ecbcdb011 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -1,5 +1,5 @@ \apisummary{ - Waits for completion of all outstanding \PUT{}, \acp{AMO}, memory store, + Waits for completion of all outstanding \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects issued by a \ac{PE}. } @@ -21,10 +21,9 @@ \end{apiarguments} \apidescription{ - The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \acp{AMO}, + The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines on - symmetric data objects issued by the calling \ac{PE} - on the given context. All \PUT{}, \acp{AMO}, + symmetric data objects issued by the calling \ac{PE} on the given context. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. @@ -37,7 +36,7 @@ \apinotes{ \FUNC{shmem\_quiet} is most useful as a way of ensuring completion of - several \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + several \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects initiated by the calling \ac{PE}. For example, one might use \FUNC{shmem\_quiet} to await delivery of a block of data before issuing another \PUT{} or non-blocking diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 51771f6f2..82b168387 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,5 +1,5 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of -communication become critical. The updates via \PUT{}, \acp{AMO}, store, and +communication become critical. The updates via \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} and \GET{} routines on symmetric data cannot be guaranteed until some form of synchronization or ordering is introduced by the program user. The table below gives the different synchronization and ordering choices, and the situations @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to +All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a +{All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local From 41015242fd1da9986f95505f3b5bef3e55aab7d3 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:23:55 -0700 Subject: [PATCH 421/583] fixing a typo in p2p sync intro --- content/p2p_sync_intro.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 62f5a0ee0..3ac8b7239 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -1,4 +1,4 @@ -The following section discusses \openshmem \acp{API} that provides a mechanism +The following section discusses \openshmem \acp{API} that provide a mechanism for synchronization between two \acp{PE} based on the value of a symmetric data object. The point-to-point synchronization routines can be used to portably ensure From 27f443c90e8c3455fa7b507ee76016a79949fb4d Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:36:28 -0700 Subject: [PATCH 422/583] fixing param description in shmem_wait_until removing a contrafictory statement shmem_wait_until param description that cmp_value has to be an integer --- content/shmem_wait.tex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..448415fb8 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -42,8 +42,7 @@ \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} -\apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When - using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the +\apiargument{IN}{When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of the same size and kind as \VAR{ivar}.} From bc9ef0494038a08a9276472a8510b365a6019dfd Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:47:58 -0700 Subject: [PATCH 423/583] Revert "fixing param description in shmem_wait_until" This reverts commit 0d03b7f22dcf76eced133277c073ff1fe71d35e8. --- content/shmem_wait.tex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 448415fb8..13b7f0432 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -42,7 +42,8 @@ \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} -\apiargument{IN}{When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the +\apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When + using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of the same size and kind as \VAR{ivar}.} From 679cd60904baf32a26c5e4c274d7ba619e4f257b Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Wed, 6 Sep 2017 16:41:40 -0400 Subject: [PATCH 424/583] Minor editorial changes identified (or similar to those) in https://github.com/openshmem-org/specification/pull/63#pullrequestreview-60933842 --- content/shmem_atomic_compare_swap.tex | 2 +- content/shmem_ctx_create.tex | 6 +++--- content/shmem_finalize.tex | 4 ++-- utils/defs.tex | 1 - 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index bae9f2463..d980bb1eb 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -34,7 +34,7 @@ updated on the remote \ac{PE}. } \apiargument{IN}{cond}{\VAR{cond} is compared to the remote \VAR{dest} value. If \VAR{cond} and the remote \VAR{dest} are equal, then \VAR{value} - is swapped into the remote \VAR{dest}. Otherwise, the remote \VAR{dest} is + is swapped into the remote \VAR{dest}; otherwise, the remote \VAR{dest} is unchanged. In either case, the old value of the remote \VAR{dest} is returned as the routine return value. \VAR{cond} must be of the same data type as \VAR{dest}.} diff --git a/content/shmem_ctx_create.tex b/content/shmem_ctx_create.tex index 1d813fd78..0ee85d368 100644 --- a/content/shmem_ctx_create.tex +++ b/content/shmem_ctx_create.tex @@ -11,7 +11,7 @@ \begin{apiarguments} \apiargument{IN}{options}{The set of options requested for the given context. Multiple options may be requested by combining them with a bitwise - OR operation. Otherwise, \CONST{0} can be given if no options are + OR operation; otherwise, \CONST{0} can be given if no options are requested.} \apiargument{OUT}{ctx}{A handle to the newly created context.} \end{apiarguments} @@ -19,7 +19,7 @@ \apidescription{ The \FUNC{shmem\_ctx\_create} routine creates a new communication context and returns its handle through the \VAR{ctx} argument. If the context was - created successfully, a value of zero is returned; otherwise a nonzero + created successfully, a value of zero is returned; otherwise, a nonzero value is returned. An unsuccessful context creation call is not treated as an error and the \openshmem library remains in a correct state. The creation call can be reattempted with different @@ -32,7 +32,7 @@ The following options can be supplied during context creation to restrict this usage model and enable performance optimizations. When using a given context, the application must comply with the requirements of all options - set on that context. Otherwise the behavior is undefined. + set on that context; otherwise, the behavior is undefined. No options are enabled on the default context. \apitablerow{\CONST{SHMEM\_CTX\_SERIALIZED}}{ diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index e54d1384b..acd0f73e1 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -28,8 +28,8 @@ \acp{PE} have entered \FUNC{shmem\_finalize}. This routine destroys all shareable contexts. The user is responsible for destroying all contexts with the - \CONST{SHMEM\_CTX\_PRIVATE} option enabled prior to calling this routine. - Otherwise, the behavior is undefined. + \CONST{SHMEM\_CTX\_PRIVATE} option enabled prior to calling this routine; + otherwise, the behavior is undefined. \FUNC{shmem\_finalize} must be the last \openshmem library call encountered in the \openshmem portion of a program. A call to \FUNC{shmem\_finalize} will release any resources diff --git a/utils/defs.tex b/utils/defs.tex index 5051ac6b6..11e651162 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -170,7 +170,6 @@ breakatwhitespace=true, % sets if automatic breaks should only happen at whitespace basicstyle=\ttfamily\footnotesize, breaklines=true, % sets automatic line breaking - escapeinside={|}{|}, % if you want to add LaTeX within your code extendedchars=true, % lets you use non-ASCII characters; for 8-bits % encodings only, does not work with UTF-8 keepspaces=true, % keeps spaces in text, useful for keeping indentation of code From 4a8b9d46ee2553f0a0cf5fe61110a2d035efeb51 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 6 Sep 2017 17:06:29 -0400 Subject: [PATCH 425/583] Added changelog preamble for OpenSHMEM 1.4 --- content/backmatter.tex | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 17791d5a9..fdcb2a6c7 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -520,7 +520,16 @@ \subsection{Fortran API}\label{subsec:deprecate-fortran} %% WARNING: Issue #66. \chapter{Changes to this Document}\label{sec:changelog} \section{Version 1.4} -%Major changes in \openshmem[1.4] include ... +Major changes in \openshmem[1.4] include +multithreading support, +\emph{contexts} for communication management, +\FUNC{shmem\_sync}, +\FUNC{shmem\_calloc}, +expanded type support for \ac{RMA} and \ac{AMO} operations, +a new namespace for atomic operations, +atomic bitwise operations, +\FUNC{shmem\_test} for non-blocking point-to-point synchronization, +and \Cstd[11] type-generic interfaces for point-to-point synchronization. The following list describes the specific changes in \openshmem[1.4]: \begin{itemize} From 732b1c2c1244a36c5a982e2533d0a38ab7e19bb0 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Wed, 6 Sep 2017 17:03:10 -0700 Subject: [PATCH 426/583] renaming section to shmem_wait_until --- main_spec.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main_spec.tex b/main_spec.tex index adf26cf69..a52420352 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -273,7 +273,7 @@ \subsubsection{\textbf{SHMEM\_ALLTOALLS}}\label{subsec:shmem_alltoalls} \subsection{Point-To-Point Synchronization Routines}\label{subsec:p2p_intro} \input{content/p2p_sync_intro.tex} -\subsubsection{\textbf{SHMEM\_WAIT}}\label{subsec:shmem_wait} +\subsubsection{\textbf{SHMEM\_WAIT\_UNTIL}}\label{subsec:shmem_wait} \input{content/shmem_wait.tex} \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} From 9514c38675def6a81577a6ca9ca9dd22473f6750 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 6 Sep 2017 20:18:24 -0400 Subject: [PATCH 427/583] Annex E: Removed list of implementations in favor of website link --- content/backmatter.tex | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index fdcb2a6c7..42ed8f5bb 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -288,28 +288,12 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \item \ac{SGI} and Open Source Software Solutions, Inc. (OSSS) signed a SHMEM trademark licensing agreement, in 2010 \end{itemize} - \item Other Implementations - \begin{itemize} - \item Quadrics (Vega UK, Ltd.) - \item Hewlett Packard - \item GPSHMEM - \item IBM - \item QLogic - \item Mellanox - % \item University of Houston - \item University of Florida - \end{itemize} - \end{itemize} -\item OpenSHMEM Implementations - \begin{itemize} - \item \ac{SGI} \openshmem - \item University of Houston - \openshmem Reference Implementation - \item Mellanox ScalableSHMEM - \item Portals-SHMEM - \item IBM OpenSHMEM \end{itemize} \end{itemize} +A listing of \openshmem implementations can be found on +\url{http://www.openshmem.org/}. + From 660e1c8704fc93535183032c92e11c51a592457d Mon Sep 17 00:00:00 2001 From: Min Si Date: Thu, 31 Aug 2017 13:18:20 -0500 Subject: [PATCH 428/583] Use consistent dest/source param for Put/Get routines. (Cherry-pick of 4700b0f from @min-si, updated for contexts.) --- content/shmem_g.tex | 12 ++++++------ content/shmem_p.tex | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/shmem_g.tex b/content/shmem_g.tex index 1eec9813f..4b0972a7c 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_g(const TYPE *addr, int pe); -TYPE shmem_g(shmem_ctx_t ctx, const TYPE *addr, int pe); +TYPE shmem_g(const TYPE *source, int pe); +TYPE shmem_g(shmem_ctx_t ctx, const TYPE *source, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -TYPE shmem__g(const TYPE *addr, int pe); -TYPE shmem_ctx__g(shmem_ctx_t ctx, const TYPE *addr, int pe); +TYPE shmem__g(const TYPE *source, int pe); +TYPE shmem_ctx__g(shmem_ctx_t ctx, const TYPE *source, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. @@ -20,8 +20,8 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} - \apiargument{IN}{addr}{The remotely accessible array element or scalar data object.} - \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{addr} resides.} + \apiargument{IN}{source}{The remotely accessible array element or scalar data object.} + \apiargument{IN}{pe}{The number of the remote \ac{PE} on which \VAR{source} resides.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_p.tex b/content/shmem_p.tex index cc241bdbf..40556a3b5 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -20,9 +20,9 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} - \apiargument{IN}{addr}{The remotely accessible array element or scalar data object + \apiargument{IN}{dest}{The remotely accessible array element or scalar data object which will receive the data on the remote \ac{PE}.} - \apiargument{IN}{value}{The value to be transferred to \VAR{addr} on the + \apiargument{IN}{value}{The value to be transferred to \VAR{dest} on the remote \ac{PE}.} \apiargument{IN}{pe}{The number of the remote \ac{PE}.} \end{apiarguments} From f614b8d54aa72b09dc235fd6729b0d4f7b421f81 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 6 Sep 2017 21:29:35 -0400 Subject: [PATCH 429/583] Annex E: Reword --- content/backmatter.tex | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 42ed8f5bb..e9904e53f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -263,30 +263,30 @@ \section{\ac{MPI} Interoperability} \chapter{History of OpenSHMEM}\label{sec:openshmem_history} -SHMEM has a long history as a parallel programming model, having been used -extensively on a number of products since 1993, including Cray T3D, Cray X1E, -the Cray XT3/4, \ac{SGI} Origin, \ac{SGI} Altix, clusters based on the Quadrics -interconnect, and, to a very limited extent, Infiniband based clusters. +SHMEM has a long history as a parallel-programming model and has been +extensively used on a number of products since 1993, including the Cray T3D, +Cray X1E, Cray XT3 and XT4, \ac{SGI} Origin, \ac{SGI} Altix, Quadrics-based +clusters, and InfiniBand-based clusters. \begin{itemize} -\item A SHMEM Timeline +\item SHMEM Timeline \begin{itemize} \item Cray SHMEM \begin{itemize} - \item SHMEM first introduced by Cray Research Inc. in 1993 for Cray T3D - \item Cray is acquired by \ac{SGI} in 1996 - \item Cray is acquired by Tera in 2000 (MTA) + \item SHMEM first introduced by Cray Research, Inc.\ in 1993 for Cray T3D + \item Cray was acquired by \ac{SGI} in 1996 + \item Cray was acquired by Tera in 2000 (MTA) \item Platforms: Cray T3D, T3E, C90, J90, SV1, SV2, X1, X2, XE, XMT, XT \end{itemize} \item \ac{SGI} SHMEM \begin{itemize} - \item \ac{SGI} purchases Cray Research Inc. and SHMEM was integrated into + \item \ac{SGI} acquired Cray Research, Inc.\ and SHMEM was integrated into \ac{SGI}'s Message Passing Toolkit (MPT) \item \ac{SGI} currently owns the rights to SHMEM and \openshmem \item Platforms: Origin, Altix 4700, Altix XE, ICE, UV - \item \ac{SGI} was purchased by Rackable Systems in 2009 + \item \ac{SGI} was acquired by Rackable Systems in 2009 \item \ac{SGI} and Open Source Software Solutions, Inc. (OSSS) signed a - SHMEM trademark licensing agreement, in 2010 + SHMEM trademark licensing agreement in 2010 \end{itemize} \end{itemize} \end{itemize} From 0bc12befcb9ca6f2bc5f3ee615c87989ba39e85b Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Thu, 7 Sep 2017 10:35:25 -0400 Subject: [PATCH 430/583] Editing out redudant PE expansion --- content/shmem_reductions.tex | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index f23d46c33..58216c849 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -7,7 +7,7 @@ \begin{apidefinition} \paragraph{AND} -Performs a bitwise AND reduction across a set of processing elements (\acp{PE}).\newline +Performs a bitwise AND reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_and_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -21,7 +21,7 @@ \end{Fsynopsis} \paragraph{MAX} -Performs a maximum-value reduction across a set of processing elements (\acp{PE}).\newline +Performs a maximum-value reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -41,7 +41,7 @@ \end{Fsynopsis} \paragraph{MIN} -Performs a minimum-value reduction across a set of processing elements (\acp{PE}).\newline +Performs a minimum-value reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -61,7 +61,7 @@ \end{Fsynopsis} \paragraph{SUM} -Performs a sum reduction across a set of processing elements (\acp{PE}).\newline +Performs a sum reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| void shmem_complexf_sum_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); @@ -85,7 +85,7 @@ \end{Fsynopsis} \paragraph{PROD} -Performs a product reduction across a set of processing elements (\acp{PE}).\newline +Performs a product reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); @@ -109,7 +109,7 @@ \end{Fsynopsis} \paragraph{OR} -Performs a bitwise OR reduction across a set of processing elements (\acp{PE}).\newline +Performs a bitwise OR reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_or_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -123,7 +123,7 @@ \end{Fsynopsis} \paragraph{XOR} -Performs a bitwise EXCLUSIVE OR reduction across a set of processing elements (\acp{PE}).\newline +Performs a bitwise EXCLUSIVE OR reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_xor_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); From 5d04f548f481dd4a12a412c1c173509686431e1c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 7 Sep 2017 12:02:55 -0400 Subject: [PATCH 431/583] Update formatting of threads introduction Use LaTeX definition enviornment for defining threading levels and use enumeration for listing semantics (the numbered list allows a reader to reference a particular semantic). Signed-off-by: James Dinan --- content/threads_intro.tex | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/threads_intro.tex b/content/threads_intro.tex index 56b7bdd54..8060eaa9a 100644 --- a/content/threads_intro.tex +++ b/content/threads_intro.tex @@ -3,27 +3,27 @@ querying the thread environment. There are four levels of threading defined by the \openshmem specification. -\begin{itemize} -\item {\bf \CONST{SHMEM\_THREAD\_SINGLE}} The \openshmem program may not be multithreaded. +\begin{description} +\item[\CONST{SHMEM\_THREAD\_SINGLE}] \hfill \\ +The \openshmem program may not be multithreaded. -\item {\bf \CONST{SHMEM\_THREAD\_FUNNELED}} +\item[\CONST{SHMEM\_THREAD\_FUNNELED}] \hfill \\ The \openshmem program may be multithreaded. However, the program must ensure that only the main thread invokes the \openshmem interfaces. The main thread is the thread that invokes either \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. -\item {\bf \CONST{SHMEM\_THREAD\_SERIALIZED}} +\item[\CONST{SHMEM\_THREAD\_SERIALIZED}] \hfill \\ The \openshmem program may be multithreaded. However, the program must ensure that the \openshmem interfaces are not invoked concurrently by multiple threads. -\item {\bf \CONST{SHMEM\_THREAD\_MULTIPLE}} +\item[\CONST{SHMEM\_THREAD\_MULTIPLE}] \hfill \\ The \openshmem program may be multithreaded and any thread may invoke the \openshmem interfaces. -\end{itemize} +\end{description} -\hspace{-15pt} -{\bf Semantics} +\noindent The following semantics apply to the usage of these models: -\begin{itemize} +\begin{enumerate} \item In the \CONST{SHMEM\_THREAD\_FUNNELED}, \CONST{SHMEM\_THREAD\_SERIALIZED}, and \CONST{SHMEM\_THREAD\_MULTIPLE} thread levels, the \FUNC{shmem\_init} and @@ -61,4 +61,4 @@ management routines, it is the programmer's responsibility to ensure the correct ordering of collective calls. -\end{itemize} +\end{enumerate} From af8befdaf6ac3fad640097cd2cde3042ff6a2149 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 7 Sep 2017 14:35:38 -0400 Subject: [PATCH 432/583] Update shmem_init referenes to be inclusive of shmem_init_thread Signed-off-by: James Dinan --- content/shmem_finalize.tex | 4 ++-- content/start_pes.tex | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index 804db9e4c..09893189e 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -20,7 +20,7 @@ \apidescription{ \FUNC{shmem\_finalize} is a collective operation that ends the \openshmem - portion of a program previously initialized by \FUNC{shmem\_init} and + portion of a program previously initialized by \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread} and releases all resources used by the \openshmem library. This collective operation requires all \acp{PE} to participate in the call. There is an implicit global barrier in \FUNC{shmem\_finalize} to ensure that pending @@ -33,7 +33,7 @@ \FUNC{shmem\_finalize} must be the last \openshmem library call encountered in the \openshmem portion of a program. A call to \FUNC{shmem\_finalize} will release all resources - initialized by a corresponding call to \FUNC{shmem\_init}. All processes + initialized by a corresponding call to \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. All processes that represent the \acp{PE} will still exist after the call to \FUNC{shmem\_finalize} returns, but they will no longer have access to resources that have been released. diff --git a/content/start_pes.tex b/content/start_pes.tex index e029cb230..d24735d42 100644 --- a/content/start_pes.tex +++ b/content/start_pes.tex @@ -23,9 +23,9 @@ \apidescription{ The \FUNC{start\_pes} routine initializes the \openshmem execution - environment. An \openshmem program must call either \FUNC{start\_pes} or - \FUNC{shmem\_init} before calling any other \openshmem routine. Unlike - \FUNC{shmem\_init}, \FUNC{start\_pes} does not require a call to + environment. An \openshmem program must call \FUNC{start\_pes}, + \FUNC{shmem\_init}, or \FUNC{shmem\_init\_thread} before calling any other \openshmem routine. Unlike + \FUNC{shmem\_init} and \FUNC{shmem\_init\_thread}, \FUNC{start\_pes} does not require a call to \FUNC{shmem\_finalize}. Instead, the \openshmem library is implicitly finalized when the program exits. Implicit finalization is collective and includes a global synchronization to ensure that all pending communication @@ -45,7 +45,8 @@ As of \openshmem[1.2] the use of \FUNC{start\_pes} has been deprecated. Although \openshmem libraries are required to support the - call, program users are encouraged to use \FUNC{shmem\_init} instead. + call, users are encouraged to use \FUNC{shmem\_init} or + \FUNC{shmem\_init\_thread} instead. } From fe8cfa939591a4274918340fe6823d3f0483a3b9 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 7 Sep 2017 15:36:58 -0400 Subject: [PATCH 433/583] Fix on more instance of NULL pointer text Signed-off-by: James Dinan --- content/shmem_malloc.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index c5e847a85..f4cce930d 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -73,7 +73,7 @@ The \FUNC{shmem\_free} routine returns no value. The \FUNC{shmem\_realloc} routine returns a pointer to the allocated space - (which may have moved); otherwise, it returns a \const{NULL} pointer. + (which may have moved); otherwise, it returns a null pointer. The \FUNC{shmem\_align} routine returns an aligned pointer to the allocated space; otherwise, it returns a null pointer. From c95702d9dd01e3a28fb792ab37c789a2c79ef432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bouteiller?= Date: Thu, 7 Sep 2017 16:55:43 -0400 Subject: [PATCH 434/583] Copying the note on ordering in MT programs from quiet to fence. --- content/shmem_fence.tex | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 55a543103..fdbd490c0 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -50,6 +50,16 @@ The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, \acp{AMO}, and memory store routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. + + In an \openshmem program with multithreaded \acp{PE}, it is the + user's responsibility to ensure ordering between operations issued by the threads + in a \ac{PE} that target symmetric memory (e.g. \PUT{}, \ac{AMO}, memory stores, + and nonblocking routines) and calls by threads in that \ac{PE} to + \FUNC{shmem\_fence}. The \FUNC{shmem\_fence} routine can enforce memory store ordering only for the + calling thread. Thus, to ensure ordering for memory stores performed by a thread that is + not the thread calling \FUNC{shmem\_fence}, the update must be made visible to the + calling thread according to the rules of the memory model associated with + the threading environment. } \begin{apiexamples} From 8a9b45ee9b39adb4d4189d11315bddd11e1df661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bouteiller?= Date: Thu, 7 Sep 2017 17:11:33 -0400 Subject: [PATCH 435/583] 90:30: the following example uses shmem_fence in a C11 program. 92:30: "by the program user" -> in the user's program --- content/shmem_fence.tex | 2 +- content/synchronization_model.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 55a543103..cccb84edd 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -55,7 +55,7 @@ \begin{apiexamples} \apicexample - {The following \FUNC{shmem\_fence} example is for C11 programs: } + {The following example uses \FUNC{shmem\_fence} in a C11 program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 641d67aa1..d2070954c 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,7 +1,7 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of communication become critical. The updates via \PUT{} routines, \acp{AMO} and store routines on symmetric data cannot be guaranteed until some form of -synchronization or ordering is introduced by the program user. The table below +synchronization or ordering is introduced in the user's program. The table below gives the different synchronization and ordering choices, and the situations where they may be useful.\\ From 8c6d6d9171421e2f62b0fe76f69abcf1ca65b1e1 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 7 Sep 2017 14:34:58 -0700 Subject: [PATCH 436/583] clarifying shmem_fence and non-blocking get shmem_fence does not guarantee order of delivery of non-blocking get routines --- content/shmem_fence.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index df50b692c..7e97a5f2e 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -27,7 +27,7 @@ to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, - not completion. + not completion. It does not guarantee order of delivery of non-blocking \GET{} routines. } \apireturnvalues{ From 816ea3b8b4bb68ee8a802324f12d0b5f00098c49 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Sun, 10 Sep 2017 18:13:09 -0400 Subject: [PATCH 437/583] Add label for SMA_* deprecation to backmatter --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index e9904e53f..3493ef8cc 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -462,7 +462,7 @@ \subsection{\CONST{\_SHMEM\_*} Library Constants} with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran naming conventions. -\subsection{\VAR{SMA\_*} Environment Variables} +\subsection{\VAR{SMA\_*} Environment Variables}\label{subsec:deprecate-sma-env} The environment variables \VAR{SMA\_VERSION}, \VAR{SMA\_INFO}, \VAR{SMA\_SYMMETRIC\_SIZE}, and \VAR{SMA\_DEBUG} were deprecated in order to normalize the \openshmem \ac{API} to use From be42a4206243d4ad634bd4cbcad1b948fa722d8c Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Tue, 12 Sep 2017 10:04:44 -0500 Subject: [PATCH 438/583] Fix the definition of OSSS --- utils/defs.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/defs.tex b/utils/defs.tex index 9da54b89e..e0905f9da 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -89,7 +89,7 @@ \acro{ORNL}{Oak Ridge National Laboratory} \acro{LANL}{Los Alamos National Laboratory} \acro{ESSC}{Extreme Scale Systems Center} -\acro{OSSS}{Open Software System Solutions} +\acro{OSSS}{Open Source Software Solutions} \acro{DoD}{U.S. Department of Defense} \acro{SBU}{Stonybrook University} \acro{UTK}{University of Tenneesee at Knoxville} From 746c406a9c07aeb8724ab7acd8012f0cbdf5d5b9 Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Mon, 18 Sep 2017 15:10:58 -0500 Subject: [PATCH 439/583] Add Ozog and remove Reed from the contributors --- content/coverpage.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/coverpage.tex b/content/coverpage.tex index fe620b876..d871035cb 100644 --- a/content/coverpage.tex +++ b/content/coverpage.tex @@ -72,6 +72,7 @@ \section*{Current Authors and Collaborators} \item Jeff Kuehn, \ac{LANL} \item Jens Manser, \ac{DoD} \item Tiffany M. Mintz, \ac{ORNL} +\item David Ozog, Intel \item Nicholas Park, \ac{DoD} \item Steve Poole, \ac{OSSS} \item Wendy Poole, \ac{OSSS} @@ -80,7 +81,6 @@ \section*{Current Authors and Collaborators} \item Howard Pritchard, \ac{LANL} \item Naveen Ravi, Cray Inc. \item Michael Raymond, \ac{HPE} -\item Isayah Reed, Mellanox \item James Ross, \ac{ARL} \item Pavel Shamis, ARM Inc. \item Sameer Shende, \ac{UO} From bb0fd09e5b53d67b167e0b2a845f92288cd8f2cb Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Wed, 20 Sep 2017 06:59:39 -0500 Subject: [PATCH 440/583] Update library_constants.tex --- content/library_constants.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index c0a3da296..6a450ac56 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -44,7 +44,7 @@ See Section~\ref{sec:ctx} for more detail about its use. \tabularnewline \hline %% -\LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZE} & +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZED} & The context creation option which specifies that the given context is shareable but will not be used by multiple threads concurrently. See Section~\ref{subsec:shmem_ctx_create} for more detail about its use. @@ -190,7 +190,7 @@ %% \LibConstDecl{SHMEM\_CMP\_NE} \begin{DeprecateBlock} - \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_NEEQ} + \LibConstDecl[\CorCpp]{\_SHMEM\_CMP\_NE} \end{DeprecateBlock} & An integer constant expression corresponding to the From e333f2914b581c10ac37fa3566e2589c955c6434 Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Wed, 20 Sep 2017 07:03:12 -0500 Subject: [PATCH 441/583] Update coverpage.tex --- content/coverpage.tex | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/coverpage.tex b/content/coverpage.tex index d871035cb..31371338a 100644 --- a/content/coverpage.tex +++ b/content/coverpage.tex @@ -27,10 +27,6 @@ \section*{Development by} \begin{itemize} -\item High Performance Computing Tools group at the University of Houston\\ - \url{http://www.cs.uh.edu/~hpctools/} -\item Extreme Scale Systems Center, Oak Ridge National Laboratory\\ - \url{http://www.csm.ornl.gov/essc/} \item For a current list of contributors and collaborators please see\\ \url{http://www.openshmem.org/site/Contributors/} \item For a current list of OpenSHMEM implementations and tools, please see\\ From cbbd763fe108cc544aef299c0d8895e31bbe5022 Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Wed, 20 Sep 2017 07:09:02 -0500 Subject: [PATCH 442/583] Update memory_model.tex --- content/memory_model.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/memory_model.tex b/content/memory_model.tex index 711be5593..3efd38a67 100644 --- a/content/memory_model.tex +++ b/content/memory_model.tex @@ -20,8 +20,8 @@ \ref{subsec:shfree}}. (For the definition of what is accessible, see the descriptions for \FUNC{shmem\_pe\_accessible} and \FUNC{shmem\_addr\_accessible} in sections \ref{subsec:shmem_pe_accessible} and -\ref{subsec:shmem_addr_accessible}.) Symmetric data objects accessed via typed -\openshmem interfaces are required to be naturally aligned based on their type +\ref{subsec:shmem_addr_accessible}.) Symmetric data objects accessed via typed and +type-generic \openshmem interfaces are required to be naturally aligned based on their type requirements and underlying architecture. In \openshmem the following kinds of data objects are symmetric: % From 3e1119eea0090b70c9667ddd61dd347eec1f7def Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 09:50:41 -0400 Subject: [PATCH 443/583] section/management: Add macro use where appropriate --- content/shmem_finalize.tex | 2 +- content/shmem_global_exit.tex | 6 +++--- content/shmem_malloc.tex | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index 09893189e..c9738cf70 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -55,7 +55,7 @@ \begin{apiexamples} \apicexample - {The following finalize example is for C11 programs:} + {The following finalize example is for \Cstd[11] programs:} {./example_code/shmem_finalize_example.c} {} diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 0b2b7b8bc..9d3a65f08 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -28,7 +28,7 @@ the entire program, not just the \openshmem portion. When any \ac{PE} calls \FUNC{shmem\_global\_exit}, it results in the immediate notification to all \acp{PE} to terminate. \FUNC{shmem\_global\_exit} flushes I/O and releases - resources in accordance with C/C++/Fortran language requirements for normal + resources in accordance with \CorCppFor language requirements for normal program termination. If more than one \ac{PE} calls \FUNC{shmem\_global\_exit}, then the exit status returned to the environment shall be one of the values passed to \FUNC{shmem\_global\_exit} as the @@ -50,10 +50,10 @@ or a found solution. Since \FUNC{shmem\_global\_exit} is a non-collective routine, there is no implied synchronization, and all \acp{PE} must terminate regardless of their current execution state. While I/O must be - flushed for standard language I/O calls from C/C++/Fortran, it is + flushed for standard language I/O calls from \CorCppFor, it is implementation dependent as to how I/O done by other means (e.g. third party I/O libraries) is handled. Similarly, resources are released - according to C/C++/Fortran standard language requirements, but this may not + according to \CorCppFor standard language requirements, but this may not include all resources allocated for the \openshmem program. However, a quality implementation will make a best effort to flush all I/O and clean up all resources. diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index f4cce930d..644c49cb0 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -27,7 +27,7 @@ heap). The \FUNC{shmem\_align} routine allocates a block in the symmetric heap that has - a byte alignment specified by the alignment argument. + a byte alignment specified by the \VAR{alignment} argument. The \FUNC{shmem\_free} routine causes the block to which \VAR{ptr} points to be deallocated, that is, made available for further allocation. If \VAR{ptr} is a @@ -81,7 +81,7 @@ \apinotes{ As of \openshmem[1.2] the use of \FUNC{shmalloc}, \FUNC{shmemalign}, - \FUNC{shfree}, and \FUNC{shrealloc} has been deprecated. Although OpenSHMEM + \FUNC{shfree}, and \FUNC{shrealloc} has been deprecated. Although \openshmem libraries are required to support the calls, users are encouraged to use \FUNC{shmem\_malloc}, \FUNC{shmem\_align}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} instead. The behavior and signature of the routines From a030eea598e2daeed48f1a24347b26e779d061b9 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 09:51:55 -0400 Subject: [PATCH 444/583] section/management: Punctuation and grammar fixes --- content/shmem_finalize.tex | 2 +- content/shmem_malloc.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index c9738cf70..58ba349f9 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -24,7 +24,7 @@ releases all resources used by the \openshmem library. This collective operation requires all \acp{PE} to participate in the call. There is an implicit global barrier in \FUNC{shmem\_finalize} to ensure that pending - communications are completed, and that no resources are released until all + communications are completed and that no resources are released until all \acp{PE} have entered \FUNC{shmem\_finalize}. This routine destroys all shareable contexts. The user is responsible for destroying all contexts with the diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 644c49cb0..f89a99936 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -46,7 +46,7 @@ The \FUNC{shmem\_malloc}, \FUNC{shmem\_align}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines are provided so that multiple \acp{PE} in a program can allocate symmetric, remotely accessible memory blocks. These memory blocks can then be used with - \openshmem communication routines. Each of these routines include at least one + \openshmem communication routines. Each of these routines includes at least one call to a procedure that is semantically equivalent to \FUNC{shmem\_barrier\_all}: \FUNC{shmem\_malloc} and \FUNC{shmem\_align} call a barrier on exit; \FUNC{shmem\_free} calls a barrier on entry; and From 7741f7fa019821e065c30c4c6cdb8fef5bf4b26f Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 09:56:40 -0400 Subject: [PATCH 445/583] section/management: general text improvements - Improve/remove use of "i.e." and "e.g." - Improve sentence structure and styling --- content/shmem_global_exit.tex | 7 ++++--- content/shmem_init.tex | 2 +- content/shmem_malloc.tex | 4 ++-- content/threads_intro.tex | 8 ++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 9d3a65f08..0968743aa 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -46,12 +46,13 @@ \FUNC{shmem\_global\_exit} may be used in situations where one or more \acp{PE} have determined that the program has completed and/or should terminate early. Accordingly, the integer status argument can be used to - pass any information about the nature of the exit, e.g an encountered error - or a found solution. Since \FUNC{shmem\_global\_exit} is a non-collective + pass any information about the nature of the exit; e.g., that the program + encountered an error or a found solution. + Since \FUNC{shmem\_global\_exit} is a non-collective routine, there is no implied synchronization, and all \acp{PE} must terminate regardless of their current execution state. While I/O must be flushed for standard language I/O calls from \CorCppFor, it is - implementation dependent as to how I/O done by other means (e.g. third + implementation dependent as to how I/O done by other means (e.g., third party I/O libraries) is handled. Similarly, resources are released according to \CorCppFor standard language requirements, but this may not include all resources allocated for the \openshmem program. However, a diff --git a/content/shmem_init.tex b/content/shmem_init.tex index b1b83a763..b9ee5731d 100644 --- a/content/shmem_init.tex +++ b/content/shmem_init.tex @@ -34,7 +34,7 @@ \apinotes{ As of \openshmem[1.2], the use of \FUNC{start\_pes} has been - deprecated and is replaced with \FUNC{shmem\_init}. While support for + deprecated and calls to it should be replaced with calls to \FUNC{shmem\_init}. While support for \FUNC{start\_pes} is still required in \openshmem libraries, users are encouraged to use \FUNC{shmem\_init}. An important difference between \FUNC{shmem\_init} and \FUNC{start\_pes} is that multiple calls to diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index f89a99936..0b592e476 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -101,8 +101,8 @@ symmetric objects across all \acp{PE}. The \openshmem specification does not require that the virtual addresses are equal across all \acp{PE}. Nevertheless, the implementation must avoid costly address translation operations in the - communication path, including order $N$ (where $N$ is the number of \acp{PE}) - memory translation tables. In order to avoid address translations, the + communication path, including $O(N)$ memory translation tables, + where $N$ is the number of \acp{PE}. In order to avoid address translations, the implementation may re-map the allocated block of memory based on agreed virtual address. Additionally, some operating systems provide an option to disable virtual address randomization, which enables predictable allocation of virtual diff --git a/content/threads_intro.tex b/content/threads_intro.tex index 8060eaa9a..01c8b1fde 100644 --- a/content/threads_intro.tex +++ b/content/threads_intro.tex @@ -32,8 +32,8 @@ \item Any \openshmem operation initiated by a thread is considered an action of the \ac{PE} as a whole. The symmetric heap and symmetric variables scope are not -impacted by multiple threads invoking the \openshmem interfaces, i.e., -each \ac{PE} has a single symmetric data segment and symmetric heap that is shared by +impacted by multiple threads invoking the \openshmem interfaces. +Each \ac{PE} has a single symmetric data segment and symmetric heap that is shared by all threads within that \ac{PE}. For example, a thread invoking a memory allocation routine such as \FUNC{shmem\_malloc} allocates memory that is accessible by all threads of the \ac{PE}. The requirement that the same symmetric heap operations @@ -52,8 +52,8 @@ In addition, a blocked thread will not prevent the progress of \openshmem calls performed on other \acp{PE}. -\item In the \CONST{SHMEM\_THREAD\_MULTIPLE} thread level, all \openshmem calls are thread-safe, -i.e., two concurrently running threads may make \openshmem calls and the outcome +\item In the \CONST{SHMEM\_THREAD\_MULTIPLE} thread level, all \openshmem calls are thread-safe. +Any two concurrently running threads may make \openshmem calls and the outcome will be as if the calls executed in some order, even if their execution is interleaved. \item In the \CONST{SHMEM\_THREAD\_SERIALIZED} and \CONST{SHMEM\_THREAD\_MULTIPLE} thread levels, From d7dd1c35cf302710fc751b9e93cd40759a327595 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 09:59:34 -0400 Subject: [PATCH 446/583] section/management: Semantic clarifications - Clarify that ptr, size, and alignment arguments must all be equal across collective calls to memory management routines - "adjust" -> "specify" for the behavior of SHMEM_SYMMETRIC_SIZE - Remove Fortran-dependent behavioral text from shmem_pe_accessible for language-neutral behavioral description. --- content/shmem_malloc.tex | 6 +++--- content/shmem_pe_accessible.tex | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 0b592e476..8d53ec80c 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -62,8 +62,8 @@ the \FUNC{shmem\_free} and \FUNC{shmem\_realloc} routines. The user is also responsible for calling these routines with identical argument(s) on all - \acp{PE}; if differing \VAR{size} arguments are used, the behavior of the call - and any subsequent \openshmem calls becomes undefined. + \acp{PE}; if differing \VAR{ptr}, \VAR{size}, or \VAR{alignment} arguments are used, the behavior of the call + and any subsequent \openshmem calls is undefined. } \apireturnvalues{ @@ -88,7 +88,7 @@ remains unchanged from the deprecated versions. The total size of the symmetric heap is determined at job startup. One can - adjust the size of the heap using the \VAR{SHMEM\_SYMMETRIC\_SIZE} environment + specify the size of the heap using the \VAR{SHMEM\_SYMMETRIC\_SIZE} environment variable (where available). The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, and \FUNC{shmem\_realloc} routines diff --git a/content/shmem_pe_accessible.tex b/content/shmem_pe_accessible.tex index 2fb1a3b7a..c9ddd2f9a 100644 --- a/content/shmem_pe_accessible.tex +++ b/content/shmem_pe_accessible.tex @@ -23,11 +23,11 @@ \apidescription{ \FUNC{shmem\_pe\_accessible} is a query routine that indicates whether a specified \ac{PE} is accessible via \openshmem from the local \ac{PE}. The - \FUNC{shmem\_pe\_accessible} routine returns \CONST{TRUE} only if the remote + \FUNC{shmem\_pe\_accessible} routine returns a value indicating whether the remote \ac{PE} is a process running from the same executable file as the local - \ac{PE}, indicating that full \openshmem support for symmetric data objects - (that reside in the static memory and symmetric heap) is available, otherwise it - returns \CONST{FALSE}. This routine may be particularly useful for hybrid + \ac{PE}, thereby indicating whether full support for symmetric data objects, + which may reside in either static memory or the symmetric heap, is available. + This routine may be particularly useful for hybrid programming with other communication libraries (such as a \ac{MPI}) or parallel languages. For example, on SGI Altix series systems, \openshmem is supported across multiple partitioned hosts and InfiniBand connected hosts. From dede23a50f99997d56b2d5af64ce34792b8f9604 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 10:01:55 -0400 Subject: [PATCH 447/583] section/management: TOC spelling correction --- main_spec.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main_spec.tex b/main_spec.tex index 4792704e4..865ba17ef 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -110,7 +110,7 @@ \subsubsection{\textbf{SHPALLOC}}\label{subsec:shpalloc} \subsubsection{\textbf{SHPCLMOVE}}\label{subsec:shpclmove} \input{content/shpclmove.tex} -\subsubsection{\textbf{SHPDEALLOC}}\label{subsec:shpdealloc} +\subsubsection{\textbf{SHPDEALLC}}\label{subsec:shpdealloc} \input{content/shpdealloc.tex} From 6f3e4f71d6a57fd5c6a19176365bd7b93cd5cea9 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 10:49:53 -0400 Subject: [PATCH 448/583] section/rma-amo: Fix type introduced in RC1 --- content/shmem_iput.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index 1f71f238c..b86c2835f 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -24,7 +24,7 @@ \begin{Fsynopsis} INTEGER dst, sst, nelems, pe -nCALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) +CALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_DOUBLE_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_INTEGER_IPUT(dest, source, dst, sst, nelems, pe) CALL SHMEM_IPUT4(dest, source, dst, sst, nelems, pe) From 44ddd7d5611f990547b51488bb6bda227a409bfb Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:28:33 -0400 Subject: [PATCH 449/583] section/rma-amo: Fix argument intents This commit resolves https://github.com/openshmem-org/specification/issues/147 for the RMA/AMO section and takes the place of https://github.com/nspark/specification/pull/3 from @min-si. --- content/shmem_atomic_fetch_inc.tex | 2 +- content/shmem_atomic_inc.tex | 2 +- content/shmem_atomic_set.tex | 2 +- content/shmem_p.tex | 2 +- content/shmem_put.tex | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 6e6619893..12c10d1b5 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -32,7 +32,7 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} -\apiargument{IN}{dest}{The remotely accessible integer data object to be updated +\apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index a807f9e43..61065123b 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -29,7 +29,7 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} -\apiargument{IN}{dest}{The remotely accessible integer data object to be updated +\apiargument{OUT}{dest}{The remotely accessible integer data object to be updated on the remote \ac{PE}. The type of \dest{} should match that implied in the SYNOPSIS section.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 1e9e10c4d..2d0f62f5b 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -35,7 +35,7 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} -\apiargument{IN}{dest}{The remotely accessible data object to be set on +\apiargument{OUT}{dest}{The remotely accessible data object to be set on the remote \ac{PE}.} \apiargument{IN}{value}{The value to be atomically written to the remote \ac{PE}.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number on which diff --git a/content/shmem_p.tex b/content/shmem_p.tex index 40556a3b5..d5722ff84 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -20,7 +20,7 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} - \apiargument{IN}{dest}{The remotely accessible array element or scalar data object + \apiargument{OUT}{dest}{The remotely accessible array element or scalar data object which will receive the data on the remote \ac{PE}.} \apiargument{IN}{value}{The value to be transferred to \VAR{dest} on the remote \ac{PE}.} diff --git a/content/shmem_put.tex b/content/shmem_put.tex index 2f6d9efeb..5368b8c87 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -47,9 +47,9 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} - \apiargument{IN}{dest}{Data object to be updated on the remote \ac{PE}. This + \apiargument{OUT}{dest}{Data object to be updated on the remote \ac{PE}. This data object must be remotely accessible.} - \apiargument{OUT}{source}{Data object containing the data to be copied.} + \apiargument{IN}{source}{Data object containing the data to be copied.} \apiargument{IN}{nelems}{Number of elements in the \VAR{dest} and \VAR{source} arrays. \VAR{nelems} must be of type \VAR{size\_t} for \Cstd. When using \Fortran, it must be a constant, variable, or array element of default From 2217397a007c60ab8acb7c338ca92dc15a975ac8 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:36:12 -0400 Subject: [PATCH 450/583] section/rma-amo: "PEs" -> "\acp{PE}" --- content/shmem_ctx_destroy.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_ctx_destroy.tex b/content/shmem_ctx_destroy.tex index 1066fd4ed..3a882c2ef 100644 --- a/content/shmem_ctx_destroy.tex +++ b/content/shmem_ctx_destroy.tex @@ -50,8 +50,8 @@ \apicexample {The following example demonstrates the use of contexts in a single-threaded \Cstd[11] program that performs a summation reduction where - the data contained in the \VAR{in\_buf} arrays on all PEs is reduced into - the \VAR{out\_buf} arrays on all PEs. The buffers are divided into + the data contained in the \VAR{in\_buf} arrays on all \acp{PE} is reduced into + the \VAR{out\_buf} arrays on all \acp{PE}. The buffers are divided into segments and processing of the segments is pipelined. Contexts are used to overlap an all-to-all exchange of data for segment \VAR{p} with the local reduction of segment \VAR{p-1}.} From 2445b2ba950f11ba3c817ea313ac187c4b5e8824 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:40:53 -0400 Subject: [PATCH 451/583] section/rma-amo: Add highlighting for shmem_ctx_t in API listing --- utils/defs.tex | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 11e651162..9b57d6230 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -368,13 +368,15 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, + shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, + shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -382,7 +384,8 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, + shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -390,7 +393,8 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, + shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}} } {} From 98b4d72cb10608c0f7bbe5c8f12e55d1b6db5cc5 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:41:27 -0400 Subject: [PATCH 452/583] section/rma-amo: Clarify start of deprecation for Fortran SHMEM_PUT --- content/shmem_put.tex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/shmem_put.tex b/content/shmem_put.tex index 5368b8c87..9c0b62ef2 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -98,7 +98,8 @@ \apinotes{ When using \Fortran, data types must be of default size. For example, a real variable must be declared as \CONST{REAL}, \CONST{REAL*4}, or - \CONST{REAL(KIND=KIND(1.0))}. The Fortran API routine \FUNC{SHMEM\_PUT} has + \CONST{REAL(KIND=KIND(1.0))}. + As of \openshmem[1.2], the \Fortran API routine \FUNC{SHMEM\_PUT} has been deprecated, and either \FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64} should be used in its place. } From 1065b7d5170ce03b38886904f1f71901f51d29fb Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 12:12:35 -0400 Subject: [PATCH 453/583] section/collectives: "C11" -> "\Cstd[11]" --- content/shmem_barrier.tex | 2 +- content/shmem_barrier_all.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 68d145402..d866b7671 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -82,7 +82,7 @@ \begin{apiexamples} \apicexample - {The following barrier example is for C11 programs:} + {The following barrier example is for \Cstd[11] programs:} {./example_code/shmem_barrier_example.c} {} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 9ee9cf8c8..1744f69be 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -52,7 +52,7 @@ \begin{apiexamples} \apicexample - { The following \FUNC{shmem\_barrier\_all} example is for C11 programs:} + { The following \FUNC{shmem\_barrier\_all} example is for \Cstd[11] programs:} {./example_code/shmem_barrierall_example.c} {} From 47a7e92bddfcd3909ab7ee299b583b3c97630103 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 13:53:53 -0400 Subject: [PATCH 454/583] section/collectives: add shmem_sync[_all] to intro --- content/collective_intro.tex | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 4b883843c..8f788b6e9 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -3,8 +3,8 @@ routines require all \acp{PE} in the active set to simultaneously call the routine. A \ac{PE} that is not in the active set calling the collective routine results in undefined behavior. All collective routines have an -active set as an input parameter except \FUNC{shmem\_barrier\_all}; -\FUNC{shmem\_barrier\_all} must be called by all \acp{PE} of the +active set as an input parameter except \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all}. +Both \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all} must be called by all \acp{PE} of the \openshmem program. The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, @@ -21,7 +21,7 @@ array if all previous collective routines using the \VAR{pSync} array have been completed by all participating \acp{PE}. One can use a synchronization collective routine such as \FUNC{shmem\_barrier} to ensure completion of previous collective -routines. The \FUNC{shmem\_barrier} routine allows the same \VAR{pSync} array to +routines. The \FUNC{shmem\_barrier} and \FUNC{shmem\_sync} routines allow the same \VAR{pSync} array to be used on consecutive calls as long as the \acp{PE} in the active set do not change. All collective routines defined in the specification are blocking. The @@ -31,6 +31,8 @@ \begin{itemize} \item \FUNC{shmem\_barrier\_all} \item \FUNC{shmem\_barrier} +\item \FUNC{shmem\_sync\_all} +\item \FUNC{shmem\_sync} \item \FUNC{shmem\_broadcast\{32, 64\}} \item \FUNC{shmem\_collect\{32, 64\}} \item \FUNC{shmem\_fcollect\{32, 64\}} From 25a3f3ad6ea0fc26112ee2bbc5ef1fc20e686fb7 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 13:56:38 -0400 Subject: [PATCH 455/583] section/collectives: "active PE set" -> "active set" --- content/shmem_barrier.tex | 2 +- content/shmem_sync.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index d866b7671..7cac89bee 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -54,7 +54,7 @@ \acp{PE} in the active set on the default context are complete before returning. The same \VAR{pSync} array may be reused on consecutive calls to - \FUNC{shmem\_barrier} if the same active \ac{PE} set is used. + \FUNC{shmem\_barrier} if the same active set is used. } \apireturnvalues{ diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index 2bee1247f..8917bd7c4 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -45,7 +45,7 @@ completion of remote memory updates issued via \openshmem routines. The same \VAR{pSync} array may be reused on consecutive calls to - \FUNC{shmem\_sync} if the same active \ac{PE} set is used. + \FUNC{shmem\_sync} if the same active set is used. } \apireturnvalues{ From 53bc3d233b435040a9b4337514023852c4788177 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 13:58:34 -0400 Subject: [PATCH 456/583] section/collectives: normalize language on undefined behavior --- content/shmem_alltoall.tex | 4 ++-- content/shmem_barrier.tex | 2 +- content/shmem_sync.tex | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index 368ca793a..baba24c3e 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -65,8 +65,8 @@ As with all \openshmem collective routines, this routine assumes that only \acp{PE} in the active set call the routine. If a \ac{PE} not - in the active set calls an \openshmem collective routine, undefined - behavior results. + in the active set calls an \openshmem collective routine, + the behavior is undefined. The values of arguments \VAR{nelems}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 7cac89bee..14ae6f809 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -43,7 +43,7 @@ As with all \openshmem collective routines, each of these routines assumes that only \acp{PE} in the active set call the routine. If a \ac{PE} not in the - active set calls an \openshmem collective routine, undefined behavior results. + active set calls an \openshmem collective routine, the behavior is undefined. The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be the same value on all \acp{PE} in the active set. The same work array must be diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index 8917bd7c4..eb3bf24f1 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -33,8 +33,7 @@ As with all \openshmem collective routines, each of these routines assumes that only \acp{PE} in the active set call the routine. If a \ac{PE} not in - the active set calls an \openshmem collective routine, undefined behavior - results. + the active set calls an \openshmem collective routine, the behavior is undefined. The values of arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same From d002b77eb037d4b3ddd050d008ab51869bb78e56 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 13:59:19 -0400 Subject: [PATCH 457/583] section/collectives: Example is C11 not C/C++ --- content/shmem_sync.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index eb3bf24f1..97cc8c195 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -71,7 +71,7 @@ \apicexample {The following \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} example is - for \CorCpp programs:} + for \Cstd[11] programs:} {./example_code/shmem_sync_example.c} {} From 0253262e32d2601088bc1646957cfc8f05cdbab6 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:05:54 -0400 Subject: [PATCH 458/583] section/collectives: normalize language on undefined behavior (round 2) --- content/shmem_broadcast.tex | 2 +- content/shmem_reductions.tex | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index a6f53a138..ccdf3990a 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -59,7 +59,7 @@ As with all \openshmem collective routines, each of these routines assumes that only \acp{PE} in the active set call the routine. If a \ac{PE} not in the - active set calls an \openshmem collective routine, undefined behavior results. + active set calls an \openshmem collective routine, the behavior is undefined. The values of arguments \VAR{PE\_root}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be the same value on all \acp{PE} in the active set. The same diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 58216c849..bb6262520 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -188,8 +188,7 @@ As with all \openshmem collective routines, each of these routines assumes that only \acp{PE} in the active set call the routine. If a \ac{PE} not in - the active set calls an \openshmem collective routine, undefined behavior - results. + the active set calls an \openshmem collective routine, the behavior is undefined. The values of arguments \VAR{nreduce}, \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same \dest{} From 46b7954324769e1571da669b42fe6f513c72bfd4 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:06:50 -0400 Subject: [PATCH 459/583] section/collectives: "EXCLUSIVE OR" -> "exclusive OR (XOR)", like AMOs --- content/shmem_reductions.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index bb6262520..7b544f36e 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -123,7 +123,7 @@ \end{Fsynopsis} \paragraph{XOR} -Performs a bitwise EXCLUSIVE OR reduction across a set of \acp{PE}.\newline +Performs a bitwise exclusive OR (XOR) reduction across a set of \acp{PE}.\newline \begin{Csynopsis} void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_xor_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); From 7e6d3b54c6c16e44407f5e8ad4fa25468f05d1a9 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:08:27 -0400 Subject: [PATCH 460/583] section/collectives: Simplify API argument descriptions Back when C and Fortran has constants with different prefixes (i.e., _SHMEM_* and SHMEM_*) the argument descriptions called out the constants separately for each language. After these prefixes were normalized to SHMEM_*, the C-specific names were updated, but the redundancy was left in place. This commit consolidates the argument descriptions to only refer to C and Fortran separately in cases where they are truly distinct. --- content/shmem_alltoall.tex | 14 +++++++------- content/shmem_alltoalls.tex | 14 +++++++------- content/shmem_barrier.tex | 9 +++++---- content/shmem_broadcast.tex | 12 ++++++------ content/shmem_collect.tex | 14 +++++++------- content/shmem_reductions.tex | 21 ++++++++++----------- content/shmem_sync.tex | 2 +- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index baba24c3e..fb9172395 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -37,13 +37,13 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be - of type long and size \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE}. In \Fortran, - \VAR{pSync} must be of type integer and size - \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE}. When using \Fortran, it must be a - default integer value. Every element of this array must be initialized with - the value \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the - active set enter the routine.} +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_ALLTOALL\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. + Every element of this array must be initialized with the value + \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set + enter the routine.} \end{apiarguments} diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index 97506fd9a..2446130b6 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -48,13 +48,13 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be - of type long and size \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE}. In \Fortran, - \VAR{pSync} must be of type integer and size - \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE}. When using \Fortran, it must be a - default integer value. Every element of this array must be initialized with - the value \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the - active set enter the routine.} +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_ALLTOALLS\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. + Every element of this array must be initialized with the value + \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set + enter the routine.} \end{apiarguments} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index 14ae6f809..dd5912def 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -26,10 +26,11 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must - be of type long and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. In \Fortran, - \VAR{pSync} must be of type integer and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. - When using \Fortran, it must be a default integer type. Every element +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. + Every element of this array must be initialized to \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set enter \FUNC{shmem\_barrier} the first time.} diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index ccdf3990a..1edd1ed35 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -40,13 +40,13 @@ \apiargument{IN}{PE\_size}{ The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pSync}{ A symmetric work array. In \CorCpp, \VAR{pSync} must - be of type long and size \CONST{SHMEM\_BCAST\_SYNC\_SIZE}. In \Fortran, - \VAR{pSync} must be of type integer and size \CONST{SHMEM\_BCAST\_SYNC\_SIZE}. +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_BCAST\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. Every element of this array must be initialized with the value - \CONST{SHMEM\_SYNC\_VALUE} (in \CorCpp) or \CONST{SHMEM\_SYNC\_VALUE} (in - \Fortran) before any of the \acp{PE} in the active set enter - \FUNC{shmem\_broadcast}.} + \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set + enters \FUNC{shmem\_broadcast}.} \end{apiarguments} diff --git a/content/shmem_collect.tex b/content/shmem_collect.tex index 3775b9579..3ab27e2ae 100644 --- a/content/shmem_collect.tex +++ b/content/shmem_collect.tex @@ -51,13 +51,13 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be of - type long and size \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}. In \Fortran, - \VAR{pSync} must be of type integer and size \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}. - When using \Fortran, it must be a default integer value. Every element of - this array must be initialized with the value \CONST{SHMEM\_SYNC\_VALUE} in - \CorCpp{} or \CONST{SHMEM\_SYNC\_VALUE} in \Fortran before any of the \acp{PE} - in the active set enter \FUNC{shmem\_collect} or \FUNC{shmem\_fcollect}.} +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_COLLECT\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. + Every element of this array must be initialized with the value + \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set + enter \FUNC{shmem\_collect} or \FUNC{shmem\_fcollect}.} \end{apiarguments} diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 7b544f36e..b5310730d 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -157,18 +157,17 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer. When using \Fortran, it must be a default integer value.} -\apiargument{IN}{pWrk}{A symmetric work array. The \VAR{pWrk} argument must have the - same data type as \dest. In \CorCpp, this contains max(\VAR{nreduce}/2 + 1, - \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}) elements. In \Fortran, this - contains max(\VAR{nreduce}/2 + 1, \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}) +\apiargument{IN}{pWrk}{ + A symmetric work array of size at least + max(\VAR{nreduce}/2 + 1, \CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}) elements.} -\apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be of - type long and size \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}. In \Fortran, \VAR{pSync} - must be of type integer and size \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}. When - using \Fortran, it must be a default integer value. Every element of this array - must be initialized with the value \CONST{SHMEM\_SYNC\_VALUE} (in \CorCpp) or - \CONST{SHMEM\_SYNC\_VALUE} (in \Fortran) before any of the \acp{PE} in the - active set enter the reduction routine.} +\apiargument{IN}{pSync}{ + A symmetric work array of size \CONST{SHMEM\_REDUCE\_SYNC\_SIZE}. + In \CorCpp, \VAR{pSync} must be an array of elements of type \CTYPE{long}. + In \Fortran, \VAR{pSync} must be an array of elements of default integer type. + Every element of this array must be initialized with the value + \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set + enter the reduction routine.} \end{apiarguments} diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index 97cc8c195..ccd58d36d 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -19,7 +19,7 @@ \apiargument{IN}{PE\_size}{The number of \acp{PE} in the active set. \VAR{PE\_size} must be of type integer.} \apiargument{IN}{pSync}{A symmetric work array. In \CorCpp, \VAR{pSync} must be - of type long and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. Every element of + of type \CTYPE{long} and size \CONST{SHMEM\_BARRIER\_SYNC\_SIZE}. Every element of this array must be initialized to \CONST{SHMEM\_SYNC\_VALUE} before any of the \acp{PE} in the active set enter \FUNC{shmem\_sync} the first time.} From 109f7b0f74088a4deb32d862c505eba2cda20247 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:11:56 -0400 Subject: [PATCH 461/583] section/collectives: Revise API note for clarity --- content/shmem_barrier.tex | 6 +++--- content/shmem_sync.tex | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index dd5912def..e875122d3 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -63,9 +63,9 @@ } \apinotes{ - If the \VAR{pSync} array is initialized at run time, be sure to use some type of - synchronization, for example, a call to \FUNC{shmem\_barrier\_all}, before - calling \FUNC{shmem\_barrier} for the first time. + If the \VAR{pSync} array is initialized at run time, another method of + synchronization (e.g., \FUNC{shmem\_barrier\_all}) must be used before + the initial use of that \VAR{pSync} array by \FUNC{shmem\_barrier}. If the active set does not change, \FUNC{shmem\_barrier} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index ccd58d36d..fa55ca515 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -52,9 +52,9 @@ } \apinotes{ - If the \VAR{pSync} array is initialized at run time, be sure to use some type of - synchronization, for example, a call to \FUNC{shmem\_sync\_all}, before - calling \FUNC{shmem\_sync} for the first time. + If the \VAR{pSync} array is initialized at run time, another method of + synchronization (e.g., \FUNC{shmem\_sync\_all}) must be used before + the initial use of that \VAR{pSync} array by \FUNC{shmem\_sync}. If the active set does not change, \FUNC{shmem\_sync} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization From f94471726c8209fe6aa39b590d7ea77cb849b245 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:12:48 -0400 Subject: [PATCH 462/583] section/collectives: Revise complex type clarification on reductions --- content/shmem_reductions.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index b5310730d..264dfcce5 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -206,8 +206,8 @@ The values in the \VAR{pSync} array are restored to the original values. - The sum and product reduction routines include complex-typed - interfaces for the \Cstd API only. When the \Cstd translation + The complex-typed interfaces are only provided for sum and product + reductions. When the \Cstd translation environment does not support complex types\footnote{That is, under \Cstd language standards prior to \Cstd[99] or under \Cstd[11] when \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, an \openshmem From 68370efedd19ef6c9be11516dc0dcab55f29769a Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:13:42 -0400 Subject: [PATCH 463/583] section/collectives: Improve the formatting of entry conditions for collectives --- content/shmem_alltoall.tex | 16 +++++++++------- content/shmem_alltoalls.tex | 20 +++++++++++--------- content/shmem_broadcast.tex | 26 +++++++++++++++++--------- content/shmem_reductions.tex | 18 +++++++++++------- 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index fb9172395..2b179e305 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -73,13 +73,15 @@ \VAR{dest} and \VAR{source} data objects, and the same \VAR{pSync} work array must be passed to all \acp{PE} in the active set. - Before any \ac{PE} calls a \FUNC{shmem\_alltoall} routine, the following - conditions must exist (synchronization via a barrier or some other method is - often needed to ensure this): The \VAR{pSync} array on all \acp{PE} in the - active set is not still in use from a prior call to a - \FUNC{shmem\_alltoall/s} routine. The \VAR{dest} data object on - all \acp{PE} in the active set is ready to accept the - \FUNC{shmem\_alltoall} data. + Before any \ac{PE} calls a \FUNC{shmem\_alltoall} routine, + the following conditions must be ensured: + \begin{itemize} + \item The \VAR{pSync} array on all \acp{PE} in the active set is not + still in use from a prior call to a \FUNC{shmem\_alltoall} routine. + \item The \VAR{dest} data object on all \acp{PE} in the active set is + ready to accept the \FUNC{shmem\_alltoall} data. + \end{itemize} + Otherwise, the behavior is undefined. Upon return from a \FUNC{shmem\_alltoall} routine, the following is true for the local PE: Its \VAR{dest} symmetric data object is completely updated and diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index 2446130b6..f1559d094 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -79,15 +79,17 @@ \VAR{logPE\_stride}, and \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same \VAR{dest} and \VAR{source} data objects, and the same \VAR{pSync} work array must be passed to all \acp{PE} in the active set. - - Before any \ac{PE} calls to a \FUNC{shmem\_alltoalls} routine, the following - conditions must exist (synchronization via a barrier or some other method is - often needed to ensure this): The \VAR{pSync} array on all \acp{PE} in the - active set is not still in use from a prior call to a - \FUNC{shmem\_alltoalls} routine. The \VAR{dest} data object on - all \acp{PE} in the active set is ready to accept the - \FUNC{shmem\_alltoalls} data. - + + Before any \ac{PE} calls a \FUNC{shmem\_alltoalls} routine, + the following conditions must be ensured: + \begin{itemize} + \item The \VAR{pSync} array on all \acp{PE} in the active set is not + still in use from a prior call to a \FUNC{shmem\_alltoall} routine. + \item The \VAR{dest} data object on all \acp{PE} in the active set is + ready to accept the \FUNC{shmem\_alltoalls} data. + \end{itemize} + Otherwise, the behavior is undefined. + Upon return from a \FUNC{shmem\_alltoalls} routine, the following is true for the local PE: Its \VAR{dest} symmetric data object is completely updated and the data has been copied out of the \VAR{source} data object. diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index 1edd1ed35..a7a2ca08e 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -66,17 +66,25 @@ \dest{} and \source{} data objects and the same \VAR{pSync} work array must be passed by all \acp{PE} in the active set. - Before any \ac{PE} calls a broadcast routine, the following - conditions must be met: (synchronization via a barrier or some other method is often - needed to ensure this): The \VAR{pSync} array on all \acp{PE} in the - active set is not still in use from a prior call to a broadcast routine. The - \dest{} array on all \acp{PE} in the active set is ready to accept the - broadcast data. + Before any \ac{PE} calls a broadcast routine, + the following conditions must be ensured: + \begin{itemize} + \item The \VAR{pSync} array on all \acp{PE} in the active set is + not still in use from a prior call to a broadcast routine. + \item The \dest{} array on all \acp{PE} in the active set is ready + to accept the broadcast data. + \end{itemize} + Otherwise, the behavior is undefined. Upon return from a broadcast routine, the following are true for the local - \ac{PE}: If the current \ac{PE} is not the root \ac{PE}, the \dest{} data object - is updated. The \source{} data object may be safely reused. - The values in the \VAR{pSync} array are restored to the original values. + \ac{PE}: + \begin{itemize} + \item If the current \ac{PE} is not the root \ac{PE}, + the \dest{} data object is updated. + \item The \source{} data object may be safely reused. + \item The values in the \VAR{pSync} array are restored to the + original values. + \end{itemize} } \apidesctable{ diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 264dfcce5..53df3ee43 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -193,13 +193,17 @@ \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same \dest{} and \source{} arrays, and the same \VAR{pWrk} and \VAR{pSync} work arrays, must be passed to all \acp{PE} in the active set. - %FIXME: Reword 'the following conditions must be met.' - Before any \ac{PE} calls a reduction routine, the - following conditions must be met (synchronization via a \OPR{barrier} or some other - method is often needed to ensure this): The \VAR{pWrk} and \VAR{pSync} arrays - on all \acp{PE} in the active set are not still in use from a prior call to a - collective \openshmem routine. The \dest{} array on all \acp{PE} in the - active set is ready to accept the results of the \OPR{reduction}. + + Before any \ac{PE} calls a reduction routine, + the following conditions must be ensured: + \begin{itemize} + \item The \VAR{pWrk} and \VAR{pSync} arrays on all \acp{PE} in the + active set are not still in use from a prior call to a collective + \openshmem routine. + \item The \dest{} array on all \acp{PE} in the active set is ready + to accept the results of the \OPR{reduction}. + \end{itemize} + Otherwise, the behavior is undefined. Upon return from a reduction routine, the following are true for the local \ac{PE}: The \dest{} array is updated and the \source{} array may be safely reused. From ae5952c541215421d489bee9dd3c11a99b6ad1e1 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:29:42 -0400 Subject: [PATCH 464/583] section/front: Improve odd use of "e.g." --- content/language_bindings_and_conformance.tex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/language_bindings_and_conformance.tex b/content/language_bindings_and_conformance.tex index 18817ec4b..f1f9f29c5 100644 --- a/content/language_bindings_and_conformance.tex +++ b/content/language_bindings_and_conformance.tex @@ -4,7 +4,9 @@ future \Fortran use of \openshmem, see Section~\ref{subsec:deprecate-fortran}. Any implementation that provides both \Cstd and \Fortran bindings can claim -conformance to the specification. An implementation that provides e.g.\ only a +conformance to the specification. Alternatively, an implementation may claim +conformance only with respect to one of those languages. For example, +an implementation that provides only a \Cstd interface may claim to conform to the \openshmem specification with respect to the \Cstd language, but not to \Fortran, and should make this clear in its documentation. The \openshmem header files \HEADER{shmem.h} for From f92ea575c9f0962f41664a1691e3cf1041f99626 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:32:23 -0400 Subject: [PATCH 465/583] section/front: Move "Atomicity Guarantees" to "Memory Model" section --- content/execution_model.tex | 16 ---------------- content/memory_model.tex | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/content/execution_model.tex b/content/execution_model.tex index 0f3bbed9c..42be0aa10 100644 --- a/content/execution_model.tex +++ b/content/execution_model.tex @@ -52,19 +52,3 @@ \subsection{Progress of \openshmem Operations}\label{subsec:progress} provide asynchronous one-sided operations, as these have very limited performance value for \openshmem programs. \end{itemize} - -\subsection{Atomicity Guarantees}\label{subsec:amo_guarantees} - -\openshmem contains a number of routines that operate on symmetric data -atomically (Section \ref{sec:amo}). These routines guarantee that accesses by -\openshmem's atomic operations with the same datatype will be exclusive, but do not guarantee -exclusivity in combination with other routines, either inside \openshmem or -outside. - -For example: during the execution of an atomic remote integer increment -operation on a symmetric variable \VAR{X}, no other \openshmem atomic operation -may access \VAR{X}. After the increment, \VAR{X} will have increased its value -by \CONST{1} on the destination \ac{PE}, at which point other atomic operations -may then modify that \VAR{X}. However, access to the symmetric object \VAR{X} -with non-atomic operations, such as one-sided \OPR{put} or \OPR{get} operations, -will \OPR{invalidate} the atomicity guarantees. diff --git a/content/memory_model.tex b/content/memory_model.tex index 3efd38a67..a8b0b42da 100644 --- a/content/memory_model.tex +++ b/content/memory_model.tex @@ -51,3 +51,19 @@ objects and private data objects when executing an \openshmem program. Symmetric data objects are stored on the symmetric heap or in the global/static memory section of each \ac{PE}. + +\subsection{Atomicity Guarantees}\label{subsec:amo_guarantees} + +\openshmem contains a number of routines that operate on symmetric data +atomically (Section \ref{sec:amo}). These routines guarantee that accesses by +\openshmem's atomic operations with the same datatype will be exclusive, but do not guarantee +exclusivity in combination with other routines, either inside \openshmem or +outside. + +For example: during the execution of an atomic remote integer increment +operation on a symmetric variable \VAR{X}, no other \openshmem atomic operation +may access \VAR{X}. After the increment, \VAR{X} will have increased its value +by \CONST{1} on the destination \ac{PE}, at which point other atomic operations +may then modify that \VAR{X}. However, access to the symmetric object \VAR{X} +with non-atomic operations, such as one-sided \OPR{put} or \OPR{get} operations, +will \OPR{invalidate} the atomicity guarantees. From 08be1acbfacf0469a9b570d859f659d1d216c096 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:33:34 -0400 Subject: [PATCH 466/583] section/front: Remove odd formatting --- content/memory_model.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/memory_model.tex b/content/memory_model.tex index a8b0b42da..6dae1efb6 100644 --- a/content/memory_model.tex +++ b/content/memory_model.tex @@ -66,4 +66,4 @@ \subsection{Atomicity Guarantees}\label{subsec:amo_guarantees} by \CONST{1} on the destination \ac{PE}, at which point other atomic operations may then modify that \VAR{X}. However, access to the symmetric object \VAR{X} with non-atomic operations, such as one-sided \OPR{put} or \OPR{get} operations, -will \OPR{invalidate} the atomicity guarantees. +will invalidate the atomicity guarantees. From 136f75d021cc4d6f721af90db2b75e4b7750a465 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:49:19 -0400 Subject: [PATCH 467/583] section/front: Improve macro use in Programming Model Overview This commit comes from https://github.com/openshmem-org/specification/issues/149 and replaces the use of \textit with appropriate use of \VAR or \emph. This also uses the DeprecateBlock environment for the Data Cache Control section for consistency with the deprecation markings in the rest of the specification. --- content/programming_model_overview.tex | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/content/programming_model_overview.tex b/content/programming_model_overview.tex index 1106a623b..c52edc1a6 100644 --- a/content/programming_model_overview.tex +++ b/content/programming_model_overview.tex @@ -4,7 +4,7 @@ allows communication and synchronization operations on both private (local to the PE initiating the operation) and remotely accessible data objects. The key feature of \openshmem is that data transfer operations are -\textit{\textbf{one-sided}} in nature. This means that a local \ac{PE} executing +\emph{one-sided} in nature. This means that a local \ac{PE} executing a data transfer routine does not require the participation of the remote \ac{PE} to complete the routine. This allows for overlap between communication and computation to hide data transfer latencies, which makes \openshmem ideal for @@ -105,7 +105,7 @@ \item \textbf{Collective Communication} \begin{enumerate} - \item \OPR{Broadcast}: The \textit{root} \ac{PE} specifies a symmetric data + \item \OPR{Broadcast}: The \VAR{root} \ac{PE} specifies a symmetric data object to be copied to a symmetric data object on one or more remote \acp{PE} (not including itself). \item \OPR{Collection}: All \acp{PE} participating in the routine get the result @@ -119,16 +119,19 @@ \item \textbf{Mutual Exclusion} \begin{enumerate} \item \OPR{Set Lock}: The \ac{PE} acquires exclusive access to the region - bounded by the symmetric \textit{lock} variable. - \item \OPR{Test Lock}: The \ac{PE} tests the symmetric \textit{lock} variable + bounded by the symmetric \VAR{lock} variable. + \item \OPR{Test Lock}: The \ac{PE} tests the symmetric \VAR{lock} variable for availability. \item \OPR{Clear Lock}: The \ac{PE} which has previously acquired the - \textit{lock} releases it. + \VAR{lock} releases it. \end{enumerate} -\item \textbf{Data Cache Control \textit{(deprecated)}} +\begin{DeprecateBlock} +\item \textbf{Data Cache Control} \begin{enumerate} \item Implementation of mechanisms to exploit the capabilities of hardware cache if available. \end{enumerate} +\end{DeprecateBlock} + \end{enumerate} From a3d8e8b2f329f693faced6255791077280b2c9af Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 14:55:21 -0400 Subject: [PATCH 468/583] section/front: Update the Programming Model Overview This commit adds the bitwise AMOs (from 1.4) and all-to-all collectives (from 1.3) to the Programming Model Overview. --- content/programming_model_overview.tex | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/content/programming_model_overview.tex b/content/programming_model_overview.tex index c52edc1a6..9ddfdb48b 100644 --- a/content/programming_model_overview.tex +++ b/content/programming_model_overview.tex @@ -79,6 +79,9 @@ symmetric data object on the remote \ac{PE}. \item \OPR{Add}: The \ac{PE} initiating the add specifies the value to be added to the symmetric data object on the remote \ac{PE}. + \item \OPR{Bitwise Operations}: The \ac{PE} initiating the bitwise + operation specifies the operand value to the bitwise operation to be + performed on the symmetric data object on the remote \ac{PE}. \item \OPR{Compare and Swap}: The \ac{PE} initiating the swap gets the old value of the symmetric data object based on a value to be compared and copies a new value to the symmetric data object on the remote \ac{PE}. @@ -88,6 +91,10 @@ \item \OPR{Fetch and Add}: The \ac{PE} initiating the add specifies the value to be added to the symmetric data object on the remote \ac{PE} and returns with the old value. + \item \OPR{Fetch and Bitwise Operations}: The \ac{PE} initiating the bitwise + operation specifies the operand value to the bitwise operation to be + performed on the symmetric data object on the remote \ac{PE} + and returns the old value. \end{enumerate} \item \textbf{Synchronization and Ordering} @@ -113,7 +120,10 @@ another symmetric data object. \item \OPR{Reduction}: All \acp{PE} participating in the routine get the result of an associative binary routine over elements of the specified symmetric - data object on another symmetric data object. + data object on another symmetric data object. + \item \OPR{All-to-All}: All \acp{PE} participating in the routine exchange + a fixed amount of contiguous or strided data with all other \acp{PE} + in the active set. \end{enumerate} \item \textbf{Mutual Exclusion} From ff7d9c6430b998e5fca977d81805e6313f1bfcea Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:02:42 -0400 Subject: [PATCH 469/583] section/front: "OpenSHMEM standard" -> "OpenSHMEM Specification" See https://github.com/openshmem-org/specification/issues/170 --- content/library_constants.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 6a450ac56..6bc198ae6 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -147,7 +147,7 @@ \LibConstDecl[\CorCpp]{\_SHMEM\_MAJOR\_VERSION} \end{DeprecateBlock} & -Integer representing the major version of \openshmem standard in use. +Integer representing the major version of \openshmem Specification in use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_MINOR\_VERSION} @@ -155,7 +155,7 @@ \LibConstDecl[\CorCpp]{\_SHMEM\_MINOR\_VERSION} \end{DeprecateBlock} & -Integer representing the minor version of \openshmem standard in use. +Integer representing the minor version of \openshmem Specification in use. \tabularnewline \hline %% \LibConstDecl{SHMEM\_MAX\_NAME\_LEN} From 03244f025f911944e4b2bba4137a7f9eef92e8aa Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:05:36 -0400 Subject: [PATCH 470/583] section/rma-amo: \textit -> \emph See https://github.com/openshmem-org/specification/issues/149 --- content/atomics_intro.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 86005e1b3..786898c1f 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -7,7 +7,7 @@ \begin{itemize} \item - The \textit{fetching} routines return the original value of, and optionally + The \emph{fetching} routines return the original value of, and optionally update, the remote data object in a single atomic operation. The routines return after the data has been fetched from the target \ac{PE} and delivered to the calling \ac{PE}. @@ -19,7 +19,7 @@ \FUNC{shmem\_atomic\_fetch\_\{inc, add, and, or, xor\}}. \item - The \textit{non-fetching} routines update the remote data object in a single + The \emph{non-fetching} routines update the remote data object in a single atomic operation. A call to a non-fetching atomic routine issues the atomic operation and may return before the operation executes on the target \ac{PE}. The \FUNC{shmem\_quiet}, \FUNC{shmem\_barrier}, or \FUNC{shmem\_barrier\_all} From 85c9a51b6370cd9939f71c45ea2f473af974dd5b Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:27:59 -0400 Subject: [PATCH 471/583] section/sync: Use LaTeX macros where appropriate --- content/p2p_sync_intro.tex | 2 +- content/shmem_fence.tex | 2 +- content/shmem_quiet.tex | 2 +- content/shmem_wait.tex | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 3ac8b7239..e468b449e 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -47,7 +47,7 @@ \CTYPE{shmem\_cmp\_t}, whose enumerators specify the comparison operators used by synchronization routines that take a \CTYPE{shmem\_cmp\_t} argument. The enumerators of \CTYPE{shmem\_cmp\_t} and their associated operations are -presented in Table~\ref{p2p-consts}. For Fortran, the constant names of +presented in Table~\ref{p2p-consts}. For \Fortran, the constant names of Table~\ref{p2p-consts} shall be identifiers for integer parameters of default kind corresponding to the associated comparison operation. diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 7b37117fe..d380cdda2 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -65,7 +65,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_fence} in a C11 program: } + {The following example uses \FUNC{shmem\_fence} in a \Cstd[11] program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index ecbcdb011..4f6fe164d 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -76,7 +76,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_quiet} in a C11 program: } + {The following example uses \FUNC{shmem\_quiet} in a \Cstd[11] program: } {./example_code/shmem_quiet_example.c} {\VAR{Put1} and \VAR{put2} will be completed and visible before \VAR{put3} and \VAR{put4}.} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..8bbfe3c0d 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -80,7 +80,7 @@ \apinotes{ As of \openshmem[1.4], the \FUNC{shmem\_wait} routine is deprecated, however, \FUNC{shmem\_wait} is equivalent to \FUNC{shmem\_wait\_until} - where \VAR{cmp} is SHMEM\_CMP\_NE. + where \VAR{cmp} is \CONST{SHMEM\_CMP\_NE}. } \apiimpnotes{ From 506f8f16e06ff76edb25c5cb85fba34a0e38bc3c Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:28:28 -0400 Subject: [PATCH 472/583] section/sync: Update context wording for consistency with RMA/AMO --- content/shmem_fence.tex | 3 ++- content/shmem_quiet.tex | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index d380cdda2..e9ea4e887 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -16,7 +16,8 @@ \begin{apiarguments} \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 4f6fe164d..16fa7df14 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -17,7 +17,8 @@ \begin{apiarguments} \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ From 8a6545c569f9688de314d2ab7d0023c183e16b7b Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:29:07 -0400 Subject: [PATCH 473/583] section/sync: Fix a couple instances of comma over-use --- content/shmem_wait.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 8bbfe3c0d..dca6e4d70 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -53,14 +53,14 @@ \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} wait for \VAR{ivar} to be changed by a write or an atomic operation issued by a \ac{PE}. These routines can be used for point-to-point direct synchronization. A call - to \FUNC{shmem\_wait} does not return until a \ac{PE} writes a value, - not equal to \VAR{cmp\_value}, into \VAR{ivar} on the waiting \ac{PE}. A call + to \FUNC{shmem\_wait} does not return until a \ac{PE} writes a value + not equal to \VAR{cmp\_value} into \VAR{ivar} on the waiting \ac{PE}. A call to \FUNC{shmem\_wait\_until} does not return until a \ac{PE} changes \VAR{ivar} to satisfy the condition implied by \VAR{cmp} and \VAR{cmp\_value}. The \FUNC{shmem\_wait} routines return when \VAR{ivar} is no longer equal to \VAR{cmp\_value}. The \FUNC{shmem\_wait\_until} routines return when the compare condition is true. The compare condition is defined by the \VAR{ivar} argument compared with the - \VAR{cmp\_value} using the comparison operator, \VAR{cmp}. + \VAR{cmp\_value} using the comparison operator \VAR{cmp}. } From fbe951dbaa24971a543ed3bdd8fc8d965613954f Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:52:44 -0400 Subject: [PATCH 474/583] section/sync: Fix deprecation styling on shmem_cache --- content/shmem_cache.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_cache.tex b/content/shmem_cache.tex index b3a53eab0..eab9dbd35 100644 --- a/content/shmem_cache.tex +++ b/content/shmem_cache.tex @@ -15,7 +15,8 @@ \end{Csynopsis} \end{DeprecateBlock} -\begin{DeprecateBlock} +% N.B., The DeprecateBlock environment is not necessary here +% because the entire Fortran API is deprecated. \begin{Fsynopsis} CALL SHMEM_CLEAR_CACHE_INV CALL SHMEM_SET_CACHE_INV @@ -23,7 +24,6 @@ CALL SHMEM_UDCFLUSH CALL SHMEM_UDCFLUSH_LINE(dest) \end{Fsynopsis} -\end{DeprecateBlock} \begin{apiarguments} From a740bdc191510521ad704d33f3ded63fdc27ea63 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Fri, 6 Oct 2017 15:30:33 -0400 Subject: [PATCH 475/583] Replace "OpenSHMEM Standard" with "OpenSHMEM Specification" Signed-off-by: James Dinan --- content/shmem_info_get_version.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index af9da605f..49329cd09 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -14,12 +14,12 @@ \end{Fsynopsis} \begin{apiarguments} - \apiargument{OUT}{major}{The major version of the \openshmem standard in use.} - \apiargument{OUT}{minor}{The minor version of the \openshmem standard in use.} + \apiargument{OUT}{major}{The major version of the \openshmem Specification in use.} + \apiargument{OUT}{minor}{The minor version of the \openshmem Specification in use.} \end{apiarguments} \apidescription{ - This routine returns the major and minor version of the \openshmem standard + This routine returns the major and minor version of the \openshmem Specification in use. For a given library implementation, the major and minor version returned by these calls are consistent with the library constants \CONST{SHMEM\_MAJOR\_VERSION} and \CONST{SHMEM\_MINOR\_VERSION}. From a3f634e48f2eac20c7658d3ac4088d980a03a679 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Mon, 9 Oct 2017 13:07:22 -0400 Subject: [PATCH 476/583] Removing commented text --- content/shmem_reductions.tex | 3 +-- utils/defs.tex | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 58216c849..751e5b731 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -1,5 +1,4 @@ \apisummary{ - %Performs arithmetic and logical operations across a set of \acp{PE}. The following functions perform reduction operations across all \acp{PE} in a set of \acp{PE}. } @@ -195,7 +194,7 @@ \VAR{PE\_size} must be equal on all \acp{PE} in the active set. The same \dest{} and \source{} arrays, and the same \VAR{pWrk} and \VAR{pSync} work arrays, must be passed to all \acp{PE} in the active set. - %FIXME: Reword 'the following conditions must be met.' + Before any \ac{PE} calls a reduction routine, the following conditions must be met (synchronization via a \OPR{barrier} or some other method is often needed to ensure this): The \VAR{pWrk} and \VAR{pSync} arrays diff --git a/utils/defs.tex b/utils/defs.tex index e7279cc7a..db7a86cbf 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -138,9 +138,6 @@ % % Use Sans Serif font for sections, etc. % -% FIXME? `\bf` should be `\textbf` if you want to preserve the sans-serif font -% at subsubsection and paragraph. In my opinion, the serif font looks better -% anyway. -- Bryant Lam % \makeatletter \def\section{\@startsection {section}{1}{\z@}{-3.5ex plus -1ex minus @@ -151,7 +148,6 @@ -1ex minus -.2ex}{1.5ex plus .2ex}{\normalsize\sf\bf}} \def\paragraph{\@startsection {paragraph}{4}{\z@}{3.25ex plus 1ex minus .2ex} {-1em}{\normalsize\sf\bf}} % Indent after \paragraph -%{.1pt}{\normalsize\sf\bf}} % Newline after \paragraph \makeatother % % End use Sans Serif font for sections, etc. S. Otto From b68d63d5b270624e964eadfc481ecbc5bd4b8d7f Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Mon, 9 Oct 2017 13:15:26 -0400 Subject: [PATCH 477/583] Editing missing fortran mention in reductions; 10x Nick --- content/shmem_reductions.tex | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 751e5b731..b52a69b6e 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -207,11 +207,10 @@ The values in the \VAR{pSync} array are restored to the original values. - The sum and product reduction routines include complex-typed - interfaces for the \Cstd API only. When the \Cstd translation - environment does not support complex types\footnote{That is, under - \Cstd language standards prior to \Cstd[99] or under \Cstd[11] when - \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, an \openshmem + The complex-typed interfaces are only provided for sum and product reductions. + When the \Cstd translation environment does not support complex types + \footnote{That is, under \Cstd language standards prior to \Cstd[99] or under \Cstd[11] + when \CONST{\_\_STDC\_NO\_COMPLEX\_\_} is defined to 1}, an \openshmem implementation is not required to provide support for these complex-typed interfaces. } From 62b66827dca360ce47bc40a39b4f15fb65b96005 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 10 Oct 2017 12:30:27 -0400 Subject: [PATCH 478/583] Indicate that malloc, etc. are collective routines Signed-off-by: James Dinan --- content/shmem_malloc.tex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index 8d53ec80c..b488c99ab 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -1,5 +1,5 @@ \apisummary{ - Symmetric heap memory management routines. + Collective symmetric heap memory management routines. } \begin{apidefinition} @@ -21,6 +21,10 @@ \apidescription{ + The \FUNC{shmem\_malloc}, \FUNC{shmem\_free}, \FUNC{shmem\_realloc}, and + \FUNC{shmem\_align} routines are collective operations that require + participation by all \acp{PE}. + The \FUNC{shmem\_malloc} routine returns a pointer to a block of at least \VAR{size} bytes suitably aligned for any use. This space is allocated from the symmetric heap (in contrast to \FUNC{malloc}, which allocates from the private From b08ee50d05860808e5273fe3a19ef6e6fc6967a0 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 10 Oct 2017 13:01:51 -0400 Subject: [PATCH 479/583] Clean up hybrid programming rationale Signed-off-by: James Dinan --- content/shmem_addr_accessible.tex | 27 +++++++++++++-------------- content/shmem_pe_accessible.tex | 25 ++++++++++++------------- utils/defs.tex | 1 + 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/content/shmem_addr_accessible.tex b/content/shmem_addr_accessible.tex index b70772ad3..10408d157 100644 --- a/content/shmem_addr_accessible.tex +++ b/content/shmem_addr_accessible.tex @@ -1,6 +1,6 @@ \apisummary{ Determines whether an address is accessible via OpenSHMEM data transfer - routines from the specified remote \ac{PE}. + routines from the specified remote \ac{PE}. } \begin{apidefinition} @@ -25,22 +25,12 @@ address is accessible via \openshmem routines from the specified remote \ac{PE}. This routine verifies that the data object is symmetric and accessible with - respect to a remote \ac{PE} via \openshmem data transfer routines. The + respect to a remote \ac{PE} via \openshmem data transfer routines. The specified address \VAR{addr} is a data object on the local \ac{PE}. - - This routine may be particularly useful for hybrid programming with other - communication libraries (such as \ac{MPI}) or parallel languages. For - example, in SGI Altix series systems, for multiple executable MPI programs that - use \openshmem routines, it is important to note that static memory, such as a - \Fortran common block or \Cstd global variable, is symmetric between - processes running from the same executable file, but is not symmetric between - processes running from different executable files. Data allocated from the - symmetric heap (\FUNC{shmem\_malloc} or \FUNC{shpalloc}) is symmetric across the - same or different executable files. } \apireturnvalues{ - \CorCpp: The return value is \CONST{1} if \VAR{addr} is a symmetric data object + \CorCpp: The return value is \CONST{1} if \VAR{addr} is a symmetric data object and accessible via \openshmem routines from the specified remote \ac{PE}; otherwise, it is \CONST{0}. @@ -50,7 +40,16 @@ } \apinotes{ - None. + This routine may be particularly useful for hybrid programming with other + communication libraries (such as \ac{MPI}) or parallel languages. For + example, when an \ac{MPI} job uses \ac{MPMD} mode, multiple executable + \ac{MPI} programs may use \openshmem routines. In such cases, static + memory, such as a \Fortran common block or \Cstd global variable, is + symmetric between processes running from the same executable file, but is + not symmetric between processes running from different executable files. + Data allocated from the symmetric heap (\FUNC{shmem\_malloc} or + \FUNC{shpalloc}) is symmetric across the same or different executable + files. } \end{apidefinition} diff --git a/content/shmem_pe_accessible.tex b/content/shmem_pe_accessible.tex index c9ddd2f9a..7aae628ac 100644 --- a/content/shmem_pe_accessible.tex +++ b/content/shmem_pe_accessible.tex @@ -21,22 +21,12 @@ \end{apiarguments} \apidescription{ - \FUNC{shmem\_pe\_accessible} is a query routine that indicates whether a + \FUNC{shmem\_pe\_accessible} is a query routine that indicates whether a specified \ac{PE} is accessible via \openshmem from the local \ac{PE}. The \FUNC{shmem\_pe\_accessible} routine returns a value indicating whether the remote - \ac{PE} is a process running from the same executable file as the local + \ac{PE} is a process running from the same executable file as the local \ac{PE}, thereby indicating whether full support for symmetric data objects, which may reside in either static memory or the symmetric heap, is available. - This routine may be particularly useful for hybrid - programming with other communication libraries (such as a \ac{MPI}) or parallel - languages. For example, on SGI Altix series systems, \openshmem is - supported across multiple partitioned hosts and InfiniBand connected hosts. - When running multiple executable MPI programs using \openshmem on an Altix, full - \openshmem support is available between processes running from the same - executable file. However, \openshmem support between processes of different - executable files is supported only for data objects on the symmetric heap, - since static data objects are not symmetric between different executable - files. } \apireturnvalues{ @@ -47,6 +37,15 @@ remote \ac{PE} for \openshmem routines; otherwise, it is \CONST{.FALSE.}. } -\apinotes{ None. } +\apinotes{ + This routine may be particularly useful for hybrid programming with other + communication libraries (such as \ac{MPI}) or parallel languages. For + example, when an \ac{MPI} job uses \ac{MPMD} mode, multiple executable + \ac{MPI} programs are executed as part of the same MPI job. In such cases, + \openshmem support may only be available between processes running from the + same executable file. In addition, some environments may allow a hybrid + job may span multiple network partitions. In such scenarios, \openshmem + support may only be available between \acp{PE} within the same partition. +} \end{apidefinition} diff --git a/utils/defs.tex b/utils/defs.tex index 5f92d4d1b..9af53b150 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -82,6 +82,7 @@ \acro{API}{\emph{Application Programming Interface}} \acro{MPI}{\emph{Message Passing Interface}} \acro{SPMD}{\emph{Single Program Multiple Data}} +\acro{MPMD}{\emph{Multiple Program Multiple Data}} \acro{UH}{University of Houston} \acro{UO}{University of Oregon} \acro{ORNL}{Oak Ridge National Laboratory} From 5027735f82102cb0c8b044d4bd7ccde67035facc Mon Sep 17 00:00:00 2001 From: "Michael A. Raymond" Date: Tue, 10 Oct 2017 12:19:31 -0500 Subject: [PATCH 480/583] Fix Naveen's name --- content/coverpage.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/coverpage.tex b/content/coverpage.tex index 31371338a..850956e15 100644 --- a/content/coverpage.tex +++ b/content/coverpage.tex @@ -75,7 +75,7 @@ \section*{Current Authors and Collaborators} \item Swaroop Pophale, \ac{ORNL} \item Sreeram Potluri, NVIDIA \item Howard Pritchard, \ac{LANL} -\item Naveen Ravi, Cray Inc. +\item Naveen Ravichandrasekaran, Cray Inc. \item Michael Raymond, \ac{HPE} \item James Ross, \ac{ARL} \item Pavel Shamis, ARM Inc. From 3c546f066bb6be2904a1b171e8433dff9fc042f3 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 10 Oct 2017 14:51:04 -0400 Subject: [PATCH 481/583] Clarify "must" requirements in thread intro Signed-off-by: James Dinan --- content/threads_intro.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/threads_intro.tex b/content/threads_intro.tex index 01c8b1fde..47a0d7d6d 100644 --- a/content/threads_intro.tex +++ b/content/threads_intro.tex @@ -5,7 +5,7 @@ \begin{description} \item[\CONST{SHMEM\_THREAD\_SINGLE}] \hfill \\ -The \openshmem program may not be multithreaded. +The \openshmem program must not be multithreaded. \item[\CONST{SHMEM\_THREAD\_FUNNELED}] \hfill \\ The \openshmem program may be multithreaded. However, the program must ensure @@ -27,7 +27,7 @@ \item In the \CONST{SHMEM\_THREAD\_FUNNELED}, \CONST{SHMEM\_THREAD\_SERIALIZED}, and \CONST{SHMEM\_THREAD\_MULTIPLE} thread levels, the \FUNC{shmem\_init} and -\FUNC{shmem\_finalize} calls may only be invoked by the same thread. +\FUNC{shmem\_finalize} calls must be invoked by the same thread. \item Any \openshmem operation initiated by a thread is considered an action of the From 636f9729244b2dd3e99640122440dafa5295b3e4 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 10 Oct 2017 15:22:16 -0400 Subject: [PATCH 482/583] Add OpenSHMEM 1.0 folks to alumni listing Signed-off-by: James Dinan --- content/coverpage.tex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/coverpage.tex b/content/coverpage.tex index 850956e15..d7692e386 100644 --- a/content/coverpage.tex +++ b/content/coverpage.tex @@ -86,11 +86,14 @@ \section*{Current Authors and Collaborators} \section*{Alumni Authors and Collaborators} \begin{itemize} +\item Amrita Banerjee, \ac{UH} \item Monika ten Bruggencate, Cray Inc. \item Eduardo D'Azevedo, \ac{ORNL} \item Oscar Hernandez, \ac{ORNL} \item Gregory Koenig, \ac{ORNL} \item Graham Lopez, \ac{ORNL} +\item Ricardo Mauricio, \ac{UH} +\item Ram Nanjegowda, \ac{UH} \item Aaron Welch, \ac{ORNL} \end{itemize} From 84cdd8ea50fba4f989af387be7517a08bf82b69c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 10 Oct 2017 15:23:17 -0400 Subject: [PATCH 483/583] May -> Must for SHMEM_THREAD_SINGLE Signed-off-by: James Dinan --- content/library_constants.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/library_constants.tex b/content/library_constants.tex index 6bc198ae6..b03ec2693 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -12,7 +12,7 @@ %% \LibConstDecl[\CorCpp]{SHMEM\_THREAD\_SINGLE} & The \openshmem thread support level which specifies that the program -may not be multithreaded. +must not be multithreaded. See Section~\ref{subsec:thread_support} for more detail about its use. \tabularnewline \hline %% From 6e35c6c5049ed1f1b10181011a381792655bad08 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Tue, 10 Oct 2017 15:39:00 -0400 Subject: [PATCH 484/583] Fix : IN/OUT intent arguments for reductions; 10x Nick --- content/shmem_reductions.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index b52a69b6e..5269d32a0 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -137,7 +137,7 @@ \begin{apiarguments} -\apiargument{IN}{dest}{A symmetric array, of length \VAR{nreduce} elements, to +\apiargument{OUT}{dest}{A symmetric array, of length \VAR{nreduce} elements, to receive the result of the reduction routines. The data type of \dest{} varies with the version of the reduction routine being called. When calling from \CorCpp, refer to the SYNOPSIS section for data type information.} From 38968ad2300b244847ebe1f79aaf386b55663d67 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 12:45:50 -0400 Subject: [PATCH 485/583] Simple edits from RCM reading --- content/backmatter.tex | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 3493ef8cc..d6884afe0 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -8,7 +8,7 @@ \fancyhf{} \fancyhead[RE, LO]{\leftmark} \fancyhead[RO, LE]{\thepage} -\fancyfoot[CE,CO]{\thepage} +\fancyfoot[CE, CO]{\thepage} \renewcommand{\headrulewidth}{0pt} @@ -23,9 +23,9 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \begin{itemize} \item Include the header file \HEADER{shmem.h} for \Cstd or \HEADER{shmem.fh} for \Fortran. \item Add the initialization call \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}}. -\item Use OpenSHMEM calls to query the local PE number +\item Use \openshmem calls to query the local \ac{PE} number (\hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}}) and the total number - of PEs (\hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}}). + of \acp{PE} (\hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}}). \item Add the finalization call \hyperref[subsec:shmem_finalize]{\FUNC{shmem\_finalize}}. \end{itemize} @@ -69,7 +69,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} the local address of the symmetric data object that will receive the data. This local address resolution aids programmability because the address of the \dest{} need not be exchanged with the active side (\ac{PE} \CONST{0}) prior to -the RMA (Remote Memory Access) routine. +the \acf{RMA} routine. Conversely, the declaration of the \VAR{short source} array is asymmetric (local only). @@ -175,7 +175,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} immediately upon an \openshmem call into the uninitialized library. \tabularnewline \hline -Multiple calls to initialization routines & In an OpenSHMEM program where +Multiple calls to initialization routines & In an \openshmem program where an initialization routine (\FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}) has already been called, any subsequent calls to an initialization routine result in undefined behavior. @@ -417,12 +417,12 @@ \subsection{\CorCpp: \FUNC{\_my\_pe}, \FUNC{\_num\_pes}, \FUNC{shmalloc}, to normalize the \openshmem \ac{API} to use \shmemprefixLC{} as the standard prefix for all routines. -\subsection{Fortran: \FUNC{START\_PES}, \FUNC{MY\_PE}, \FUNC{NUM\_PES}} +\subsection{\textit{Fortran}: \FUNC{START\_PES}, \FUNC{MY\_PE}, \FUNC{NUM\_PES}} %% WARNING: Issue #66. The \Fortran routines \FUNC{START\_PES}, \FUNC{MY\_PE}, and \FUNC{NUM\_PES} were deprecated in order to minimize the API differences from the deprecation of \CorCpp routines \FUNC{start\_pes}, \FUNC{\_my\_pe}, and \FUNC{\_num\_pes}. -\subsection{Fortran: \FUNC{SHMEM\_PUT}} +\subsection{\textit{Fortran}: \FUNC{SHMEM\_PUT}} %% WARNING: Issue #66. The \Fortran routine \FUNC{SHMEM\_PUT} is defined only for the \Fortran \ac{API} and is semantically identical to \Fortran routines \FUNC{SHMEM\_PUT8} and \FUNC{SHMEM\_PUT64}. Since \FUNC{SHMEM\_PUT8} and @@ -488,12 +488,12 @@ \subsection{\CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap} In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were expanded for clarity to ``compare\_swap'', ``fetch\_inc'', and ``fetch\_add''. -\subsection{Fortran API}\label{subsec:deprecate-fortran} %% WARNING: Issue #66. +\subsection{\textit{Fortran} API}\label{subsec:deprecate-fortran} %% WARNING: Issue #66. The entire \openshmem \Fortran API was deprecated because of a general lack of use and a lack of conformance with legacy \Fortran standards. In lieu of an extensive update of the \Fortran API, \Fortran users are encouraged to leverage current and future \openshmem specifications of the \Cstd API -through the \Fortran-\Cstd interoperability initially standardized by +through the \Fortran--\Cstd interoperability initially standardized by \Fortran[2003]% \footnote{Formally, \Fortran[2003] is known as ISO/IEC~1539-1:2004(E).}. @@ -523,7 +523,7 @@ \section{Version 1.4} routines that accept \CTYPE{shmem\_ctx\_t} arguments. \\See Section \ref{sec:ctx}. % -\item New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide PE +\item New API \FUNC{shmem\_sync\_all} and \FUNC{shmem\_sync} to provide \ac{PE} synchronization without completing pending communication operations. \\See Sections \ref{subsec:shmem_sync_all} and \ref{subsec:shmem_sync}. % @@ -547,8 +547,7 @@ \section{Version 1.4} \item Removed the \VAR{volatile} qualifiers from the \VAR{ivar} arguments to \FUNC{shmem\_wait} routines and the \VAR{lock} arguments in the lock API. \emph{Rationale: Volatile qualifiers were added to several API routines in -version 1.3 of the OpenSHMEM specification; however, they were later found -to be unnecessary.} +\openshmem[1.3]; however, they were later found to be unnecessary.} \\ See Sections \ref{subsec:shmem_wait} and \ref{subsec:shmem_lock}. % \item Deprecated the \VAR{SMA\_}* environment variables and added equivalent @@ -703,9 +702,9 @@ \section{Version 1.2} \item Added specification of \VAR{pSync} initialization for all routines that use it. % \item Replaced all placeholder variable names \VAR{target} with \VAR{dest} to - avoid confusion with \Fortran `target' keyword. + avoid confusion with \Fortran's \CONST{target} keyword. % FIXME: Change to \KEYWORD{target} % -\item New Execution Model for exiting/finishing OpenSHMEM programs. +\item New Execution Model for exiting/finishing \openshmem programs. \\See Section \ref{subsec:execution_model}. % \item New library constants to support API that query version and name information. From 551dca387b62ddc814c6c88ba065ad6d700c1f8e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 12:48:26 -0400 Subject: [PATCH 486/583] Clarified undefined behavior for multiple init calls `start_pes` can be called multiple times (subsequent calls are no-ops). --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index d6884afe0..f1f574811 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -176,8 +176,8 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} \tabularnewline \hline Multiple calls to initialization routines & In an \openshmem program where -an initialization routine (\FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}) -has already been called, any subsequent calls to an initialization routine +the initialization routines \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread} +have already been called, any subsequent calls to these initialization routines result in undefined behavior. \tabularnewline \hline From 0e4de516f8f0d5daadc47020fe400ee6e7e87093 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 12:58:20 -0400 Subject: [PATCH 487/583] oshCC --> oshc++ --- content/backmatter.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index f1f574811..2cbf14d22 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -111,14 +111,14 @@ \subsection*{Programs written in \Cstd} \subsection*{Programs written in \Cpp} The \openshmem Reference Implementation provides a wrapper program, named -\textbf{oshCC}, to aid in the compilation of \Cpp programs. +\textbf{oshc++}, to aid in the compilation of \Cpp programs. The wrapper may be called as follows: \begin{lstlisting}[language=bash] -oshCC -o myprogram myprogram.cpp +oshc++ -o myprogram myprogram.cpp \end{lstlisting} Where the $\langle\mbox{compiler options}\rangle$ are options understood by the -underlying \Cpp compiler called by \textbf{oshCC}. +underlying \Cpp compiler called by \textbf{oshc++}. \subsection*{Programs written in \Fortran} From 176d02d7030414166d0e06d07e69ba3a2db7cd62 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 13:33:03 -0400 Subject: [PATCH 488/583] Suggested edits from #148 --- content/backmatter.tex | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 2cbf14d22..6a3862d86 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -142,12 +142,12 @@ \section{Running Programs} The wrapper may be called as follows: \begin{lstlisting}[language=bash] -oshrun -np <#> +oshrun -np <#> \end{lstlisting} -The program arguments for \textbf{oshrun} are: +The arguments for \textbf{oshrun} are: \begin{tabular}{p{0.3\textwidth}p{0.6\textwidth}} -$\langle\mbox{additional options}\rangle$ & {Options passed to the underlying launcher.}\tabularnewline +$\langle\mbox{runner options}\rangle$ & {Options passed to the underlying launcher.}\tabularnewline -np $\langle\mbox{\#}\rangle$ & {The number of \acp{PE} to be used in the execution.}\tabularnewline $\langle\mbox{program}\rangle$ & {The program executable to be launched.}\tabularnewline $\langle\mbox{program arguments}\rangle$ & {Flags and other parameters to pass to the program.}\tabularnewline @@ -193,7 +193,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} implementation may choose to continue execution with or without a warning. \tabularnewline \hline -Non-symmetric memory allocation & The symmetric memory management routines are +Nonsymmetric allocation of symmetric memory & The symmetric memory management routines are collectives. For example, all \acp{PE} in the program must call \FUNC{shmem\_malloc} with the same \VAR{size} argument. Program behavior after a mismatched \FUNC{shmem\_malloc} call is undefined.\tabularnewline @@ -305,8 +305,8 @@ \chapter{OpenSHMEM Specification and Deprecated API}\label{sec:dep_api} \section{Overview}\label{subsec:dep_overview} For the \openshmem specification, deprecation is the process of identifying -API that is supported but no longer recommended for use by program users. For -\openshmem library users, said API \textbf{must} be supported until clearly +API that is supported but no longer recommended for use by users. +The deprecated API \textbf{must} be supported until clearly indicated as otherwise by the specification. This chapter records the API or functionality that have been deprecated, the \openshmem specification version that effected the deprecation, and the @@ -406,7 +406,7 @@ \subsection{\CorCpp: \FUNC{start\_pes}} \openshmem users are encouraged to use \FUNC{shmem\_init} instead. \subsection{Implicit Finalization} -Implicit finalization has been replaced with explicit finalization using the +Implicit finalization was deprecated and replaced with explicit finalization using the \FUNC{shmem\_finalize} routine. Explicit finalization improves portability and also improves interoperability with profiling and debugging tools. @@ -458,7 +458,7 @@ \subsection{\CONST{\_SHMEM\_*} Library Constants} \end{tabular} \end{center} do not adhere to the \Cstd standard's reserved identifiers and the \Cpp -standard's reserved names. These constants have been deprecated and replaced +standard's reserved names. These constants were deprecated and replaced with corresponding constants of prefix \shmemprefix{} that adhere to \CorCpp{} and \Fortran naming conventions. @@ -479,7 +479,6 @@ \subsection{\CorCpp: \FUNC{shmem\_wait}} \subsection{\CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} - The \CorCpp interfaces for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, and \FUNC{shmem\_add} were deprecated and replaced with From baa04680646ae93d6d9b296230df1e7d356b849b Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 14:41:49 -0400 Subject: [PATCH 489/583] standard --> specification, where appropriate FIXME? "non-standard" --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6a3862d86..f698677f3 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -384,8 +384,8 @@ \section{Deprecation Rationale}\label{subsec:dep_rationale} \subsection{Header Directory: \HEADER{mpp}} \label{subsec:dep_rationale:mpp} In addition to the default system header paths, \openshmem implementations -must provide all \openshmem standard header files from the \HEADER{mpp} -header directory such that headers can be referenced in \CorCpp as +must provide all \openshmem-specified header files from the \HEADER{mpp} +header directory such that these headers can be referenced in \CorCpp as \begin{lstlisting}[language=] #include #include From 4c4a5484b5848df2ff1f6bdddff159c29f26a532 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 14:43:01 -0400 Subject: [PATCH 490/583] non-blocking --> nonblocking; Reverted to "non-" --- content/backmatter.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index f698677f3..b7a8bdbc5 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -193,7 +193,7 @@ \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} implementation may choose to continue execution with or without a warning. \tabularnewline \hline -Nonsymmetric allocation of symmetric memory & The symmetric memory management routines are +Non-symmetric allocation of symmetric memory & The symmetric memory management routines are collectives. For example, all \acp{PE} in the program must call \FUNC{shmem\_malloc} with the same \VAR{size} argument. Program behavior after a mismatched \FUNC{shmem\_malloc} call is undefined.\tabularnewline @@ -511,7 +511,7 @@ \section{Version 1.4} expanded type support for \ac{RMA} and \ac{AMO} operations, a new namespace for atomic operations, atomic bitwise operations, -\FUNC{shmem\_test} for non-blocking point-to-point synchronization, +\FUNC{shmem\_test} for nonblocking point-to-point synchronization, and \Cstd[11] type-generic interfaces for point-to-point synchronization. The following list describes the specific changes in \openshmem[1.4]: @@ -634,7 +634,7 @@ \section{Version 1.4} \section{Version 1.3} Major changes in \openshmem[1.3] include the addition of -non-blocking RMA operations, +nonblocking \ac{RMA} operations, atomic \PUT{} and \GET{} operations, all-to-all collectives, and \Cstd[11] type-generic interfaces for \ac{RMA} and \ac{AMO} operations. @@ -662,7 +662,7 @@ \section{Version 1.3} operations based on \Cstd[11] Generics. \\See Sections \ref{sec:rma}, \ref{sec:rma_nbi} and \ref{sec:amo}. % -\item New non-blocking variants of remote memory access, \FUNC{SHMEM\_PUT\_NBI} +\item New nonblocking variants of remote memory access, \FUNC{SHMEM\_PUT\_NBI} and \FUNC{SHMEM\_GET\_NBI}. \\See Sections \ref{subsec:shmem_put_nbi} and \ref{subsec:shmem_get_nbi}. % From b934d0d810a1837c75d13aa0119be4e4f753c69d Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Wed, 11 Oct 2017 14:44:47 -0400 Subject: [PATCH 491/583] Edits to shmem barrier notes to improve clarity; 10x Nick --- content/shmem_barrier.tex | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index e875122d3..b00d528d6 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -63,9 +63,10 @@ } \apinotes{ - If the \VAR{pSync} array is initialized at run time, another method of - synchronization (e.g., \FUNC{shmem\_barrier\_all}) must be used before - the initial use of that \VAR{pSync} array by \FUNC{shmem\_barrier}. + If the \VAR{pSync} array is initialized at the run time, all + \acp{PE} must be synchronized before the first call to \FUNC{shmem\_barrier} + (e.g., by \FUNC{shmem\_barrier\_all}) to ensure the array has been initialized + by all \acp{PE} before it is used. If the active set does not change, \FUNC{shmem\_barrier} can be called repeatedly with the same \VAR{pSync} array. No additional synchronization From 8d3e16ffda1ac1ac3304112f01594a53c26ff940 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 11 Oct 2017 20:41:08 -0400 Subject: [PATCH 492/583] History: HPE acquired SGI in 2016 --- content/backmatter.tex | 3 ++- utils/defs.tex | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index b7a8bdbc5..22096d49e 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -285,8 +285,9 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \item \ac{SGI} currently owns the rights to SHMEM and \openshmem \item Platforms: Origin, Altix 4700, Altix XE, ICE, UV \item \ac{SGI} was acquired by Rackable Systems in 2009 - \item \ac{SGI} and Open Source Software Solutions, Inc. (OSSS) signed a + \item \ac{SGI} and \ac{OSSS} signed a SHMEM trademark licensing agreement in 2010 + \item \ac{HPE} acquired {SGI} in 2016 \end{itemize} \end{itemize} \end{itemize} diff --git a/utils/defs.tex b/utils/defs.tex index 2ebde7180..2ccfb2fe9 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -89,6 +89,7 @@ \acro{LANL}{Los Alamos National Laboratory} \acro{ESSC}{Extreme Scale Systems Center} \acro{SGI}{Silicon Graphics International} +\acro{HPE}{Hewlett Packard Enterprise} \acro{OSSS}{Open Software System Solutions} \acro{DoD}{U.S. Department of Defense} \end{acronym} From c73a4107e86a796d215bd2f8e2a556a4e4a7fec6 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Thu, 12 Oct 2017 04:38:04 -0400 Subject: [PATCH 493/583] specification -> Specification change --- content/collective_intro.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 8f788b6e9..d244ea590 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -24,9 +24,9 @@ routines. The \FUNC{shmem\_barrier} and \FUNC{shmem\_sync} routines allow the same \VAR{pSync} array to be used on consecutive calls as long as the \acp{PE} in the active set do not change. -All collective routines defined in the specification are blocking. The +All collective routines defined in the Specification are blocking. The collective routines return on completion. The collective routines defined in -the \openshmem specification are: +the \openshmem Specification are: \begin{itemize} \item \FUNC{shmem\_barrier\_all} From e8a6e21d01f091606a1c97b1715d353c9c121125 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 12 Oct 2017 11:20:56 -0400 Subject: [PATCH 494/583] Backmatter: Implemented "Specification" for #170 --- content/backmatter.tex | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 22096d49e..6df2f137f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -89,7 +89,7 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} \chapter{Compiling and Running Programs}\label{sec:compiling} -The specification does not specify how +The \openshmem Specification does not specify how \openshmem programs are compiled, linked, and run. This section shows some examples of how wrapper programs are utilized in the \openshmem Reference Implementation to compile and launch programs. @@ -158,11 +158,10 @@ \section{Running Programs} \chapter{Undefined Behavior in OpenSHMEM}\label{sec:undefined} -The specification formalizes the expected behavior of +The \openshmem Specification formalizes the expected behavior of its library routines. In cases where routines are improperly used -or the input is not in accordance with the specification, undefined -behavior is observed. Depending on the implementation, there are -many interpretations of undefined behavior. +or the input is not in accordance with the Specification, the behavior +is undefined. \begin{longtable}{|>{\raggedright}p{0.3\textwidth}|>{\raggedright}p{0.6\textwidth}|} \hline @@ -305,14 +304,14 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \chapter{OpenSHMEM Specification and Deprecated API}\label{sec:dep_api} \section{Overview}\label{subsec:dep_overview} -For the \openshmem specification, deprecation is the process of identifying +For the \openshmem Specification, deprecation is the process of identifying API that is supported but no longer recommended for use by users. The deprecated API \textbf{must} be supported until clearly -indicated as otherwise by the specification. +indicated as otherwise by the Specification. This chapter records the API or functionality that have been deprecated, the -\openshmem specification version that effected the deprecation, and the -\openshmem specification version that the feature was last supported before -removal. +version of the \openshmem Specification that effected the deprecation, and the +most recent version of the \openshmem Specification in which the feature was +supported before removal. \begin{center} \scriptsize @@ -492,9 +491,8 @@ \subsection{\textit{Fortran} API}\label{subsec:deprecate-fortran} %% WARNING: Is The entire \openshmem \Fortran API was deprecated because of a general lack of use and a lack of conformance with legacy \Fortran standards. In lieu of an extensive update of the \Fortran API, \Fortran users are encouraged to -leverage current and future \openshmem specifications of the \Cstd API -through the \Fortran--\Cstd interoperability initially standardized by -\Fortran[2003]% +leverage the \openshmem Specification's \Cstd API through the +\Fortran--\Cstd interoperability initially standardized by \Fortran[2003]% \footnote{Formally, \Fortran[2003] is known as ISO/IEC~1539-1:2004(E).}. @@ -749,7 +747,7 @@ \section{Version 1.2} \\See Annex \ref{sec:undefined} % \item Addition of new Annex for clearly specifying deprecated API and its - support in the existing specification version. + support across versions of the \openshmem Specification. \\See Annex \ref{sec:dep_api}. % \end{itemize} @@ -851,7 +849,7 @@ \section{Version 1.1} inclusion in \HEADER{shmemx.h}. \\See Section \ref{subsec:bindings}. % -\item Various fixes to \openshmem code examples across the specification to +\item Various fixes to \openshmem code examples across the Specification to include appropriate header files. % \item Removing requirement that implementations should detect size mismatch and From 8c492ecb233a8560e24369c75dc55f4ed46a8876 Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Thu, 12 Oct 2017 13:15:45 -0400 Subject: [PATCH 495/583] whitespace cleanup in collective intro --- content/collective_intro.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index d244ea590..10d6b1fac 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -5,15 +5,15 @@ routine results in undefined behavior. All collective routines have an active set as an input parameter except \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all}. Both \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all} must be called by all \acp{PE} of the -\openshmem program. +\openshmem program. The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}. \VAR{PE\_start} is the starting \ac{PE} number, a log (base 2) of \VAR{logPE\_stride} is the stride between \acp{PE}, and \VAR{PE\_size} is the number of \acp{PE} participating in the active set. All \acp{PE} participating in the collective routine must provide the same values for these -arguments. - +arguments. + Another argument important to collective routines is \VAR{pSync}, which is a symmetric work array. All \acp{PE} participating in a collective must pass the same \VAR{pSync} array. On completion of a collective call, the \VAR{pSync} is @@ -22,7 +22,7 @@ completed by all participating \acp{PE}. One can use a synchronization collective routine such as \FUNC{shmem\_barrier} to ensure completion of previous collective routines. The \FUNC{shmem\_barrier} and \FUNC{shmem\_sync} routines allow the same \VAR{pSync} array to -be used on consecutive calls as long as the \acp{PE} in the active set do not change. +be used on consecutive calls as long as the \acp{PE} in the active set do not change. All collective routines defined in the Specification are blocking. The collective routines return on completion. The collective routines defined in From 87dc8cf8343ca30ebd0fa96e331b87442b3a2bbf Mon Sep 17 00:00:00 2001 From: Manjunath Gorentla Venkata Date: Thu, 12 Oct 2017 13:29:46 -0400 Subject: [PATCH 496/583] Linebreak / Whitespace cleanup --- content/collective_intro.tex | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/collective_intro.tex b/content/collective_intro.tex index 10d6b1fac..b58e0e9a4 100644 --- a/content/collective_intro.tex +++ b/content/collective_intro.tex @@ -3,9 +3,9 @@ routines require all \acp{PE} in the active set to simultaneously call the routine. A \ac{PE} that is not in the active set calling the collective routine results in undefined behavior. All collective routines have an -active set as an input parameter except \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all}. -Both \FUNC{shmem\_barrier\_all} and \FUNC{shmem\_sync\_all} must be called by all \acp{PE} of the -\openshmem program. +active set as an input parameter except \FUNC{shmem\_barrier\_all} and +\FUNC{shmem\_sync\_all}. Both \FUNC{shmem\_barrier\_all} and +\FUNC{shmem\_sync\_all} must be called by all \acp{PE} of the \openshmem program. The active set is defined by the arguments \VAR{PE\_start}, \VAR{logPE\_stride}, and \VAR{PE\_size}. \VAR{PE\_start} is the starting \ac{PE} number, a log (base @@ -21,8 +21,9 @@ array if all previous collective routines using the \VAR{pSync} array have been completed by all participating \acp{PE}. One can use a synchronization collective routine such as \FUNC{shmem\_barrier} to ensure completion of previous collective -routines. The \FUNC{shmem\_barrier} and \FUNC{shmem\_sync} routines allow the same \VAR{pSync} array to -be used on consecutive calls as long as the \acp{PE} in the active set do not change. +routines. The \FUNC{shmem\_barrier} and \FUNC{shmem\_sync} routines allow the same +\VAR{pSync} array to be used on consecutive calls as long as the \acp{PE} +in the active set do not change. All collective routines defined in the Specification are blocking. The collective routines return on completion. The collective routines defined in From c7b87d165b5996dfadbecec74145f0fcdafade94 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 12 Oct 2017 13:39:25 -0400 Subject: [PATCH 497/583] Replace OpenSHMEM with \openshmem Signed-off-by: James Dinan --- content/shmem_addr_accessible.tex | 2 +- content/shmem_init_thread.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_addr_accessible.tex b/content/shmem_addr_accessible.tex index 10408d157..064a0d865 100644 --- a/content/shmem_addr_accessible.tex +++ b/content/shmem_addr_accessible.tex @@ -1,5 +1,5 @@ \apisummary{ - Determines whether an address is accessible via OpenSHMEM data transfer + Determines whether an address is accessible via \openshmem data transfer routines from the specified remote \ac{PE}. } diff --git a/content/shmem_init_thread.tex b/content/shmem_init_thread.tex index 17fb1a471..db61b3bff 100644 --- a/content/shmem_init_thread.tex +++ b/content/shmem_init_thread.tex @@ -1,5 +1,5 @@ \apisummary{ -Initializes the OpenSHMEM library, similar to \FUNC{shmem\_init}, and performs any +Initializes the \openshmem library, similar to \FUNC{shmem\_init}, and performs any initialization required for supporting the provided thread level. } From 272df4dbcdb85e51e4ac5a84ddc862b6592a231d Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 12 Oct 2017 16:06:30 -0700 Subject: [PATCH 498/583] addressing feedback from RCM reading non-blocking -> nonblocking using the right macro for C11 --- content/shmem_fence.tex | 16 ++++++++-------- content/shmem_quiet.tex | 12 ++++++------ content/synchronization_model.tex | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index c1c3e2d92..b4ecc5824 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines + Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects. } @@ -20,14 +20,14 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} - routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} + routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data + subsequent \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, - not completion. It does not guarantee order of delivery of non-blocking \GET{} routines. + not completion. It does not guarantee order of delivery of nonblocking \GET{} routines. } \apireturnvalues{ @@ -43,12 +43,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to + guarantees completion of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired + \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. In an \openshmem program with multithreaded \acp{PE}, it is the @@ -65,7 +65,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_fence} in a C11 program: } + {The following example uses \FUNC{shmem\_fence} in a \Cstd[11] program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index ecbcdb011..56d82d6da 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -1,6 +1,6 @@ \apisummary{ Waits for completion of all outstanding \PUT{}, \ac{AMO}, memory store, - and non-blocking \PUT{} and \GET{} routines to symmetric data + and nonblocking \PUT{} and \GET{} routines to symmetric data objects issued by a \ac{PE}. } @@ -22,9 +22,9 @@ \apidescription{ The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \ac{AMO}, - memory store, and non-blocking \PUT{} and \GET{} routines on + memory store, and nonblocking \PUT{} and \GET{} routines on symmetric data objects issued by the calling \ac{PE} on the given context. All \PUT{}, \ac{AMO}, - memory store, and non-blocking \PUT{} and \GET{} routines to + memory store, and nonblocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. } @@ -36,10 +36,10 @@ \apinotes{ \FUNC{shmem\_quiet} is most useful as a way of ensuring completion of - several \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + several \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} and \GET{} routines to symmetric data objects initiated by the calling \ac{PE}. For example, one might use \FUNC{shmem\_quiet} to await delivery - of a block of data before issuing another \PUT{} or non-blocking + of a block of data before issuing another \PUT{} or nonblocking \PUT{} routine, which sets a completion flag on another \ac{PE}. \FUNC{shmem\_quiet} is not usually needed if \FUNC{shmem\_barrier\_all} or \FUNC{shmem\_barrier} are called. The barrier @@ -76,7 +76,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_quiet} in a C11 program: } + {The following example uses \FUNC{shmem\_quiet} in a \Cstd[11] program: } {./example_code/shmem_quiet_example.c} {\VAR{Put1} and \VAR{put2} will be completed and visible before \VAR{put3} and \VAR{put4}.} diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index c154f6f5e..88dd1587e 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to +All \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a +{All \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local From 5121dcb6605ce082640eaf79ae1d42e0c85984f3 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 12 Oct 2017 16:33:36 -0700 Subject: [PATCH 499/583] updating figure to use shmem_wait_until instead of deprecated shmem_wait --- content/synchronization_model.tex | 2 +- figures/wait.graffle | 28 ++++++++++++++-------------- figures/wait.pdf | Bin 57694 -> 54392 bytes 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 88dd1587e..953b9cf6f 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -11,7 +11,7 @@ \hline \hline {Point-to-point synchronization}\\ -\FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until} +\FUNC{shmem\_wait\_until} & \raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{figures/wait}} \end{tabular} diff --git a/figures/wait.graffle b/figures/wait.graffle index ba0b04fdd..8a05b6cf9 100644 --- a/figures/wait.graffle +++ b/figures/wait.graffle @@ -6,7 +6,7 @@ 0 ApplicationVersion - com.omnigroup.OmniGraffle + com.omnigroup.OmniGrafflePro 139.18.0.187838 AutoAdjust @@ -90,7 +90,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -103,7 +103,7 @@ Bounds - {{576, 66}, {201, 58.824271203326333}} + {{576, 66}, {221, 58.824271203326333}} Class ShapedGraphic ID @@ -140,12 +140,12 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs30 \cf0 shmem_wait is a blocking operation therefore it waits until value in +\f0\fs30 \cf0 shmem_wait_until is a blocking operation therefore it waits until value in \i addr \i0 is updated} @@ -189,7 +189,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\froman\fcharset0 Times-Roman;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -227,7 +227,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -352,7 +352,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -450,7 +450,7 @@ is Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -495,7 +495,7 @@ is Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -574,9 +574,9 @@ is MasterSheets ModificationDate - 2014-02-10 21:26:55 +0000 + 2017-10-12 23:18:46 +0000 Modifier - Shamis, Pavel + Sreeram Potluri NotesVisible NO Orientation @@ -655,7 +655,7 @@ is Frame - {{398, 136}, {1067, 872}} + {{157, 4}, {1067, 872}} ListView OutlineWidth @@ -669,7 +669,7 @@ is SidebarWidth 120 VisibleRegion - {{0, 0}, {932, 733}} + {{0, 0}, {918, 715}} Zoom 1 ZoomValues diff --git a/figures/wait.pdf b/figures/wait.pdf index 6ece7fddcdc40d14911f05e10d60c86c7be2ac51..b48fa8b7b2e9361d8aef7134d5cc3dc39f889d5a 100644 GIT binary patch delta 34052 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 Date: Thu, 12 Oct 2017 17:30:32 -0700 Subject: [PATCH 500/583] removing recommendations for wait under fence and quiet sections --- content/shmem_fence.tex | 2 +- content/shmem_quiet.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index b4ecc5824..19b586f54 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -38,7 +38,7 @@ \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does not guarantee completion of delivery. \FUNC{shmem\_fence} also does not have an effect on the ordering between memory - accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, + accesses issued by the target PE. \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee ordering of its memory accesses. There is a subtle difference between diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 56d82d6da..06838e10e 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -68,7 +68,7 @@ \FUNC{shmem\_quiet}. \FUNC{shmem\_quiet} does not have an effect on the ordering between memory - accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, + accesses issued by the target PE. \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee ordering of its memory accesses. } From 292b28ed69679686faff177dd860e5bbad318001 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 19 Oct 2017 13:23:07 -0400 Subject: [PATCH 501/583] Fix typo in function name Signed-off-by: James Dinan --- example_code/shmem_ctx_pipelined_reduce.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example_code/shmem_ctx_pipelined_reduce.c b/example_code/shmem_ctx_pipelined_reduce.c index c85331d5b..c21d7ff89 100644 --- a/example_code/shmem_ctx_pipelined_reduce.c +++ b/example_code/shmem_ctx_pipelined_reduce.c @@ -38,14 +38,14 @@ int main(void) { shmem_put_nbi(ctx[p_idx], &pbuf[p_idx][PLEN*me], &in_buf[PLEN*p], PLEN, (me+i) % npes); - shmemx_ctx_quiet(ctx[p_idx^1]); + shmem_ctx_quiet(ctx[p_idx^1]); shmem_sync_all(); for (i = 0; i < npes; i++) for (j = 0; j < PLEN; j++) out_buf[PLEN*(p-1)+j] += pbuf[p_idx^1][PLEN*i+j]; } - shmemx_ctx_quiet(ctx[p_idx]); + shmem_ctx_quiet(ctx[p_idx]); shmem_sync_all(); for (i = 0; i < npes; i++) for (j = 0; j < PLEN; j++) From 4441cbe0b6ecdffb23cdf0b28ea25ad941d96bc6 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 17 Oct 2017 13:45:09 -0400 Subject: [PATCH 502/583] Fix index generation Signed-off-by: James Dinan --- Makefile | 1 + content/backmatter.tex | 3 --- content/frontmatter.tex | 1 - main_spec.tex | 13 ++++--------- utils/defs.tex | 2 ++ 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 0c595dac9..7e4603ad1 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ all: ${TARGET}.pdf ${TARGET}.pdf: ${SOURCES} ${FIGURES} ${EXAMPLES} pdflatex $(LATEXOPT) ${TARGET} + makeindex ${TARGET} pdflatex $(LATEXOPT) ${TARGET} pdflatex $(LATEXOPT) ${TARGET} diff --git a/content/backmatter.tex b/content/backmatter.tex index 6df2f137f..488703f28 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -870,7 +870,4 @@ \section{Version 1.1} % \end{itemize} - - - } %end of setlength command that was started in frontmatter.tex diff --git a/content/frontmatter.tex b/content/frontmatter.tex index 72cdca489..a0c857f45 100644 --- a/content/frontmatter.tex +++ b/content/frontmatter.tex @@ -34,4 +34,3 @@ %\setlength{\baselineskip}{3pt plus 3pt minus 3pt} \setlength{\parskip}{3pt} - diff --git a/main_spec.tex b/main_spec.tex index 1104fdb6e..d579f8a7a 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -4,8 +4,6 @@ \input{utils/defs} -\makeindex - \begin{document} \input{content/frontmatter} @@ -324,16 +322,13 @@ \subsection{Cache Management} \subsubsection{\textbf{SHMEM\_CACHE}}\label{subsec:shmem_cache} \input{content/shmem_cache.tex} - - - - \clearpage - - - \input{content/backmatter} +\clearpage +\phantomsection +\addcontentsline{toc}{chapter}{Index} +\printindex \end{document} diff --git a/utils/defs.tex b/utils/defs.tex index d8733e297..747be7a6d 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -1,3 +1,5 @@ +\makeindex + \definecolor{ListingBG}{rgb}{0.91,0.91,0.91} \definecolor{shadecolor}{rgb}{0.92,0.92,0.92} From cd0cfda3216b6ee836fc6d440a61156f47e4dff6 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 00:54:13 -0400 Subject: [PATCH 503/583] Added generated index to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 13d85ac1e..721f3a3f6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ chappage.txt main_spec.aux main_spec.idx +main_spec.ilg +main_spec.ind main_spec.log main_spec.out main_spec.pdf From 29e4d3da98d8238e505cdd5381d222358a85c830 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 00:57:43 -0400 Subject: [PATCH 504/583] Indexed library constants --- content/backmatter.tex | 20 ++++++++++---------- utils/defs.tex | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 488703f28..b95217f83 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -352,16 +352,16 @@ \section{Overview}\label{subsec:dep_overview} \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline - \CONST{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline - \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline - \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BCAST\_SYNC\_SIZE}} \\ \hline - \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_COLLECT\_SYNC\_SIZE}} \\ \hline - \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_SYNC\_SIZE}} \\ \hline - \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} \\ \hline - \CONST{\_SHMEM\_MAJOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAJOR\_VERSION}} \\ \hline - \CONST{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline - \CONST{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline - \CONST{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline + \LibConstRef{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline + \LibConstRef{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline + \LibConstRef{\_SHMEM\_BCAST\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BCAST\_SYNC\_SIZE}} \\ \hline + \LibConstRef{\_SHMEM\_COLLECT\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_COLLECT\_SYNC\_SIZE}} \\ \hline + \LibConstRef{\_SHMEM\_REDUCE\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_SYNC\_SIZE}} \\ \hline + \LibConstRef{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE}} \\ \hline + \LibConstRef{\_SHMEM\_MAJOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAJOR\_VERSION}} \\ \hline + \LibConstRef{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline + \LibConstRef{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline + \LibConstRef{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline \VAR{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline diff --git a/utils/defs.tex b/utils/defs.tex index 747be7a6d..911f9bb46 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -47,8 +47,9 @@ \textit{C\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} +\newcommand{\LibConstRef}[1]{\CONST{#1}\index{Constants!#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% - \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \CONST{#2} \\~}} + \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\TYPE}{\emph{TYPE}} \newcommand{\TYPENAME}{\emph{TYPENAME}} \newcommand{\SIZE}{\emph{SIZE}} From 89c55f73337d442467c1583f2d20bbf0608ac216 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 01:39:41 -0400 Subject: [PATCH 505/583] Whitespace --- content/environment_variables.tex | 37 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/content/environment_variables.tex b/content/environment_variables.tex index cabda16a4..6f830ed0e 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -13,20 +13,29 @@ \medskip{} \begin{tabular}{|l|l|l|} -\hline -\textbf{Variable} & \textbf{Value} & \textbf{Description}\tabularnewline -\hline -\VAR{SHMEM\_VERSION} & Any & Print the library version at -start-up\tabularnewline -\hline -\VAR{SHMEM\_INFO} & Any & Print helpful text about all these environment -variables\tabularnewline -\hline -\VAR{SHMEM\_SYMMETRIC\_SIZE} & Non-negative integer & Number of bytes to -allocate for symmetric heap\tabularnewline -\hline -\VAR{SHMEM\_DEBUG} & Any & Enable debugging messages\tabularnewline -\hline +\hline +\textbf{Variable} & \textbf{Value} & \textbf{Description} +\tabularnewline\hline +%% +\VAR{SHMEM\_VERSION} + & Any + & Print the library version at start-up + \tabularnewline\hline +%% +\VAR{SHMEM\_INFO} + & Any + & Print helpful text about all these environment variables + \tabularnewline\hline +%% +\VAR{SHMEM\_SYMMETRIC\_SIZE} + & Non-negative integer + & Number of bytes to allocate for symmetric heap + \tabularnewline\hline +%% +\VAR{SHMEM\_DEBUG} + & Any + & Enable debugging messages + \tabularnewline\hline \end{tabular} \medskip{} From 3c92bf97c492500191c3f8678b828de84c33e28e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 01:40:26 -0400 Subject: [PATCH 506/583] Indexed environment variables --- content/backmatter.tex | 8 ++++---- content/environment_variables.tex | 8 ++++---- utils/defs.tex | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index b95217f83..39a0a961e 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -362,10 +362,10 @@ \section{Overview}\label{subsec:dep_overview} \LibConstRef{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline \LibConstRef{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \LibConstRef{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline - \VAR{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline - \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline - \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline - \VAR{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline + \EnvVarRef{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline + \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline + \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline + \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline \CorCpp: \FUNC{shmem\_wait} & 1.4 & Current & See ``Notes'' for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline \CorCpp: \FUNC{shmem\_fetch} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline \CorCpp: \FUNC{shmem\_set} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline diff --git a/content/environment_variables.tex b/content/environment_variables.tex index 6f830ed0e..b6eb067d4 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -17,22 +17,22 @@ \textbf{Variable} & \textbf{Value} & \textbf{Description} \tabularnewline\hline %% -\VAR{SHMEM\_VERSION} +\EnvVarDecl{SHMEM\_VERSION} & Any & Print the library version at start-up \tabularnewline\hline %% -\VAR{SHMEM\_INFO} +\EnvVarDecl{SHMEM\_INFO} & Any & Print helpful text about all these environment variables \tabularnewline\hline %% -\VAR{SHMEM\_SYMMETRIC\_SIZE} +\EnvVarDecl{SHMEM\_SYMMETRIC\_SIZE} & Non-negative integer & Number of bytes to allocate for symmetric heap \tabularnewline\hline %% -\VAR{SHMEM\_DEBUG} +\EnvVarDecl{SHMEM\_DEBUG} & Any & Enable debugging messages \tabularnewline\hline diff --git a/utils/defs.tex b/utils/defs.tex index 911f9bb46..fbabff497 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -39,6 +39,7 @@ \newcommand{\CTYPE}[1]{\textit{#1}} \newcommand{\VAR}[1]{\textit{#1}} \newcommand{\CONST}[1]{\textit{#1}} +%% \newcommand{\CorCpp}{\textit{C/C++}\xspace} \newcommand{\CorCppFor}{\textit{C/C++/Fortran}\xspace} \newcommand{\Fortran}[1][]{% @@ -47,9 +48,14 @@ \textit{C\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} +%% +\newcommand{\EnvVarRef}[1]{\VAR{#1}\index{Environment Variables!#1}} \newcommand{\LibConstRef}[1]{\CONST{#1}\index{Constants!#1}} +%% +\newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} +%% \newcommand{\TYPE}{\emph{TYPE}} \newcommand{\TYPENAME}{\emph{TYPENAME}} \newcommand{\SIZE}{\emph{SIZE}} From 453dab672a7d1582255eabdab21a3a45000a5b56 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 01:56:56 -0400 Subject: [PATCH 507/583] Indexed deprecated routines --- content/backmatter.tex | 62 +++++++++++++++++++++--------------------- utils/defs.tex | 2 ++ 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 39a0a961e..7b7a5b43a 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -324,33 +324,33 @@ \section{Overview}\label{subsec:dep_overview} \hline \endhead Header Directory: \hyperref[subsec:dep_rationale:mpp]{\HEADER{mpp}} & 1.1 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:start_pes]{\FUNC{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline - \Fortran: \hyperref[subsec:start_pes]{\FUNC{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline + \CorCpp: \hyperref[subsec:start_pes]{\FuncRef{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \Fortran: \hyperref[subsec:start_pes]{\FuncRef{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline \hyperref[subsec:start_pes]{Implicit finalization} & 1.2 & Current & \hyperref[subsec:shmem_finalize]{\FUNC{shmem\_finalize}} \\ \hline - \CorCpp: \FUNC{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline - \CorCpp: \FUNC{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline - \Fortran: \FUNC{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline - \Fortran: \FUNC{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline - \CorCpp: \FUNC{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline - \CorCpp: \FUNC{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline - \CorCpp: \FUNC{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline - \CorCpp: \FUNC{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \Fortran: \FUNC{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} + \CorCpp: \FuncRef{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \CorCpp: \FuncRef{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \Fortran: \FuncRef{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline + \Fortran: \FuncRef{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline + \CorCpp: \FuncRef{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \CorCpp: \FuncRef{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \CorCpp: \FuncRef{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \CorCpp: \FuncRef{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \Fortran: \FuncRef{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_CLEAR\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} + \CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_line\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_LINE\_INV}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} + \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush\_line}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline \LibConstRef{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline \LibConstRef{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline @@ -366,15 +366,15 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline - \CorCpp: \FUNC{shmem\_wait} & 1.4 & Current & See ``Notes'' for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline - \CorCpp: \FUNC{shmem\_fetch} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline - \CorCpp: \FUNC{shmem\_set} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline - \CorCpp: \FUNC{shmem\_cswap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline - \CorCpp: \FUNC{shmem\_swap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline - \CorCpp: \FUNC{shmem\_finc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline - \CorCpp: \FUNC{shmem\_inc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline - \CorCpp: \FUNC{shmem\_fadd} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline - \CorCpp: \FUNC{shmem\_add} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline + \CorCpp: \FuncRef{shmem\_wait} & 1.4 & Current & See ``Notes'' for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline + \CorCpp: \FuncRef{shmem\_fetch} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline + \CorCpp: \FuncRef{shmem\_set} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline + \CorCpp: \FuncRef{shmem\_cswap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline + \CorCpp: \FuncRef{shmem\_swap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline + \CorCpp: \FuncRef{shmem\_finc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline + \CorCpp: \FuncRef{shmem\_inc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline + \CorCpp: \FuncRef{shmem\_fadd} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline + \CorCpp: \FuncRef{shmem\_add} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline \end{longtable} \end{center} diff --git a/utils/defs.tex b/utils/defs.tex index fbabff497..5ab1ef7db 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -50,9 +50,11 @@ \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} %% \newcommand{\EnvVarRef}[1]{\VAR{#1}\index{Environment Variables!#1}} +\newcommand{\FuncRef}[1]{\FUNC{#1}\index{Routines!#1}} \newcommand{\LibConstRef}[1]{\CONST{#1}\index{Constants!#1}} %% \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} +\newcommand{\FuncDecl}[1]{\FuncRef{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} %% From 6f6e5dd94b48a9848260a7481e86e65a38493a9e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 21:36:56 -0400 Subject: [PATCH 508/583] Added missing deprecated library constants Closes #177. --- content/backmatter.tex | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6df2f137f..b02be102f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -362,6 +362,12 @@ \section{Overview}\label{subsec:dep_overview} \CONST{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline \CONST{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \CONST{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline + \CONST{\_SHMEM\_CMP\_EQ} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_EQ}} \\ \hline + \CONST{\_SHMEM\_CMP\_NE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_NE}} \\ \hline + \CONST{\_SHMEM\_CMP\_LT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LT}} \\ \hline + \CONST{\_SHMEM\_CMP\_LE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LE}} \\ \hline + \CONST{\_SHMEM\_CMP\_GT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GT}} \\ \hline + \CONST{\_SHMEM\_CMP\_GE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GE}} \\ \hline \VAR{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline @@ -450,11 +456,14 @@ \subsection{\CONST{\_SHMEM\_*} Library Constants} The library constants \begin{center} \begin{tabular}{ll} - \CONST{\_SHMEM\_SYNC\_VALUE} & \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} \\ - \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAJOR\_VERSION} \\ - \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & \CONST{\_SHMEM\_MINOR\_VERSION} \\ - \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAX\_NAME\_LEN} \\ - \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \CONST{\_SHMEM\_VENDOR\_STRING} \\ + \CONST{\_SHMEM\_SYNC\_VALUE} & \CONST{\_SHMEM\_MAX\_NAME\_LEN} \\ + \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \CONST{\_SHMEM\_VENDOR\_STRING} \\ + \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_EQ} \\ + \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_NE} \\ + \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_LT} \\ + \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & \CONST{\_SHMEM\_CMP\_LE} \\ + \CONST{\_SHMEM\_MAJOR\_VERSION} & \CONST{\_SHMEM\_CMP\_GT} \\ + \CONST{\_SHMEM\_MINOR\_VERSION} & \CONST{\_SHMEM\_CMP\_GE} \\ \end{tabular} \end{center} do not adhere to the \Cstd standard's reserved identifiers and the \Cpp From 95ae64cebf94a6fe328ce220d10323088e679541 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 21:41:46 -0400 Subject: [PATCH 509/583] Indexed additional deprecated library constants --- content/backmatter.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 7ab39ffd9..fc988b715 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -362,12 +362,12 @@ \section{Overview}\label{subsec:dep_overview} \LibConstRef{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline \LibConstRef{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \LibConstRef{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline - \CONST{\_SHMEM\_CMP\_EQ} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_EQ}} \\ \hline - \CONST{\_SHMEM\_CMP\_NE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_NE}} \\ \hline - \CONST{\_SHMEM\_CMP\_LT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LT}} \\ \hline - \CONST{\_SHMEM\_CMP\_LE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LE}} \\ \hline - \CONST{\_SHMEM\_CMP\_GT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GT}} \\ \hline - \CONST{\_SHMEM\_CMP\_GE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GE}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_EQ} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_EQ}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_NE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_NE}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_LT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LT}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_LE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LE}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_GT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GT}} \\ \hline + \LibConstRef{\_SHMEM\_CMP\_GE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GE}} \\ \hline \EnvVarRef{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline From 656d9a86c1548e13756bbb8cf1efd4728ae16a91 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 22:27:20 -0400 Subject: [PATCH 510/583] Split index commands into +1 abstraction --- utils/defs.tex | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 5ab1ef7db..aa31aa1fb 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -48,11 +48,15 @@ \textit{C\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} -%% -\newcommand{\EnvVarRef}[1]{\VAR{#1}\index{Environment Variables!#1}} -\newcommand{\FuncRef}[1]{\FUNC{#1}\index{Routines!#1}} -\newcommand{\LibConstRef}[1]{\CONST{#1}\index{Constants!#1}} -%% +%% Generate indexed reference. +\newcommand{\EnvVarIndex}[1]{\index{Environment Variables!#1}} +\newcommand{\FuncIndex}[1]{\index{Routines!#1}} +\newcommand{\LibConstIndex}[1]{\index{Constants!#1}} +%% Write text and generate reference. +\newcommand{\EnvVarRef}[1]{\VAR{#1}\EnvVarIndex{#1}} +\newcommand{\FuncRef}[1]{\FUNC{#1}\FuncIndex{#1}} +\newcommand{\LibConstRef}[1]{\CONST{#1}\LibConstIndex{#1}} +%% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \newcommand{\FuncDecl}[1]{\FuncRef{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% From f7e6810db6ca0b53206a41c4e87d4a424b0f12d0 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 22:38:03 -0400 Subject: [PATCH 511/583] Indexed tables --- content/atomics_intro.tex | 6 +++--- content/backmatter.tex | 1 + content/environment_variables.tex | 2 ++ content/library_constants.tex | 2 ++ content/p2p_sync_intro.tex | 4 ++-- content/rma_intro.tex | 2 +- utils/defs.tex | 2 ++ 7 files changed, 13 insertions(+), 6 deletions(-) diff --git a/content/atomics_intro.tex b/content/atomics_intro.tex index 786898c1f..6945b2a3a 100644 --- a/content/atomics_intro.tex +++ b/content/atomics_intro.tex @@ -68,7 +68,7 @@ size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} - \caption{Standard \ac{AMO} Types and Names} + \TableCaptionRef{Standard \ac{AMO} Types and Names} \label{stdamotypes} \end{center} \end{table} @@ -93,7 +93,7 @@ size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} - \caption{Extended \ac{AMO} Types and Names} + \TableCaptionRef{Extended \ac{AMO} Types and Names} \label{extamotypes} \end{center} \end{table} @@ -111,7 +111,7 @@ uint32\_t & uint32 \\ \hline uint64\_t & uint64 \\ \hline \end{tabular} - \caption{Bitwise \ac{AMO} Types and Names} + \TableCaptionRef{Bitwise \ac{AMO} Types and Names} \label{bitamotypes} \end{center} \end{table} diff --git a/content/backmatter.tex b/content/backmatter.tex index 7b7a5b43a..ff194c0ac 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -304,6 +304,7 @@ \chapter{History of OpenSHMEM}\label{sec:openshmem_history} \chapter{OpenSHMEM Specification and Deprecated API}\label{sec:dep_api} \section{Overview}\label{subsec:dep_overview} +\TableIndex{Deprecated API} For the \openshmem Specification, deprecation is the process of identifying API that is supported but no longer recommended for use by users. The deprecated API \textbf{must} be supported until clearly diff --git a/content/environment_variables.tex b/content/environment_variables.tex index b6eb067d4..96deaeb92 100644 --- a/content/environment_variables.tex +++ b/content/environment_variables.tex @@ -1,3 +1,5 @@ +\TableIndex{Environment Variables} + The \openshmem specification provides a set of environment variables that allows users to configure the \openshmem implementation, and receive information about the implementation. The implementations of the specification are free to define diff --git a/content/library_constants.tex b/content/library_constants.tex index b03ec2693..bb19c07f7 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -1,3 +1,5 @@ +\TableIndex{Library Constants} + The \openshmem library provides a set of compile-time constants that may be used to specify options to API routines, provide implementation-specific parameters, or return information about the implementation. diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 3ac8b7239..e48980dfa 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -38,7 +38,7 @@ size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} - \caption{Point-to-Point Synchronization Types and Names} + \TableCaptionRef{Point-to-Point Synchronization Types and Names} \label{p2psynctypes} \end{center} \end{table} @@ -63,7 +63,7 @@ SHMEM\_CMP\_LT & Less than \\ SHMEM\_CMP\_LE & Less than or equal to \\ \hline \end{tabular} - \caption{Point-to-Point Comparison Enumeration Constants} + \TableCaptionRef{Point-to-Point Comparison Enumeration Constants} \label{p2p-consts} \end{center} \end{table} diff --git a/content/rma_intro.tex b/content/rma_intro.tex index 9919cc6b6..eea89511c 100644 --- a/content/rma_intro.tex +++ b/content/rma_intro.tex @@ -56,7 +56,7 @@ size\_t & size \\ \hline ptrdiff\_t & ptrdiff \\ \hline \end{tabular} - \caption{Standard \ac{RMA} Types and Names} + \TableCaptionRef{Standard \ac{RMA} Types and Names} \label{stdrmatypes} \end{center} \end{table} diff --git a/utils/defs.tex b/utils/defs.tex index aa31aa1fb..010a19668 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -52,10 +52,12 @@ \newcommand{\EnvVarIndex}[1]{\index{Environment Variables!#1}} \newcommand{\FuncIndex}[1]{\index{Routines!#1}} \newcommand{\LibConstIndex}[1]{\index{Constants!#1}} +\newcommand{\TableIndex}[1]{\index{Tables!#1}} %% Write text and generate reference. \newcommand{\EnvVarRef}[1]{\VAR{#1}\EnvVarIndex{#1}} \newcommand{\FuncRef}[1]{\FUNC{#1}\FuncIndex{#1}} \newcommand{\LibConstRef}[1]{\CONST{#1}\LibConstIndex{#1}} +\newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \newcommand{\FuncDecl}[1]{\FuncRef{#1}} From 78b675a4b58789fb7d1a7ac83e8e3118fb917ba5 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 23:12:01 -0400 Subject: [PATCH 512/583] Indexed more library constants --- content/p2p_sync_intro.tex | 14 +++++++------- content/shmem_ctx_create.tex | 6 +++--- content/threads_intro.tex | 8 ++++---- main_spec.tex | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index e48980dfa..c541296c8 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -55,13 +55,13 @@ \begin{center} \begin{tabular}{ll} \hline - Constant Name & Comparison \\ \hline - SHMEM\_CMP\_EQ & Equal \\ - SHMEM\_CMP\_NE & Not equal \\ - SHMEM\_CMP\_GT & Greater than \\ - SHMEM\_CMP\_GE & Greater than or equal to \\ - SHMEM\_CMP\_LT & Less than \\ - SHMEM\_CMP\_LE & Less than or equal to \\ \hline + Constant Name & Comparison \\ \hline + \LibConstRef{SHMEM\_CMP\_EQ} & Equal \\ + \LibConstRef{SHMEM\_CMP\_NE} & Not equal \\ + \LibConstRef{SHMEM\_CMP\_GT} & Greater than \\ + \LibConstRef{SHMEM\_CMP\_GE} & Greater than or equal to \\ + \LibConstRef{SHMEM\_CMP\_LT} & Less than \\ + \LibConstRef{SHMEM\_CMP\_LE} & Less than or equal to \\ \hline \end{tabular} \TableCaptionRef{Point-to-Point Comparison Enumeration Constants} \label{p2p-consts} diff --git a/content/shmem_ctx_create.tex b/content/shmem_ctx_create.tex index 0ee85d368..b23fcf9d0 100644 --- a/content/shmem_ctx_create.tex +++ b/content/shmem_ctx_create.tex @@ -35,16 +35,16 @@ set on that context; otherwise, the behavior is undefined. No options are enabled on the default context. - \apitablerow{\CONST{SHMEM\_CTX\_SERIALIZED}}{ + \apitablerow{\LibConstRef{SHMEM\_CTX\_SERIALIZED}}{ The given context is shareable; however, it will not be used by multiple threads concurrently. When the \CONST{SHMEM\_CTX\_SERIALIZED} option is set, the user must ensure that operations involving the given context are serialized by the application.} - \apitablerow{\CONST{SHMEM\_CTX\_PRIVATE}}{ + \apitablerow{\LibConstRef{SHMEM\_CTX\_PRIVATE}}{ The given context will be used only by the thread that created it.} - \apitablerow{\CONST{SHMEM\_CTX\_NOSTORE}}{ + \apitablerow{\LibConstRef{SHMEM\_CTX\_NOSTORE}}{ Quiet and fence operations performed on the given context are not required to enforce completion and ordering of memory store operations. diff --git a/content/threads_intro.tex b/content/threads_intro.tex index 47a0d7d6d..71dade746 100644 --- a/content/threads_intro.tex +++ b/content/threads_intro.tex @@ -4,19 +4,19 @@ the \openshmem specification. \begin{description} -\item[\CONST{SHMEM\_THREAD\_SINGLE}] \hfill \\ +\item[\LibConstRef{SHMEM\_THREAD\_SINGLE}] \hfill \\ The \openshmem program must not be multithreaded. -\item[\CONST{SHMEM\_THREAD\_FUNNELED}] \hfill \\ +\item[\LibConstRef{SHMEM\_THREAD\_FUNNELED}] \hfill \\ The \openshmem program may be multithreaded. However, the program must ensure that only the main thread invokes the \openshmem interfaces. The main thread is the thread that invokes either \FUNC{shmem\_init} or \FUNC{shmem\_init\_thread}. -\item[\CONST{SHMEM\_THREAD\_SERIALIZED}] \hfill \\ +\item[\LibConstRef{SHMEM\_THREAD\_SERIALIZED}] \hfill \\ The \openshmem program may be multithreaded. However, the program must ensure that the \openshmem interfaces are not invoked concurrently by multiple threads. -\item[\CONST{SHMEM\_THREAD\_MULTIPLE}] \hfill \\ +\item[\LibConstRef{SHMEM\_THREAD\_MULTIPLE}] \hfill \\ The \openshmem program may be multithreaded and any thread may invoke the \openshmem interfaces. \end{description} diff --git a/main_spec.tex b/main_spec.tex index d579f8a7a..515987a61 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -130,7 +130,7 @@ \subsection{Communication Management Routines} passed as an argument in the \Cstd \CTYPE{shmem\_ctx\_*} and type-generic API routines. API routines that do not accept a context argument operate on the default context. The default context can be used explicitly through the -\CONST{SHMEM\_CTX\_DEFAULT} handle. +\LibConstRef{SHMEM\_CTX\_DEFAULT} handle. \subsubsection{\textbf{SHMEM\_CTX\_CREATE}} \label{subsec:shmem_ctx_create} From 3136b13f961bbb02b9d8e978e7419916c1ef47b3 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 3 Nov 2017 00:28:40 -0400 Subject: [PATCH 513/583] Indexed a few routines to test Observed Oddities - Problems with `\index{}` - Index sorting is case-insensitive --- content/shmem_atomic_add.tex | 12 ++++++------ content/shmem_barrier.tex | 4 ++-- content/shmem_barrier_all.tex | 4 ++-- content/shmem_broadcast.tex | 12 ++++++------ utils/defs.tex | 8 +++++++- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index e2ffcb2d3..29da96566 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_add(TYPE *dest, TYPE value, int pe); -void shmem_atomic_add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -void shmem__atomic_add(TYPE *dest, TYPE value, int pe); -void shmem_ctx__atomic_add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 value_i4 -CALL SHMEM_INT4_ADD(dest, value_i4, pe) +CALL @\FuncDecl{SHMEM\_INT4\_ADD}@(dest, value_i4, pe) INTEGER*8 value_i8 -CALL SHMEM_INT8_ADD(dest, value_i8, pe) +CALL @\FuncDecl{SHMEM\_INT8\_ADD}@(dest, value_i8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index b00d528d6..c5f7adea5 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -6,13 +6,13 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_barrier(int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_barrier}@(int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BARRIER_SYNC_SIZE) -CALL SHMEM_BARRIER(PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BARRIER}@(PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 1744f69be..9119ce1ff 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -7,11 +7,11 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_barrier_all(void); +void @\FuncDecl{shmem\_barrier\_all}@(void); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_BARRIER_ALL +CALL @\FuncDecl{SHMEM\_BARRIER\_ALL} \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index a7a2ca08e..06a9bec5f 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -6,17 +6,17 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_broadcast32(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_broadcast64(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_broadcast32}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_broadcast64}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER nelems, PE_root, PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BCAST_SYNC_SIZE) -CALL SHMEM_BROADCAST4(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_BROADCAST8(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_BROADCAST32(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) -CALL SHMEM_BROADCAST64(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST4}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST8}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST32}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST64}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/utils/defs.tex b/utils/defs.tex index 010a19668..898f5ec06 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -60,7 +60,7 @@ \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} -\newcommand{\FuncDecl}[1]{\FuncRef{#1}} +\newcommand{\FuncDecl}[1]{#1\FuncIndex{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} %% @@ -380,6 +380,7 @@ { \textbf{C++11:} \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, + escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, noreturn}, aboveskip=0pt, belowskip=0pt}}{} @@ -387,6 +388,7 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, + escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -394,6 +396,7 @@ \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, + escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -403,6 +406,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, + escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -412,6 +416,7 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, + escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}} @@ -422,6 +427,7 @@ { \deprecationstart \\ \textbf{FORTRAN:} \lstset{language={Fortran}, backgroundcolor=\color{gray}, lineskip=3pt, + escapechar=@, deletekeywords=[2]{STATUS}, deletekeywords=[3]{LOG}, aboveskip=0pt, belowskip=0pt}} From e71c43bf1d5b91b646bf7d9e981deb1e630a074c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 7 Nov 2017 17:16:23 -0500 Subject: [PATCH 514/583] Move SHMEM_CTX_DEFAULT to new library handles section Signed-off-by: James Dinan --- content/library_constants.tex | 8 -------- content/library_handles.tex | 21 +++++++++++++++++++++ main_spec.tex | 3 +++ 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 content/library_handles.tex diff --git a/content/library_constants.tex b/content/library_constants.tex index b03ec2693..920cefabb 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -36,14 +36,6 @@ See Section~\ref{subsec:thread_support} for more detail about its use. \tabularnewline \hline %% -\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & -Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the -default communication context. All point-to-point communication operations -and synchronizations that do not specify a context are performed on the -default context. -See Section~\ref{sec:ctx} for more detail about its use. -\tabularnewline \hline -%% \LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZED} & The context creation option which specifies that the given context is shareable but will not be used by multiple threads concurrently. diff --git a/content/library_handles.tex b/content/library_handles.tex new file mode 100644 index 000000000..4fb7e35a3 --- /dev/null +++ b/content/library_handles.tex @@ -0,0 +1,21 @@ +The \openshmem library provides a set of predefined named constant handles. +All named constants can be used in initialization expressions or assignments, +but not necessarily in array declarations or as labels in C switch statements. +This implies named constants to be link-time but not necessarily compile-time +constants. + +\begin{longtable}{|p{0.45\textwidth}|p{0.5\textwidth}|} +\hline +\textbf{Handle} & \textbf{Description} +\tabularnewline \hline +\endhead +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & +Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the +default communication context. All point-to-point communication operations +and synchronizations that do not specify a context are performed on the +default context. +See Section~\ref{sec:ctx} for more detail about its use. +\tabularnewline \hline +%% +\end{longtable} diff --git a/main_spec.tex b/main_spec.tex index 97e39b776..56fef5919 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -30,6 +30,9 @@ \section{Language Bindings and Conformance}\label{subsec:bindings} \section{Library Constants}\label{subsec:library_constants} \input{content/library_constants} +\section{Library Handles}\label{subsec:library_handles} +\input{content/library_handles} + \section{Environment Variables }\label{subsec:environment_variables} \input{content/environment_variables} From 6b9e8cbd1a33092f6be4b2cc1fdaf58c59b70abe Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 8 Nov 2017 22:19:05 -0500 Subject: [PATCH 515/583] Fixed indexing for Fortran SHMEM_BARRIER_ALL --- content/shmem_barrier_all.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 9119ce1ff..8392054bf 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -11,7 +11,7 @@ \end{Csynopsis} \begin{Fsynopsis} -CALL @\FuncDecl{SHMEM\_BARRIER\_ALL} +CALL @\FuncDecl{SHMEM\_BARRIER\_ALL}@ \end{Fsynopsis} \begin{apiarguments} From 63544b5ee05c879a963a5818950b2ec449473d9e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 8 Nov 2017 22:23:47 -0500 Subject: [PATCH 516/583] Use T1 font encoding The TeX default font encoding (7-bit OT1) renders less-than and greater-than characters as upside-down exclamation mark and upside-down question mark. Use 8-bit T1 encoding which fixes this quirk. --- utils/packages.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/packages.tex b/utils/packages.tex index c29088b8b..8ff6beef6 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -1,4 +1,5 @@ \usepackage[letterpaper,top=2.5cm,bottom=2.5cm,left=2.5cm,right=2.5cm]{geometry} +\usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{graphicx} \usepackage{multicol} From 61afd4d9d6b84cac24d974e9550cf81123e934e4 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 9 Nov 2017 16:46:45 -0500 Subject: [PATCH 517/583] Minor edits from 11/9/17 reading Signed-off-by: James Dinan --- content/shmem_calloc.tex | 3 ++- content/shmem_global_exit.tex | 2 +- content/shmem_pe_accessible.tex | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/shmem_calloc.tex b/content/shmem_calloc.tex index 70e0ab028..666d7a238 100644 --- a/content/shmem_calloc.tex +++ b/content/shmem_calloc.tex @@ -15,7 +15,8 @@ \apidescription{ - The \FUNC{shmem\_calloc} routine allocates a region of remotely-accessible + The \FUNC{shmem\_calloc} routine is a collective operation that allocates a + region of remotely-accessible memory for an array of \VAR{count} objects of \VAR{size} bytes each and returns a pointer to the lowest byte address of the allocated symmetric memory. The space is initialized to all bits zero. diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 0968743aa..79d8696dd 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -47,7 +47,7 @@ \acp{PE} have determined that the program has completed and/or should terminate early. Accordingly, the integer status argument can be used to pass any information about the nature of the exit; e.g., that the program - encountered an error or a found solution. + encountered an error or found a solution. Since \FUNC{shmem\_global\_exit} is a non-collective routine, there is no implied synchronization, and all \acp{PE} must terminate regardless of their current execution state. While I/O must be diff --git a/content/shmem_pe_accessible.tex b/content/shmem_pe_accessible.tex index 7aae628ac..ca814ff69 100644 --- a/content/shmem_pe_accessible.tex +++ b/content/shmem_pe_accessible.tex @@ -44,7 +44,7 @@ \ac{MPI} programs are executed as part of the same MPI job. In such cases, \openshmem support may only be available between processes running from the same executable file. In addition, some environments may allow a hybrid - job may span multiple network partitions. In such scenarios, \openshmem + job to span multiple network partitions. In such scenarios, \openshmem support may only be available between \acp{PE} within the same partition. } From e74ee95980823fc4710c05ffcf41adc6d22ea32a Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 7 Nov 2017 17:16:23 -0500 Subject: [PATCH 518/583] Move SHMEM_CTX_DEFAULT to new library handles section Signed-off-by: James Dinan --- content/library_constants.tex | 8 -------- content/library_handles.tex | 21 +++++++++++++++++++++ main_spec.tex | 3 +++ 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 content/library_handles.tex diff --git a/content/library_constants.tex b/content/library_constants.tex index bb19c07f7..26499136a 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -38,14 +38,6 @@ See Section~\ref{subsec:thread_support} for more detail about its use. \tabularnewline \hline %% -\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & -Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the -default communication context. All point-to-point communication operations -and synchronizations that do not specify a context are performed on the -default context. -See Section~\ref{sec:ctx} for more detail about its use. -\tabularnewline \hline -%% \LibConstDecl[\CorCpp]{SHMEM\_CTX\_SERIALIZED} & The context creation option which specifies that the given context is shareable but will not be used by multiple threads concurrently. diff --git a/content/library_handles.tex b/content/library_handles.tex new file mode 100644 index 000000000..4fb7e35a3 --- /dev/null +++ b/content/library_handles.tex @@ -0,0 +1,21 @@ +The \openshmem library provides a set of predefined named constant handles. +All named constants can be used in initialization expressions or assignments, +but not necessarily in array declarations or as labels in C switch statements. +This implies named constants to be link-time but not necessarily compile-time +constants. + +\begin{longtable}{|p{0.45\textwidth}|p{0.5\textwidth}|} +\hline +\textbf{Handle} & \textbf{Description} +\tabularnewline \hline +\endhead +%% +\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & +Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the +default communication context. All point-to-point communication operations +and synchronizations that do not specify a context are performed on the +default context. +See Section~\ref{sec:ctx} for more detail about its use. +\tabularnewline \hline +%% +\end{longtable} diff --git a/main_spec.tex b/main_spec.tex index 515987a61..79993c6ee 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -28,6 +28,9 @@ \section{Language Bindings and Conformance}\label{subsec:bindings} \section{Library Constants}\label{subsec:library_constants} \input{content/library_constants} +\section{Library Handles}\label{subsec:library_handles} +\input{content/library_handles} + \section{Environment Variables }\label{subsec:environment_variables} \input{content/environment_variables} From 4f3e6e42b0bbe911c99d8c7dea70c1f1cbd37011 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 14:37:46 -0500 Subject: [PATCH 519/583] Indexed library handles --- content/library_handles.tex | 4 +++- main_spec.tex | 2 +- utils/defs.tex | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/content/library_handles.tex b/content/library_handles.tex index 4fb7e35a3..facfe9032 100644 --- a/content/library_handles.tex +++ b/content/library_handles.tex @@ -1,3 +1,5 @@ +\TableIndex{Library Handles} + The \openshmem library provides a set of predefined named constant handles. All named constants can be used in initialization expressions or assignments, but not necessarily in array declarations or as labels in C switch statements. @@ -10,7 +12,7 @@ \tabularnewline \hline \endhead %% -\LibConstDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & +\LibHandleDecl[\CorCpp]{SHMEM\_CTX\_DEFAULT} & Handle of type \CTYPE{shmem\_ctx\_t} that corresponds to the default communication context. All point-to-point communication operations and synchronizations that do not specify a context are performed on the diff --git a/main_spec.tex b/main_spec.tex index 79993c6ee..452434b60 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -133,7 +133,7 @@ \subsection{Communication Management Routines} passed as an argument in the \Cstd \CTYPE{shmem\_ctx\_*} and type-generic API routines. API routines that do not accept a context argument operate on the default context. The default context can be used explicitly through the -\LibConstRef{SHMEM\_CTX\_DEFAULT} handle. +\LibHandleRef{SHMEM\_CTX\_DEFAULT} handle. \subsubsection{\textbf{SHMEM\_CTX\_CREATE}} \label{subsec:shmem_ctx_create} diff --git a/utils/defs.tex b/utils/defs.tex index 898f5ec06..761239dd4 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -52,17 +52,21 @@ \newcommand{\EnvVarIndex}[1]{\index{Environment Variables!#1}} \newcommand{\FuncIndex}[1]{\index{Routines!#1}} \newcommand{\LibConstIndex}[1]{\index{Constants!#1}} +\newcommand{\LibHandleIndex}[1]{\index{Handles!#1}} \newcommand{\TableIndex}[1]{\index{Tables!#1}} %% Write text and generate reference. \newcommand{\EnvVarRef}[1]{\VAR{#1}\EnvVarIndex{#1}} \newcommand{\FuncRef}[1]{\FUNC{#1}\FuncIndex{#1}} \newcommand{\LibConstRef}[1]{\CONST{#1}\LibConstIndex{#1}} +\newcommand{\LibHandleRef}[1]{\CONST{#1}\LibHandleIndex{#1}} \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \newcommand{\FuncDecl}[1]{#1\FuncIndex{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} +\newcommand{\LibHandleDecl}[2][\CorCppFor]{% + \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibHandleRef{#2} \\~}} %% \newcommand{\TYPE}{\emph{TYPE}} \newcommand{\TYPENAME}{\emph{TYPENAME}} From fc6b610505c5c04ea5021cd232d63509fed9ce33 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 17:01:13 -0500 Subject: [PATCH 520/583] Enable proper styling for listings escaped to LaTeX --- utils/defs.tex | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/utils/defs.tex b/utils/defs.tex index 761239dd4..7e49afb45 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -62,7 +62,8 @@ \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} -\newcommand{\FuncDecl}[1]{#1\FuncIndex{#1}} +\newcommand{\FuncDecl}[1]{\ListingsCurrentStyle{#1}\FuncIndex{#1}} +\newcommand{\FuncDeclParam}[1]{<{\ListingsKeywordStyle{#1}}>} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% @@ -114,6 +115,17 @@ \end{acronym} +% Grab current listings style for use in environment escape to LaTeX. +% https://tex.stackexchange.com/a/209644 +\makeatletter +\newcommand\ListingsCurrentStyle{} +\lst@AddToHook{Output}{\global\let\ListingsCurrentStyle\lst@thestyle} +\lst@AddToHook{OutputOther}{\global\let\ListingsCurrentStyle\lst@thestyle} +\newcommand\ListingsKeywordStyle{} +\lst@AddToHook{Output}{\global\let\ListingsKeywordStyle\lst@keywordstyle} +\lst@AddToHook{OutputOther}{\global\let\ListingsKeywordStyle\lst@keywordstyle} +\makeatother + % % This is used to put line numbers on plain pages. Used in draft.tex % From 49726b93518ebeefd79cb8d62bbade023fd46b1b Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 18:12:05 -0500 Subject: [PATCH 521/583] Reverted bad mbox from 856f097705f7f8cb42cffbd74f8cc010cf91a1f6 --- content/shmem_reductions.tex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 185a2bd8b..8a913e67e 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -62,7 +62,7 @@ \paragraph{SUM} Performs a sum reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| +void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); void shmem_complexf_sum_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -86,8 +86,8 @@ \paragraph{PROD} Performs a product reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| -void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); +void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); +void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_prod_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); @@ -117,8 +117,8 @@ \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, |\mbox{pSync)}| -CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, |\mbox{pSync)}| +CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{XOR} From e5fc252c4bce932b919730415687ff4f345dbf8f Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 18:12:05 -0500 Subject: [PATCH 522/583] Reverted bad mbox from 856f097705f7f8cb42cffbd74f8cc010cf91a1f6 --- content/shmem_reductions.tex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 185a2bd8b..8a913e67e 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -62,7 +62,7 @@ \paragraph{SUM} Performs a sum reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| +void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); void shmem_complexf_sum_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); @@ -86,8 +86,8 @@ \paragraph{PROD} Performs a product reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long |\mbox{*pSync);}| -void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int |\mbox{nreduce,}| int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); +void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); +void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); void shmem_double_prod_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); @@ -117,8 +117,8 @@ \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, |\mbox{pSync)}| -CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, |\mbox{pSync)}| +CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{XOR} From d41b5ab74c485cf7ff4748d35e8c80d19a195317 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 18:56:50 -0500 Subject: [PATCH 523/583] Add missing CALL on Fortran SHMEM_INFO routines --- content/shmem_info_get_name.tex | 2 +- content/shmem_info_get_version.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 776d50c5b..8b60bb43b 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -11,7 +11,7 @@ \begin{Fsynopsis} CHARACTER *(*)NAME -SHMEM_INFO_GET_NAME(NAME) +CALL SHMEM_INFO_GET_NAME(NAME) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index 49329cd09..4c97ed9b1 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -10,7 +10,7 @@ \begin{Fsynopsis} INTEGER MAJOR, MINOR -SHMEM_INFO_GET_VERSION(MAJOR, MINOR) +CALL SHMEM_INFO_GET_VERSION(MAJOR, MINOR) \end{Fsynopsis} \begin{apiarguments} From 915d81016939bf1af38a0841ab7f99456d4359bc Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Thu, 2 Nov 2017 21:36:56 -0400 Subject: [PATCH 524/583] Added missing deprecated library constants Closes #177. --- content/backmatter.tex | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6df2f137f..b02be102f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -362,6 +362,12 @@ \section{Overview}\label{subsec:dep_overview} \CONST{\_SHMEM\_MINOR\_VERSION} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MINOR\_VERSION}} \\ \hline \CONST{\_SHMEM\_MAX\_NAME\_LEN} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_MAX\_NAME\_LEN}} \\ \hline \CONST{\_SHMEM\_VENDOR\_STRING} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_VENDOR\_STRING}} \\ \hline + \CONST{\_SHMEM\_CMP\_EQ} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_EQ}} \\ \hline + \CONST{\_SHMEM\_CMP\_NE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_NE}} \\ \hline + \CONST{\_SHMEM\_CMP\_LT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LT}} \\ \hline + \CONST{\_SHMEM\_CMP\_LE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_LE}} \\ \hline + \CONST{\_SHMEM\_CMP\_GT} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GT}} \\ \hline + \CONST{\_SHMEM\_CMP\_GE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_CMP\_GE}} \\ \hline \VAR{SMA\_VERSION} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_VERSION}} \\ \hline \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline @@ -450,11 +456,14 @@ \subsection{\CONST{\_SHMEM\_*} Library Constants} The library constants \begin{center} \begin{tabular}{ll} - \CONST{\_SHMEM\_SYNC\_VALUE} & \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} \\ - \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAJOR\_VERSION} \\ - \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & \CONST{\_SHMEM\_MINOR\_VERSION} \\ - \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \CONST{\_SHMEM\_MAX\_NAME\_LEN} \\ - \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \CONST{\_SHMEM\_VENDOR\_STRING} \\ + \CONST{\_SHMEM\_SYNC\_VALUE} & \CONST{\_SHMEM\_MAX\_NAME\_LEN} \\ + \CONST{\_SHMEM\_BARRIER\_SYNC\_SIZE} & \CONST{\_SHMEM\_VENDOR\_STRING} \\ + \CONST{\_SHMEM\_BCAST\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_EQ} \\ + \CONST{\_SHMEM\_COLLECT\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_NE} \\ + \CONST{\_SHMEM\_REDUCE\_SYNC\_SIZE} & \CONST{\_SHMEM\_CMP\_LT} \\ + \CONST{\_SHMEM\_REDUCE\_MIN\_WRKDATA\_SIZE} & \CONST{\_SHMEM\_CMP\_LE} \\ + \CONST{\_SHMEM\_MAJOR\_VERSION} & \CONST{\_SHMEM\_CMP\_GT} \\ + \CONST{\_SHMEM\_MINOR\_VERSION} & \CONST{\_SHMEM\_CMP\_GE} \\ \end{tabular} \end{center} do not adhere to the \Cstd standard's reserved identifiers and the \Cpp From 04eb654de41153c2a09253b368209a1d28213046 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 21:05:15 -0500 Subject: [PATCH 525/583] Add C/C++ routine for `shmem_wait_until`: long Not yet deprecated. Related #176. Closes #184. --- content/shmem_wait.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..496257af6 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -11,6 +11,7 @@ Table \ref{p2psynctypes}. \begin{Csynopsis} +void shmem_wait_until(long *ivar, shmem_cmp_t cmp, long cmp_value); void shmem__wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a From 805ad41190e0c3809a79b44062d0b51a0e67a2b7 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 22:16:47 -0500 Subject: [PATCH 526/583] Removed redundant deprecate guards in SHMEM_CACHE --- content/shmem_cache.tex | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/shmem_cache.tex b/content/shmem_cache.tex index b3a53eab0..2360abfab 100644 --- a/content/shmem_cache.tex +++ b/content/shmem_cache.tex @@ -15,7 +15,6 @@ \end{Csynopsis} \end{DeprecateBlock} -\begin{DeprecateBlock} \begin{Fsynopsis} CALL SHMEM_CLEAR_CACHE_INV CALL SHMEM_SET_CACHE_INV @@ -23,7 +22,6 @@ CALL SHMEM_UDCFLUSH CALL SHMEM_UDCFLUSH_LINE(dest) \end{Fsynopsis} -\end{DeprecateBlock} \begin{apiarguments} From 7d3aef93054f85583480e3c04f78d4b26f8847c3 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Wed, 8 Nov 2017 22:23:47 -0500 Subject: [PATCH 527/583] Use T1 font encoding The TeX default font encoding (7-bit OT1) renders less-than and greater-than characters as upside-down exclamation mark and upside-down question mark. Use 8-bit T1 encoding which fixes this quirk. --- utils/packages.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/packages.tex b/utils/packages.tex index c29088b8b..8ff6beef6 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -1,4 +1,5 @@ \usepackage[letterpaper,top=2.5cm,bottom=2.5cm,left=2.5cm,right=2.5cm]{geometry} +\usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{graphicx} \usepackage{multicol} From 7d60f013ab30237d473f670e136bfc1300331e99 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 22:56:14 -0500 Subject: [PATCH 528/583] Added \minitab to create nested tabular --- content/backmatter.tex | 12 ++++++------ utils/defs.tex | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index b02be102f..6a5d59fac 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -319,7 +319,7 @@ \section{Overview}\label{subsec:dep_overview} \hline \textbf{Deprecated API} & \textbf{Deprecated Since} - & \shortstack{\textbf{Last Version Supported}} + & \textbf{Last Version Supported} & \textbf{Replaced By} \\ \hline \endhead @@ -336,20 +336,20 @@ \section{Overview}\label{subsec:dep_overview} \CorCpp: \FUNC{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline \CorCpp: \FUNC{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline \Fortran: \FUNC{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_inv}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_CLEAR\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline \CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_inv}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_set\_cache\_line\_inv}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_SET\_CACHE\_LINE\_INV}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH}}} & 1.3 & Current & (none) \\ \hline - \shortstack[l]{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FUNC{shmem\_udcflush\_line}} \\ \Fortran: \hyperref[subsec:shmem_cache]{\FUNC{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline \CONST{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline diff --git a/utils/defs.tex b/utils/defs.tex index 2ccfb2fe9..288080c4a 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -1,3 +1,5 @@ +\newcommand{\minitab}[2][l]{\begin{tabular}{@{}#1@{}}#2\end{tabular}} + \definecolor{ListingBG}{rgb}{0.91,0.91,0.91} \definecolor{shadecolor}{rgb}{0.92,0.92,0.92} From 0bc7b4ad54d2560aff0c59058bc2f90e92a3a5ba Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 23:09:01 -0500 Subject: [PATCH 529/583] Deprecation: Explicit C11 and C/C++ interfaces --- content/backmatter.tex | 63 +++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6a5d59fac..f1afefff6 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -372,15 +372,33 @@ \section{Overview}\label{subsec:dep_overview} \VAR{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \VAR{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \VAR{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline - \CorCpp: \FUNC{shmem\_wait} & 1.4 & Current & See ``Notes'' for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline - \CorCpp: \FUNC{shmem\_fetch} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline - \CorCpp: \FUNC{shmem\_set} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline - \CorCpp: \FUNC{shmem\_cswap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline - \CorCpp: \FUNC{shmem\_swap} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline - \CorCpp: \FUNC{shmem\_finc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline - \CorCpp: \FUNC{shmem\_inc} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline - \CorCpp: \FUNC{shmem\_fadd} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline - \CorCpp: \FUNC{shmem\_add} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline + \minitab{\CorCpp: \FUNC{shmem\_wait} + \\ \CorCpp: \FUNC{shmem\_\_wait}} + & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_fetch} + \\ \CorCpp: \FUNC{shmem\_\_fetch}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_set} + \\ \CorCpp: \FUNC{shmem\_\_set}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_cswap} + \\ \CorCpp: \FUNC{shmem\_\_cswap}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_swap} + \\ \CorCpp: \FUNC{shmem\_\_swap}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_finc} + \\ \CorCpp: \FUNC{shmem\_\_finc}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_inc} + \\ \CorCpp: \FUNC{shmem\_\_inc}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_fadd} + \\ \CorCpp: \FUNC{shmem\_\_fadd}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline + \minitab{\Cstd[11]: \FUNC{shmem\_add} + \\ \CorCpp: \FUNC{shmem\_\_add}} + & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline \end{longtable} \end{center} @@ -478,19 +496,32 @@ \subsection{\VAR{SMA\_*} Environment Variables}\label{subsec:deprecate-sma-env} \shmemprefix{} as the standard prefix for all environment variables. \subsection{\CorCpp: \FUNC{shmem\_wait}} -The \CorCpp interface for \FUNC{shmem\_wait} was identified as unintuitive with respect to +The \CorCpp interface for \FUNC{shmem\_wait} and \FUNC{shmem\_\_wait} +was identified as unintuitive with respect to the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is \CONST{SHMEM\_CMP\_NE}, the \FUNC{shmem\_wait} interface was deprecated in favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation explicit and better communicates the developer's intent. -\subsection{\CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \FUNC{shmem\_cswap}, - \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, - \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} -The \CorCpp interfaces for \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, -\FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, -\FUNC{shmem\_fadd}, and \FUNC{shmem\_add} were deprecated and replaced with +\subsection{\Cstd[11] and \CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, + \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, + \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} +The \Cstd[11] and \CorCpp interfaces for +\begin{center} +\begin{tabular}{ll} + \Cstd[11]: & \CorCpp: \\ + \FUNC{shmem\_fetch} & \FUNC{shmem\_\_fetch} \\ + \FUNC{shmem\_set} & \FUNC{shmem\_\_set} \\ + \FUNC{shmem\_cswap} & \FUNC{shmem\_\_cswap} \\ + \FUNC{shmem\_swap} & \FUNC{shmem\_\_swap} \\ + \FUNC{shmem\_finc} & \FUNC{shmem\_\_finc} \\ + \FUNC{shmem\_inc} & \FUNC{shmem\_\_inc} \\ + \FUNC{shmem\_fadd} & \FUNC{shmem\_\_fadd} \\ + \FUNC{shmem\_add} & \FUNC{shmem\_\_add} \\ +\end{tabular} +\end{center} +were deprecated and replaced with similarly named interfaces within the \FUNC{shmem\_atomic\_*} namespace in order to more clearly identify these calls as performing atomic operations. In addition, the abbreviated names ``cswap'', ``finc'', and ``fadd'' were From 579e6bfa6a6ff310ecad77eb59c87d31fd220e5e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 23:21:03 -0500 Subject: [PATCH 530/583] Reword --- content/backmatter.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index f1afefff6..73ba63e19 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -64,8 +64,8 @@ \section*{Incorporating OpenSHMEM into Programs}\label{sec:writing_programs} remote destination in \hyperref[subsec:shmem_put]{\FUNC{shmem\_put}}. The \VAR{static} keyword makes the \VAR{dest} array symmetric on all \acp{PE}. -%% FIXME: The following sentence is not *technically* correct. -Each \ac{PE} is able to transfer data to the \dest{} array by simply specifying +Each \ac{PE} is able to transfer data to a remote \dest{} array by simply +specifying to an OpenSHMEM routine such as \hyperref[subsec:shmem_put]{\FUNC{shmem\_put}} the local address of the symmetric data object that will receive the data. This local address resolution aids programmability because the address of the \dest{} need not be exchanged with the active side (\ac{PE} \CONST{0}) prior to From 660a828890fd3cf9ca997dda4e79ec2b4b546f04 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 01:15:38 -0500 Subject: [PATCH 531/583] Added another argument to \Func{Index,Ref,Decl} for subcategorization --- content/backmatter.tex | 80 +++++++++++++++++------------------ content/shmem_atomic_add.tex | 12 +++--- content/shmem_barrier.tex | 4 +- content/shmem_barrier_all.tex | 4 +- content/shmem_broadcast.tex | 12 +++--- utils/defs.tex | 9 ++-- 6 files changed, 61 insertions(+), 60 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6cb12ee1b..8c6c8f4c1 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -325,33 +325,33 @@ \section{Overview}\label{subsec:dep_overview} \hline \endhead Header Directory: \hyperref[subsec:dep_rationale:mpp]{\HEADER{mpp}} & 1.1 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:start_pes]{\FuncRef{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline - \Fortran: \hyperref[subsec:start_pes]{\FuncRef{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline + \CorCpp: \hyperref[subsec:start_pes]{\FuncRef{\CorCpp}{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \Fortran: \hyperref[subsec:start_pes]{\FuncRef{\Fortran}{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline \hyperref[subsec:start_pes]{Implicit finalization} & 1.2 & Current & \hyperref[subsec:shmem_finalize]{\FUNC{shmem\_finalize}} \\ \hline - \CorCpp: \FuncRef{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline - \CorCpp: \FuncRef{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline - \Fortran: \FuncRef{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline - \Fortran: \FuncRef{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline - \CorCpp: \FuncRef{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline - \CorCpp: \FuncRef{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline - \CorCpp: \FuncRef{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline - \CorCpp: \FuncRef{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \Fortran: \FuncRef{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_CLEAR\_CACHE\_INV}}} + \CorCpp: \FuncRef{\CorCpp}{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \CorCpp: \FuncRef{\CorCpp}{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \Fortran: \FuncRef{\Fortran}{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline + \Fortran: \FuncRef{\Fortran}{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline + \CorCpp: \FuncRef{\CorCpp}{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \CorCpp: \FuncRef{\CorCpp}{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \CorCpp: \FuncRef{\CorCpp}{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \CorCpp: \FuncRef{\CorCpp}{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \Fortran: \FuncRef{\Fortran}{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_clear\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_CLEAR\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_INV}}} + \CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_set\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_SET\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_line\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_LINE\_INV}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_set\_cache\_line\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_SET\_CACHE\_LINE\_INV}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_udcflush}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_UDCFLUSH}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush\_line}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH\_LINE}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_udcflush\_line}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline \LibConstRef{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline \LibConstRef{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline @@ -373,32 +373,32 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline - \minitab{\CorCpp: \FuncRef{shmem\_wait} - \\ \CorCpp: \FuncRef{shmem\_\_wait}} + \minitab{\CorCpp: \FuncRef{\Cstd[11]}{shmem\_wait} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_wait}} & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_fetch} - \\ \CorCpp: \FuncRef{shmem\_\_fetch}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fetch} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_fetch}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_set} - \\ \CorCpp: \FuncRef{shmem\_\_set}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_set} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_set}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_cswap} - \\ \CorCpp: \FuncRef{shmem\_\_cswap}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_cswap} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_cswap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_swap} - \\ \CorCpp: \FuncRef{shmem\_\_swap}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_swap} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_swap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_finc} - \\ \CorCpp: \FuncRef{shmem\_\_finc}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_finc} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_finc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_inc} - \\ \CorCpp: \FuncRef{shmem\_\_inc}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_inc} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_inc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_fadd} - \\ \CorCpp: \FuncRef{shmem\_\_fadd}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fadd} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_fadd}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{shmem\_add} - \\ \CorCpp: \FuncRef{shmem\_\_add}} + \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_add} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_add}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline \end{longtable} diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 29da96566..7ab4f7997 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void @\FuncDecl{shmem\_atomic\_add}@(TYPE *dest, TYPE value, int pe); -void @\FuncDecl{shmem\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\Cstd[11]}{shmem\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\Cstd[11]}{shmem\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -void @\FuncDecl{shmem\_\_atomic\_add}@(TYPE *dest, TYPE value, int pe); -void @\FuncDecl{shmem\_ctx\_\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\CorCpp}{shmem\_\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\CorCpp}{shmem\_ctx\_\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 value_i4 -CALL @\FuncDecl{SHMEM\_INT4\_ADD}@(dest, value_i4, pe) +CALL @\FuncDecl{\Fortran}{SHMEM\_INT4\_ADD}@(dest, value_i4, pe) INTEGER*8 value_i8 -CALL @\FuncDecl{SHMEM\_INT8\_ADD}@(dest, value_i8, pe) +CALL @\FuncDecl{\Fortran}{SHMEM\_INT8\_ADD}@(dest, value_i8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index c5f7adea5..c6666e977 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -6,13 +6,13 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{shmem\_barrier}@(int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{\CorCpp}{shmem\_barrier}@(int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BARRIER_SYNC_SIZE) -CALL @\FuncDecl{SHMEM\_BARRIER}@(PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{\Fortran}{SHMEM\_BARRIER}@(PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 8392054bf..59a3d213f 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -7,11 +7,11 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{shmem\_barrier\_all}@(void); +void @\FuncDecl{\CorCpp}{shmem\_barrier\_all}@(void); \end{Csynopsis} \begin{Fsynopsis} -CALL @\FuncDecl{SHMEM\_BARRIER\_ALL}@ +CALL @\FuncDecl{\Fortran}{SHMEM\_BARRIER\_ALL}@ \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index 06a9bec5f..b6aae114a 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -6,17 +6,17 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{shmem\_broadcast32}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); -void @\FuncDecl{shmem\_broadcast64}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{\CorCpp}{shmem\_broadcast32}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{\CorCpp}{shmem\_broadcast64}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER nelems, PE_root, PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BCAST_SYNC_SIZE) -CALL @\FuncDecl{SHMEM\_BROADCAST4}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL @\FuncDecl{SHMEM\_BROADCAST8}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL @\FuncDecl{SHMEM\_BROADCAST32}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) -CALL @\FuncDecl{SHMEM\_BROADCAST64}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST4}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST8}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST32}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST64}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/utils/defs.tex b/utils/defs.tex index acb3b6d89..65e587c33 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -52,25 +52,26 @@ \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} %% Generate indexed reference. \newcommand{\EnvVarIndex}[1]{\index{Environment Variables!#1}} -\newcommand{\FuncIndex}[1]{\index{Routines!#1}} +\newcommand{\FuncIndex}[2]{\index{Routines --- #1!#2}} \newcommand{\LibConstIndex}[1]{\index{Constants!#1}} \newcommand{\LibHandleIndex}[1]{\index{Handles!#1}} \newcommand{\TableIndex}[1]{\index{Tables!#1}} %% Write text and generate reference. \newcommand{\EnvVarRef}[1]{\VAR{#1}\EnvVarIndex{#1}} -\newcommand{\FuncRef}[1]{\FUNC{#1}\FuncIndex{#1}} +\newcommand{\FuncRef}[2]{\FUNC{#2}\FuncIndex{#1}{#2}} \newcommand{\LibConstRef}[1]{\CONST{#1}\LibConstIndex{#1}} \newcommand{\LibHandleRef}[1]{\CONST{#1}\LibHandleIndex{#1}} \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} -\newcommand{\FuncDecl}[1]{\ListingsCurrentStyle{#1}\FuncIndex{#1}} -\newcommand{\FuncDeclParam}[1]{<{\ListingsKeywordStyle{#1}}>} +\newcommand{\FuncDecl}[2]{\ListingsCurrentStyle{#2}\FuncIndex{#1}{#2}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibHandleRef{#2} \\~}} %% +\newcommand{\FuncParam}[1]{<{\ListingsKeywordStyle{#1}}>} +%% \newcommand{\TYPE}{\emph{TYPE}} \newcommand{\TYPENAME}{\emph{TYPENAME}} \newcommand{\SIZE}{\emph{SIZE}} From 9dea7f04bed06fb1959d0334c9ca106de6f3f748 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 01:19:16 -0500 Subject: [PATCH 532/583] Used \FuncParam on TYPENAME --- content/backmatter.tex | 36 ++++++++++++++++++------------------ content/shmem_atomic_add.tex | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 8c6c8f4c1..2c1148818 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -374,31 +374,31 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline \minitab{\CorCpp: \FuncRef{\Cstd[11]}{shmem\_wait} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_wait}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_wait}} & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fetch} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_fetch}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fetch}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_set} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_set}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_set}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_cswap} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_cswap}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_cswap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_swap} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_swap}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_swap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_finc} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_finc}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_finc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_inc} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_inc}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_inc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fadd} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_fadd}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fadd}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_add} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\_add}} + \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_add}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline \end{longtable} @@ -497,7 +497,7 @@ \subsection{\VAR{SMA\_*} Environment Variables}\label{subsec:deprecate-sma-env} \shmemprefix{} as the standard prefix for all environment variables. \subsection{\CorCpp: \FUNC{shmem\_wait}} -The \CorCpp interface for \FUNC{shmem\_wait} and \FUNC{shmem\_\_wait} +The \CorCpp interface for \FUNC{shmem\_wait} and \FUNC{shmem\_\FuncParam{TYPENAME}\_wait} was identified as unintuitive with respect to the comparison operation it performed. As \FUNC{shmem\_wait} can be trivially replaced by \FUNC{shmem\_wait\_until} where \VAR{cmp} is @@ -512,14 +512,14 @@ \subsection{\Cstd[11] and \CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, \begin{center} \begin{tabular}{ll} \Cstd[11]: & \CorCpp: \\ - \FUNC{shmem\_fetch} & \FUNC{shmem\_\_fetch} \\ - \FUNC{shmem\_set} & \FUNC{shmem\_\_set} \\ - \FUNC{shmem\_cswap} & \FUNC{shmem\_\_cswap} \\ - \FUNC{shmem\_swap} & \FUNC{shmem\_\_swap} \\ - \FUNC{shmem\_finc} & \FUNC{shmem\_\_finc} \\ - \FUNC{shmem\_inc} & \FUNC{shmem\_\_inc} \\ - \FUNC{shmem\_fadd} & \FUNC{shmem\_\_fadd} \\ - \FUNC{shmem\_add} & \FUNC{shmem\_\_add} \\ + \FUNC{shmem\_fetch} & \FUNC{shmem\_\FuncParam{TYPENAME}\_fetch} \\ + \FUNC{shmem\_set} & \FUNC{shmem\_\FuncParam{TYPENAME}\_set} \\ + \FUNC{shmem\_cswap} & \FUNC{shmem\_\FuncParam{TYPENAME}\_cswap} \\ + \FUNC{shmem\_swap} & \FUNC{shmem\_\FuncParam{TYPENAME}\_swap} \\ + \FUNC{shmem\_finc} & \FUNC{shmem\_\FuncParam{TYPENAME}\_finc} \\ + \FUNC{shmem\_inc} & \FUNC{shmem\_\FuncParam{TYPENAME}\_inc} \\ + \FUNC{shmem\_fadd} & \FUNC{shmem\_\FuncParam{TYPENAME}\_fadd} \\ + \FUNC{shmem\_add} & \FUNC{shmem\_\FuncParam{TYPENAME}\_add} \\ \end{tabular} \end{center} were deprecated and replaced with diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 7ab4f7997..20aea32c2 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -12,8 +12,8 @@ Table~\ref{stdamotypes}. \begin{Csynopsis} -void @\FuncDecl{\CorCpp}{shmem\_\_atomic\_add}@(TYPE *dest, TYPE value, int pe); -void @\FuncDecl{\CorCpp}{shmem\_ctx\_\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{\CorCpp}{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. From 888af405e0302a4cefd59c104b9e540c71d24a7d Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 01:29:07 -0500 Subject: [PATCH 533/583] Indexed deprecated atomics --- content/shmem_atomic_add.tex | 4 +++- content/shmem_atomic_compare_swap.tex | 4 +++- content/shmem_atomic_fetch.tex | 4 +++- content/shmem_atomic_fetch_add.tex | 4 +++- content/shmem_atomic_fetch_inc.tex | 4 +++- content/shmem_atomic_inc.tex | 5 ++++- content/shmem_atomic_set.tex | 4 +++- content/shmem_atomic_swap.tex | 4 +++- 8 files changed, 25 insertions(+), 8 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 20aea32c2..460540453 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -59,7 +59,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_add} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_add}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_add} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_add}. } diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index d980bb1eb..d85d249f1 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -65,7 +65,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_cswap} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_cswap}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_cswap} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_compare\_swap}. } diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 015c6a981..53c5a1161 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -54,7 +54,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_fetch} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_fetch}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fetch} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_fetch}. } diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index 20ae949e3..631e02a64 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -66,7 +66,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_fadd} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_fadd}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fadd} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_fetch\_add}. } diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 12c10d1b5..06ddafd72 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -61,7 +61,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_finc} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_finc}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_finc} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_fetch\_inc}. } diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index 61065123b..7f6d44b4b 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -56,7 +56,10 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_inc} has been deprecated. + As of \openshmem[1.4], + \FUNC{shmem\_inc} + \FuncRef{\Cstd[11]}{shmem\_inc}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_inc} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_inc}. } diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 2d0f62f5b..5f74ce44b 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -53,7 +53,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_set} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_set}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_set} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_set}. } diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index 160635e39..b9059777b 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -65,7 +65,9 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_swap} has been deprecated. + As of \openshmem[1.4], + \FuncRef{\Cstd[11]}{shmem\_swap}\FuncIndex{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_swap} + has been deprecated. Its behavior and call signature are identical to the replacement interface, \FUNC{shmem\_atomic\_swap}. } From ea3ace4f88c95754efe10c5b1b8f6963d00fafc5 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 01:49:07 -0500 Subject: [PATCH 534/583] Whoops --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 2c1148818..633a45b5d 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -373,7 +373,7 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline - \minitab{\CorCpp: \FuncRef{\Cstd[11]}{shmem\_wait} + \minitab{\CorCpp: \FuncRef{\CorCpp}{shmem\_wait} \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_wait}} & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fetch} From 11bf892ed1469c836d728184a716975836ad48ca Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 02:59:14 -0500 Subject: [PATCH 535/583] Force subcategorization with \FuncDecl --- content/shmem_atomic_add.tex | 12 ++++++------ content/shmem_barrier.tex | 4 ++-- content/shmem_barrier_all.tex | 4 ++-- content/shmem_broadcast.tex | 12 ++++++------ utils/defs.tex | 9 ++++++++- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 460540453..402a7b133 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void @\FuncDecl{\Cstd[11]}{shmem\_atomic\_add}@(TYPE *dest, TYPE value, int pe); -void @\FuncDecl{\Cstd[11]}{shmem\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -void @\FuncDecl{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_atomic\_add}@(TYPE *dest, TYPE value, int pe); -void @\FuncDecl{\CorCpp}{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_add}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 value_i4 -CALL @\FuncDecl{\Fortran}{SHMEM\_INT4\_ADD}@(dest, value_i4, pe) +CALL @\FuncDecl{SHMEM\_INT4\_ADD}@(dest, value_i4, pe) INTEGER*8 value_i8 -CALL @\FuncDecl{\Fortran}{SHMEM\_INT8\_ADD}@(dest, value_i8, pe) +CALL @\FuncDecl{SHMEM\_INT8\_ADD}@(dest, value_i8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier.tex b/content/shmem_barrier.tex index c6666e977..c5f7adea5 100644 --- a/content/shmem_barrier.tex +++ b/content/shmem_barrier.tex @@ -6,13 +6,13 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{\CorCpp}{shmem\_barrier}@(int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_barrier}@(int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BARRIER_SYNC_SIZE) -CALL @\FuncDecl{\Fortran}{SHMEM\_BARRIER}@(PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BARRIER}@(PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_barrier_all.tex b/content/shmem_barrier_all.tex index 59a3d213f..8392054bf 100644 --- a/content/shmem_barrier_all.tex +++ b/content/shmem_barrier_all.tex @@ -7,11 +7,11 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{\CorCpp}{shmem\_barrier\_all}@(void); +void @\FuncDecl{shmem\_barrier\_all}@(void); \end{Csynopsis} \begin{Fsynopsis} -CALL @\FuncDecl{\Fortran}{SHMEM\_BARRIER\_ALL}@ +CALL @\FuncDecl{SHMEM\_BARRIER\_ALL}@ \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_broadcast.tex b/content/shmem_broadcast.tex index b6aae114a..06a9bec5f 100644 --- a/content/shmem_broadcast.tex +++ b/content/shmem_broadcast.tex @@ -6,17 +6,17 @@ \begin{apidefinition} \begin{Csynopsis} -void @\FuncDecl{\CorCpp}{shmem\_broadcast32}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); -void @\FuncDecl{\CorCpp}{shmem\_broadcast64}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_broadcast32}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_broadcast64}@(void *dest, const void *source, size_t nelems, int PE_root, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER nelems, PE_root, PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_BCAST_SYNC_SIZE) -CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST4}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST8}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) -CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST32}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) -CALL @\FuncDecl{\Fortran}{SHMEM\_BROADCAST64}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST4}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST8}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST32}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) +CALL @\FuncDecl{SHMEM\_BROADCAST64}@(dest, source, nelems, PE_root, PE_start, logPE_stride, PE_size,pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/utils/defs.tex b/utils/defs.tex index 65e587c33..a67091665 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -64,7 +64,8 @@ \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} -\newcommand{\FuncDecl}[2]{\ListingsCurrentStyle{#2}\FuncIndex{#1}{#2}} +\providecommand{\FuncDecl}{} +\newcommand{\FuncDeclImpl}[2]{\ListingsCurrentStyle{#2}\FuncIndex{#1}{#2}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% @@ -397,6 +398,7 @@ \lstnewenvironment{Cpp11synopsis} { + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Cpp[11]}{##1}} \textbf{C++11:} \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -405,6 +407,7 @@ \lstnewenvironment{C11synopsis} { + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Cstd[11]}{##1}} \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -414,6 +417,7 @@ \lstnewenvironment{CsynopsisCol} { + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, @@ -423,6 +427,7 @@ \lstnewenvironment{Csynopsis} { + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -432,6 +437,7 @@ \lstnewenvironment{CsynopsisST} { + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, @@ -444,6 +450,7 @@ \lstnewenvironment{Fsynopsis} { \deprecationstart \\ + \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Fortran}{##1}} \textbf{FORTRAN:} \lstset{language={Fortran}, backgroundcolor=\color{gray}, lineskip=3pt, escapechar=@, From 7121852a3943019d2a8156a4991986a5d76e37d9 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 03:10:13 -0500 Subject: [PATCH 536/583] Indexed all routines --- content/shmem_addr_accessible.tex | 4 +- content/shmem_alltoall.tex | 8 +- content/shmem_alltoalls.tex | 8 +- content/shmem_atomic_and.tex | 8 +- content/shmem_atomic_compare_swap.tex | 12 +-- content/shmem_atomic_fetch.tex | 16 +-- content/shmem_atomic_fetch_add.tex | 12 +-- content/shmem_atomic_fetch_and.tex | 8 +- content/shmem_atomic_fetch_inc.tex | 12 +-- content/shmem_atomic_fetch_or.tex | 8 +- content/shmem_atomic_fetch_xor.tex | 8 +- content/shmem_atomic_inc.tex | 12 +-- content/shmem_atomic_or.tex | 8 +- content/shmem_atomic_set.tex | 16 +-- content/shmem_atomic_swap.tex | 18 ++-- content/shmem_atomic_xor.tex | 8 +- content/shmem_cache.tex | 22 ++-- content/shmem_calloc.tex | 2 +- content/shmem_collect.tex | 24 ++--- content/shmem_ctx_create.tex | 2 +- content/shmem_ctx_destroy.tex | 2 +- content/shmem_fence.tex | 6 +- content/shmem_finalize.tex | 4 +- content/shmem_g.tex | 8 +- content/shmem_get.tex | 40 +++---- content/shmem_get_nbi.tex | 40 +++---- content/shmem_global_exit.tex | 6 +- content/shmem_iget.tex | 32 +++--- content/shmem_info_get_name.tex | 4 +- content/shmem_info_get_version.tex | 4 +- content/shmem_init.tex | 4 +- content/shmem_init_thread.tex | 2 +- content/shmem_iput.tex | 32 +++--- content/shmem_lock.tex | 12 +-- content/shmem_malloc.tex | 8 +- content/shmem_my_pe.tex | 4 +- content/shmem_n_pes.tex | 4 +- content/shmem_p.tex | 8 +- content/shmem_pe_accessible.tex | 2 +- content/shmem_ptr.tex | 4 +- content/shmem_put.tex | 40 +++---- content/shmem_put_nbi.tex | 40 +++---- content/shmem_query_thread.tex | 2 +- content/shmem_quiet.tex | 6 +- content/shmem_reductions.tex | 148 +++++++++++++------------- content/shmem_sync.tex | 2 +- content/shmem_sync_all.tex | 2 +- content/shmem_test.tex | 4 +- content/shmem_wait.tex | 20 ++-- content/shpalloc.tex | 2 +- content/shpclmove.tex | 2 +- content/shpdealloc.tex | 2 +- content/start_pes.tex | 4 +- 53 files changed, 358 insertions(+), 358 deletions(-) diff --git a/content/shmem_addr_accessible.tex b/content/shmem_addr_accessible.tex index 064a0d865..81e4d78dc 100644 --- a/content/shmem_addr_accessible.tex +++ b/content/shmem_addr_accessible.tex @@ -6,13 +6,13 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_addr_accessible(const void *addr, int pe); +int @\FuncDecl{shmem\_addr\_accessible}@(const void *addr, int pe); \end{Csynopsis} \begin{Fsynopsis} LOGICAL LOG, SHMEM_ADDR_ACCESSIBLE INTEGER pe -LOG = SHMEM_ADDR_ACCESSIBLE(addr, pe) +LOG = @\FuncDecl{SHMEM\_ADDR\_ACCESSIBLE}@(addr, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_alltoall.tex b/content/shmem_alltoall.tex index 2b179e305..35e3d5108 100644 --- a/content/shmem_alltoall.tex +++ b/content/shmem_alltoall.tex @@ -6,15 +6,15 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_alltoall32(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_alltoall64(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_alltoall32}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_alltoall64}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER pSync(SHMEM_ALLTOALL_SYNC_SIZE) INTEGER PE_start, logPE_stride, PE_size, nelems -CALL SHMEM_ALLTOALL32(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_ALLTOALL64(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_ALLTOALL32}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_ALLTOALL64}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_alltoalls.tex b/content/shmem_alltoalls.tex index f1559d094..0f2aa47da 100644 --- a/content/shmem_alltoalls.tex +++ b/content/shmem_alltoalls.tex @@ -6,16 +6,16 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_alltoalls32(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_alltoalls64(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_alltoalls32}@(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_alltoalls64}@(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER pSync(SHMEM_ALLTOALLS_SYNC_SIZE) INTEGER dst, sst, PE_start, logPE_stride, PE_size INTEGER nelems -CALL SHMEM_ALLTOALLS32(dest, source, dst, sst, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_ALLTOALLS64(dest, source, dst, sst, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_ALLTOALLS32}@(dest, source, dst, sst, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_ALLTOALLS64}@(dest, source, dst, sst, nelems, PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_and.tex b/content/shmem_atomic_and.tex index 5bfafdbb4..d356b5d6b 100644 --- a/content/shmem_atomic_and.tex +++ b/content/shmem_atomic_and.tex @@ -6,15 +6,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_and(TYPE *dest, TYPE value, int pe); -void shmem_atomic_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_and}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_and}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__atomic_and(TYPE *dest, TYPE value, int pe); -void shmem_ctx__atomic_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_and}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_and}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index d85d249f1..49a9a6048 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_compare_swap(TYPE *dest, TYPE cond, TYPE value, int pe); -TYPE shmem_atomic_compare_swap(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_compare\_swap}@(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_compare\_swap}@(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_compare_swap(TYPE *dest, TYPE cond, TYPE value, int pe); -TYPE shmem_ctx__atomic_compare_swap(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_compare\_swap}@(TYPE *dest, TYPE cond, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_compare\_swap}@(shmem_ctx_t ctx, TYPE *dest, TYPE cond, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_CSWAP, cond_i4, value_i4, ires_i4 -ires_i4 = SHMEM_INT4_CSWAP(dest, cond_i4, value_i4, pe) +ires\_i4 = @\FuncDecl{SHMEM\_INT4\_CSWAP}@(dest, cond_i4, value_i4, pe) INTEGER*8 SHMEM_INT8_CSWAP, cond_i8, value_i8, ires_i8 -ires_i8 = SHMEM_INT8_CSWAP(dest, cond_i8, value_i8, pe) +ires\_i8 = @\FuncDecl{SHMEM\_INT8\_CSWAP}@(dest, cond_i8, value_i8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 53c5a1161..aabe2be26 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch(const TYPE *dest, int pe); -TYPE shmem_atomic_fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch}@(const TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch}@(shmem_ctx_t ctx, const TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table~\ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch(const TYPE *dest, int pe); -TYPE shmem_ctx__atomic_fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch}@(const TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch}@(shmem_ctx_t ctx, const TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. @@ -21,13 +21,13 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FETCH, ires_i4 -ires_i4 = SHMEM_INT4_FETCH(dest, pe) +ires\_i4 = @\FuncDecl{SHMEM\_INT4\_FETCH}@(dest, pe) INTEGER*8 SHMEM_INT8_FETCH, ires_i8 -ires_i8 = SHMEM_INT8_FETCH(dest, pe) +ires\_i8 = @\FuncDecl{SHMEM\_INT8\_FETCH}@(dest, pe) REAL*4 SHMEM_REAL4_FETCH, res_r4 -res_r4 = SHMEM_REAL4_FETCH(dest, pe) +res\_r4 = @\FuncDecl{SHMEM\_REAL4\_FETCH}@(dest, pe) REAL*8 SHMEM_REAL8_FETCH, res_r8 -res_r8 = SHMEM_REAL8_FETCH(dest, pe) +res\_r8 = @\FuncDecl{SHMEM\_REAL8\_FETCH}@(dest, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index 631e02a64..61cc783dc 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch_add(TYPE *dest, TYPE value, int pe); -TYPE shmem_atomic_fetch_add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_add}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch_add(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__atomic_fetch_add(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch\_add}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch\_add}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FADD, ires_i4, value_i4 -ires_i4 = SHMEM_INT4_FADD(dest, value_i4, pe) +ires\_i4 = @\FuncDecl{SHMEM\_INT4\_FADD}@(dest, value_i4, pe) INTEGER*8 SHMEM_INT8_FADD, ires_i8, value_i8 -ires_i8 = SHMEM_INT8_FADD(dest, value_i8, pe) +ires\_i8 = @\FuncDecl{SHMEM\_INT8\_FADD}@(dest, value_i8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_fetch_and.tex b/content/shmem_atomic_fetch_and.tex index 15c37cf13..63b53b27e 100644 --- a/content/shmem_atomic_fetch_and.tex +++ b/content/shmem_atomic_fetch_and.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch_and(TYPE *dest, TYPE value, int pe); -TYPE shmem_atomic_fetch_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_and}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_and}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch_and(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__atomic_fetch_and(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch\_and}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch\_and}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 06ddafd72..c138eac50 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch_inc(TYPE *dest, int pe); -TYPE shmem_atomic_fetch_inc(shmem_ctx_t ctx, TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_inc}@(TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_inc}@(shmem_ctx_t ctx, TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch_inc(TYPE *dest, int pe); -TYPE shmem_ctx__atomic_fetch_inc(shmem_ctx_t ctx, TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch\_inc}@(TYPE *dest, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch\_inc}@(shmem_ctx_t ctx, TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. @@ -21,9 +21,9 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FINC, ires_i4 -ires_i4 = SHMEM_INT4_FINC(dest, pe) +ires\_i4 = @\FuncDecl{SHMEM\_INT4\_FINC}@(dest, pe) INTEGER*8 SHMEM_INT8_FINC, ires_i8 -ires_i8 = SHMEM_INT8_FINC(dest, pe) +ires\_i8 = @\FuncDecl{SHMEM\_INT8\_FINC}@(dest, pe) \end{Fsynopsis} diff --git a/content/shmem_atomic_fetch_or.tex b/content/shmem_atomic_fetch_or.tex index d4574d708..23892b555 100644 --- a/content/shmem_atomic_fetch_or.tex +++ b/content/shmem_atomic_fetch_or.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch_or(TYPE *dest, TYPE value, int pe); -TYPE shmem_atomic_fetch_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_or}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_or}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch_or(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__atomic_fetch_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch\_or}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch\_or}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_atomic_fetch_xor.tex b/content/shmem_atomic_fetch_xor.tex index 05b1d0efa..1a36b4bb8 100644 --- a/content/shmem_atomic_fetch_xor.tex +++ b/content/shmem_atomic_fetch_xor.tex @@ -6,15 +6,15 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch_xor(TYPE *dest, TYPE value, int pe); -TYPE shmem_atomic_fetch_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_xor}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_fetch\_xor}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch_xor(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__atomic_fetch_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_fetch\_xor}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_fetch\_xor}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index 7f6d44b4b..4bfd48532 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -5,23 +5,23 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_inc(TYPE *dest, int pe); -void shmem_atomic_inc(shmem_ctx_t ctx, TYPE *dest, int pe); +void @\FuncDecl{shmem\_atomic\_inc}@(TYPE *dest, int pe); +void @\FuncDecl{shmem\_atomic\_inc}@(shmem_ctx_t ctx, TYPE *dest, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{AMO} types specified by Table~\ref{stdamotypes}. \begin{Csynopsis} -void shmem__atomic_inc(TYPE *dest, int pe); -void shmem_ctx__atomic_inc(shmem_ctx_t ctx, TYPE *dest, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_inc}@(TYPE *dest, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_inc}@(shmem_ctx_t ctx, TYPE *dest, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. \begin{Fsynopsis} INTEGER pe -CALL SHMEM_INT4_INC(dest, pe) -CALL SHMEM_INT8_INC(dest, pe) +CALL @\FuncDecl{SHMEM\_INT4\_INC}@(dest, pe) +CALL @\FuncDecl{SHMEM\_INT8\_INC}@(dest, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_or.tex b/content/shmem_atomic_or.tex index 42b16037e..b53c6bd9f 100644 --- a/content/shmem_atomic_or.tex +++ b/content/shmem_atomic_or.tex @@ -6,15 +6,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_or(TYPE *dest, TYPE value, int pe); -void shmem_atomic_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_or}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_or}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__atomic_or(TYPE *dest, TYPE value, int pe); -void shmem_ctx__atomic_or(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_or}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_or}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 5f74ce44b..dc34acbb1 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -5,15 +5,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_set(TYPE *dest, TYPE value, int pe); -void shmem_atomic_set(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_set}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_set}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table~\ref{extamotypes}. \begin{Csynopsis} -void shmem__atomic_set(TYPE *dest, TYPE value, int pe); -void shmem_ctx__atomic_set(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_set}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_set}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. @@ -21,13 +21,13 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_SET, value_i4 -CALL SHMEM_INT4_SET(dest, value_i4, pe) +CALL @\FuncDecl{SHMEM\_INT4\_SET}@(dest, value_i4, pe) INTEGER*8 SHMEM_INT8_SET, value_i8 -CALL SHMEM_INT8_SET(dest, value_i8, pe) +CALL @\FuncDecl{SHMEM\_INT8\_SET}@(dest, value_i8, pe) REAL*4 SHMEM_REAL4_SET, value_r4 -CALL SHMEM_REAL4_SET(dest, value_r4, pe) +CALL @\FuncDecl{SHMEM\_REAL4\_SET}@(dest, value_r4, pe) REAL*8 SHMEM_REAL8_SET, value_r8 -CALL SHMEM_REAL8_SET(dest, value_r8, pe) +CALL @\FuncDecl{SHMEM\_REAL8\_SET}@(dest, value_r8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index b9059777b..2f27664a2 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -5,28 +5,28 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_swap(TYPE *dest, TYPE value, int pe); -TYPE shmem_atomic_swap(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_swap}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_atomic\_swap}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table \ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_swap(TYPE *dest, TYPE value, int pe); -TYPE shmem_ctx__atomic_swap(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_swap}@(TYPE *dest, TYPE value, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_swap}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. \begin{Fsynopsis} INTEGER SHMEM_SWAP, value, pe -ires = SHMEM_SWAP(dest, value, pe) +ires = @\FuncDecl{SHMEM\_SWAP}@(dest, value, pe) INTEGER*4 SHMEM_INT4_SWAP, value_i4, ires_i4 -ires_i4 = SHMEM_INT4_SWAP(dest, value_i4, pe) +ires\_i4 = @\FuncDecl{SHMEM\_INT4\_SWAP}@(dest, value_i4, pe) INTEGER*8 SHMEM_INT8_SWAP, value_i8, ires_i8 -ires_i8 = SHMEM_INT8_SWAP(dest, value_i8, pe) +ires\_i8 = @\FuncDecl{SHMEM\_INT8\_SWAP}@(dest, value_i8, pe) REAL*4 SHMEM_REAL4_SWAP, value_r4, res_r4 -res_r4 = SHMEM_REAL4_SWAP(dest, value_r4, pe) +res\_r4 = @\FuncDecl{SHMEM\_REAL4\_SWAP}@(dest, value_r4, pe) REAL*8 SHMEM_REAL8_SWAP, value_r8, res_r8 -res_r8 = SHMEM_REAL8_SWAP(dest, value_r8, pe) +res\_r8 = @\FuncDecl{SHMEM\_REAL8\_SWAP}@(dest, value_r8, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_atomic_xor.tex b/content/shmem_atomic_xor.tex index 2d7fe5a57..d5aefba3c 100644 --- a/content/shmem_atomic_xor.tex +++ b/content/shmem_atomic_xor.tex @@ -6,15 +6,15 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_atomic_xor(TYPE *dest, TYPE value, int pe); -void shmem_atomic_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_xor}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_atomic\_xor}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the bitwise \ac{AMO} types specified by Table~\ref{bitamotypes}. \begin{Csynopsis} -void shmem__atomic_xor(TYPE *dest, TYPE value, int pe); -void shmem_ctx__atomic_xor(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_atomic\_xor}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_atomic\_xor}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the bitwise \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{bitamotypes}. diff --git a/content/shmem_cache.tex b/content/shmem_cache.tex index 2360abfab..6a0f0744a 100644 --- a/content/shmem_cache.tex +++ b/content/shmem_cache.tex @@ -6,21 +6,21 @@ \begin{DeprecateBlock} \begin{Csynopsis} -void shmem_clear_cache_inv(void); -void shmem_set_cache_inv(void); -void shmem_clear_cache_line_inv(void *dest); -void shmem_set_cache_line_inv(void *dest); -void shmem_udcflush(void); -void shmem_udcflush_line(void *dest); +void @\FuncDecl{shmem\_clear\_cache\_inv}@(void); +void @\FuncDecl{shmem\_set\_cache\_inv}@(void); +void @\FuncDecl{shmem\_clear\_cache\_line\_inv}@(void *dest); +void @\FuncDecl{shmem\_set\_cache\_line\_inv}@(void *dest); +void @\FuncDecl{shmem\_udcflush}@(void); +void @\FuncDecl{shmem\_udcflush\_line}@(void *dest); \end{Csynopsis} \end{DeprecateBlock} \begin{Fsynopsis} -CALL SHMEM_CLEAR_CACHE_INV -CALL SHMEM_SET_CACHE_INV -CALL SHMEM_SET_CACHE_LINE_INV(dest) -CALL SHMEM_UDCFLUSH -CALL SHMEM_UDCFLUSH_LINE(dest) +CALL @\FuncDecl{SHMEM\_CLEAR\_CACHE\_INV}@ +CALL @\FuncDecl{SHMEM\_SET\_CACHE\_INV}@ +CALL @\FuncDecl{SHMEM\_SET\_CACHE\_LINE\_INV}@(dest) +CALL @\FuncDecl{SHMEM\_UDCFLUSH}@ +CALL @\FuncDecl{SHMEM\_UDCFLUSH\_LINE}@(dest) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_calloc.tex b/content/shmem_calloc.tex index 70e0ab028..ed5c8f363 100644 --- a/content/shmem_calloc.tex +++ b/content/shmem_calloc.tex @@ -5,7 +5,7 @@ \begin{apidefinition} \begin{Csynopsis} -void *shmem_calloc(size_t count, size_t size); +void *@\FuncDecl{shmem\_calloc}@(size_t count, size_t size); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_collect.tex b/content/shmem_collect.tex index 3ab27e2ae..2ca75d491 100644 --- a/content/shmem_collect.tex +++ b/content/shmem_collect.tex @@ -6,24 +6,24 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_collect32(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_collect64(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_fcollect32(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); -void shmem_fcollect64(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_collect32}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_collect64}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_fcollect32}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_fcollect64}@(void *dest, const void *source, size_t nelems, int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{Fsynopsis} INTEGER nelems INTEGER PE_start, logPE_stride, PE_size INTEGER pSync(SHMEM_COLLECT_SYNC_SIZE) -CALL SHMEM_COLLECT4(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT8(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT32(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_COLLECT64(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT4(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT8(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT32(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) -CALL SHMEM_FCOLLECT64(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_COLLECT4}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_COLLECT8}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_COLLECT32}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_COLLECT64}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_FCOLLECT4}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_FCOLLECT8}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_FCOLLECT32}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) +CALL @\FuncDecl{SHMEM\_FCOLLECT64}@(dest, source, nelems, PE_start, logPE_stride, PE_size, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_ctx_create.tex b/content/shmem_ctx_create.tex index b23fcf9d0..7211b4547 100644 --- a/content/shmem_ctx_create.tex +++ b/content/shmem_ctx_create.tex @@ -5,7 +5,7 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_ctx_create(long options, shmem_ctx_t *ctx); +int @\FuncDecl{shmem\_ctx\_create}@(long options, shmem_ctx_t *ctx); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_ctx_destroy.tex b/content/shmem_ctx_destroy.tex index 3a882c2ef..287c5bcdd 100644 --- a/content/shmem_ctx_destroy.tex +++ b/content/shmem_ctx_destroy.tex @@ -5,7 +5,7 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_ctx_destroy(shmem_ctx_t ctx); +void @\FuncDecl{shmem\_ctx\_destroy}@(shmem_ctx_t ctx); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index b03864c78..b0955e450 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -6,12 +6,12 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_fence(void); -void shmem_ctx_fence(shmem_ctx_t ctx); +void @\FuncDecl{shmem\_fence}@(void); +void @\FuncDecl{shmem\_ctx\_fence}@(shmem_ctx_t ctx); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_FENCE +CALL @\FuncDecl{SHMEM\_FENCE}@ \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_finalize.tex b/content/shmem_finalize.tex index 43b92d9bc..a65348fa2 100644 --- a/content/shmem_finalize.tex +++ b/content/shmem_finalize.tex @@ -7,11 +7,11 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_finalize(void); +void @\FuncDecl{shmem\_finalize}@(void); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_FINALIZE() +CALL @\FuncDecl{SHMEM\_FINALIZE}@() \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_g.tex b/content/shmem_g.tex index 4b0972a7c..89b3f84b9 100644 --- a/content/shmem_g.tex +++ b/content/shmem_g.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_g(const TYPE *source, int pe); -TYPE shmem_g(shmem_ctx_t ctx, const TYPE *source, int pe); +TYPE @\FuncDecl{shmem\_g}@(const TYPE *source, int pe); +TYPE @\FuncDecl{shmem\_g}@(shmem_ctx_t ctx, const TYPE *source, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -TYPE shmem__g(const TYPE *source, int pe); -TYPE shmem_ctx__g(shmem_ctx_t ctx, const TYPE *source, int pe); +TYPE @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_g}@(const TYPE *source, int pe); +TYPE @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_g}@(shmem_ctx_t ctx, const TYPE *source, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. diff --git a/content/shmem_get.tex b/content/shmem_get.tex index 6368be8de..2f567969b 100644 --- a/content/shmem_get.tex +++ b/content/shmem_get.tex @@ -5,42 +5,42 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_get(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_get(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__get(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__get(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_get}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_get}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_get(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_get(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get\FuncParam{SIZE}}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_get\FuncParam{SIZE}}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} -void shmem_getmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_getmem(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_getmem}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_getmem}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} INTEGER nelems, pe -CALL SHMEM_CHARACTER_GET(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_GET(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_GET(dest, source, nelems, pe) -CALL SHMEM_GET4(dest, source, nelems, pe) -CALL SHMEM_GET8(dest, source, nelems, pe) -CALL SHMEM_GET32(dest, source, nelems, pe) -CALL SHMEM_GET64(dest, source, nelems, pe) -CALL SHMEM_GET128(dest, source, nelems, pe) -CALL SHMEM_GETMEM(dest, source, nelems, pe) -CALL SHMEM_INTEGER_GET(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_GET(dest, source, nelems, pe) -CALL SHMEM_REAL_GET(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_CHARACTER\_GET}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_GET}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_GET}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET4}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET8}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET32}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET64}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET128}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GETMEM}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_GET}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_GET}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_GET}@(dest, source, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_get_nbi.tex b/content/shmem_get_nbi.tex index c52958122..0f7f1f24f 100644 --- a/content/shmem_get_nbi.tex +++ b/content/shmem_get_nbi.tex @@ -6,42 +6,42 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_get_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get\_nbi}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get\_nbi}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__get_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__get_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_get\_nbi}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_get\_nbi}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_get_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_get_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_get\FuncParam{SIZE}\_nbi}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_get\FuncParam{SIZE}\_nbi}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} -void shmem_getmem_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_getmem_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_getmem\_nbi}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_getmem\_nbi}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} INTEGER nelems, pe -CALL SHMEM_CHARACTER_GET_NBI(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_GET_NBI(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_GET_NBI(dest, source, nelems, pe) -CALL SHMEM_GET4_NBI(dest, source, nelems, pe) -CALL SHMEM_GET8_NBI(dest, source, nelems, pe) -CALL SHMEM_GET32_NBI(dest, source, nelems, pe) -CALL SHMEM_GET64_NBI(dest, source, nelems, pe) -CALL SHMEM_GET128_NBI(dest, source, nelems, pe) -CALL SHMEM_GETMEM_NBI(dest, source, nelems, pe) -CALL SHMEM_INTEGER_GET_NBI(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_GET_NBI(dest, source, nelems, pe) -CALL SHMEM_REAL_GET_NBI(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_CHARACTER\_GET\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_GET\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_GET\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET4\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET8\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET32\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET64\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GET128\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_GETMEM\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_GET\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_GET\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_GET\_NBI}@(dest, source, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_global_exit.tex b/content/shmem_global_exit.tex index 0968743aa..84e2ad72d 100644 --- a/content/shmem_global_exit.tex +++ b/content/shmem_global_exit.tex @@ -5,16 +5,16 @@ \begin{apidefinition} \begin{C11synopsis} -_Noreturn void shmem_global_exit(int status); +_Noreturn void @\FuncDecl{shmem\_global\_exit}@(int status); \end{C11synopsis} \begin{Csynopsis} -void shmem_global_exit(int status); +void @\FuncDecl{shmem\_global\_exit}@(int status); \end{Csynopsis} \begin{Fsynopsis} INTEGER STATUS -CALL SHMEM_GLOBAL_EXIT(status) +CALL @\FuncDecl{SHMEM\_GLOBAL\_EXIT}@(status) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_iget.tex b/content/shmem_iget.tex index b8bd5ec1b..c4ce98e90 100644 --- a/content/shmem_iget.tex +++ b/content/shmem_iget.tex @@ -5,35 +5,35 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iget(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iget}@(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iget}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__iget(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx__iget(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_iget}@(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_iget}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_iget(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iget(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iget\FuncParam{SIZE}}@(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_iget\FuncParam{SIZE}}@(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{Fsynopsis} INTEGER dst, sst, nelems, pe -CALL SHMEM_COMPLEX_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_DOUBLE_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET4(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET8(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET32(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET64(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IGET128(dest, source, dst, sst, nelems, pe) -CALL SHMEM_INTEGER_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_LOGICAL_IGET(dest, source, dst, sst, nelems, pe) -CALL SHMEM_REAL_IGET(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_IGET}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_IGET}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IGET4}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IGET8}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IGET32}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IGET64}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IGET128}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_IGET}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_IGET}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_IGET}@(dest, source, dst, sst, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_info_get_name.tex b/content/shmem_info_get_name.tex index 8b60bb43b..dd1d5ab8b 100644 --- a/content/shmem_info_get_name.tex +++ b/content/shmem_info_get_name.tex @@ -6,12 +6,12 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_info_get_name(char *name); +void @\FuncDecl{shmem\_info\_get\_name}@(char *name); \end{Csynopsis} \begin{Fsynopsis} CHARACTER *(*)NAME -CALL SHMEM_INFO_GET_NAME(NAME) +CALL @\FuncDecl{SHMEM\_INFO\_GET\_NAME}@(NAME) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_info_get_version.tex b/content/shmem_info_get_version.tex index 4c97ed9b1..3ef298963 100644 --- a/content/shmem_info_get_version.tex +++ b/content/shmem_info_get_version.tex @@ -5,12 +5,12 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_info_get_version(int *major, int *minor); +void @\FuncDecl{shmem\_info\_get\_version}@(int *major, int *minor); \end{Csynopsis} \begin{Fsynopsis} INTEGER MAJOR, MINOR -CALL SHMEM_INFO_GET_VERSION(MAJOR, MINOR) +CALL @\FuncDecl{SHMEM\_INFO\_GET\_VERSION}@(MAJOR, MINOR) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_init.tex b/content/shmem_init.tex index b9ee5731d..2bf3b9c70 100644 --- a/content/shmem_init.tex +++ b/content/shmem_init.tex @@ -6,11 +6,11 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_init(void); +void @\FuncDecl{shmem\_init}@(void); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INIT() +CALL @\FuncDecl{SHMEM\_INIT}@() \end{Fsynopsis} diff --git a/content/shmem_init_thread.tex b/content/shmem_init_thread.tex index db61b3bff..8796af396 100644 --- a/content/shmem_init_thread.tex +++ b/content/shmem_init_thread.tex @@ -6,7 +6,7 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_init_thread(int requested, int *provided); +int @\FuncDecl{shmem\_init\_thread}@(int requested, int *provided); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_iput.tex b/content/shmem_iput.tex index b86c2835f..537b5b770 100644 --- a/content/shmem_iput.tex +++ b/content/shmem_iput.tex @@ -5,35 +5,35 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_iput(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iput}@(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iput}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__iput(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx__iput(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_iput}@(TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_iput}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_iput(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); -void shmem_ctx_iput(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_iput\FuncParam{SIZE}}@(void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_iput\FuncParam{SIZE}}@(shmem_ctx_t ctx, void *dest, const void *source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{Fsynopsis} INTEGER dst, sst, nelems, pe -CALL SHMEM_COMPLEX_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_DOUBLE_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_INTEGER_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT4(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT8(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT32(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT64(dest, source, dst, sst, nelems, pe) -CALL SHMEM_IPUT128(dest, source, dst, sst, nelems, pe) -CALL SHMEM_LOGICAL_IPUT(dest, source, dst, sst, nelems, pe) -CALL SHMEM_REAL_IPUT(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_IPUT}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_IPUT}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_IPUT}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IPUT4}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IPUT8}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IPUT32}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IPUT64}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_IPUT128}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_IPUT}@(dest, source, dst, sst, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_IPUT}@(dest, source, dst, sst, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_lock.tex b/content/shmem_lock.tex index 53bae2e26..5b028669f 100644 --- a/content/shmem_lock.tex +++ b/content/shmem_lock.tex @@ -4,16 +4,16 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_clear_lock(long *lock); -void shmem_set_lock(long *lock); -int shmem_test_lock(long *lock); +void @\FuncDecl{shmem\_clear\_lock}@(long *lock); +void @\FuncDecl{shmem\_set\_lock}@(long *lock); +int @\FuncDecl{shmem\_test\_lock}@(long *lock); \end{Csynopsis} \begin{Fsynopsis} INTEGER lock, SHMEM_TEST_LOCK -CALL SHMEM_CLEAR_LOCK(lock) -CALL SHMEM_SET_LOCK(lock) -I = SHMEM_TEST_LOCK(lock) +CALL @\FuncDecl{SHMEM\_CLEAR\_LOCK}@(lock) +CALL @\FuncDecl{SHMEM\_SET\_LOCK}@(lock) +I = @\FuncDecl{SHMEM\_TEST\_LOCK}@(lock) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_malloc.tex b/content/shmem_malloc.tex index b488c99ab..3a8fe2d46 100644 --- a/content/shmem_malloc.tex +++ b/content/shmem_malloc.tex @@ -5,10 +5,10 @@ \begin{apidefinition} \begin{Csynopsis} -void *shmem_malloc(size_t size); -void shmem_free(void *ptr); -void *shmem_realloc(void *ptr, size_t size); -void *shmem_align(size_t alignment, size_t size); +void *@\FuncDecl{shmem\_malloc}@(size_t size); +void @\FuncDecl{shmem\_free}@(void *ptr); +void *@\FuncDecl{shmem\_realloc}@(void *ptr, size_t size); +void *@\FuncDecl{shmem\_align}@(size_t alignment, size_t size); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_my_pe.tex b/content/shmem_my_pe.tex index 831df9a55..c1500d461 100644 --- a/content/shmem_my_pe.tex +++ b/content/shmem_my_pe.tex @@ -5,12 +5,12 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_my_pe(void); +int @\FuncDecl{shmem\_my\_pe}@(void); \end{Csynopsis} \begin{Fsynopsis} INTEGER SHMEM_MY_PE, ME -ME = SHMEM_MY_PE() +ME = @\FuncDecl{SHMEM\_MY\_PE}@() \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_n_pes.tex b/content/shmem_n_pes.tex index 94285f7cc..c9fa29a8c 100644 --- a/content/shmem_n_pes.tex +++ b/content/shmem_n_pes.tex @@ -5,12 +5,12 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_n_pes(void); +int @\FuncDecl{shmem\_n\_pes}@(void); \end{Csynopsis} \begin{Fsynopsis} INTEGER SHMEM_N_PES, N_PES -N_PES = SHMEM_N_PES() +N_PES = @\FuncDecl{SHMEM\_N\_PES}@() \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_p.tex b/content/shmem_p.tex index d5722ff84..dfe6beed0 100644 --- a/content/shmem_p.tex +++ b/content/shmem_p.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_p(TYPE *dest, TYPE value, int pe); -void shmem_p(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_p}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_p}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__p(TYPE *dest, TYPE value, int pe); -void shmem_ctx__p(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_p}@(TYPE *dest, TYPE value, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_p}@(shmem_ctx_t ctx, TYPE *dest, TYPE value, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. diff --git a/content/shmem_pe_accessible.tex b/content/shmem_pe_accessible.tex index 7aae628ac..bf9ffb1e6 100644 --- a/content/shmem_pe_accessible.tex +++ b/content/shmem_pe_accessible.tex @@ -6,7 +6,7 @@ \begin{apidefinition} \begin{Csynopsis} -int shmem_pe_accessible(int pe); +int @\FuncDecl{shmem\_pe\_accessible}@(int pe); \end{Csynopsis} \begin{Fsynopsis} diff --git a/content/shmem_ptr.tex b/content/shmem_ptr.tex index b99b00163..98d8c592a 100644 --- a/content/shmem_ptr.tex +++ b/content/shmem_ptr.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{Csynopsis} -void *shmem_ptr(const void *dest, int pe); +void *@\FuncDecl{shmem\_ptr}@(const void *dest, int pe); \end{Csynopsis} \begin{Fsynopsis} POINTER (PTR, POINTEE) INTEGER pe -PTR = SHMEM_PTR(dest, pe) +PTR = @\FuncDecl{SHMEM\_PTR}@(dest, pe) \end{Fsynopsis} diff --git a/content/shmem_put.tex b/content/shmem_put.tex index 9c0b62ef2..c21a0cd9e 100644 --- a/content/shmem_put.tex +++ b/content/shmem_put.tex @@ -6,41 +6,41 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_put(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_put(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__put(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__put(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_put}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_put}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_put(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_put(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put\FuncParam{SIZE}}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_put\FuncParam{SIZE}}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} -void shmem_putmem(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_putmem(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_putmem}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_putmem}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} -CALL SHMEM_CHARACTER_PUT(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_PUT(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_PUT(dest, source, nelems, pe) -CALL SHMEM_INTEGER_PUT(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_PUT(dest, source, nelems, pe) -CALL SHMEM_PUT4(dest, source, nelems, pe) -CALL SHMEM_PUT8(dest, source, nelems, pe) -CALL SHMEM_PUT32(dest, source, nelems, pe) -CALL SHMEM_PUT64(dest, source, nelems, pe) -CALL SHMEM_PUT128(dest, source, nelems, pe) -CALL SHMEM_PUTMEM(dest, source, nelems, pe) -CALL SHMEM_REAL_PUT(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_CHARACTER\_PUT}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_PUT}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_PUT}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_PUT}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_PUT}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT4}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT8}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT32}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT64}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT128}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUTMEM}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_PUT}@(dest, source, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_put_nbi.tex b/content/shmem_put_nbi.tex index 4bd0c68c0..dd9ac0413 100644 --- a/content/shmem_put_nbi.tex +++ b/content/shmem_put_nbi.tex @@ -6,41 +6,41 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_put_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put\_nbi}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put\_nbi}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{C11synopsis} where \TYPE{} is one of the standard \ac{RMA} types specified by Table \ref{stdrmatypes}. \begin{Csynopsis} -void shmem__put_nbi(TYPE *dest, const TYPE *source, size_t nelems, int pe); -void shmem_ctx__put_nbi(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_put\_nbi}@(TYPE *dest, const TYPE *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_\FuncParam{TYPENAME}\_put\_nbi}@(shmem_ctx_t ctx, TYPE *dest, const TYPE *source, size_t nelems, int pe); \end{Csynopsis} where \TYPE{} is one of the standard \ac{RMA} types and has a corresponding \TYPENAME{} specified by Table \ref{stdrmatypes}. \begin{CsynopsisCol} -void shmem_put_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_put_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_put\FuncParam{SIZE}\_nbi}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_put\FuncParam{SIZE}\_nbi}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} where \SIZE{} is one of \CONST{8, 16, 32, 64, 128}. \begin{CsynopsisCol} -void shmem_putmem_nbi(void *dest, const void *source, size_t nelems, int pe); -void shmem_ctx_putmem_nbi(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_putmem\_nbi}@(void *dest, const void *source, size_t nelems, int pe); +void @\FuncDecl{shmem\_ctx\_putmem\_nbi}@(shmem_ctx_t ctx, void *dest, const void *source, size_t nelems, int pe); \end{CsynopsisCol} \begin{Fsynopsis} -CALL SHMEM_CHARACTER_PUT_NBI(dest, source, nelems, pe) -CALL SHMEM_COMPLEX_PUT_NBI(dest, source, nelems, pe) -CALL SHMEM_DOUBLE_PUT_NBI(dest, source, nelems, pe) -CALL SHMEM_INTEGER_PUT_NBI(dest, source, nelems, pe) -CALL SHMEM_LOGICAL_PUT_NBI(dest, source, nelems, pe) -CALL SHMEM_PUT4_NBI(dest, source, nelems, pe) -CALL SHMEM_PUT8_NBI(dest, source, nelems, pe) -CALL SHMEM_PUT32_NBI(dest, source, nelems, pe) -CALL SHMEM_PUT64_NBI(dest, source, nelems, pe) -CALL SHMEM_PUT128_NBI(dest, source, nelems, pe) -CALL SHMEM_PUTMEM_NBI(dest, source, nelems, pe) -CALL SHMEM_REAL_PUT_NBI(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_CHARACTER\_PUT\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_COMPLEX\_PUT\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_DOUBLE\_PUT\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_INTEGER\_PUT\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_LOGICAL\_PUT\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT4\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT8\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT32\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT64\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUT128\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_PUTMEM\_NBI}@(dest, source, nelems, pe) +CALL @\FuncDecl{SHMEM\_REAL\_PUT\_NBI}@(dest, source, nelems, pe) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_query_thread.tex b/content/shmem_query_thread.tex index a90349351..37b218cd4 100644 --- a/content/shmem_query_thread.tex +++ b/content/shmem_query_thread.tex @@ -5,7 +5,7 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_query_thread(int *provided); +void @\FuncDecl{shmem\_query\_thread}@(int *provided); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 560d51ffb..317629c4f 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -7,12 +7,12 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_quiet(void); -void shmem_ctx_quiet(shmem_ctx_t ctx); +void @\FuncDecl{shmem\_quiet}@(void); +void @\FuncDecl{shmem\_ctx\_quiet}@(shmem_ctx_t ctx); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_QUIET +CALL @\FuncDecl{SHMEM\_QUIET}@ \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index 8a913e67e..dde92f4c6 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -8,131 +8,131 @@ \paragraph{AND} Performs a bitwise AND reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_short_and_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_and_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_and_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_and_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_and\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_and\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_and\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_and\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_AND_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_AND_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_AND\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_AND\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{MAX} Performs a maximum-value reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_short_max_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_max_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_double_max_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_max_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_long_max_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_max_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_max_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_max\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_max\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_double\_max\_to\_all}@(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); +void @\FuncDecl{shmem\_float\_max\_to\_all}@(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_max\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longdouble\_max\_to\_all}@(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_max\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_MAX_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_MAX\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_MAX\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL4\_MAX\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL8\_MAX\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL16\_MAX\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{MIN} Performs a minimum-value reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_short_min_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_min_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_double_min_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_min_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_long_min_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_min_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_min_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_min\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_min\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_double\_min\_to\_all}@(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); +void @\FuncDecl{shmem\_float\_min\_to\_all}@(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_min\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longdouble\_min\_to\_all}@(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_min\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_MIN_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_MIN\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_MIN\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL4\_MIN\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL8\_MIN\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL16\_MIN\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{SUM} Performs a sum reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_sum_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); -void shmem_complexf_sum_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); -void shmem_short_sum_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_sum_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_double_sum_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_sum_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_long_sum_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride,int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_sum_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_sum_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_complexd\_sum\_to\_all}@(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); +void @\FuncDecl{shmem\_complexf\_sum\_to\_all}@(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_sum\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_sum\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_double\_sum\_to\_all}@(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); +void @\FuncDecl{shmem\_float\_sum\_to\_all}@(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_sum\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride,int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longdouble\_sum\_to\_all}@(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_sum\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_COMP4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_COMP8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_SUM_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_COMP4\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_COMP8\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL4\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL8\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL16\_SUM\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{PROD} Performs a product reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_complexd_prod_to_all(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); -void shmem_complexf_prod_to_all(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); -void shmem_short_prod_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_prod_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_double_prod_to_all(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); -void shmem_float_prod_to_all(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); -void shmem_long_prod_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longdouble_prod_to_all(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); -void shmem_longlong_prod_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_complexd\_prod\_to\_all}@(double _Complex *dest, const double _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double _Complex *pWrk, long *pSync); +void @\FuncDecl{shmem\_complexf\_prod\_to\_all}@(float _Complex *dest, const float _Complex *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float _Complex *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_prod\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_prod\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_double\_prod\_to\_all}@(double *dest, const double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, double *pWrk, long *pSync); +void @\FuncDecl{shmem\_float\_prod\_to\_all}@(float *dest, const float *source, int nreduce, int PE_start, int logPE_stride, int PE_size, float *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_prod\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longdouble\_prod\_to\_all}@(long double *dest, const long double *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long double *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_prod\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_COMP4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_COMP8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL4_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL8_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_REAL16_PROD_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_COMP4\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_COMP8\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL4\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL8\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_REAL16\_PROD\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{OR} Performs a bitwise OR reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_short_or_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_or_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_or_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_or_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_or\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_or\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_or\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_or\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_OR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_OR\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_OR\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \paragraph{XOR} Performs a bitwise exclusive OR (XOR) reduction across a set of \acp{PE}.\newline \begin{Csynopsis} -void shmem_short_xor_to_all(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); -void shmem_int_xor_to_all(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); -void shmem_long_xor_to_all(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); -void shmem_longlong_xor_to_all(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); +void @\FuncDecl{shmem\_short\_xor\_to\_all}@(short *dest, const short *source, int nreduce, int PE_start, int logPE_stride, int PE_size, short *pWrk, long *pSync); +void @\FuncDecl{shmem\_int\_xor\_to\_all}@(int *dest, const int *source, int nreduce, int PE_start, int logPE_stride, int PE_size, int *pWrk, long *pSync); +void @\FuncDecl{shmem\_long\_xor\_to\_all}@(long *dest, const long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long *pWrk, long *pSync); +void @\FuncDecl{shmem\_longlong\_xor\_to\_all}@(long long *dest, const long long *source, int nreduce, int PE_start, int logPE_stride, int PE_size, long long *pWrk, long *pSync); \end{Csynopsis} \begin{Fsynopsis} -CALL SHMEM_INT4_XOR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) -CALL SHMEM_INT8_XOR_TO_ALL(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT4\_XOR\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) +CALL @\FuncDecl{SHMEM\_INT8\_XOR\_TO\_ALL}@(dest, source, nreduce, PE_start, logPE_stride, PE_size, pWrk, pSync) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shmem_sync.tex b/content/shmem_sync.tex index fa55ca515..2c5707929 100644 --- a/content/shmem_sync.tex +++ b/content/shmem_sync.tex @@ -6,7 +6,7 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_sync(int PE_start, int logPE_stride, int PE_size, long *pSync); +void @\FuncDecl{shmem\_sync}@(int PE_start, int logPE_stride, int PE_size, long *pSync); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_sync_all.tex b/content/shmem_sync_all.tex index aa9873706..8d6c95244 100644 --- a/content/shmem_sync_all.tex +++ b/content/shmem_sync_all.tex @@ -6,7 +6,7 @@ \begin{apidefinition} \begin{Csynopsis} -void shmem_sync_all(void); +void @\FuncDecl{shmem\_sync\_all}@(void); \end{Csynopsis} \begin{apiarguments} diff --git a/content/shmem_test.tex b/content/shmem_test.tex index f8705da17..e0dc41932 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int @\FuncDecl{shmem\_test}@(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_test}@(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..f07575322 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,21 +5,21 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void @\FuncDecl{shmem\_wait\_until}@(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem__wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_wait\_until}@(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table~\ref{p2psynctypes}. \begin{DeprecateBlock} \begin{CsynopsisCol} -void shmem_wait(long *ivar, long cmp_value); -void shmem__wait(TYPE *ivar, TYPE cmp_value); +void @\FuncDecl{shmem\_wait}@(long *ivar, long cmp_value); +void @\FuncDecl{shmem\_\FuncParam{TYPENAME}\_wait}@(TYPE *ivar, TYPE cmp_value); \end{CsynopsisCol} where \TYPE{} is one of \{\CTYPE{short}, \CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} and has a corresponding \TYPENAME{} specified by @@ -27,12 +27,12 @@ \end{DeprecateBlock} \begin{Fsynopsis} -CALL SHMEM_INT4_WAIT(ivar, cmp_value) -CALL SHMEM_INT4_WAIT_UNTIL(ivar, cmp, cmp_value) -CALL SHMEM_INT8_WAIT(ivar, cmp_value) -CALL SHMEM_INT8_WAIT_UNTIL(ivar, cmp, cmp_value) -CALL SHMEM_WAIT(ivar, cmp_value) -CALL SHMEM_WAIT_UNTIL(ivar, cmp, cmp_value) +CALL @\FuncDecl{SHMEM\_INT4\_WAIT}@(ivar, cmp_value) +CALL @\FuncDecl{SHMEM\_INT4\_WAIT\_UNTIL}@(ivar, cmp, cmp_value) +CALL @\FuncDecl{SHMEM\_INT8\_WAIT}@(ivar, cmp_value) +CALL @\FuncDecl{SHMEM\_INT8\_WAIT\_UNTIL}@(ivar, cmp, cmp_value) +CALL @\FuncDecl{SHMEM\_WAIT}@(ivar, cmp_value) +CALL @\FuncDecl{SHMEM\_WAIT\_UNTIL}@(ivar, cmp, cmp_value) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shpalloc.tex b/content/shpalloc.tex index 1cb4c0ab3..fb63060b1 100644 --- a/content/shpalloc.tex +++ b/content/shpalloc.tex @@ -7,7 +7,7 @@ \begin{Fsynopsis} POINTER (addr, A(1)) INTEGER length, errcode, abort -CALL SHPALLOC(addr, length, errcode, abort) +CALL @\FuncDecl{SHPALLOC}@(addr, length, errcode, abort) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shpclmove.tex b/content/shpclmove.tex index c748c5928..726a86061 100644 --- a/content/shpclmove.tex +++ b/content/shpclmove.tex @@ -8,7 +8,7 @@ \begin{Fsynopsis} POINTER (addr, A(1)) INTEGER length, status, abort -CALL SHPCLMOVE (addr, length, status, abort) +CALL @\FuncDecl{SHPCLMOVE}@(addr, length, status, abort) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/shpdealloc.tex b/content/shpdealloc.tex index 66e992893..f14a557c3 100644 --- a/content/shpdealloc.tex +++ b/content/shpdealloc.tex @@ -7,7 +7,7 @@ \begin{Fsynopsis} POINTER (addr, A(1)) INTEGER errcode, abort -CALL SHPDEALLC(addr, errcode, abort) +CALL @\FuncDecl{SHPDEALLC}@(addr, errcode, abort) \end{Fsynopsis} \begin{apiarguments} diff --git a/content/start_pes.tex b/content/start_pes.tex index d24735d42..a88d55fc0 100644 --- a/content/start_pes.tex +++ b/content/start_pes.tex @@ -9,12 +9,12 @@ \begin{DeprecateBlock} \begin{Csynopsis} -void start_pes(int npes); +void @\FuncDecl{start\_pes}@(int npes); \end{Csynopsis} \end{DeprecateBlock} \begin{Fsynopsis} -CALL START_PES(npes) +CALL @\FuncDecl{START\_PES}@(npes) \end{Fsynopsis} \begin{apiarguments} From 626f452b9464e252c6fa732cbf78fda33a1913f2 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 13 Nov 2017 11:38:25 -0500 Subject: [PATCH 537/583] Update shmem_cmp_t to int This commit addresses #175 by removing the enumerated type shmem_cmp_t in favor of int-typed arguments to shmem_{wait, wait_until, test}. --- content/p2p_sync_intro.tex | 10 +++++----- content/shmem_test.tex | 4 ++-- content/shmem_wait.tex | 8 ++++---- example_code/shmem_test_example1.c | 2 +- utils/defs.tex | 11 +++++------ 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 3ac8b7239..0baeafb06 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -43,10 +43,10 @@ \end{center} \end{table} -The point-to-point synchronization interface provides the enumerated type -\CTYPE{shmem\_cmp\_t}, whose enumerators specify the comparison operators used -by synchronization routines that take a \CTYPE{shmem\_cmp\_t} argument. The -enumerators of \CTYPE{shmem\_cmp\_t} and their associated operations are +The point-to-point synchronization interface provides named constants whose +values are integer constant expressions that specify the comparison operation +used by \openshmem synchronization routines. +The constant names and associated operations are presented in Table~\ref{p2p-consts}. For Fortran, the constant names of Table~\ref{p2p-consts} shall be identifiers for integer parameters of default kind corresponding to the associated comparison operation. @@ -63,7 +63,7 @@ SHMEM\_CMP\_LT & Less than \\ SHMEM\_CMP\_LE & Less than or equal to \\ \hline \end{tabular} - \caption{Point-to-Point Comparison Enumeration Constants} + \caption{Point-to-Point Comparison Constants} \label{p2p-consts} \end{center} \end{table} diff --git a/content/shmem_test.tex b/content/shmem_test.tex index f8705da17..4a588f9cf 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int shmem_test(TYPE *ivar, int cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int shmem__test(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 496257af6..c4614995f 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void shmem_wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem_wait_until(long *ivar, shmem_cmp_t cmp, long cmp_value); -void shmem__wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void shmem_wait_until(long *ivar, int cmp, long cmp_value); +void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table~\ref{p2psynctypes}. @@ -42,7 +42,7 @@ the type of \VAR{ivar} should match that implied in the SYNOPSIS section.} \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. - When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} + When using \CorCpp, it must be of type \CTYPE{int}.} \apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of diff --git a/example_code/shmem_test_example1.c b/example_code/shmem_test_example1.c index 02c430bae..d3f760f44 100644 --- a/example_code/shmem_test_example1.c +++ b/example_code/shmem_test_example1.c @@ -1,7 +1,7 @@ #include #include -int user_wait_any(long *ivar, int count, shmem_cmp_t cmp, long value) +int user_wait_any(long *ivar, int count, int cmp, long value) { int idx = 0; while (!shmem_test(&ivar[idx], cmp, value)) diff --git a/utils/defs.tex b/utils/defs.tex index 924663190..7f26fc0fe 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -243,8 +243,7 @@ shmem_short_fadd, shmem_int_fadd, shmem_long_fadd, shmem_set_lock, shmem_test_lock, shmem_clear_lock, shmem_long_sum_to_all, - shmem_complexd_sum_to_all, - shmem_cmp_t + shmem_complexd_sum_to_all }, keywordstyle=\color{black}\textbf, classoffset=0, @@ -368,13 +367,13 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} @@ -382,7 +381,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -471,7 +470,7 @@ ##1 \lstinputlisting[language={C}, tabsize=2, basicstyle=\ttfamily\footnotesize, - morekeywords={size_t, ptrdiff_t, shmem_cmp_t, shmem_ctx_t}]{##2} + morekeywords={size_t, ptrdiff_t, shmem_ctx_t}]{##2} ##3 } \newcommand{\apifexample}[3]{ ##1 From 2213b36c7abb48b36a1bc1e62db904b782d52347 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 13:15:32 -0500 Subject: [PATCH 538/583] Added style guard on \FuncDeclImpl --- utils/defs.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/defs.tex b/utils/defs.tex index a67091665..d926406ee 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -65,7 +65,7 @@ %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \providecommand{\FuncDecl}{} -\newcommand{\FuncDeclImpl}[2]{\ListingsCurrentStyle{#2}\FuncIndex{#1}{#2}} +\newcommand{\FuncDeclImpl}[2]{{\ListingsCurrentStyle{#2}}\FuncIndex{#1}{#2}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% From fa559c33cccaeadbf6b7ce355f99715c1715b984 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 13:26:11 -0500 Subject: [PATCH 539/583] Revert "Removed redundant deprecate guards in SHMEM_CACHE" This reverts commit 805ad41190e0c3809a79b44062d0b51a0e67a2b7. Conflicts with fbe951dbaa24971a543ed3bdd8fc8d965613954f. --- content/shmem_cache.tex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/shmem_cache.tex b/content/shmem_cache.tex index 2360abfab..b3a53eab0 100644 --- a/content/shmem_cache.tex +++ b/content/shmem_cache.tex @@ -15,6 +15,7 @@ \end{Csynopsis} \end{DeprecateBlock} +\begin{DeprecateBlock} \begin{Fsynopsis} CALL SHMEM_CLEAR_CACHE_INV CALL SHMEM_SET_CACHE_INV @@ -22,6 +23,7 @@ CALL SHMEM_UDCFLUSH CALL SHMEM_UDCFLUSH_LINE(dest) \end{Fsynopsis} +\end{DeprecateBlock} \begin{apiarguments} From d423285b36f76c8aed3ea5dca73d43c5bac68942 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 13 Nov 2017 14:47:03 -0500 Subject: [PATCH 540/583] Clarify the AMO notes on the deprecated old-style interfaces These changes (attempt to) address https://github.com/openshmem-org/specification/issues/185 --- content/shmem_atomic_add.tex | 11 ++++++++--- content/shmem_atomic_compare_swap.tex | 11 ++++++++--- content/shmem_atomic_fetch.tex | 11 ++++++++--- content/shmem_atomic_fetch_add.tex | 11 ++++++++--- content/shmem_atomic_fetch_inc.tex | 11 ++++++++--- content/shmem_atomic_inc.tex | 11 ++++++++--- content/shmem_atomic_set.tex | 11 ++++++++--- content/shmem_atomic_swap.tex | 11 ++++++++--- 8 files changed, 64 insertions(+), 24 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index e2ffcb2d3..844b88907 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -59,9 +59,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_add} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_add}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_add} and \FUNC{shmem\_TYPENAME\_add} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_add} and + \FUNC{shmem\_TYPENAME\_atomic\_add}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} + types. } \begin{apiexamples} diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index d980bb1eb..eedd1336a 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -65,9 +65,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_cswap} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_compare\_swap}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_cswap} and \FUNC{shmem\_TYPENAME\_cswap} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_compare\_swap} and + \FUNC{shmem\_TYPENAME\_atomic\_compare\_swap}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} + types. } \begin{apiexamples} diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 015c6a981..3bba429e3 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -54,9 +54,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_fetch} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_fetch}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_fetch} and \FUNC{shmem\_TYPENAME\_fetch} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_fetch} and + \FUNC{shmem\_TYPENAME\_atomic\_fetch}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, + \CTYPE{long}, and \CTYPE{long~long} types. } \end{apidefinition} diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index 20ae949e3..64b69e926 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -66,9 +66,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_fadd} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_fetch\_add}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_fetch\_add} and \FUNC{shmem\_TYPENAME\_fetch\_add} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_fetch\_add} and + \FUNC{shmem\_TYPENAME\_atomic\_fetch\_add}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} + types. } \begin{apiexamples} diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index 12c10d1b5..ccff0b4ac 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -61,9 +61,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_finc} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_fetch\_inc}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_fetch\_inc} and \FUNC{shmem\_TYPENAME\_fetch\_inc} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_fetch\_inc} and + \FUNC{shmem\_TYPENAME\_atomic\_fetch\_inc}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} + types. } \begin{apiexamples} diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index 61065123b..a2d897de3 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -56,9 +56,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_inc} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_inc}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_inc} and \FUNC{shmem\_TYPENAME\_inc} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_inc} and + \FUNC{shmem\_TYPENAME\_atomic\_inc}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} + types. } \begin{apiexamples} diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 2d0f62f5b..3aebc9ce3 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -53,9 +53,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_set} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_set}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_set} and \FUNC{shmem\_TYPENAME\_set} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_set} and + \FUNC{shmem\_TYPENAME\_atomic\_set}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, + \CTYPE{long}, and \CTYPE{long~long} types. } \end{apidefinition} diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index 160635e39..593360a7e 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -65,9 +65,14 @@ } \apinotes{ - As of \openshmem[1.4], \FUNC{shmem\_swap} has been deprecated. - Its behavior and call signature are identical to the replacement - interface, \FUNC{shmem\_atomic\_swap}. + As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces + \FUNC{shmem\_swap} and \FUNC{shmem\_TYPENAME\_swap} have been + deprecated. Their behavior and call signature are identical to the + respective replacement interfaces, \FUNC{shmem\_atomic\_swap} and + \FUNC{shmem\_TYPENAME\_atomic\_swap}, subject to the constraints + that the deprecated interfaces do not accept a context argument and + are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, + \CTYPE{long}, and \CTYPE{long~long} types. } \begin{apiexamples} From 1a8991487296a441fa91baed18d4575c6d2dea96 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 13 Nov 2017 20:35:28 -0500 Subject: [PATCH 541/583] Add explicitly deprecated AMO interfaces; remove deprecation "note" Driver: https://github.com/openshmem-org/specification/issues/185 --- content/shmem_atomic_add.tex | 22 ++++++++++++++-------- content/shmem_atomic_compare_swap.tex | 22 ++++++++++++++-------- content/shmem_atomic_fetch.tex | 24 ++++++++++++++++-------- content/shmem_atomic_fetch_add.tex | 22 ++++++++++++++-------- content/shmem_atomic_fetch_inc.tex | 22 ++++++++++++++-------- content/shmem_atomic_inc.tex | 22 ++++++++++++++-------- content/shmem_atomic_set.tex | 24 ++++++++++++++++-------- content/shmem_atomic_swap.tex | 24 ++++++++++++++++-------- 8 files changed, 118 insertions(+), 64 deletions(-) diff --git a/content/shmem_atomic_add.tex b/content/shmem_atomic_add.tex index 844b88907..a6cbaf7ea 100644 --- a/content/shmem_atomic_add.tex +++ b/content/shmem_atomic_add.tex @@ -18,6 +18,19 @@ where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +void shmem_add(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +void shmem__add(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} +and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 value_i4 @@ -59,14 +72,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_add} and \FUNC{shmem\_TYPENAME\_add} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_add} and - \FUNC{shmem\_TYPENAME\_atomic\_add}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} - types. + None. } \begin{apiexamples} diff --git a/content/shmem_atomic_compare_swap.tex b/content/shmem_atomic_compare_swap.tex index eedd1336a..473fbd6c4 100644 --- a/content/shmem_atomic_compare_swap.tex +++ b/content/shmem_atomic_compare_swap.tex @@ -18,6 +18,19 @@ where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +TYPE shmem_cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +TYPE shmem__cswap(TYPE *dest, TYPE cond, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} +and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_CSWAP, cond_i4, value_i4, ires_i4 @@ -65,14 +78,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_cswap} and \FUNC{shmem\_TYPENAME\_cswap} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_compare\_swap} and - \FUNC{shmem\_TYPENAME\_atomic\_compare\_swap}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} - types. + None. } \begin{apiexamples} diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index 3bba429e3..a1907e58d 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -18,6 +18,21 @@ where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +TYPE shmem_fetch(const TYPE *dest, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +TYPE shmem__fetch(const TYPE *dest, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\} and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FETCH, ires_i4 @@ -54,14 +69,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_fetch} and \FUNC{shmem\_TYPENAME\_fetch} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_fetch} and - \FUNC{shmem\_TYPENAME\_atomic\_fetch}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, - \CTYPE{long}, and \CTYPE{long~long} types. + None. } \end{apidefinition} diff --git a/content/shmem_atomic_fetch_add.tex b/content/shmem_atomic_fetch_add.tex index 64b69e926..0105e1000 100644 --- a/content/shmem_atomic_fetch_add.tex +++ b/content/shmem_atomic_fetch_add.tex @@ -18,6 +18,19 @@ where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +TYPE shmem_fadd(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +TYPE shmem__fadd(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} +and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FADD, ires_i4, value_i4 @@ -66,14 +79,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_fetch\_add} and \FUNC{shmem\_TYPENAME\_fetch\_add} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_fetch\_add} and - \FUNC{shmem\_TYPENAME\_atomic\_fetch\_add}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} - types. + None. } \begin{apiexamples} diff --git a/content/shmem_atomic_fetch_inc.tex b/content/shmem_atomic_fetch_inc.tex index ccff0b4ac..d6af7b3fc 100644 --- a/content/shmem_atomic_fetch_inc.tex +++ b/content/shmem_atomic_fetch_inc.tex @@ -18,6 +18,19 @@ where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +TYPE shmem_finc(TYPE *dest, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +TYPE shmem__finc(TYPE *dest, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} +and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FINC, ires_i4 @@ -61,14 +74,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_fetch\_inc} and \FUNC{shmem\_TYPENAME\_fetch\_inc} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_fetch\_inc} and - \FUNC{shmem\_TYPENAME\_atomic\_fetch\_inc}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} - types. + None. } \begin{apiexamples} diff --git a/content/shmem_atomic_inc.tex b/content/shmem_atomic_inc.tex index a2d897de3..8f6661092 100644 --- a/content/shmem_atomic_inc.tex +++ b/content/shmem_atomic_inc.tex @@ -18,6 +18,19 @@ where \TYPE{} is one of the standard \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +void shmem_inc(TYPE *dest, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +void shmem__inc(TYPE *dest, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} +and has a corresponding \TYPENAME{} specified by Table~\ref{stdamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe CALL SHMEM_INT4_INC(dest, pe) @@ -56,14 +69,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_inc} and \FUNC{shmem\_TYPENAME\_inc} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_inc} and - \FUNC{shmem\_TYPENAME\_atomic\_inc}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{int}, \CTYPE{long}, and \CTYPE{long~long} - types. + None. } \begin{apiexamples} diff --git a/content/shmem_atomic_set.tex b/content/shmem_atomic_set.tex index 3aebc9ce3..4336ca42b 100644 --- a/content/shmem_atomic_set.tex +++ b/content/shmem_atomic_set.tex @@ -18,6 +18,21 @@ where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +void shmem_set(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +void shmem__set(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\} and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_SET, value_i4 @@ -53,14 +68,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_set} and \FUNC{shmem\_TYPENAME\_set} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_set} and - \FUNC{shmem\_TYPENAME\_atomic\_set}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, - \CTYPE{long}, and \CTYPE{long~long} types. + None. } \end{apidefinition} diff --git a/content/shmem_atomic_swap.tex b/content/shmem_atomic_swap.tex index 593360a7e..fc86972ec 100644 --- a/content/shmem_atomic_swap.tex +++ b/content/shmem_atomic_swap.tex @@ -16,6 +16,21 @@ \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table \ref{extamotypes}. +\begin{DeprecateBlock} +\begin{C11synopsis} +TYPE shmem_swap(TYPE *dest, TYPE value, int pe); +\end{C11synopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\}. + +\begin{Csynopsis} +TYPE shmem__swap(TYPE *dest, TYPE value, int pe); +\end{Csynopsis} +where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, +\CTYPE{long}, \CTYPE{long long}\} and has a corresponding +\TYPENAME{} specified by Table~\ref{extamotypes}. +\end{DeprecateBlock} + \begin{Fsynopsis} INTEGER SHMEM_SWAP, value, pe ires = SHMEM_SWAP(dest, value, pe) @@ -65,14 +80,7 @@ } \apinotes{ - As of \openshmem[1.4], the \Cstd[11] and \CorCpp interfaces - \FUNC{shmem\_swap} and \FUNC{shmem\_TYPENAME\_swap} have been - deprecated. Their behavior and call signature are identical to the - respective replacement interfaces, \FUNC{shmem\_atomic\_swap} and - \FUNC{shmem\_TYPENAME\_atomic\_swap}, subject to the constraints - that the deprecated interfaces do not accept a context argument and - are only supported for \CTYPE{float}, \CTYPE{double}, \CTYPE{int}, - \CTYPE{long}, and \CTYPE{long~long} types. + None. } \begin{apiexamples} From 80d42edf4a296481f8f6dfe2925c1c842b6f11bb Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 13 Nov 2017 20:38:18 -0500 Subject: [PATCH 542/583] Rename "dest" to "source" in shmem_fetch --- content/shmem_atomic_fetch.tex | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/content/shmem_atomic_fetch.tex b/content/shmem_atomic_fetch.tex index a1907e58d..b47f54719 100644 --- a/content/shmem_atomic_fetch.tex +++ b/content/shmem_atomic_fetch.tex @@ -5,28 +5,28 @@ \begin{apidefinition} \begin{C11synopsis} -TYPE shmem_atomic_fetch(const TYPE *dest, int pe); -TYPE shmem_atomic_fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); +TYPE shmem_atomic_fetch(const TYPE *source, int pe); +TYPE shmem_atomic_fetch(shmem_ctx_t ctx, const TYPE *source, int pe); \end{C11synopsis} where \TYPE{} is one of the extended \ac{AMO} types specified by Table~\ref{extamotypes}. \begin{Csynopsis} -TYPE shmem__atomic_fetch(const TYPE *dest, int pe); -TYPE shmem_ctx__atomic_fetch(shmem_ctx_t ctx, const TYPE *dest, int pe); +TYPE shmem__atomic_fetch(const TYPE *source, int pe); +TYPE shmem_ctx__atomic_fetch(shmem_ctx_t ctx, const TYPE *source, int pe); \end{Csynopsis} where \TYPE{} is one of the extended \ac{AMO} types and has a corresponding \TYPENAME{} specified by Table~\ref{extamotypes}. \begin{DeprecateBlock} \begin{C11synopsis} -TYPE shmem_fetch(const TYPE *dest, int pe); +TYPE shmem_fetch(const TYPE *source, int pe); \end{C11synopsis} where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\}. \begin{Csynopsis} -TYPE shmem__fetch(const TYPE *dest, int pe); +TYPE shmem__fetch(const TYPE *source, int pe); \end{Csynopsis} where \TYPE{} is one of \{\CTYPE{float}, \CTYPE{double}, \CTYPE{int}, \CTYPE{long}, \CTYPE{long long}\} and has a corresponding @@ -36,13 +36,13 @@ \begin{Fsynopsis} INTEGER pe INTEGER*4 SHMEM_INT4_FETCH, ires_i4 -ires_i4 = SHMEM_INT4_FETCH(dest, pe) +ires_i4 = SHMEM_INT4_FETCH(source, pe) INTEGER*8 SHMEM_INT8_FETCH, ires_i8 -ires_i8 = SHMEM_INT8_FETCH(dest, pe) +ires_i8 = SHMEM_INT8_FETCH(source, pe) REAL*4 SHMEM_REAL4_FETCH, res_r4 -res_r4 = SHMEM_REAL4_FETCH(dest, pe) +res_r4 = SHMEM_REAL4_FETCH(source, pe) REAL*8 SHMEM_REAL8_FETCH, res_r8 -res_r8 = SHMEM_REAL8_FETCH(dest, pe) +res_r8 = SHMEM_REAL8_FETCH(source, pe) \end{Fsynopsis} \begin{apiarguments} @@ -50,20 +50,20 @@ \apiargument{IN}{ctx}{The context on which to perform the operation. When this argument is not provided, the operation is performed on \CONST{SHMEM\_CTX\_DEFAULT}.} - \apiargument{IN}{dest}{The remotely accessible data object to be fetched from + \apiargument{IN}{source}{The remotely accessible data object to be fetched from the remote \ac{PE}.} \apiargument{IN}{pe}{An integer that indicates the \ac{PE} number from which - \VAR{dest} is to be fetched.} + \VAR{source} is to be fetched.} \end{apiarguments} \apidescription{ \FUNC{shmem\_atomic\_fetch} performs an atomic fetch operation. - It returns the contents of the \VAR{dest} as an atomic operation. + It returns the contents of the \VAR{source} as an atomic operation. } \apireturnvalues{ - The contents at the \VAR{dest} address on the remote \ac{PE}. + The contents at the \VAR{source} address on the remote \ac{PE}. The data type of the return value is the same as the type of the remote data object. } From 5722aa16cec05e4612981cfa0385d711e3eff12c Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 13 Nov 2017 21:52:05 -0500 Subject: [PATCH 543/583] Replace C with \Cstd Signed-off-by: James Dinan --- content/library_handles.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/library_handles.tex b/content/library_handles.tex index 4fb7e35a3..94f9d72cd 100644 --- a/content/library_handles.tex +++ b/content/library_handles.tex @@ -1,6 +1,6 @@ The \openshmem library provides a set of predefined named constant handles. All named constants can be used in initialization expressions or assignments, -but not necessarily in array declarations or as labels in C switch statements. +but not necessarily in array declarations or as labels in \Cstd switch statements. This implies named constants to be link-time but not necessarily compile-time constants. From 431f7fa78f81ed532efb1f7d9e5c6ba271974a0a Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 23:24:11 -0500 Subject: [PATCH 544/583] Deprecate long-typed `shmem_wait_until` --- content/shmem_wait.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 4dbb0ebde..b49cf5f8a 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -11,7 +11,6 @@ Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem_wait_until(long *ivar, int cmp, long cmp_value); void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a @@ -19,6 +18,7 @@ \begin{DeprecateBlock} \begin{CsynopsisCol} +void shmem_wait_until(long *ivar, int cmp, long cmp_value); void shmem_wait(long *ivar, long cmp_value); void shmem__wait(TYPE *ivar, TYPE cmp_value); \end{CsynopsisCol} From a0df4627565c3ec180864796a02e714db437a9cb Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 14 Nov 2017 00:05:36 -0500 Subject: [PATCH 545/583] Fixed broken PDF bookmark --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 73ba63e19..23f7522c6 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -504,7 +504,7 @@ \subsection{\CorCpp: \FUNC{shmem\_wait}} favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation explicit and better communicates the developer's intent. -\subsection{\Cstd[11] and \CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, +\subsection{\textit{C11} and \CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, %% Issue #66. \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} The \Cstd[11] and \CorCpp interfaces for From 76a8c54b38ba3a7fd1de6eae419d5f63721749cd Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 14 Nov 2017 00:11:50 -0500 Subject: [PATCH 546/583] Added deprecation rationale for C/C++ `shmem_wait_until` --- content/backmatter.tex | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/content/backmatter.tex b/content/backmatter.tex index 23f7522c6..5e4a487bf 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -375,6 +375,8 @@ \section{Overview}\label{subsec:dep_overview} \minitab{\CorCpp: \FUNC{shmem\_wait} \\ \CorCpp: \FUNC{shmem\_\_wait}} & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline + \CorCpp: \FUNC{shmem\_wait\_until} & 1.4 & Current + & \Cstd[11]: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}}, \CorCpp: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_long\_wait\_until}} \\ \hline \minitab{\Cstd[11]: \FUNC{shmem\_fetch} \\ \CorCpp: \FUNC{shmem\_\_fetch}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline @@ -504,6 +506,11 @@ \subsection{\CorCpp: \FUNC{shmem\_wait}} favor of \FUNC{shmem\_wait\_until}, which makes the comparison operation explicit and better communicates the developer's intent. +\subsection{\CorCpp: \FUNC{shmem\_wait\_until}} +The \CTYPE{long}-typed \CorCpp routine \FUNC{shmem\_wait\_until} was deprecated +in favor of the \Cstd[11] type-generic interface of the same name or the +explicitly typed \CorCpp routine \FUNC{shmem\_long\_wait\_until}. + \subsection{\textit{C11} and \CorCpp: \FUNC{shmem\_fetch}, \FUNC{shmem\_set}, %% Issue #66. \FUNC{shmem\_cswap}, \FUNC{shmem\_swap}, \FUNC{shmem\_finc}, \FUNC{shmem\_inc}, \FUNC{shmem\_fadd}, \FUNC{shmem\_add}} From 2365daf4add31f4ad25b3b1d1ac0b035b4bdbc25 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Tue, 14 Nov 2017 00:29:54 -0500 Subject: [PATCH 547/583] Added changelog for deprecating `shmem_wait_until` --- content/backmatter.tex | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 5e4a487bf..f9a0c981e 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -586,7 +586,7 @@ \section{Version 1.4} \item Added the \CONST{SHMEM\_SYNC\_SIZE} constant. \\See Section \ref{subsec:library_constants}. % -\item Added type-generic interfaces for \FUNC{SHMEM\_WAIT}. +\item Added type-generic interfaces for \FUNC{shmem\_wait\_until}. \\ See Section \ref{subsec:shmem_wait}. % \item Removed the \VAR{volatile} qualifiers from the \VAR{ivar} arguments to @@ -612,8 +612,10 @@ \section{Version 1.4} \item Deprecated header directory \HEADER{mpp}. \\See Section \ref{sec:dep_api}. % -\item Deprecated the \VAR{shmem\_wait} functions and added \VAR{shmem\_test} - functions. +\item Deprecated the \FUNC{shmem\_wait} functions and the \CTYPE{long}-typed \CorCpp \FUNC{shmem\_wait\_until} function. +\\ See Section \ref{subsec:p2p_intro}. +% +\item Added the \FUNC{shmem\_test} functions. \\ See Section \ref{subsec:p2p_intro}. % \item Added the \FUNC{shmem\_calloc} function. From 9c96a55cc13e424580150634a9a2d7ab6de9b28b Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:40:53 -0400 Subject: [PATCH 548/583] Fix (future) merge conflict with section/rma-amo There was going to be a conflict between: - fix/shmem_cmp_t: Update shmem_cmp_t to int - section/rma-amo: Add highlighting for shmem_ctx_t in API listing in utils/defs.tex Thanks @BryantLam --- utils/defs.tex | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 7f26fc0fe..f8470d809 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -367,13 +367,13 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -381,7 +381,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -389,9 +389,10 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t}, aboveskip=0pt, belowskip=0pt}} - } - {} + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, + aboveskip=0pt, belowskip=0pt}} +} +{} \lstnewenvironment{Fsynopsis} { \deprecationstart \\ From 5d7c1637688cf40d66ae7dc18e7fdee218906b03 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:40:53 -0400 Subject: [PATCH 549/583] Fix (future) merge conflict with section/rma-amo There was going to be a conflict between: - fix/shmem_cmp_t: Update shmem_cmp_t to int - section/rma-amo: Add highlighting for shmem_ctx_t in API listing in utils/defs.tex Thanks @BryantLam --- utils/defs.tex | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 9b57d6230..3478e76c8 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -368,15 +368,13 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, - shmem_cmp_t, shmem_ctx_t}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, - shmem_cmp_t, shmem_ctx_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -384,8 +382,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, - shmem_cmp_t, shmem_ctx_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -393,11 +390,10 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, - shmem_cmp_t, shmem_ctx_t}, - aboveskip=0pt, belowskip=0pt}} - } - {} + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, + aboveskip=0pt, belowskip=0pt}} +} +{} \lstnewenvironment{Fsynopsis} { \deprecationstart \\ From c3b82377a5381e2a51ca70d397ea4dcbb90a0fc3 Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 17:19:36 -0500 Subject: [PATCH 550/583] Typo fix in sync section ("no PE my"->"no PE shall"). --- content/synchronization_model.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 641d67aa1..3a713f180 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -77,7 +77,7 @@ & {All local and remote memory operations issued by all \acp{PE} within the active set are guaranteed to be completed before any \ac{PE} in the -active set returns from the call. Additionally, no \ac{PE} my return from the +active set returns from the call. Additionally, no \ac{PE} shall return from the barrier until all \acp{PE} in the active set have entered the same barrier call. This routine should be used when synchronization as well as completion of all stores and remote memory updates via \openshmem is required over a sub set From 5652d0b16f4d90ad50e14039018b1e8f8068575e Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Wed, 30 Aug 2017 16:50:54 -0700 Subject: [PATCH 551/583] fixing mislabled PEs in quiet.pdf addressing github issue #81 --- figures/quiet.graffle | 2706 +++++++++++++++++++++-------------------- figures/quiet.pdf | Bin 63074 -> 46593 bytes 2 files changed, 1397 insertions(+), 1309 deletions(-) diff --git a/figures/quiet.graffle b/figures/quiet.graffle index d01f3f254..9749d29ee 100644 --- a/figures/quiet.graffle +++ b/figures/quiet.graffle @@ -1,1309 +1,1397 @@ - - - - - ActiveLayerIndex - 0 - ApplicationVersion - - com.omnigroup.OmniGraffle - 139.18.0.187838 - - AutoAdjust - - BackgroundGraphic - - Bounds - {{0, 0}, {1152, 733}} - Class - SolidGraphic - ID - 2 - Style - - shadow - - Draws - NO - - stroke - - Draws - NO - - - - BaseZoom - 0 - CanvasOrigin - {0, 0} - ColumnAlign - 1 - ColumnSpacing - 36 - CreationDate - 2014-02-04 18:37:20 +0000 - Creator - Pavel Shamis - DisplayScale - 1 0/72 in = 1.0000 in - GraphDocumentVersion - 8 - GraphicsList - - - Bounds - {{70.096904063309495, 405.61554727051521}, {76.921333312988281, 15}} - Class - ShapedGraphic - ID - 65 - Rotation - 153.57574462890625 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{70.121753001297776, 163.67627997882585}, {77.871635437011719, 15}} - Class - ShapedGraphic - ID - 54 - Rotation - 153.82313537597656 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Class - LineGraphic - Head - - ID - 45 - - ID - 77 - Points - - {16, 264} - {224, 264.21963500976562} - - Style - - stroke - - HeadArrow - 0 - Legacy - - Pattern - 24 - TailArrow - 0 - - - - - Bounds - {{548.94970253341262, 123}, {198, 125.83084106445312}} - Class - ShapedGraphic - ID - 70 - Shape - Rectangle - Style - - fill - - Color - - b - 0.999991 - g - 0.999974 - r - 1 - - - stroke - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs30 \cf0 PE K is any PE in the system.\ -\ -value1, value2, and value3\ -are delivered to target PEs and visible for PE K after the shmem_quiet() call.} - - - - Bounds - {{45.999997409511252, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 76 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{16, 11}, {70, 39}} - Class - ShapedGraphic - ID - 75 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE 2} - VerticalPad - 0 - - - - Bounds - {{45.999997409511252, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 74 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{765.69970444076125, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 62 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{735.69970703125, 11}, {70, 39}} - Class - ShapedGraphic - ID - 61 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE K} - VerticalPad - 0 - - - - Bounds - {{765.69970444076125, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 60 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{432.95552725825144, 360.83631934136469}, {79.163833618164062, 15}} - Class - ShapedGraphic - ID - 57 - Rotation - 29.242952346801758 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Class - LineGraphic - ID - 56 - Points - - {352.099853515625, 264.21963500976562} - {805.69970703125, 263} - - Style - - stroke - - HeadArrow - 0 - Legacy - - Pattern - 24 - TailArrow - 0 - - - Tail - - ID - 45 - Info - 3 - - - - Bounds - {{429.58094966987062, 193.41368125253854}, {77.487899780273438, 15}} - Class - ShapedGraphic - ID - 55 - Rotation - 24.251314163208008 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{520.19970444076125, 263.71961975097656}, {10, 184.49977111816406}} - Class - ShapedGraphic - ID - 53 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{283.099853515625, 420.54342651367188}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 52 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{156.54992416732375, 377.10272216796875}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 51 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr5, value5, PE 2)} - - - - Bounds - {{156.54992416732375, 333.66201782226562}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 50 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr4, value4, PE 0)} - - - - Bounds - {{283.099853515625, 290.557861328125}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 49 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - Style - - fill - - Color - - b - 0.830403 - g - 0.830389 - r - 0.830414 - - - - - - Bounds - {{156.54992416732375, 172.49285888671875}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 48 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr3, value3, PE 0)} - - - - Bounds - {{156.54992416732375, 136.35284042358398}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 47 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr2, value2, PE 2)} - - - - Bounds - {{224, 250.38165283203125}, {128.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 45 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_quiet()} - - - - Bounds - {{156.54992416732375, 102.67642211914062}, {263.099853515625, 27.67596435546875}} - Class - ShapedGraphic - ID - 36 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - - Shape - Rectangle - Style - - stroke - - CornerRadius - 5 - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 shmem_int_p (addr1, value1, PE 0)} - - - - Bounds - {{283.099853515625, 210.20545196533203}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 35 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{283.09985092513625, 62.500228881835938}, {10, 27.67596435546875}} - Class - ShapedGraphic - ID - 33 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - Bounds - {{432.56935019526316, 127.00000037163812}, {73.461151123046875, 15}} - Class - ShapedGraphic - ID - 27 - Rotation - 24.960399627685547 - Shape - AdjustableArrow - ShapeData - - ratio - 0.32189163565635681 - width - 14.973806381225586 - - Style - - fill - - Color - - a - 0.1 - b - 0 - g - 0 - r - 0 - - Draws - NO - MiddleFraction - 0.70634919404983521 - - shadow - - Color - - a - 0.4 - b - 0 - g - 0 - r - 0 - - Fuzziness - 0.0 - ShadowVector - {0, 2} - - stroke - - Color - - a - 0.75 - b - 0 - g - 0 - r - 0 - - - - TextRelativeArea - {{0.125, 0.25}, {0.75, 0.5}} - isConnectedShape - - - - Bounds - {{490.19970703125, 11}, {70, 39}} - Class - ShapedGraphic - ID - 30 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs28 \cf0 PE 1} - VerticalPad - 0 - - - - Bounds - {{253.09985092513625, 11}, {70, 39}} - Class - ShapedGraphic - ID - 28 - Shape - Circle - Style - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs32 \cf0 PE 0} - VerticalPad - 0 - - - - Bounds - {{520.19970444076125, 62.500225067138672}, {10, 202.21939086914062}} - Class - ShapedGraphic - ID - 1 - Magnets - - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {1, 1} - {1, -1} - {-1, 1} - {-1, -1} - - Shape - Rectangle - - - GridInfo - - GuidesLocked - NO - GuidesVisible - YES - HPages - 2 - ImageCounter - 1 - KeepToScale - - Layers - - - Lock - NO - Name - Layer 1 - Print - YES - View - YES - - - LayoutInfo - - Animate - NO - circoMinDist - 18 - circoSeparation - 0.0 - layoutEngine - dot - neatoSeparation - 0.0 - twopiSeparation - 0.0 - - LinksVisible - NO - MagnetsVisible - NO - MasterSheets - - ModificationDate - 2014-02-21 22:17:58 +0000 - Modifier - Shamis, Pavel - NotesVisible - NO - Orientation - 2 - OriginVisible - NO - PageBreaks - YES - PrintInfo - - NSBottomMargin - - float - 41 - - NSHorizonalPagination - - coded - BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG - - NSLeftMargin - - float - 18 - - NSPaperSize - - size - {612, 792} - - NSPrintReverseOrientation - - int - 0 - - NSRightMargin - - float - 18 - - NSTopMargin - - float - 18 - - - PrintOnePage - - ReadOnly - NO - RowAlign - 1 - RowSpacing - 36 - SheetTitle - Canvas 1 - SmartAlignmentGuidesActive - YES - SmartDistanceGuidesActive - YES - UniqueID - 1 - UseEntirePage - - VPages - 1 - WindowInfo - - CurrentSheet - 0 - ExpandedCanvases - - - name - Canvas 1 - - - Frame - {{108, 206}, {1434, 902}} - ListView - - OutlineWidth - 142 - RightSidebar - - Sidebar - - SidebarWidth - 120 - VisibleRegion - {{-81, -37}, {1314, 808}} - Zoom - 1 - ZoomValues - - - Canvas 1 - 1 - 1 - - - - - + + + + + ApplicationVersion + + com.omnigroup.OmniGraffle7 + 179.14.0.293243 + + CreationDate + 2014-02-04 18:37:20 +0000 + Creator + Pavel Shamis + GraphDocumentVersion + 14 + GuidesLocked + NO + GuidesVisible + YES + ImageCounter + 1 + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2014-02-21 22:17:58 +0000 + Modifier + Shamis, Pavel + MovementHandleVisible + NO + NotesVisible + NO + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {611.99999332427979, 792} + + NSPrintReverseOrientation + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + ReadOnly + NO + Sheets + + + ActiveLayerIndex + 0 + AutoAdjust + 6 + AutosizingMargin + 72 + BackgroundGraphic + + Bounds + {{0, 0}, {1152, 733}} + Class + GraffleShapes.CanvasBackgroundGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasDimensionsOrigin + {0, 0} + CanvasOrigin + {0, 0} + CanvasSizingMode + 1 + ColumnAlign + 1 + ColumnSpacing + 36 + DisplayScale + 1 in = 1.00000 in + GraphicsList + + + Bounds + {{70.096904063309495, 405.61554727051521}, {76.921333312988281, 15}} + Class + ShapedGraphic + ID + 3 + Rotation + 153.57574462890625 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{70.121753001297776, 163.67627997882585}, {77.871635437011719, 15}} + Class + ShapedGraphic + ID + 4 + Rotation + 153.82313537597656 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Class + LineGraphic + Head + + ID + 23 + + ID + 5 + Points + + {16, 264} + {224, 264.21963500976562} + + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + HeadArrow + 0 + Legacy + + Pattern + 24 + TailArrow + 0 + + + + + Bounds + {{548.94970253341262, 123}, {198, 125.83084106445312}} + Class + ShapedGraphic + ID + 6 + Style + + fill + + Color + + b + 0.99999970197677612 + g + 0.99999970197677612 + r + 0.9999966025352478 + space + srgb + + + stroke + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs30 \cf0 PE K is any PE in the system.\ +\ +value1, value2, and value3\ +are delivered to target PEs and visible for PE K after the shmem_quiet() call.} + + + + Bounds + {{45.999997409511252, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 7 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{16, 11}, {70, 39}} + Class + ShapedGraphic + ID + 8 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE 2} + VerticalPad + 0.0 + + + + Bounds + {{45.999997409511252, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 9 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{765.69970444076125, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 10 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{735.69970703125, 11}, {70, 39}} + Class + ShapedGraphic + ID + 11 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE K} + VerticalPad + 0.0 + + + + Bounds + {{765.69970444076125, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 12 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{432.95552725825144, 360.83631934136469}, {79.163833618164062, 15}} + Class + ShapedGraphic + ID + 13 + Rotation + 29.242952346801758 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Class + LineGraphic + ID + 14 + Points + + {352.099853515625, 264.21963500976562} + {805.69970703125, 263} + + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + HeadArrow + 0 + Legacy + + Pattern + 24 + TailArrow + 0 + + + Tail + + ID + 23 + Info + 3 + + + + Bounds + {{429.58094966987062, 193.41368125253854}, {77.487899780273438, 15}} + Class + ShapedGraphic + ID + 15 + Rotation + 24.251314163208008 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{520.19970444076125, 263.71961975097656}, {10, 184.49977111816406}} + Class + ShapedGraphic + ID + 16 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{283.099853515625, 420.54342651367188}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 17 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{156.54992416732375, 377.10272216796875}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 18 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr5, value5, PE 2)} + + + + Bounds + {{156.54992416732375, 333.66201782226562}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 19 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr4, value4, PE 1)} + + + + Bounds + {{283.099853515625, 290.557861328125}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 20 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + Style + + fill + + Color + + b + 0.86274486780166626 + g + 0.86274498701095581 + r + 0.86274510622024536 + space + srgb + + + + + + Bounds + {{156.54992416732375, 172.49285888671875}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 21 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr3, value3, PE 1)} + + + + Bounds + {{156.54992416732375, 136.35284042358398}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 22 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr2, value2, PE 2)} + + + + Bounds + {{224, 250.38165283203125}, {128.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 23 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_quiet()} + + + + Bounds + {{156.54992416732375, 102.67642211914062}, {263.099853515625, 27.67596435546875}} + Class + ShapedGraphic + ID + 24 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Style + + stroke + + CornerRadius + 5 + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 shmem_int_p (addr1, value1, PE 1)} + + + + Bounds + {{283.099853515625, 210.20545196533203}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 25 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{283.09985092513625, 62.500228881835938}, {10, 27.67596435546875}} + Class + ShapedGraphic + ID + 26 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + Bounds + {{432.56935019526316, 127.00000037163812}, {73.461151123046875, 15}} + Class + ShapedGraphic + ID + 27 + Rotation + 24.960399627685547 + Shape + AdjustableArrow + ShapeData + + ratio + 0.32189163565635681 + width + 14.973806381225586 + + Style + + fill + + Color + + a + 0.10000000000000001 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Draws + NO + MiddleFraction + 0.70634919404983521 + + shadow + + Color + + a + 0.40000000000000002 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + Fuzziness + 0.0 + + stroke + + Color + + a + 0.75 + b + 0.0 + g + 0.0 + r + 0.0 + space + srgb + + + + TextRelativeArea + {{0.125, 0.25}, {0.75, 0.5}} + isConnectedShape + + + + Bounds + {{490.19970703125, 11}, {70, 39}} + Class + ShapedGraphic + ID + 28 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs28 \cf0 PE 1} + VerticalPad + 0.0 + + + + Bounds + {{253.09985092513625, 11}, {70, 39}} + Class + ShapedGraphic + ID + 29 + Shape + Circle + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 + +\f0\fs32 \cf0 PE 0} + VerticalPad + 0.0 + + + + Bounds + {{520.19970444076125, 62.500225067138672}, {10, 202.21939086914062}} + Class + ShapedGraphic + ID + 30 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + {1, 1} + {1, -1} + {-1, 1} + {-1, -1} + + + + GridInfo + + HPages + 2 + KeepToScale + + Layers + + + Artboards + + Lock + + Name + Layer 1 + Print + + View + + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoLineLength + 0.20000000298023224 + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + Orientation + 2 + PrintOnePage + + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + UniqueID + 1 + VPages + 1 + VisibleVoidKey + 1 + + + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UseEntirePage + + WindowInfo + + CurrentSheet + 0 + Frame + {{0, 0}, {1276, 777}} + ShowInfo + + Sidebar + + SidebarWidth + 200 + Sidebar_Tab + 0 + VisibleRegion + {{0, -127}, {774, 667}} + ZoomValues + + + Canvas 1 + 1 + 1 + + + + compressOnDiskKey + + copyLinkedImagesKey + + createSinglePDFKey + + exportAreaKey + 0 + exportQualityKey + 100 + exportSizesKey + + 1 + + + fileFormatKey + 0 + htmlImageTypeKey + 0 + includeBackgroundGraphicKey + + includeNonPrintingLayersKey + + lastExportTypeKey + 8 + marginWidthKey + 0.0 + previewTypeKey + 0 + readOnlyKey + + resolutionForBMPKey + 1 + resolutionForGIFKey + 1 + resolutionForHTMLKey + 1 + resolutionForJPGKey + 1 + resolutionForPNGKey + 1 + resolutionForTIFFKey + 1 + resolutionUnitsKey + 0 + saveAsFlatFileOptionKey + 3 + useArtboardsKey + + useMarginKey + + useNotesKey + + + diff --git a/figures/quiet.pdf b/figures/quiet.pdf index 3f674f23829b6d6d47ce57c332afd2027427a1dc..fed7f1d52b31985081e068b6d2989bbece8bad02 100644 GIT binary patch literal 46593 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 From d7304c3b1336289a5231f0bde2d5a2402af70d6f Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 21:25:36 -0500 Subject: [PATCH 552/583] Use consistent param name for wait/test routines. --- content/shmem_test.tex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/shmem_test.tex b/content/shmem_test.tex index 3396a61ed..f8705da17 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE value); +int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE value); +int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. @@ -20,21 +20,21 @@ \apiargument{OUT}{ivar}{A pointer to a remotely accessible data object.} \apiargument{IN}{cmp}{The comparison operator that compares \VAR{ivar} with - \VAR{value}.} - \apiargument{IN}{value}{The value against which the object pointed to + \VAR{cmp\_value}.} + \apiargument{IN}{cmp\_value}{The value against which the object pointed to by \VAR{ivar} will be compared.} \end{apiarguments} \apidescription{ \FUNC{shmem\_test} tests the numeric comparison of the symmetric object - pointed to by \VAR{ivar} with the value \VAR{value} according to the + pointed to by \VAR{ivar} with the value \VAR{cmp\_value} according to the comparison operator \VAR{cmp}. } \apireturnvalues{ \FUNC{shmem\_test} returns 1 if the comparison of the symmetric object - pointed to by \VAR{ivar} with the value \VAR{value} according to the + pointed to by \VAR{ivar} with the value \VAR{cmp\_value} according to the comparison operator \VAR{cmp} evalutes to true; otherwise, it returns 0. } From 502e654978a5e73495a0bf2a3c987c22563f962c Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 22:36:46 -0500 Subject: [PATCH 553/583] Add nb put/get in fence/quiet description. --- content/shmem_fence.tex | 14 +++++++------- content/synchronization_model.tex | 8 ++++---- main_spec.tex | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 55a543103..c0d30fdf1 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store routines + Assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects. } @@ -20,12 +20,12 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \acp{AMO}, and memory store - routines to symmetric data objects. All \PUT{}, \acp{AMO}, and memory store - routines to symmetric data objects issued to a particular remote \ac{PE} + This routine assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects. All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \acp{AMO}, and memory store routines to symmetric data + subsequent \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, not completion. } @@ -43,12 +43,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \acp{AMO}, and memory store routines to + guarantees completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \acp{AMO}, and memory store routines to symmetric data objects is desired + \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. } diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 3a713f180..51771f6f2 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,6 +1,6 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of -communication become critical. The updates via \PUT{} routines, \acp{AMO} and -store routines on symmetric data cannot be guaranteed until some form of +communication become critical. The updates via \PUT{}, \acp{AMO}, store, and +nonblocking \PUT{} and \GET{} routines on symmetric data cannot be guaranteed until some form of synchronization or ordering is introduced by the program user. The table below gives the different synchronization and ordering choices, and the situations where they may be useful.\\ @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued to +All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{} routines, \acp{AMO} and store routines on symmetric data issued by a +{All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local diff --git a/main_spec.tex b/main_spec.tex index ee570da14..adf26cf69 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -285,8 +285,8 @@ \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} \subsection{Memory Ordering Routines}\label{subsec:memory_order} The following section discusses \openshmem \acp{API} that provide mechanisms to -ensure ordering and/or delivery of \OPR{Put}, \ac{AMO}, and memory store -routines to symmetric data objects. +ensure ordering and/or delivery of \OPR{Put}, \ac{AMO}, memory store, +and non-blocking \PUT{} and \GET{} routines to symmetric data objects. \subsubsection{\textbf{SHMEM\_FENCE}}\label{subsec:shmem_fence} \input{content/shmem_fence.tex} From 5036ab6c969ed00fea327787cf3fd101918df605 Mon Sep 17 00:00:00 2001 From: Min Si Date: Wed, 30 Aug 2017 22:48:49 -0500 Subject: [PATCH 554/583] Change AMOs to AMO in sync section. Because "AMOs" is always followed by "routines" in the sync section, e.g., delivery of Put, AMOs,...routines, it should be changed to AMO. --- content/shmem_fence.tex | 12 ++++++------ content/shmem_quiet.tex | 9 ++++----- content/synchronization_model.tex | 6 +++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index c0d30fdf1..df50b692c 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines + Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects. } @@ -20,12 +20,12 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} - routines to symmetric data objects. All \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data + subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, not completion. } @@ -43,12 +43,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} routines to + guarantees completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \acp{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired + \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. } diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 78bb66b1e..ecbcdb011 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -1,5 +1,5 @@ \apisummary{ - Waits for completion of all outstanding \PUT{}, \acp{AMO}, memory store, + Waits for completion of all outstanding \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects issued by a \ac{PE}. } @@ -21,10 +21,9 @@ \end{apiarguments} \apidescription{ - The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \acp{AMO}, + The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines on - symmetric data objects issued by the calling \ac{PE} - on the given context. All \PUT{}, \acp{AMO}, + symmetric data objects issued by the calling \ac{PE} on the given context. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. @@ -37,7 +36,7 @@ \apinotes{ \FUNC{shmem\_quiet} is most useful as a way of ensuring completion of - several \PUT{}, \acp{AMO}, memory store, and non-blocking \PUT{} + several \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} and \GET{} routines to symmetric data objects initiated by the calling \ac{PE}. For example, one might use \FUNC{shmem\_quiet} to await delivery of a block of data before issuing another \PUT{} or non-blocking diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 51771f6f2..82b168387 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,5 +1,5 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of -communication become critical. The updates via \PUT{}, \acp{AMO}, store, and +communication become critical. The updates via \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} and \GET{} routines on symmetric data cannot be guaranteed until some form of synchronization or ordering is introduced by the program user. The table below gives the different synchronization and ordering choices, and the situations @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to +All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{}, \acp{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a +{All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local From 92af11eb1593a8ab1697b703b235ff644f132b14 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:23:55 -0700 Subject: [PATCH 555/583] fixing a typo in p2p sync intro --- content/p2p_sync_intro.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 62f5a0ee0..3ac8b7239 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -1,4 +1,4 @@ -The following section discusses \openshmem \acp{API} that provides a mechanism +The following section discusses \openshmem \acp{API} that provide a mechanism for synchronization between two \acp{PE} based on the value of a symmetric data object. The point-to-point synchronization routines can be used to portably ensure From e80b2328ce41a9dda8981cc43f8552e33ad9e070 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:36:28 -0700 Subject: [PATCH 556/583] fixing param description in shmem_wait_until removing a contrafictory statement shmem_wait_until param description that cmp_value has to be an integer --- content/shmem_wait.tex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..448415fb8 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -42,8 +42,7 @@ \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} -\apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When - using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the +\apiargument{IN}{When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of the same size and kind as \VAR{ivar}.} From bd8c7940cc93f9b3ea654666075892764e49c324 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 31 Aug 2017 07:47:58 -0700 Subject: [PATCH 557/583] Revert "fixing param description in shmem_wait_until" This reverts commit 0d03b7f22dcf76eced133277c073ff1fe71d35e8. --- content/shmem_wait.tex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 448415fb8..13b7f0432 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -42,7 +42,8 @@ \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} -\apiargument{IN}{When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the +\apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When + using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of the same size and kind as \VAR{ivar}.} From a4b7385dfa818c5b224b23c5ca7015dddcb2446e Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Wed, 6 Sep 2017 17:03:10 -0700 Subject: [PATCH 558/583] renaming section to shmem_wait_until --- main_spec.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main_spec.tex b/main_spec.tex index adf26cf69..a52420352 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -273,7 +273,7 @@ \subsubsection{\textbf{SHMEM\_ALLTOALLS}}\label{subsec:shmem_alltoalls} \subsection{Point-To-Point Synchronization Routines}\label{subsec:p2p_intro} \input{content/p2p_sync_intro.tex} -\subsubsection{\textbf{SHMEM\_WAIT}}\label{subsec:shmem_wait} +\subsubsection{\textbf{SHMEM\_WAIT\_UNTIL}}\label{subsec:shmem_wait} \input{content/shmem_wait.tex} \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} From b462900eb848f3a5d28175aa234f8558616423ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bouteiller?= Date: Thu, 7 Sep 2017 16:55:43 -0400 Subject: [PATCH 559/583] Copying the note on ordering in MT programs from quiet to fence. --- content/shmem_fence.tex | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index df50b692c..7a8b6aa21 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -50,6 +50,16 @@ The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. + + In an \openshmem program with multithreaded \acp{PE}, it is the + user's responsibility to ensure ordering between operations issued by the threads + in a \ac{PE} that target symmetric memory (e.g. \PUT{}, \ac{AMO}, memory stores, + and nonblocking routines) and calls by threads in that \ac{PE} to + \FUNC{shmem\_fence}. The \FUNC{shmem\_fence} routine can enforce memory store ordering only for the + calling thread. Thus, to ensure ordering for memory stores performed by a thread that is + not the thread calling \FUNC{shmem\_fence}, the update must be made visible to the + calling thread according to the rules of the memory model associated with + the threading environment. } \begin{apiexamples} From 3d4664663881c8c9fca327d9ff4f41dd2e152715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bouteiller?= Date: Thu, 7 Sep 2017 17:11:33 -0400 Subject: [PATCH 560/583] 90:30: the following example uses shmem_fence in a C11 program. 92:30: "by the program user" -> in the user's program --- content/shmem_fence.tex | 2 +- content/synchronization_model.tex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 7a8b6aa21..7b37117fe 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -65,7 +65,7 @@ \begin{apiexamples} \apicexample - {The following \FUNC{shmem\_fence} example is for C11 programs: } + {The following example uses \FUNC{shmem\_fence} in a C11 program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index 82b168387..c10bd15ca 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -1,7 +1,7 @@ When using the \openshmem \ac{API}, synchronization, ordering, and completion of -communication become critical. The updates via \PUT{}, \ac{AMO}, store, and +communication become critical. The updates via \PUT{} routines, \acp{AMO}, stores, and nonblocking \PUT{} and \GET{} routines on symmetric data cannot be guaranteed until some form of -synchronization or ordering is introduced by the program user. The table below +synchronization or ordering is introduced in the user's program. The table below gives the different synchronization and ordering choices, and the situations where they may be useful.\\ From c02a475cc81bee663253087aacd5d530e6372ea7 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 7 Sep 2017 14:34:58 -0700 Subject: [PATCH 561/583] clarifying shmem_fence and non-blocking get shmem_fence does not guarantee order of delivery of non-blocking get routines --- content/shmem_fence.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 7b37117fe..c1c3e2d92 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -27,7 +27,7 @@ to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, - not completion. + not completion. It does not guarantee order of delivery of non-blocking \GET{} routines. } \apireturnvalues{ From 6ad0e8b2e6279d4d61d6f312cc12102f91fdfb80 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:27:59 -0400 Subject: [PATCH 562/583] section/sync: Use LaTeX macros where appropriate --- content/p2p_sync_intro.tex | 2 +- content/shmem_fence.tex | 2 +- content/shmem_quiet.tex | 2 +- content/shmem_wait.tex | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index 3ac8b7239..e468b449e 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -47,7 +47,7 @@ \CTYPE{shmem\_cmp\_t}, whose enumerators specify the comparison operators used by synchronization routines that take a \CTYPE{shmem\_cmp\_t} argument. The enumerators of \CTYPE{shmem\_cmp\_t} and their associated operations are -presented in Table~\ref{p2p-consts}. For Fortran, the constant names of +presented in Table~\ref{p2p-consts}. For \Fortran, the constant names of Table~\ref{p2p-consts} shall be identifiers for integer parameters of default kind corresponding to the associated comparison operation. diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index c1c3e2d92..96daa94b2 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -65,7 +65,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_fence} in a C11 program: } + {The following example uses \FUNC{shmem\_fence} in a \Cstd[11] program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index ecbcdb011..4f6fe164d 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -76,7 +76,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_quiet} in a C11 program: } + {The following example uses \FUNC{shmem\_quiet} in a \Cstd[11] program: } {./example_code/shmem_quiet_example.c} {\VAR{Put1} and \VAR{put2} will be completed and visible before \VAR{put3} and \VAR{put4}.} diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 13b7f0432..8bbfe3c0d 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -80,7 +80,7 @@ \apinotes{ As of \openshmem[1.4], the \FUNC{shmem\_wait} routine is deprecated, however, \FUNC{shmem\_wait} is equivalent to \FUNC{shmem\_wait\_until} - where \VAR{cmp} is SHMEM\_CMP\_NE. + where \VAR{cmp} is \CONST{SHMEM\_CMP\_NE}. } \apiimpnotes{ From 9cdfe8bb2eb4493d695f0ebd42e6d0b6197d6043 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:28:28 -0400 Subject: [PATCH 563/583] section/sync: Update context wording for consistency with RMA/AMO --- content/shmem_fence.tex | 3 ++- content/shmem_quiet.tex | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 96daa94b2..162483414 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -16,7 +16,8 @@ \begin{apiarguments} \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 4f6fe164d..16fa7df14 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -17,7 +17,8 @@ \begin{apiarguments} \apiargument{IN}{ctx}{Context on which to perform the operation. When this - argument is not provided, \CONST{SHMEM\_CTX\_DEFAULT} is used.} + argument is not provided, the operation is performed on + \CONST{SHMEM\_CTX\_DEFAULT}.} \end{apiarguments} \apidescription{ From 4aacd86f3d9d1201ba4c1ce76ebde69883622a90 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:29:07 -0400 Subject: [PATCH 564/583] section/sync: Fix a couple instances of comma over-use --- content/shmem_wait.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 8bbfe3c0d..dca6e4d70 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -53,14 +53,14 @@ \FUNC{shmem\_wait} and \FUNC{shmem\_wait\_until} wait for \VAR{ivar} to be changed by a write or an atomic operation issued by a \ac{PE}. These routines can be used for point-to-point direct synchronization. A call - to \FUNC{shmem\_wait} does not return until a \ac{PE} writes a value, - not equal to \VAR{cmp\_value}, into \VAR{ivar} on the waiting \ac{PE}. A call + to \FUNC{shmem\_wait} does not return until a \ac{PE} writes a value + not equal to \VAR{cmp\_value} into \VAR{ivar} on the waiting \ac{PE}. A call to \FUNC{shmem\_wait\_until} does not return until a \ac{PE} changes \VAR{ivar} to satisfy the condition implied by \VAR{cmp} and \VAR{cmp\_value}. The \FUNC{shmem\_wait} routines return when \VAR{ivar} is no longer equal to \VAR{cmp\_value}. The \FUNC{shmem\_wait\_until} routines return when the compare condition is true. The compare condition is defined by the \VAR{ivar} argument compared with the - \VAR{cmp\_value} using the comparison operator, \VAR{cmp}. + \VAR{cmp\_value} using the comparison operator \VAR{cmp}. } From 7a6255e80167269d78b0275852140cacc4a8f039 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 15:52:44 -0400 Subject: [PATCH 565/583] section/sync: Fix deprecation styling on shmem_cache --- content/shmem_cache.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_cache.tex b/content/shmem_cache.tex index b3a53eab0..eab9dbd35 100644 --- a/content/shmem_cache.tex +++ b/content/shmem_cache.tex @@ -15,7 +15,8 @@ \end{Csynopsis} \end{DeprecateBlock} -\begin{DeprecateBlock} +% N.B., The DeprecateBlock environment is not necessary here +% because the entire Fortran API is deprecated. \begin{Fsynopsis} CALL SHMEM_CLEAR_CACHE_INV CALL SHMEM_SET_CACHE_INV @@ -23,7 +24,6 @@ CALL SHMEM_UDCFLUSH CALL SHMEM_UDCFLUSH_LINE(dest) \end{Fsynopsis} -\end{DeprecateBlock} \begin{apiarguments} From 842869eeacc1887192aa73e0014b5bf875e5a8db Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 12 Oct 2017 16:06:30 -0700 Subject: [PATCH 566/583] addressing feedback from RCM reading non-blocking -> nonblocking using the right macro for C11 --- content/shmem_fence.tex | 16 ++++++++-------- content/shmem_quiet.tex | 12 ++++++------ content/synchronization_model.tex | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 162483414..2e6762e9e 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -1,5 +1,5 @@ \apisummary{ - Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines + Assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects. } @@ -21,14 +21,14 @@ \end{apiarguments} \apidescription{ - This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} - routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + This routine assures ordering of delivery of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} + routines to symmetric data objects. All \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects issued to a particular remote \ac{PE} on the given context prior to the call to \FUNC{shmem\_fence} are guaranteed to be delivered before any - subsequent \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data + subsequent \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects to the same \ac{PE}. \FUNC{shmem\_fence} guarantees order of delivery, - not completion. It does not guarantee order of delivery of non-blocking \GET{} routines. + not completion. It does not guarantee order of delivery of nonblocking \GET{} routines. } \apireturnvalues{ @@ -44,12 +44,12 @@ ordering of its memory accesses. There is a subtle difference between \FUNC{shmem\_fence} and \FUNC{shmem\_quiet}, in that, \FUNC{shmem\_quiet} - guarantees completion of \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} routines to + guarantees completion of \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects which makes the updates visible to all other \acp{PE}. The \FUNC{shmem\_quiet} routine should be called if completion of \PUT{}, - \ac{AMO}, memory store, and non-blocking \PUT{} routines to symmetric data objects is desired + \ac{AMO}, memory store, and nonblocking \PUT{} routines to symmetric data objects is desired when multiple remote \acp{PE} are involved. In an \openshmem program with multithreaded \acp{PE}, it is the @@ -66,7 +66,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_fence} in a \Cstd[11] program: } + {The following example uses \FUNC{shmem\_fence} in a \Cstd[11] program: } {./example_code/shmem_fence_example.c} {\VAR{Put1} will be ordered to be delivered before \VAR{put3} and \VAR{put2} will be ordered to be delivered before \VAR{put4}.} diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 16fa7df14..016a3c4c8 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -1,6 +1,6 @@ \apisummary{ Waits for completion of all outstanding \PUT{}, \ac{AMO}, memory store, - and non-blocking \PUT{} and \GET{} routines to symmetric data + and nonblocking \PUT{} and \GET{} routines to symmetric data objects issued by a \ac{PE}. } @@ -23,9 +23,9 @@ \apidescription{ The \FUNC{shmem\_quiet} routine ensures completion of \PUT{}, \ac{AMO}, - memory store, and non-blocking \PUT{} and \GET{} routines on + memory store, and nonblocking \PUT{} and \GET{} routines on symmetric data objects issued by the calling \ac{PE} on the given context. All \PUT{}, \ac{AMO}, - memory store, and non-blocking \PUT{} and \GET{} routines to + memory store, and nonblocking \PUT{} and \GET{} routines to symmetric data objects are guaranteed to be completed and visible to all \acp{PE} when \FUNC{shmem\_quiet} returns. } @@ -37,10 +37,10 @@ \apinotes{ \FUNC{shmem\_quiet} is most useful as a way of ensuring completion of - several \PUT{}, \ac{AMO}, memory store, and non-blocking \PUT{} + several \PUT{}, \ac{AMO}, memory store, and nonblocking \PUT{} and \GET{} routines to symmetric data objects initiated by the calling \ac{PE}. For example, one might use \FUNC{shmem\_quiet} to await delivery - of a block of data before issuing another \PUT{} or non-blocking + of a block of data before issuing another \PUT{} or nonblocking \PUT{} routine, which sets a completion flag on another \ac{PE}. \FUNC{shmem\_quiet} is not usually needed if \FUNC{shmem\_barrier\_all} or \FUNC{shmem\_barrier} are called. The barrier @@ -77,7 +77,7 @@ \begin{apiexamples} \apicexample - {The following example uses \FUNC{shmem\_quiet} in a \Cstd[11] program: } + {The following example uses \FUNC{shmem\_quiet} in a \Cstd[11] program: } {./example_code/shmem_quiet_example.c} {\VAR{Put1} and \VAR{put2} will be completed and visible before \VAR{put3} and \VAR{put4}.} diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index c10bd15ca..ab62275dd 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -36,7 +36,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} routines on symmetric data issued to +All \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} routines on symmetric data issued to same \ac{PE} are guaranteed to be delivered before Puts (to the same \ac{PE}) issued after the \FUNC{fence} call. \tabularnewline \hline @@ -56,7 +56,7 @@ \begin{tabular}{p{0.2\textwidth} | p{0.7\textwidth}} {} & -{All \PUT{}, \ac{AMO}, store, and non-blocking \PUT{} and \GET{} routines on symmetric data issued by a +{All \PUT{}, \ac{AMO}, store, and nonblocking \PUT{} and \GET{} routines on symmetric data issued by a local \ac{PE} to all remote \acp{PE} are guaranteed to be completed and visible once quiet returns. This routine should be used when all remote writes issued by a local \ac{PE} need to be visible to all other \acp{PE} before the local From cd4fcd6192a0165e229f5e677ee64eb1fd423797 Mon Sep 17 00:00:00 2001 From: Sreeram Potluri Date: Thu, 12 Oct 2017 16:33:36 -0700 Subject: [PATCH 567/583] updating figure to use shmem_wait_until instead of deprecated shmem_wait --- content/synchronization_model.tex | 2 +- figures/wait.graffle | 28 ++++++++++++++-------------- figures/wait.pdf | Bin 57694 -> 54392 bytes 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/content/synchronization_model.tex b/content/synchronization_model.tex index ab62275dd..8d3dd4b15 100644 --- a/content/synchronization_model.tex +++ b/content/synchronization_model.tex @@ -11,7 +11,7 @@ \hline \hline {Point-to-point synchronization}\\ -\FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until} +\FUNC{shmem\_wait\_until} & \raisebox{-\totalheight}{\includegraphics[width=0.7\textwidth]{figures/wait}} \end{tabular} diff --git a/figures/wait.graffle b/figures/wait.graffle index ba0b04fdd..8a05b6cf9 100644 --- a/figures/wait.graffle +++ b/figures/wait.graffle @@ -6,7 +6,7 @@ 0 ApplicationVersion - com.omnigroup.OmniGraffle + com.omnigroup.OmniGrafflePro 139.18.0.187838 AutoAdjust @@ -90,7 +90,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -103,7 +103,7 @@ Bounds - {{576, 66}, {201, 58.824271203326333}} + {{576, 66}, {221, 58.824271203326333}} Class ShapedGraphic ID @@ -140,12 +140,12 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs30 \cf0 shmem_wait is a blocking operation therefore it waits until value in +\f0\fs30 \cf0 shmem_wait_until is a blocking operation therefore it waits until value in \i addr \i0 is updated} @@ -189,7 +189,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\froman\fcharset0 Times-Roman;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -227,7 +227,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -352,7 +352,7 @@ Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -450,7 +450,7 @@ is Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -495,7 +495,7 @@ is Text Text - {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 + {\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf110 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc @@ -574,9 +574,9 @@ is MasterSheets ModificationDate - 2014-02-10 21:26:55 +0000 + 2017-10-12 23:18:46 +0000 Modifier - Shamis, Pavel + Sreeram Potluri NotesVisible NO Orientation @@ -655,7 +655,7 @@ is Frame - {{398, 136}, {1067, 872}} + {{157, 4}, {1067, 872}} ListView OutlineWidth @@ -669,7 +669,7 @@ is SidebarWidth 120 VisibleRegion - {{0, 0}, {932, 733}} + {{0, 0}, {918, 715}} Zoom 1 ZoomValues diff --git a/figures/wait.pdf b/figures/wait.pdf index 6ece7fddcdc40d14911f05e10d60c86c7be2ac51..b48fa8b7b2e9361d8aef7134d5cc3dc39f889d5a 100644 GIT binary patch delta 34052 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 Date: Thu, 12 Oct 2017 17:30:32 -0700 Subject: [PATCH 568/583] removing recommendations for wait under fence and quiet sections --- content/shmem_fence.tex | 2 +- content/shmem_quiet.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_fence.tex b/content/shmem_fence.tex index 2e6762e9e..a93a7023e 100644 --- a/content/shmem_fence.tex +++ b/content/shmem_fence.tex @@ -39,7 +39,7 @@ \FUNC{shmem\_fence} only provides per-\ac{PE} ordering guarantees and does not guarantee completion of delivery. \FUNC{shmem\_fence} also does not have an effect on the ordering between memory - accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, + accesses issued by the target PE. \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee ordering of its memory accesses. There is a subtle difference between diff --git a/content/shmem_quiet.tex b/content/shmem_quiet.tex index 016a3c4c8..7db458131 100644 --- a/content/shmem_quiet.tex +++ b/content/shmem_quiet.tex @@ -69,7 +69,7 @@ \FUNC{shmem\_quiet}. \FUNC{shmem\_quiet} does not have an effect on the ordering between memory - accesses issued by the target PE. \FUNC{shmem\_wait}, \FUNC{shmem\_wait\_until}, + accesses issued by the target PE. \FUNC{shmem\_wait\_until}, \FUNC{shmem\_test}, \FUNC{shmem\_barrier}, \FUNC{shmem\_barrier\_all} routines can be called by the target PE to guarantee ordering of its memory accesses. } From a3fdea5bbbf12fea743d415bb16b10f8f9b9bf71 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Sun, 12 Nov 2017 21:05:15 -0500 Subject: [PATCH 569/583] Add C/C++ routine for `shmem_wait_until`: long Not yet deprecated. Related #176. Closes #184. --- content/shmem_wait.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index dca6e4d70..a88d44f1d 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -11,6 +11,7 @@ Table \ref{p2psynctypes}. \begin{Csynopsis} +void shmem_wait_until(long *ivar, shmem_cmp_t cmp, long cmp_value); void shmem__wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a From 74a55ebf2f4c2fa43d1898509ee1b0d17a7e7b15 Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Mon, 13 Nov 2017 11:38:25 -0500 Subject: [PATCH 570/583] Update shmem_cmp_t to int This commit addresses #175 by removing the enumerated type shmem_cmp_t in favor of int-typed arguments to shmem_{wait, wait_until, test}. --- content/p2p_sync_intro.tex | 12 ++++++------ content/shmem_test.tex | 4 ++-- content/shmem_wait.tex | 8 ++++---- example_code/shmem_test_example1.c | 2 +- utils/defs.tex | 11 +++++------ 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/content/p2p_sync_intro.tex b/content/p2p_sync_intro.tex index e468b449e..942c8b3da 100644 --- a/content/p2p_sync_intro.tex +++ b/content/p2p_sync_intro.tex @@ -43,11 +43,11 @@ \end{center} \end{table} -The point-to-point synchronization interface provides the enumerated type -\CTYPE{shmem\_cmp\_t}, whose enumerators specify the comparison operators used -by synchronization routines that take a \CTYPE{shmem\_cmp\_t} argument. The -enumerators of \CTYPE{shmem\_cmp\_t} and their associated operations are -presented in Table~\ref{p2p-consts}. For \Fortran, the constant names of +The point-to-point synchronization interface provides named constants whose +values are integer constant expressions that specify the comparison operators +used by \openshmem synchronization routines. +The constant names and associated operations are +presented in Table~\ref{p2p-consts}. For Fortran, the constant names of Table~\ref{p2p-consts} shall be identifiers for integer parameters of default kind corresponding to the associated comparison operation. @@ -63,7 +63,7 @@ SHMEM\_CMP\_LT & Less than \\ SHMEM\_CMP\_LE & Less than or equal to \\ \hline \end{tabular} - \caption{Point-to-Point Comparison Enumeration Constants} + \caption{Point-to-Point Comparison Constants} \label{p2p-consts} \end{center} \end{table} diff --git a/content/shmem_test.tex b/content/shmem_test.tex index f8705da17..4a588f9cf 100644 --- a/content/shmem_test.tex +++ b/content/shmem_test.tex @@ -5,13 +5,13 @@ \begin{apidefinition} \begin{C11synopsis} -int shmem_test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int shmem_test(TYPE *ivar, int cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -int shmem__test(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +int shmem__test(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table \ref{p2psynctypes}. diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index a88d44f1d..4dbb0ebde 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -5,14 +5,14 @@ \begin{apidefinition} \begin{C11synopsis} -void shmem_wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void shmem_wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{C11synopsis} where \TYPE{} is one of the point-to-point synchronization types specified by Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem_wait_until(long *ivar, shmem_cmp_t cmp, long cmp_value); -void shmem__wait_until(TYPE *ivar, shmem_cmp_t cmp, TYPE cmp_value); +void shmem_wait_until(long *ivar, int cmp, long cmp_value); +void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a corresponding \TYPENAME{} specified by Table~\ref{p2psynctypes}. @@ -42,7 +42,7 @@ the type of \VAR{ivar} should match that implied in the SYNOPSIS section.} \apiargument{IN}{cmp}{The compare operator that compares \VAR{ivar} with \VAR{cmp\_value}. When using \Fortran, it must be of default kind. - When using \CorCpp, it must be of type \CTYPE{shmem\_cmp\_t}.} + When using \CorCpp, it must be of type \CTYPE{int}.} \apiargument{IN}{cmp\_value}{\VAR{cmp\_value} must be of type integer. When using \CorCpp, the type of \VAR{cmp\_value} should match that implied in the SYNOPSIS section. When using \Fortran, cmp\_value must be an integer of diff --git a/example_code/shmem_test_example1.c b/example_code/shmem_test_example1.c index 02c430bae..d3f760f44 100644 --- a/example_code/shmem_test_example1.c +++ b/example_code/shmem_test_example1.c @@ -1,7 +1,7 @@ #include #include -int user_wait_any(long *ivar, int count, shmem_cmp_t cmp, long value) +int user_wait_any(long *ivar, int count, int cmp, long value) { int idx = 0; while (!shmem_test(&ivar[idx], cmp, value)) diff --git a/utils/defs.tex b/utils/defs.tex index 924663190..7f26fc0fe 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -243,8 +243,7 @@ shmem_short_fadd, shmem_int_fadd, shmem_long_fadd, shmem_set_lock, shmem_test_lock, shmem_clear_lock, shmem_long_sum_to_all, - shmem_complexd_sum_to_all, - shmem_cmp_t + shmem_complexd_sum_to_all }, keywordstyle=\color{black}\textbf, classoffset=0, @@ -368,13 +367,13 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} @@ -382,7 +381,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_cmp_t}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -471,7 +470,7 @@ ##1 \lstinputlisting[language={C}, tabsize=2, basicstyle=\ttfamily\footnotesize, - morekeywords={size_t, ptrdiff_t, shmem_cmp_t, shmem_ctx_t}]{##2} + morekeywords={size_t, ptrdiff_t, shmem_ctx_t}]{##2} ##3 } \newcommand{\apifexample}[3]{ ##1 From 5aa1a5318ede262ff1ba0ff855858b4456f99cd5 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Mon, 13 Nov 2017 23:24:11 -0500 Subject: [PATCH 571/583] Deprecate long-typed `shmem_wait_until` --- content/shmem_wait.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/shmem_wait.tex b/content/shmem_wait.tex index 4dbb0ebde..b49cf5f8a 100644 --- a/content/shmem_wait.tex +++ b/content/shmem_wait.tex @@ -11,7 +11,6 @@ Table \ref{p2psynctypes}. \begin{Csynopsis} -void shmem_wait_until(long *ivar, int cmp, long cmp_value); void shmem__wait_until(TYPE *ivar, int cmp, TYPE cmp_value); \end{Csynopsis} where \TYPE{} is one of the point-to-point synchronization types and has a @@ -19,6 +18,7 @@ \begin{DeprecateBlock} \begin{CsynopsisCol} +void shmem_wait_until(long *ivar, int cmp, long cmp_value); void shmem_wait(long *ivar, long cmp_value); void shmem__wait(TYPE *ivar, TYPE cmp_value); \end{CsynopsisCol} From 98659fc13663afeef1225536db475529c9807fec Mon Sep 17 00:00:00 2001 From: "Nicholas S. Park" Date: Fri, 6 Oct 2017 11:40:53 -0400 Subject: [PATCH 572/583] Fix (future) merge conflict with section/rma-amo There was going to be a conflict between: - fix/shmem_cmp_t: Update shmem_cmp_t to int - section/rma-amo: Add highlighting for shmem_ctx_t in API listing in utils/defs.tex Thanks @BryantLam --- utils/defs.tex | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 7f26fc0fe..f8470d809 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -367,13 +367,13 @@ { \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn}, + morekeywords={size_t, ptrdiff_t, TYPE, _Noreturn, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisCol} { \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} @@ -381,7 +381,7 @@ { \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE}, + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, aboveskip=0pt, belowskip=0pt}}{} \lstnewenvironment{CsynopsisST} @@ -389,9 +389,10 @@ \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, - morekeywords={size_t}, aboveskip=0pt, belowskip=0pt}} - } - {} + morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, + aboveskip=0pt, belowskip=0pt}} +} +{} \lstnewenvironment{Fsynopsis} { \deprecationstart \\ From f5b5d4dd3a8fb2c4b400eac1c786d8d3efd362f4 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 17 Nov 2017 15:30:18 -0500 Subject: [PATCH 573/583] Makefile: makeindex again --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 7e4603ad1..0a48e04d4 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ ${TARGET}.pdf: ${SOURCES} ${FIGURES} ${EXAMPLES} pdflatex $(LATEXOPT) ${TARGET} makeindex ${TARGET} pdflatex $(LATEXOPT) ${TARGET} + makeindex ${TARGET} pdflatex $(LATEXOPT) ${TARGET} .PHONY: clean From 1f5f49454f6624ebbcfb3cde3e5edd657953c9c8 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 17 Nov 2017 16:21:00 -0500 Subject: [PATCH 574/583] Reduced categorization in index --- content/backmatter.tex | 82 +++++++++++++++++++++--------------------- utils/defs.tex | 21 ++++------- 2 files changed, 48 insertions(+), 55 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 6f27b0435..462c6bacc 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -325,33 +325,33 @@ \section{Overview}\label{subsec:dep_overview} \hline \endhead Header Directory: \hyperref[subsec:dep_rationale:mpp]{\HEADER{mpp}} & 1.1 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:start_pes]{\FuncRef{\CorCpp}{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline - \Fortran: \hyperref[subsec:start_pes]{\FuncRef{\Fortran}{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline + \CorCpp: \hyperref[subsec:start_pes]{\FuncRef{start\_pes}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{shmem\_init}} \\ \hline + \Fortran: \hyperref[subsec:start_pes]{\FuncRef{START\_PES}} & 1.2 & Current & \hyperref[subsec:shmem_init]{\FUNC{SHMEM\_INIT}} \\ \hline \hyperref[subsec:start_pes]{Implicit finalization} & 1.2 & Current & \hyperref[subsec:shmem_finalize]{\FUNC{shmem\_finalize}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline - \Fortran: \FuncRef{\Fortran}{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline - \Fortran: \FuncRef{\Fortran}{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline - \Fortran: \FuncRef{\Fortran}{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_clear\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_CLEAR\_CACHE\_INV}}} + \CorCpp: \FuncRef{\_my\_pe} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{shmem\_my\_pe}} \\ \hline + \CorCpp: \FuncRef{\_num\_pes} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{shmem\_n\_pes}} \\ \hline + \Fortran: \FuncRef{MY\_PE} & 1.2 & Current & \hyperref[subsec:shmem_my_pe]{\FUNC{SHMEM\_MY\_PE}} \\ \hline + \Fortran: \FuncRef{NUM\_PES} & 1.2 & Current & \hyperref[subsec:shmem_n_pes]{\FUNC{SHMEM\_N\_PES}} \\ \hline + \CorCpp: \FuncRef{shmalloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_malloc}} \\ \hline + \CorCpp: \FuncRef{shfree} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_free}} \\ \hline + \CorCpp: \FuncRef{shrealloc} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_realloc}} \\ \hline + \CorCpp: \FuncRef{shmemalign} & 1.2 & Current & \hyperref[subsec:shfree]{\FUNC{shmem\_align}} \\ \hline + \Fortran: \FuncRef{SHMEM\_PUT} & 1.2 & Current & \hyperref[subsec:shmem_put]{\FUNC{SHMEM\_PUT8} or \FUNC{SHMEM\_PUT64}} \\ \hline + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_CLEAR\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_set\_cache\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_SET\_CACHE\_INV}}} + \CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_clear\_cache\_line\_inv}} & 1.3 & Current & (none) \\ \hline + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_INV}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_set\_cache\_line\_inv}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_SET\_CACHE\_LINE\_INV}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_set\_cache\_line\_inv}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_SET\_CACHE\_LINE\_INV}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_udcflush}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_UDCFLUSH}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH}}} & 1.3 & Current & (none) \\ \hline - \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{\CorCpp}{shmem\_udcflush\_line}} - \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{\Fortran}{SHMEM\_UDCFLUSH\_LINE}}} + \minitab{\CorCpp: \hyperref[subsec:shmem_cache]{\FuncRef{shmem\_udcflush\_line}} + \\ \Fortran: \hyperref[subsec:shmem_cache]{\FuncRef{SHMEM\_UDCFLUSH\_LINE}}} & 1.3 & Current & (none) \\ \hline \LibConstRef{\_SHMEM\_SYNC\_VALUE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_SYNC\_VALUE}} \\ \hline \LibConstRef{\_SHMEM\_BARRIER\_SYNC\_SIZE} & 1.3 & Current & \hyperref[subsec:library_constants]{\CONST{SHMEM\_BARRIER\_SYNC\_SIZE}} \\ \hline @@ -373,34 +373,34 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_INFO} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_INFO}} \\ \hline \EnvVarRef{SMA\_SYMMETRIC\_SIZE} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_SYMMETRIC\_SIZE}} \\ \hline \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline - \minitab{\CorCpp: \FuncRef{\CorCpp}{shmem\_wait} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_wait}} + \minitab{\CorCpp: \FuncRef{shmem\_wait} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_wait}} & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline - \CorCpp: \FuncRef{\CorCpp}{shmem\_wait\_until} & 1.4 & Current + \CorCpp: \FuncRef{shmem\_wait\_until} & 1.4 & Current & \Cstd[11]: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}}, \CorCpp: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_long\_wait\_until}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fetch} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fetch}} + \minitab{\Cstd[11]: \FuncRef{shmem\_fetch} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_fetch}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_set} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_set}} + \minitab{\Cstd[11]: \FuncRef{shmem\_set} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_set}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_set]{\FUNC{shmem\_atomic\_set}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_cswap} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_cswap}} + \minitab{\Cstd[11]: \FuncRef{shmem\_cswap} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_cswap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_compare_swap]{\FUNC{shmem\_atomic\_compare\_swap}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_swap} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_swap}} + \minitab{\Cstd[11]: \FuncRef{shmem\_swap} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_swap}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_swap]{\FUNC{shmem\_atomic\_swap}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_finc} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_finc}} + \minitab{\Cstd[11]: \FuncRef{shmem\_finc} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_finc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_inc]{\FUNC{shmem\_atomic\_fetch\_inc}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_inc} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_inc}} + \minitab{\Cstd[11]: \FuncRef{shmem\_inc} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_inc}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_inc]{\FUNC{shmem\_atomic\_inc}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_fadd} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_fadd}} + \minitab{\Cstd[11]: \FuncRef{shmem\_fadd} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_fadd}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch_add]{\FUNC{shmem\_atomic\_fetch\_add}} \\ \hline - \minitab{\Cstd[11]: \FuncRef{\Cstd[11]}{shmem\_add} - \\ \CorCpp: \FuncRef{\CorCpp}{shmem\_\FuncParam{TYPENAME}\_add}} + \minitab{\Cstd[11]: \FuncRef{shmem\_add} + \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_add}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_add]{\FUNC{shmem\_atomic\_add}} \\ \hline Entire \Fortran API & 1.4 & Current & (none) \\ \hline \end{longtable} diff --git a/utils/defs.tex b/utils/defs.tex index 6963285f1..48ca1a740 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -51,21 +51,20 @@ \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} %% Generate indexed reference. -\newcommand{\EnvVarIndex}[1]{\index{Environment Variables!#1}} -\newcommand{\FuncIndex}[2]{\index{Routines --- #1!#2}} -\newcommand{\LibConstIndex}[1]{\index{Constants!#1}} -\newcommand{\LibHandleIndex}[1]{\index{Handles!#1}} -\newcommand{\TableIndex}[1]{\index{Tables!#1}} +\newcommand{\EnvVarIndex}[1]{\index{#1}} +\newcommand{\FuncIndex}[1]{\index{#1}} +\newcommand{\LibConstIndex}[1]{\index{#1}} +\newcommand{\LibHandleIndex}[1]{\index{#1}} +\newcommand{\TableIndex}[1]{\index{#1}\index{Tables!#1}} %% Write text and generate reference. \newcommand{\EnvVarRef}[1]{\VAR{#1}\EnvVarIndex{#1}} -\newcommand{\FuncRef}[2]{\FUNC{#2}\FuncIndex{#1}{#2}} +\newcommand{\FuncRef}[1]{\FUNC{#1}\FuncIndex{#1}} \newcommand{\LibConstRef}[1]{\CONST{#1}\LibConstIndex{#1}} \newcommand{\LibHandleRef}[1]{\CONST{#1}\LibHandleIndex{#1}} \newcommand{\TableCaptionRef}[1]{\caption{#1}\TableIndex{#1}} %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} -\providecommand{\FuncDecl}{} -\newcommand{\FuncDeclImpl}[2]{{\ListingsCurrentStyle{#2}}\FuncIndex{#1}{#2}} +\newcommand{\FuncDecl}[1]{{\ListingsCurrentStyle{#1}}\FuncIndex{#1}} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% @@ -397,7 +396,6 @@ \lstnewenvironment{Cpp11synopsis} { - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Cpp[11]}{##1}} \textbf{C++11:} \lstset{language={C++}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -406,7 +404,6 @@ \lstnewenvironment{C11synopsis} { - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Cstd[11]}{##1}} \textbf{C11:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -415,7 +412,6 @@ \lstnewenvironment{CsynopsisCol} { - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, morekeywords={size_t, ptrdiff_t, TYPE, TYPENAME, SIZE, shmem_ctx_t}, @@ -424,7 +420,6 @@ \lstnewenvironment{Csynopsis} { - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \textbf{C/C++:} \lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, escapechar=@, @@ -433,7 +428,6 @@ \lstnewenvironment{CsynopsisST} { - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\CorCpp}{##1}} \textbf{C/C++:} \color{red} {\lstset{language={C}, backgroundcolor=\color{gray}, lineskip=2pt, @@ -443,7 +437,6 @@ \lstnewenvironment{Fsynopsis} { \deprecationstart \\ - \renewcommand{\FuncDecl}[1]{\FuncDeclImpl{\Fortran}{##1}} \textbf{FORTRAN:} \lstset{language={Fortran}, backgroundcolor=\color{gray}, lineskip=3pt, escapechar=@, From 67b01d8a73b116935626842fe43c50076032aac4 Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 17 Nov 2017 16:56:09 -0500 Subject: [PATCH 575/583] Moved some defs --- utils/defs.tex | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/utils/defs.tex b/utils/defs.tex index 48ca1a740..9156d07c2 100644 --- a/utils/defs.tex +++ b/utils/defs.tex @@ -50,6 +50,24 @@ \textit{C\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} \newcommand{\Cpp}[1][]{% \textit{C++\ifthenelse{\equal{#1}{}}{}{#1}}\xspace} +%% +\newcommand{\TYPE}{\emph{TYPE}} +\newcommand{\TYPENAME}{\emph{TYPENAME}} +\newcommand{\SIZE}{\emph{SIZE}} + +\newcommand{\source}{\textit{source}} +\newcommand{\dest}{\textit{dest}} +\newcommand{\PUT}{\textit{Put}} +\newcommand{\GET}{\textit{Get}} +\newcommand{\OPR}[1]{\textit{#1}} +\newcommand{\shmemprefix}{\textit{SHMEM\_}} +\newcommand{\shmemprefixLC}{\textit{shmem\_}} +\newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} +\newcommand{\ith}{${\textit{i}^{\text{\tiny th}}}$} +\newcommand{\jth}{${\textit{j}^{\text{\tiny th}}}$} +\newcommand{\kth}{${\textit{k}^{\text{\tiny th}}}$} +\newcommand{\lth}{${\textit{l}^{\text{\tiny th}}}$} + %% Generate indexed reference. \newcommand{\EnvVarIndex}[1]{\index{#1}} \newcommand{\FuncIndex}[1]{\index{#1}} @@ -65,29 +83,11 @@ %% Specialized declaration/creation and generate reference. \newcommand{\EnvVarDecl}[1]{\EnvVarRef{#1}} \newcommand{\FuncDecl}[1]{{\ListingsCurrentStyle{#1}}\FuncIndex{#1}} +\newcommand{\FuncParam}[1]{<{\ListingsKeywordStyle{#1}}>} \newcommand{\LibConstDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibConstRef{#2} \\~}} \newcommand{\LibHandleDecl}[2][\CorCppFor]{% \parbox[t]{0pt}{~\\[-4pt] #1: \\\hspace*{8mm} \LibHandleRef{#2} \\~}} -%% -\newcommand{\FuncParam}[1]{<{\ListingsKeywordStyle{#1}}>} -%% -\newcommand{\TYPE}{\emph{TYPE}} -\newcommand{\TYPENAME}{\emph{TYPENAME}} -\newcommand{\SIZE}{\emph{SIZE}} - -\newcommand{\source}{\textit{source}} -\newcommand{\dest}{\textit{dest}} -\newcommand{\PUT}{\textit{Put}} -\newcommand{\GET}{\textit{Get}} -\newcommand{\OPR}[1]{\textit{#1}} -\newcommand{\shmemprefix}{\textit{SHMEM\_}} -\newcommand{\shmemprefixLC}{\textit{shmem\_}} -\newcommand{\shmemprefixC}{\textit{\_SHMEM\_}} -\newcommand{\ith}{${\textit{i}^{\text{\tiny th}}}$} -\newcommand{\jth}{${\textit{j}^{\text{\tiny th}}}$} -\newcommand{\kth}{${\textit{k}^{\text{\tiny th}}}$} -\newcommand{\lth}{${\textit{l}^{\text{\tiny th}}}$} \begin{acronym} \acro{RMA}{\emph{Remote Memory Access}} From e9b70e86015c1fc7a428aec88319126d6a2ead7e Mon Sep 17 00:00:00 2001 From: "Bryant C. Lam" Date: Fri, 17 Nov 2017 16:56:39 -0500 Subject: [PATCH 576/583] More indexing terms for Constants and Handles --- content/library_constants.tex | 1 + content/library_handles.tex | 1 + 2 files changed, 2 insertions(+) diff --git a/content/library_constants.tex b/content/library_constants.tex index 26499136a..8a1774ac7 100644 --- a/content/library_constants.tex +++ b/content/library_constants.tex @@ -1,4 +1,5 @@ \TableIndex{Library Constants} +\TableIndex{Constants} The \openshmem library provides a set of compile-time constants that may be used to specify options to API routines, provide implementation-specific diff --git a/content/library_handles.tex b/content/library_handles.tex index d73169f6d..63d726182 100644 --- a/content/library_handles.tex +++ b/content/library_handles.tex @@ -1,4 +1,5 @@ \TableIndex{Library Handles} +\TableIndex{Handles} The \openshmem library provides a set of predefined named constant handles. All named constants can be used in initialization expressions or assignments, From 67f0c5e2e6f81c5afe0a7540e325d655bb2cc189 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Mon, 20 Nov 2017 13:41:24 -0500 Subject: [PATCH 577/583] DocEdit: Fix usage of \openshmem in section title Signed-off-by: James Dinan --- content/execution_model.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/execution_model.tex b/content/execution_model.tex index 42be0aa10..d8d4d2132 100644 --- a/content/execution_model.tex +++ b/content/execution_model.tex @@ -23,7 +23,7 @@ \acp{PE} using constructs of \Cstd or \Fortran. The identifiers are fixed for the life of the \openshmem program. -\subsection{Progress of \openshmem Operations}\label{subsec:progress} +\subsection{Progress of OpenSHMEM Operations}\label{subsec:progress} The \openshmem model assumes that computation and communication are naturally overlapped. \openshmem programs are expected to exhibit progression of From 3f4c794cc631facf4fb6f9f8bce68662c6e29073 Mon Sep 17 00:00:00 2001 From: angelali4096 Date: Mon, 4 Dec 2017 02:56:07 -0500 Subject: [PATCH 578/583] Edits to drafts/osh-1.4-rc5 to facillitate manpage generation --- content/backmatter.tex | 18 +++++++++--------- content/shmem_reductions.tex | 8 ++++---- .../{shmem_wait.tex => shmem_wait_until.tex} | 0 main_spec.tex | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) rename content/{shmem_wait.tex => shmem_wait_until.tex} (100%) diff --git a/content/backmatter.tex b/content/backmatter.tex index 462c6bacc..85bab065f 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -375,9 +375,9 @@ \section{Overview}\label{subsec:dep_overview} \EnvVarRef{SMA\_DEBUG} & 1.4 & Current & \hyperref[subsec:environment_variables]{\VAR{SHMEM\_DEBUG}} \\ \hline \minitab{\CorCpp: \FuncRef{shmem\_wait} \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_wait}} - & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}} \\ \hline + & 1.4 & Current & See \textbf{Notes} for \hyperref[subsec:shmem_wait_until]{\FUNC{shmem\_wait\_until}} \\ \hline \CorCpp: \FuncRef{shmem\_wait\_until} & 1.4 & Current - & \Cstd[11]: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_wait\_until}}, \CorCpp: \hyperref[subsec:shmem_wait]{\FUNC{shmem\_long\_wait\_until}} \\ \hline + & \Cstd[11]: \hyperref[subsec:shmem_wait_until]{\FUNC{shmem\_wait\_until}}, \CorCpp: \hyperref[subsec:shmem_wait_until]{\FUNC{shmem\_long\_wait\_until}} \\ \hline \minitab{\Cstd[11]: \FuncRef{shmem\_fetch} \\ \CorCpp: \FuncRef{shmem\_\FuncParam{TYPENAME}\_fetch}} & 1.4 & Current & \hyperref[subsec:shmem_atomic_fetch]{\FUNC{shmem\_atomic\_fetch}} \\ \hline @@ -588,13 +588,13 @@ \section{Version 1.4} \\See Section \ref{subsec:library_constants}. % \item Added type-generic interfaces for \FUNC{shmem\_wait\_until}. -\\ See Section \ref{subsec:shmem_wait}. +\\ See Section \ref{subsec:shmem_wait_until}. % \item Removed the \VAR{volatile} qualifiers from the \VAR{ivar} arguments to \FUNC{shmem\_wait} routines and the \VAR{lock} arguments in the lock API. \emph{Rationale: Volatile qualifiers were added to several API routines in \openshmem[1.3]; however, they were later found to be unnecessary.} -\\ See Sections \ref{subsec:shmem_wait} and \ref{subsec:shmem_lock}. +\\ See Sections \ref{subsec:shmem_wait_until} and \ref{subsec:shmem_lock}. % \item Deprecated the \VAR{SMA\_}* environment variables and added equivalent \VAR{SHMEM\_}* environment variables. @@ -644,7 +644,7 @@ \section{Version 1.4} % \item Revised the description of \FUNC{shmem\_wait} for a multithreaded \openshmem \ac{PE}. -\\See Section \ref{subsec:shmem_wait} +\\See Section \ref{subsec:shmem_wait_until} % \item Clarified description for \CONST{SHMEM\_VENDOR\_STRING}. \\See Section \ref{subsec:library_constants}. @@ -725,7 +725,7 @@ \section{Version 1.3} % \item Added \CTYPE{volatile} to remotely accessible pointer argument in \FUNC{SHMEM\_WAIT} and \FUNC{SHMEM\_LOCK}. -\\See Sections \ref{subsec:shmem_wait} and \ref{subsec:shmem_lock}. +\\See Sections \ref{subsec:shmem_wait_until} and \ref{subsec:shmem_lock}. % \item Deprecation of \FUNC{SHMEM\_CACHE}. \\See Section \ref{subsec:shmem_cache}. @@ -791,7 +791,7 @@ \section{Version 1.2} \\See Section \ref{subsec:shmem_put}. % \item Clarification related to \FUNC{shmem\_wait}. -\\See Section \ref{subsec:shmem_wait}. +\\See Section \ref{subsec:shmem_wait_until}. % \item Undefined behavior for null pointers without zero counts added. \\See Annex \ref{sec:undefined} @@ -851,7 +851,7 @@ \section{Version 1.1} % \item Clarification of the naming conventions for constant in \Cstd and \Fortran. -\\See Section \ref{subsec:library_constants} and \ref{subsec:shmem_wait}. +\\See Section \ref{subsec:library_constants} and \ref{subsec:shmem_wait_until}. % \item Added \ac{API} calls: \FUNC{shmem\_char\_p}, \FUNC{shmem\_char\_g}. \\See Sections \ref{subsec:shmem_p} and \ref{subsec:shmem_g}. @@ -908,7 +908,7 @@ \section{Version 1.1} \\See Sections \ref{subsec:shfree} and Annex \ref{sec:undefined}. % \item \Fortran programming fixes for examples.\\ See Sections -\ref{subsec:shmem_reductions} and \ref{subsec:shmem_wait}. +\ref{subsec:shmem_reductions} and \ref{subsec:shmem_wait_until}. % \item Clarifications of the reuse \VAR{pSync} and \VAR{pWork} across collectives. diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index dde92f4c6..d3cda8419 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -219,11 +219,11 @@ } -{ + \deprecationstart \apidesctable{ When calling from \Fortran, the \dest{} date types are as follows: -}{Routine}{Data type}{ +}{Routine}{Data type} \apitablerow{shmem\_int8\_and\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_and\_to\_all}{Integer, with an element size of 4 bytes.} \apitablerow{shmem\_comp8\_max\_to\_all}{Complex, with an element size equal to two 8-byte real values.} @@ -254,9 +254,9 @@ \apitablerow{shmem\_int4\_or\_to\_all}{Integer, with an element size of 4 bytes.} \apitablerow{shmem\_int8\_xor\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_xor\_to\_all}{Integer, with an element size of 4 bytes.} -} + \deprecationend -} + \apireturnvalues{ None. diff --git a/content/shmem_wait.tex b/content/shmem_wait_until.tex similarity index 100% rename from content/shmem_wait.tex rename to content/shmem_wait_until.tex diff --git a/main_spec.tex b/main_spec.tex index 452434b60..c24b7b73a 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -275,8 +275,8 @@ \subsubsection{\textbf{SHMEM\_ALLTOALLS}}\label{subsec:shmem_alltoalls} \subsection{Point-To-Point Synchronization Routines}\label{subsec:p2p_intro} \input{content/p2p_sync_intro.tex} -\subsubsection{\textbf{SHMEM\_WAIT\_UNTIL}}\label{subsec:shmem_wait} -\input{content/shmem_wait.tex} +\subsubsection{\textbf{SHMEM\_WAIT\_UNTIL}}\label{subsec:shmem_wait_until} +\input{content/shmem_wait_until.tex} \subsubsection{\textbf{SHMEM\_TEST}}\label{subsec:shmem_test} \input{content/shmem_test.tex} From fda5c5bde7080ff6e89c2169da6d480c070dce01 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 12 Dec 2017 16:55:20 -0500 Subject: [PATCH 579/583] Rename shpdealloc -> shpdeallc for consistency Rename file to match function/section heading names. Signed-off-by: James Dinan --- content/{shpdealloc.tex => shpdeallc.tex} | 0 main_spec.tex | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename content/{shpdealloc.tex => shpdeallc.tex} (100%) diff --git a/content/shpdealloc.tex b/content/shpdeallc.tex similarity index 100% rename from content/shpdealloc.tex rename to content/shpdeallc.tex diff --git a/main_spec.tex b/main_spec.tex index c24b7b73a..6c2c46596 100644 --- a/main_spec.tex +++ b/main_spec.tex @@ -112,8 +112,8 @@ \subsubsection{\textbf{SHPALLOC}}\label{subsec:shpalloc} \subsubsection{\textbf{SHPCLMOVE}}\label{subsec:shpclmove} \input{content/shpclmove.tex} -\subsubsection{\textbf{SHPDEALLC}}\label{subsec:shpdealloc} -\input{content/shpdealloc.tex} +\subsubsection{\textbf{SHPDEALLC}}\label{subsec:shpdeallc} +\input{content/shpdeallc.tex} \subsection{Communication Management Routines} From d086870433ae89d04fdc64de366fcc99d2631298 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 12 Dec 2017 17:13:53 -0500 Subject: [PATCH 580/583] Update type support changelog entry to ref tables Signed-off-by: James Dinan --- content/backmatter.tex | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 85bab065f..42a32cd8e 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -655,8 +655,10 @@ \section{Version 1.4} \item Clarified API description for \FUNC{shmem\_info\_get\_name}. \\See Section \ref{subsec:shmem_info_get_name}. % -\item Expanded the type support for RMA and AMO operations. -\\ See Sections \ref{sec:rma} and \ref{sec:amo}. +\item Expanded the type support for RMA, AMO, and point-to-point + synchronization operations. +\\ See Tables \ref{stdrmatypes}, \ref{stdamotypes}, \ref{extamotypes}, and + \ref{p2psynctypes} % \item Renamed AMO operations to use \FUNC{shmem\_atomic\_*} prefix and deprecated old AMO routines. From 5cd89b53c3b8b660523716c33d790fd3dcaad674 Mon Sep 17 00:00:00 2001 From: James Dinan Date: Tue, 12 Dec 2017 17:32:01 -0500 Subject: [PATCH 581/583] Update type support mention in changelog intro Signed-off-by: James Dinan --- content/backmatter.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/backmatter.tex b/content/backmatter.tex index 42a32cd8e..f2b4b7904 100644 --- a/content/backmatter.tex +++ b/content/backmatter.tex @@ -555,7 +555,7 @@ \section{Version 1.4} \emph{contexts} for communication management, \FUNC{shmem\_sync}, \FUNC{shmem\_calloc}, -expanded type support for \ac{RMA} and \ac{AMO} operations, +expanded type support, a new namespace for atomic operations, atomic bitwise operations, \FUNC{shmem\_test} for nonblocking point-to-point synchronization, From 82a0f1465c988a5e9307838492fda1d1b7dbcf2d Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 14 Dec 2017 16:08:49 -0500 Subject: [PATCH 582/583] Fix bad deprecation block formatting Removing this deprecation marker. The macros are colliding somehow and causing subsequent text to appear in red. In addition, while this text appears in several places, it only surrounded by deprecation markers here. Thus, dropping these markers also improves consistency. Signed-off-by: James Dinan --- content/shmem_reductions.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/shmem_reductions.tex b/content/shmem_reductions.tex index d3cda8419..11ee26923 100644 --- a/content/shmem_reductions.tex +++ b/content/shmem_reductions.tex @@ -220,7 +220,7 @@ -\deprecationstart +%\deprecationstart \apidesctable{ When calling from \Fortran, the \dest{} date types are as follows: }{Routine}{Data type} @@ -255,7 +255,7 @@ \apitablerow{shmem\_int8\_xor\_to\_all}{Integer, with an element size of 8 bytes.} \apitablerow{shmem\_int4\_xor\_to\_all}{Integer, with an element size of 4 bytes.} -\deprecationend +%\deprecationend \apireturnvalues{ From bf78fded6bb2871707bf48a1778b9e3fbb9bdedc Mon Sep 17 00:00:00 2001 From: James Dinan Date: Thu, 14 Dec 2017 16:11:08 -0500 Subject: [PATCH 583/583] Disable "draft" markup Signed-off-by: James Dinan --- content/frontmatter.tex | 6 +++--- utils/packages.tex | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/frontmatter.tex b/content/frontmatter.tex index a0c857f45..d8510accb 100644 --- a/content/frontmatter.tex +++ b/content/frontmatter.tex @@ -4,9 +4,9 @@ \pagestyle{fancy} \fancyhead{} \fancyhead[LE,LO]{\insertDocVersion} -\fancyhead[CO,CE]{--- DRAFT ---} -\SetWatermarkText{DRAFT} -\SetWatermarkScale{1} +%\fancyhead[CO,CE]{--- DRAFT ---} +%\SetWatermarkText{DRAFT} +%\SetWatermarkScale{1} \fancyfoot[CE,CO]{\thepage} %affects page numbering for the first pages, %except the first ToC page diff --git a/utils/packages.tex b/utils/packages.tex index 8ff6beef6..1b4b6f5b9 100644 --- a/utils/packages.tex +++ b/utils/packages.tex @@ -47,8 +47,8 @@ \usepackage{enumitem} \usepackage{framed} \usepackage{pbox} -\usepackage{draftcopy} -\usepackage{draftwatermark} +%\usepackage{draftcopy} +%\usepackage{draftwatermark} \usepackage{wrapfig} \usepackage{longtable} \usepackage{caption}