From 11f93a2e8880680f6b192298e5ce0697d2596a31 Mon Sep 17 00:00:00 2001 From: couturie Date: Mon, 5 Aug 2013 17:42:36 +0200 Subject: [PATCH] new --- BookGPU/Chapters/chapter6/Intro.tex | 34 +- BookGPU/Chapters/chapter6/PartieAsync.tex | 328 ++++++------- BookGPU/Chapters/chapter6/PartieORWL.tex | 189 ++++---- BookGPU/Chapters/chapter6/PartieSync.tex | 436 +++++++++--------- BookGPU/Chapters/chapter6/biblio6.bib | 48 +- BookGPU/Chapters/chapter6/ch6.tex | 26 +- .../chapter6/figures/Sync-NativeOverlap.pdf | Bin 40524 -> 39761 bytes .../figures/Sync-SeqSequenceOverlap.pdf | Bin 55734 -> 45711 bytes .../figures/Sync-StreamSequenceOverlap.pdf | Bin 56256 -> 46082 bytes BookGPU/Chapters/chapter7/biblio7.bib | 6 +- 10 files changed, 540 insertions(+), 527 deletions(-) mode change 100755 => 100644 BookGPU/Chapters/chapter6/figures/Sync-NativeOverlap.pdf diff --git a/BookGPU/Chapters/chapter6/Intro.tex b/BookGPU/Chapters/chapter6/Intro.tex index 5a8d0e7..77b314d 100644 --- a/BookGPU/Chapters/chapter6/Intro.tex +++ b/BookGPU/Chapters/chapter6/Intro.tex @@ -1,28 +1,28 @@ \section{Introduction}\label{ch6:intro} -This chapter proposes to draw several development methodologies to obtain +This chapter proposes to draw upon several development methodologies to obtain efficient codes in classical scientific applications. Those methodologies are -based on the feedback from several research works involving GPUs, either alone -in a single machine or in a cluster of machines. Indeed, our past -collaborations with industries have allowed us to point out that in their -economical context, they can adopt a parallel technology only if its -implementation and maintenance costs are small according to the potential -benefits (performance, accuracy,...). So, in such contexts, GPU programming is -still regarded with some distance according to its specific field of -applicability (SIMD/SIMT model) and its still higher programming complexity and -maintenance. In the academic domain, things are a bit different but studies for -efficiently integrating GPU computations in multi-core clusters with maximal -overlapping of computations with communications and/or other computations, are -still rare. +based on the feedback from several research works involving GPUs, either in a +single machine or in a cluster of machines. Indeed, our past collaborations +with industries have allowed us to point out that in their economical context, +they can adopt a parallel technology only if its implementation and maintenance +costs are small compared with the potential benefits (performance, +accuracy, etc.). So, in such contexts, GPU programming is still regarded with +some distance due to its specific field of applicability (SIMD/SIMT model: +Single Instruction Multiple Data/Thread) and its still higher programming +complexity and maintenance. In the academic domain, things are a bit different, +but studies for efficiently integrating GPU computations in multicore clusters +with maximal overlapping of computations with communications and/or other +computations are still rare. -For these reasons, the major aim of that chapter is to propose as simple as -possible general programming patterns that can be followed or adapted in +For these reasons, the major aim of that chapter is to propose general +programming patterns, as simple as possible, that can be followed or adapted in practical implementations of parallel scientific applications. % Also, according to our experience in industrial collaborations, we propose a % small prospect analysis about the perenity of such accelerators in the % middle/long term. -Also, we propose in a third part, a prospect analysis together with a particular -programming tool that is intended to ease multi-core GPU cluster programming. +In addition, we propose a prospect analysis together with a particular +programming tool that is intended to ease multicore GPU cluster programming. %%% Local Variables: diff --git a/BookGPU/Chapters/chapter6/PartieAsync.tex b/BookGPU/Chapters/chapter6/PartieAsync.tex index 0b20926..3365b41 100644 --- a/BookGPU/Chapters/chapter6/PartieAsync.tex +++ b/BookGPU/Chapters/chapter6/PartieAsync.tex @@ -2,19 +2,19 @@ computation/communication overlapping} \label{ch6:part2} -In the previous part, we have seen how to efficiently implement overlap of -computations (CPU and GPU) with communications (GPU transfers and inter-node +In the previous section, we have seen how to efficiently implement overlap of +computations (CPU and GPU) with communications (GPU transfers and internode communications). However, we have previously shown that for some parallel iterative algorithms, it is sometimes even more efficient to use an asynchronous scheme of iterations\index{iterations!asynchronous} \cite{HPCS2002,ParCo05,Para10}. In that case, the nodes do -not wait for each others but they perform their iterations using the last +not wait for each other but they perform their iterations using the last external data they have received from the other nodes, even if this data was produced \emph{before} the previous iteration on the other nodes. Formally, if we denote by $f=(f_1,...,f_n)$ the function representing the iterative process and by $x^t=(x_1^t,...,x_n^t)$ the values of the $n$ elements of the system at iteration $t$, we pass from a synchronous iterative scheme of the -form: +form given in \Alg{algo:ch6p2sync} %% \begin{algorithm}[H] %% \caption{Synchronous iterative scheme}\label{algo:ch6p2sync} %% \begin{Algo} @@ -27,7 +27,7 @@ form: %% \end{Algo} %% \end{algorithm} \begin{algorithm}[H] - \caption{Synchronous iterative scheme}\label{algo:ch6p2sync} + \caption{synchronous iterative scheme}\label{algo:ch6p2sync} $x^{0}=(x_{1}^{0},...,x_{n}^{0})$\; \For{ $t=0,1,...$} { \For{ $i=1,...,n$}{ @@ -36,9 +36,8 @@ form: } \end{algorithm} - \noindent -to an asynchronous iterative scheme of the form:\\ +to an asynchronous iterative scheme of the form given in \Alg{algo:ch6p2async}.\\ %% \begin{algorithm}[H] %% \caption{Asynchronous iterative scheme}\label{algo:ch6p2async} %% \begin{Algo} @@ -56,7 +55,7 @@ to an asynchronous iterative scheme of the form:\\ %% \end{Algo} %% \end{algorithm} \begin{algorithm}[H] - \caption{Asynchronous iterative scheme}\label{algo:ch6p2async} + \caption{asynchronous iterative scheme}\label{algo:ch6p2async} $x^{0}=(x_{1}^{0},...,x_{n}^{0})$\; \For {$t=0,1,...$} { \For{ $i=1,...,n$} { @@ -69,8 +68,8 @@ to an asynchronous iterative scheme of the form:\\ } } \end{algorithm} -where $s_j^i(t)$ is the iteration number of the production of the value $x_j$ of -element $j$ that is used on element $i$ at iteration $t$ (see for example~\cite{BT89, +In this scheme, $s_j^i(t)$ is the iteration number of the production of the value $x_j$ of +element $j$ that is used on element $i$ at iteration $t$ (see, for example,~\cite{BT89, FS2000} for further details). Such schemes are called AIAC\index{AIAC} for \emph{Asynchronous Iterations and Asynchronous Communications}. They combine two aspects that are respectively @@ -87,7 +86,7 @@ which new data arrives on each node. Typically, if a node receives newer data only every four or five local iterations, it is strongly probable that the evolution of its local iterative process will be slower than if it receives data at every iteration. The key point here is that -this frequency does not only depend on the hardware configuration of the +not only does this frequency depend on the hardware configuration of the parallel system but it also depends on the software that is used to implement the algorithmic scheme. @@ -95,11 +94,11 @@ The impact of the programming environments used to implement asynchronous algorithms has already been investigated in~\cite{SuperCo05}. Although the features required to efficiently implement asynchronous schemes have not changed, the available programming environments and computing hardware have -evolved, in particular now GPUs are available. So, there is a need to reconsider the +evolved, in particular now that GPUs are available. So, there is a need to reconsider the implementation schemes of AIAC according to the new de facto standards for parallel programming (communications and threads) as well as the integration of the GPUs. One of the main objective here is to obtain a maximal overlap between the -activities of the three types of devices that are the CPU, the GPU and the +activities of the three types of devices: the CPU, the GPU, and the network. Moreover, another objective is to present what we think is the best compromise between the simplicity of the implementation and its maintainability on one side and its @@ -112,16 +111,16 @@ with full overlap. Between these two extremes, we propose a synchronization mechanism on top of our asynchronous scheme that can be used either statically or dynamically during the application execution. -Although there exist several programming environments for inter-node -communications, multi-threading and GPU programming, a few of them have -become \emph{de facto standards}, either due to their good stability, their ease -of use and/or their wide adoption by the scientific community. -Therefore, as in the previous section all the schemes presented in the following use MPI~\cite{MPI}, -OpenMP~\cite{openMP} and CUDA~\cite{CUDA}. However, there is no loss of -generality as those schemes may easily be implemented with other libraries. +Although there exist several programming environments for internode +communications, multithreading, and GPU programming, a few of them have +become \emph{de facto standards}, due to their good stability, their ease +of use, and/or their wide adoption by the scientific community. +Therefore, as in the previous section, all the schemes presented in the following use MPI~\cite{MPI}, +OpenMP~\cite{openMP}, and CUDA~\cite{CUDA}. However, there is no loss of +generality as these schemes may easily be implemented with other libraries. Finally, in order to stay as clear as possible, only the parts of code and -variables related to the control of parallelism (communications, threads,...) +variables related to the control of parallelism (communications, threads, etc.) are presented in our schemes. The inner organization of data is not detailed as it depends on the application. We only consider that we have two data arrays (previous version and current version) and communication buffers. However, in @@ -134,17 +133,17 @@ avoid data copies. The first step toward our complete scheme is to implement a basic asynchronous scheme that includes an actual overlap of the communications with the computations\index{overlap!computation and communication}. In order to ensure that the communications are actually performed -in parallel of the computations, it is necessary to use different threads. It +in parallel with the computations, it is necessary to use different threads. It is important to remember that asynchronous communications provided in -communication libraries like MPI are not systematically performed in parallel of +communication libraries such as MPI are not systematically performed in parallel with the computations~\cite{ChVCV13,Hoefler08a}. So, the logical and classical way to implement such an overlap is to use three threads: one for -computing, one for sending and one for receiving. Moreover, since +computing, one for sending, and one for receiving. Moreover, since the communication is performed by threads, blocking synchronous communications\index{MPI!communication!blocking}\index{MPI!communication!synchronous} can be used without deteriorating the overall performance. In this basic version, the termination\index{termination} of the global process is performed -individually on each node according to their own termination. This can be guided by either a +individually on each node according to its own termination. This can be guided by either a number of iterations or a local convergence detection\index{convergence detection}. The important step at the end of the process is to perform the receptions of all pending communications in order to ensure the termination of the two communication @@ -155,7 +154,7 @@ So, the global organization of this scheme is set up in \Lst{algo:ch6p2BasicAsyn % \begin{algorithm}[H] % \caption{Initialization of the basic asynchronous scheme.} % \label{algo:ch6p2BasicAsync} -\begin{Listing}{algo:ch6p2BasicAsync}{Initialization of the basic asynchronous scheme} +\begin{Listing}{algo:ch6p2BasicAsync}{initialization of the basic asynchronous scheme} // Variables declaration and initialization // Controls the sendings from the computing thread omp_lock_t lockSend; @@ -225,7 +224,7 @@ MPI_Finalize(); In this scheme, the \texttt{lockRec} mutex\index{OpenMP!mutex} is not mandatory. It is only used to ensure that data dependencies are actually exchanged at the first iteration of the process. Data initialization and distribution -(lines~16-17) are not detailed here because they are directly related to the +(lines~20--21) are not detailed here because they are directly related to the application. The important point is that, in most cases, they should be done before the iterative process. The computing function is given in \Lst{algo:ch6p2BasicAsyncComp}. @@ -233,7 +232,7 @@ before the iterative process. The computing function is given in %\begin{algorithm}[H] % \caption{Computing function in the basic asynchronous scheme.} % \label{algo:ch6p2BasicAsyncComp} -\begin{Listing}{algo:ch6p2BasicAsyncComp}{Computing function in the basic asynchronous scheme} +\begin{Listing}{algo:ch6p2BasicAsyncComp}{computing function in the basic asynchronous scheme} // Variables declaration and initialization int iter = 1; // Number of the current iteration double difference; // Variation of one element between two iterations @@ -241,10 +240,10 @@ double residual; // Residual of the current iteration // Computation loop while(!Finished){ - // Sendings of data dependencies if there is no previous sending + // Sending of data dependencies if there is no previous sending // in progress if(!SendsInProgress){ - // Potential copy of data to be sent in additional buffers + // Potential copy of data to be sent into additional buffers ... // Change of sending state SendsInProgress = 1; @@ -288,30 +287,29 @@ while(!Finished){ \end{Listing} %\end{algorithm} -As mentioned above, it can be seen in line~18 of \Lst{algo:ch6p2BasicAsyncComp} +As mentioned above, it can be seen in lines~19--21 of \Lst{algo:ch6p2BasicAsyncComp} that the \texttt{lockRec} mutex is used only at the first iteration to wait for the initial data dependencies before the computations. The residual\index{residual}, initialized -in line~23 and computed in lines~34-37, is defined by the maximal difference +in line~24 and computed in lines~35--38, is defined by the maximal difference between the elements from two consecutive iterations. It is classically used to detect the local convergence of the process on each node. In the more complete schemes presented in the sequel, a global termination detection that takes the states of all the nodes into account will be exhibited. -Finally, the local convergence is tested and updated when necessary. In line~44, +Finally, the local convergence is tested and updated when necessary. In line~45, the \texttt{lockSend} mutex is unlocked to allow the sending function to send final messages to the dependency nodes. Those messages are required to keep the reception function alive until all the final messages have been received. -Otherwise, a node could stop its reception function whereas other nodes are +Otherwise, a node could stop its reception function while other nodes are still trying to communicate with it. Moreover, a local sending of a final -message to the node itself is required (line~45) to ensure that the reception +message to the node itself is required (line~46) to ensure that the reception function will not stay blocked in a message probing -(see~\Lst{algo:ch6p2BasicAsyncReceptions}, line~11). This may happen if the node -receives the final messages from its dependencies \emph{before} being itself in +(see~\Lst{algo:ch6p2BasicAsyncReceptions}, line~12). This may happen if the node +receives the final messages from its dependencies \emph{before} reaching its own local convergence. All the messages but this final local one are performed in the sending function described in \Lst{algo:ch6p2BasicAsyncSendings}. - The main loop is only conditioned by the end of the computing process (line~4). At each iteration, the thread waits for the permission from the computing thread (according to the \texttt{lockSend} mutex). Then, data are sent with @@ -324,7 +322,7 @@ the main loop, the final messages are sent to the dependencies of the node. %\begin{algorithm}[H] % \caption{Sending function in the basic asynchronous scheme.} % \label{algo:ch6p2BasicAsyncSendings} -\begin{Listing}{algo:ch6p2BasicAsyncSendings}{Sending function in the basic asynchronous scheme} +\begin{Listing}{algo:ch6p2BasicAsyncSendings}{sending function in the basic asynchronous scheme} // Variables declaration and initialization ... @@ -351,10 +349,10 @@ The last function, detailed in \Lst{algo:ch6p2BasicAsyncReceptions}, does all th % \label{algo:ch6p2BasicAsyncReceptions} \begin{Listing}{algo:ch6p2BasicAsyncReceptions}{Reception function in the basic asynchronous scheme} // Variables declaration and initialization -char countReceipts = 0; // Boolean indicating whether receptions are -// counted or not +char countReceipts = 1; // Boolean indicating whether receptions are + // counted or not int nbEndMsg = 0; // Number of end messages received -int arrived = 0; // Boolean indicating if a message is arrived +int arrived = 0; // Boolean indicating if a message has arrived int srcNd; // Source node of the message int size; // Message size @@ -386,7 +384,7 @@ while(!Finished){ } // Reception of pending messages and counting of end messages -do{ // Loop over the remaining incoming/waited messages +do{ // Loop over the remaining incoming/end messages MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); MPI_Get_count(&status, MPI_CHAR, &size); // Actual reception in dummy buffer @@ -399,24 +397,26 @@ do{ // Loop over the remaining incoming/waited messages \end{Listing} %\end{algorithm} -As in the sending function, the main loop of receptions is done while the -iterative process is not \texttt{Finished}. In line~11, the thread waits until -a message arrives on the node. Then, it performs the actual reception and the -corresponding subsequent actions (potential data copies for data messages and -counting for end messages). Lines 20-23 check that all data dependencies have -been received before unlocking the \texttt{lockRec} mutex. As mentioned before, -they are not mandatory and are included only to ensure that all data -dependencies are received at the first iteration. Lines 25-28 are required to -manage end messages that arrive on the node \emph{before} it reaches its own -termination process. As the nodes are \emph{not} synchronized, this may happen. -Finally, lines 34-43 perform the receptions of all pending communications, -including the remaining end messages (at least the one from the node itself). +As in the sending function, the main loop of receptions is done while the +iterative process is not \texttt{Finished}. In line~12, the thread waits until +a message arrives on the node. Then, it performs the actual reception and the +corresponding subsequent actions (potential data copies for data messages and +counting for end messages). Lines~23--26 check, only at the first iteration of +computations, that all data dependencies have been received before unlocking the +\texttt{lockRec} mutex. %As mentioned previously, they are not mandatory and are included only to +Although this is not mandatory, it ensures that all data dependencies are +received before starting the computations. % at the first iteration. +Lines~28--31 are required to manage end messages that arrive on the +node \emph{before} it reaches its own termination process. As the nodes are +\emph{not} synchronized, this may happen. Finally, lines~37--46 perform the +receptions of all pending communications, including the remaining end messages +(at least the one from the node itself). \medskip -So, with those algorithms, we obtain a quite simple and efficient asynchronous +So, with these algorithms, we obtain a quite simple and efficient asynchronous iterative scheme. It is interesting to notice that GPU computing can be easily included in the computing thread. This will be fully addressed in -paragraph~\ref{ch6:p2GPUAsync}. However, before presenting the complete +Section~\ref{ch6:p2GPUAsync}. However, before presenting the complete asynchronous scheme with GPU computing, we have to detail how our initial scheme can be made synchronous. @@ -438,11 +438,11 @@ threshold. % code, which tends to improve the implementation and maintenance costs when both % versions are required. % The second one is that -In our context, the interest of being able to dynamically change the operating -mode (sync/async) during the process execution, is that this strongly simplifies +In our context, being able to dynamically change the operating +mode (sync/async) during the process execution strongly simplifies the global convergence detection. In fact, our past experience in the design and implementation of global convergence detection in asynchronous -algorithms~\cite{SuperCo05, BCC07, Vecpar08a}, have led us to the conclusion +algorithms~\cite{SuperCo05, BCC07, Vecpar08a} has led us to the conclusion that although a decentralized detection scheme is possible and may be more efficient in some situations, its much higher complexity is an obstacle to actual use in practice, especially in industrial contexts where @@ -454,13 +454,13 @@ consists in dynamically changing the operating mode between asynchronous and syn during the execution of the process in order to check the global convergence. This is why we need to synchronize our asynchronous scheme. -In each algorithm of the initial scheme, we only exhibit the additional code +In each algorithm of the initial scheme, we only give the additional code required to change the operating mode. %\begin{algorithm}[H] % \caption{Initialization of the synchronized scheme.} % \label{algo:ch6p2Sync} -\begin{Listing}{algo:ch6p2Sync}{Initialization of the synchronized scheme} +\begin{Listing}{algo:ch6p2Sync}{initialization of the synchronized scheme} // Variables declarations and initialization ... // Controls the synchronous exchange of local states @@ -516,9 +516,9 @@ receptions of all state messages coming from the other nodes. As shown in \Lst{algo:ch6p2SyncComp}, those messages contain only a boolean indicating for each node if it is in local convergence\index{convergence!local}. So, once all the states are received on a node, it is possible to determine if all the nodes are in local -convergence, and thus to detect the global convergence. The \texttt{lockIter} +convergence and, thus, to detect the global convergence. The \texttt{lockIter} mutex is used to synchronize all the nodes at the end of each iteration. There -are also two new variables that respectively represent the local state of the +are also two new variables that represent the local state of the node (\texttt{localCV}) according to the iterative process (convergence) and the number of other nodes that are in local convergence (\texttt{nbOtherCVs}). @@ -528,18 +528,18 @@ in \Lst{algo:ch6p2SyncComp}. %\begin{algorithm}[H] % \caption{Computing function in the synchronized scheme.} % \label{algo:ch6p2SyncComp} -\begin{Listing}{algo:ch6p2SyncComp}{Computing function in the synchronized scheme} +\begin{Listing}{algo:ch6p2SyncComp}{computing function in the synchronized scheme} // Variables declarations and initialization ... // Computation loop while(!Finished){ - // Sendings of data dependencies at @\emph{each}@ iteration + // Sending of data dependencies at @\color{white}\emph{\textbf{each}}@ iteration // Potential copy of data to be sent in additional buffers ... omp_unset_lock(&lockSend); - // Blocking receptions at @\emph{each}@ iteration + // Blocking receptions at @\color{white}\emph{\textbf{each}}@ iteration omp_set_lock(&lockRec); // Local computation @@ -594,39 +594,39 @@ Most of the added code is related to the waiting for specific communications. Between lines~6 and~7, the use of the flag \texttt{SendsInProgress} is no longer needed since the sends are performed at each iteration. In line~12, the thread waits for the data receptions from its dependencies. In -lines~26-34, the local states are determined and exchanged among all nodes. A +lines~27--34, the local states are determined and exchanged among all nodes. A new message tag (\texttt{tagState}) is required for identifying those messages. In line~37, the global termination state is determined. When it is reached, -lines~38-42 change the \texttt{Finished} boolean to stop the iterative process, +lines~39--42 change the \texttt{Finished} boolean to stop the iterative process and send the end messages. Otherwise each node resets its local state -information about the other nodes and a global barrier is done between all the +information about the other nodes and a global barrier is added between all the nodes at the end of each iteration with another new tag (\texttt{tagIter}). That barrier is needed to ensure that data messages from successive iterations are actually received during the \emph{same} iteration on the destination nodes. Nevertheless, it is not useful at the termination of the global process as it is replaced by the global exchange of end messages. -There is no big modification induced by the synchronization in the sending -function. The only change could be the suppression of line~11 that is not useful -in this case. Apart from that, the function stays the same as -in \Lst{algo:ch6p2BasicAsyncSendings}. +There is no big modification induced by the synchronization in the sending +function. The function stays almost the same as in +\Lst{algo:ch6p2BasicAsyncSendings}. The only change could be the suppression of +line~11 that is not useful in this case. In the reception function, given in \Lst{algo:ch6p2SyncReceptions}, there are -mainly two insertions (in lines~19-30 and 31-40), corresponding to the +mainly two insertions (in lines~19--31 and 32--42), corresponding to the additional types of messages to receive. There is also the insertion of three variables that are used for the receptions of the new message types. In -lines~24-29 and 34-39 are located messages counting and mutex unlocking +lines~24--30 and 35--41 are located messages counting and mutex unlocking mechanisms that are used to block the computing thread at the corresponding steps of its execution. They are similar to the mechanism used for managing the end messages at the end of the entire process. Line~23 directly updates the number of other nodes that are in local convergence by adding the received state of the source node. This is possible due to the encoding that is used to -represent the local convergence (1) and the non-convergence (0). +represent the local convergence (1) and the non convergence (0). %\begin{algorithm}[H] % \caption{Reception function in the synchronized scheme.} % \label{algo:ch6p2SyncReceptions} -\begin{Listing}{algo:ch6p2SyncReceptions}{Reception function in the synchronized scheme} +\begin{Listing}{algo:ch6p2SyncReceptions}{reception function in the synchronized scheme} // Variables declarations and initialization ... int nbStateMsg = 0; // Number of local state messages received @@ -648,7 +648,7 @@ while(!Finished){ case tagState: // Management of local state messages // Actual reception of the message MPI_Recv(&recvdState, 1, MPI_CHAR, status.MPI_SOURCE, tagState, MPI_COMM_WORLD, &status); - // Updates of numbers of stabilized nodes and received state msgs + // Updates of numbers of stabilized nodes and received state msgs nbOtherCVs += recvdState; nbStateMsg++; // Unlocking of the computing thread when states of all other @@ -661,7 +661,7 @@ while(!Finished){ case tagIter: // Management of "end of iteration" messages // Actual reception of the message in dummy buffer MPI_Recv(dummyBuffer, 1, MPI_CHAR, status.MPI_SOURCE, tagIter, MPI_COMM_WORLD, &status); - nbIterMsg++; // Update of the nb of iteration messages + nbIterMsg++; // Update of the number of iteration messages // Unlocking of the computing thread when iteration messages // are received from all other nodes if(nbIterMsg == nbP - 1){ @@ -674,7 +674,7 @@ while(!Finished){ } // Reception of pending messages and counting of end messages -do{ // Loop over the remaining incoming/waited messages +do{ // Loop over the remaining incoming/end messages ... }while(arrived == 1 || nbEndMsg < nbDeps + 1); \end{Listing} @@ -683,10 +683,10 @@ do{ // Loop over the remaining incoming/waited messages Now that we can synchronize our asynchronous scheme, the final step is to dynamically alternate the two operating modes in order to regularly check the global convergence of the iterative process. This is detailed in the following -paragraph together with the inclusion of GPU computing in the final asynchronous +section together with the inclusion of GPU computing in the final asynchronous scheme. -\subsection{Asynchronous scheme using MPI, OpenMP and CUDA} +\subsection{Asynchronous scheme using MPI, OpenMP, and CUDA} \label{ch6:p2GPUAsync} As mentioned above, the strategy proposed to obtain a good compromise between @@ -701,34 +701,34 @@ convergence. The last problem is to decide \emph{when} to switch from the asynchronous to the synchronous mode. Here again, for the sake of simplicity, any -asynchronous mechanism for \emph{detecting} such instant is avoided and we +asynchronous mechanism for \emph{detecting} such moment is avoided, and we prefer to use a mechanism that is local to each node. Obviously, that local system must rely neither on the number of local iterations done nor on the local convergence. The former would slow down the fastest nodes according to the slowest ones. The latter would provoke too much synchronization because the -residuals on all nodes commonly do not evolve in the same way and, in most +residuals on all nodes generally do not evolve in the same way, and in most cases, there is a convergence wave phenomenon throughout the elements. So, a good solution is to insert a local timer mechanism on each node with a given initial duration. Then, that duration may be modified during the execution according to the successive results of the synchronous sections. Another problem induced by entering synchronous mode from the asynchronous one -is the possibility to receive some data messages +is the possibility of receiving some data messages from previous asynchronous iterations during synchronous iterations. This could lead to deadlocks. In order -to avoid this, a wait of the end of previous send is added to the +to avoid this, a wait for the end of previous send is added to the transition between the two modes. This is implemented by replacing the variable -\texttt{SendsInProgress} by a mutex \texttt{lockSendsDone} which is unlocked +\texttt{SendsInProgress} with a mutex \texttt{lockSendsDone} which is unlocked once all the messages have been sent in the sending function. Moreover, it is also necessary to stamp data messages\index{message!stamping} (by the function \texttt{stampData}) with -a Boolean indicating whether they have been sent during a synchronous or +a boolean indicating whether they have been sent during a synchronous or asynchronous iteration. Then, the \texttt{lockRec} mutex is unlocked only after to the complete reception of data messages from synchronous iterations. The message ordering of point-to-point communications in MPI -together with the barrier at the end of each iteration ensure two important +and the barrier at the end of each iteration ensure two important properties of this mechanism. First, data messages from previous asynchronous iterations will be received but not taken into account during -synchronous sections. Then, a data message from a synchronous -iteration cannot be received in another synchronous iteration. In the +synchronous sections. Then, a data message from a given synchronous +iteration cannot be received during another synchronous iteration. In the asynchronous sections, no additional mechanism is needed as there are no such constraints concerning the data receptions. @@ -737,25 +737,25 @@ Finally, the required modifications of the previous scheme are mainly related to the computing thread. Small additions or modifications are also required in the main process and the other threads. -In the main process, two new variables are added to store respectively the main +In the main process, two new variables are added to store the main operating mode of the iterative process (\texttt{mainMode}) and the duration of asynchronous sections (\texttt{asyncDuration}). Those variables are -initialized by the programmer. The \texttt{lockSendsDone} mutex is also declared, -initialized (locked) and destroyed with the other mutex in this process. +initialized by the programmer. The mutex \texttt{lockSendsDone} is also declared, +initialized (locked), and destroyed with the other mutex in this process. In the computing function, shown in \Lst{algo:ch6p2AsyncSyncComp}, the -modifications consist of the insertion of the timer mechanism and of the conditions +modifications consist of the insertion of the timer mechanism and the tests to differentiate the actions to be done in each mode. Some additional variables are also required to store the current operating mode in action during the execution (\texttt{curMode}), the starting time of the current asynchronous -section (\texttt{asyncStart}) and the number of successive synchronous +section (\texttt{asyncStart}), and the number of successive synchronous iterations done (\texttt{nbSyncIter}). %\begin{algorithm}[H] % \caption{Computing function in the final asynchronous scheme.}% without GPU computing.} % \label{algo:ch6p2AsyncSyncComp} -\pagebreak -\begin{Listing}{algo:ch6p2AsyncSyncComp}{Computing function in the final asynchronous scheme}% without GPU computing.} +%\pagebreak +\begin{Listing}{algo:ch6p2AsyncSyncComp}{computing function in the final asynchronous scheme}% without GPU computing.} // Variables declarations and initialization ... OpMode curMode = SYNC;// Current operating mode (always begin in sync) @@ -788,7 +788,7 @@ while(!Finished){ } } - // Sendings of data dependencies + // Sending of data dependencies if(curMode == SYNC || !SendsInProgress){ ... } @@ -799,18 +799,18 @@ while(!Finished){ } // Local computation - // (init of residual, arrays swapping and iteration computation) + // (init of residual, arrays swapping, and iteration computation) ... - // Checking of convergences (local & global) only in sync mode + // Checking convergences (local & global) only in sync mode if(curMode == SYNC){ // Local convergence checking (residual under threshold) ... // Blocking global exchange of local states of the nodes ... // Determination of global convergence (all nodes in local CV) - // Stop of the iterative process and sending of end messages - // or Re-initialization of state information and iteration barrier + // Stopping the iterative process and sending end messages + // or reinitialization of state information and iteration barrier ... } } @@ -822,24 +822,24 @@ while(!Finished){ %\end{algorithm} In the sending function, the only modification is the replacement in line~11 of -the assignment of variable \texttt{SendsInProgress} by the unlocking of +the assignment of variable \texttt{SendsInProgress} with the unlocking of \texttt{lockSendsDone}. Finally, in the reception function, the only -modification is the insertion before line~19 +modification is the insertion before line~21 of \Lst{algo:ch6p2BasicAsyncReceptions} of the extraction of the stamp from the message and its counting among the receipts only if the stamp is \texttt{SYNC}. The final step to get our complete scheme using GPU is to insert the GPU management in the computing thread. The first possibility, detailed in \Lst{algo:ch6p2syncGPU}, is to simply replace the -CPU kernel (lines~41-43 in \Lst{algo:ch6p2AsyncSyncComp}) by a blocking GPU kernel call. This includes data +CPU kernel (lines~42--44 in \Lst{algo:ch6p2AsyncSyncComp}) by a blocking GPU kernel call. This includes data transfers from the node RAM to the GPU RAM, the launching of the GPU kernel, the -waiting for kernel completion and the results transfers from GPU RAM to +waiting for kernel completion, and the results transfers from GPU RAM to node RAM. %\begin{algorithm}[H] % \caption{Computing function in the final asynchronous scheme.} % \label{algo:ch6p2syncGPU} -\begin{Listing}{algo:ch6p2syncGPU}{Computing function in the final asynchronous scheme} +\begin{Listing}{algo:ch6p2syncGPU}{computing function in the final asynchronous scheme} // Variables declarations and initialization ... dim3 Dg, Db; // CUDA kernel grids @@ -847,13 +847,13 @@ dim3 Dg, Db; // CUDA kernel grids // Computation loop while(!Finished){ // Determination of the dynamic operating mode, sendings of data - // dependencies and blocking data receptions in sync mode + // dependencies, and blocking data receptions in sync mode ... // Local GPU computation // Data transfers from node RAM to GPU CHECK_CUDA_SUCCESS(cudaMemcpyToSymbol(dataOnGPU, dataInRAM, inputsSize, 0, cudaMemcpyHostToDevice), "Data transfer"); ... // There may be several data transfers: typically A and b in - // linear problems + // linear problems of the form A.x = b // GPU grid definition Db.x = BLOCK_SIZE_X; // BLOCK_SIZE_# are kernel design dependent Db.y = BLOCK_SIZE_Y; @@ -879,36 +879,36 @@ while(!Finished){ %\end{algorithm} This scheme provides asynchronism through a cluster of GPUs as well as a -complete overlap of communications with GPU computations (similarly -to~\Sec{ch6:part1}). However, the autonomy of GPU devices according to their +complete overlap of communications with GPU computations (similar +to the one described in~\Sec{ch6:part1}). However, the autonomy of GPU devices according to their host can be further exploited in order to perform some computations on the CPU while the GPU kernel is running. The nature of computations that can be done by the CPU may vary depending on the application. For example, when processing data -streams (pipelines), pre-processing of next data item and/or post-processing of -previous result can be done on the CPU while the GPU is processing the current +streams (pipelines), pre-processing of the next data item and/or post-processing +of the previous result can be done on the CPU while the GPU is processing the current data item. In other cases, the CPU can perform \emph{auxiliary} computations\index{computation!auxiliary} that are not absolutely required to obtain the result but that may accelerate the entire iterative process. Another possibility would be to distribute the main computations between the GPU and CPU. However, this -usually leads to poor performance increases. This is mainly due to data +usually leads to poor performance increases mainly due to data dependencies that often require additional transfers between CPU and GPU. So, if we consider that the application enables such overlap of computations, its implementation is straightforward as it consists in inserting -the additional CPU computations between lines~23 and~24 -in \Lst{algo:ch6p2syncGPU}. Nevertheless, such scheme is fully efficient only +the additional CPU computations between lines~25 and~26 +in \Lst{algo:ch6p2syncGPU}. Nevertheless, such a scheme is fully efficient only if the computation times on both sides are similar. In some cases, especially with auxiliary computations, another interesting solution is to add a fourth CPU thread to perform them. This suppresses the duration constraint over those optional computations as they are performed in -parallel of the main iterative process, without blocking it. Moreover, this +parallel with the main iterative process, without blocking it. Moreover, this scheme stays coherent with current architectures as most nodes include four CPU cores. The algorithmic scheme of such context of complete overlap of CPU/GPU computations and communications is described in -Listings~\ref{algo:ch6p2FullOverAsyncMain},~\ref{algo:ch6p2FullOverAsyncComp1} -and~\ref{algo:ch6p2FullOverAsyncComp2}, where we suppose that auxiliary +Listings~\ref{algo:ch6p2FullOverAsyncMain},~\ref{algo:ch6p2FullOverAsyncComp1}, +and~\ref{algo:ch6p2FullOverAsyncComp2}, where we assume that auxiliary computations use intermediate results of the main computation process from any previous iteration. This may be different according to the application. @@ -916,7 +916,7 @@ different according to the application. % \caption{Initialization of the main process of complete overlap with asynchronism.} % \label{algo:ch6p2FullOverAsyncMain} %\pagebreak -\begin{Listing}{algo:ch6p2FullOverAsyncMain}{Initialization of the main process of complete overlap with asynchronism} +\begin{Listing}{algo:ch6p2FullOverAsyncMain}{initialization of the main process of complete overlap with asynchronism} // Variables declarations and initialization ... omp_lock_t lockAux; // Informs main thread about new aux results @@ -924,7 +924,7 @@ omp_lock_t lockRes; // Informs aux thread about new results omp_lock_t lockWrite; // Controls exclusion of results access ... auxRes ... ; // Results of auxiliary computations -// Parameters reading, MPI initialization, data initialization and +// Parameters reading, MPI initialization, and data initialization and // distribution ... // OpenMP initialization @@ -978,31 +978,31 @@ MPI_Finalize(); % \caption{Computing function in the final asynchronous scheme with CPU/GPU overlap.} % \label{algo:ch6p2FullOverAsyncComp1} %\pagebreak -\begin{Listing}{algo:ch6p2FullOverAsyncComp1}{Computing function in the final asynchronous scheme with CPU/GPU overlap} +\begin{Listing}{algo:ch6p2FullOverAsyncComp1}{computing function in the final asynchronous scheme with CPU/GPU overlap} // Variables declarations and initialization ... dim3 Dg, Db; // CUDA kernel grids // Computation loop while(!Finished){ - // Determination of the dynamic operating mode, sendings of data - // dependencies and blocking data receptions in sync mode + // Determination of the dynamic operating mode, sending of data + // dependencies, and blocking data receptions in sync mode ... // Local GPU computation - // Data transfers from node RAM to GPU, GPU grid definition and init - // of shared mem + // Data transfers from node RAM to GPU, GPU grid definition, + // and init of shared memory CHECK_CUDA_SUCCESS(cudaMemcpyToSymbol(dataOnGPU, dataInRAM, inputsSize, 0, cudaMemcpyHostToDevice), "Data transfer"); ... // Kernel call gpuKernelName<<>>(... @\emph{kernel parameters}@ ...); - // Potential pre/post-treatments in pipeline like computations + // Potential pre-/post-treatments in pipeline-like computations ... // Waiting for kernel completion cudaDeviceSynchronize(); // Results transfer from GPU to node RAM omp_set_lock(&lockWrite); // Wait for write access to resultsInRam CHECK_CUDA_SUCCESS(cudaMemcpyFromSymbol(resultsInRam, resultsOnGPU, resultsSize, 0, cudaMemcpyDeviceToHost), "Results transfer"); - // Potential post-treatments in non-pipeline computations + // Potential post-treatments in non pipeline computations ... omp_unset_lock(&lockWrite); // Give back read access to aux thread omp_test_lock(&lockRes); @@ -1020,13 +1020,13 @@ while(!Finished){ ... // Determination of global convergence (all nodes in local CV) if(cvLocale == 1 && nbCVLocales == nbP-1){ - // Stop of the iterative process and sending of end messages + // Stopping the iterative process and sending end messages ... - // Unlocking of aux thread for termination + // Unlocking aux thread for termination omp_test_lock(&lockRes); omp_unset_lock(&lockRes); }else{ - // Re-initialization of state information and iteration barrier + // Reinitialization of state information and iteration barrier ... } } @@ -1038,7 +1038,7 @@ while(!Finished){ % \caption{Auxiliary computing function in the final asynchronous scheme with CPU/GPU overlap.} % \label{algo:ch6p2FullOverAsyncComp2} %\pagebreak -\begin{Listing}{algo:ch6p2FullOverAsyncComp2}{Auxiliary computing function in the final asynchronous scheme with CPU/GPU overlap} +\begin{Listing}{algo:ch6p2FullOverAsyncComp2}{auxiliary computing function in the final asynchronous scheme with CPU/GPU overlap} // Variables declarations and initialization ... auxInput ... // Local array for input data @@ -1066,23 +1066,23 @@ while(!Finished){ %\end{algorithm} As can be seen in \Lst{algo:ch6p2FullOverAsyncMain}, there are three additional -mutex (\texttt{lockAux}, \texttt{lockRes} and \texttt{lockWrite}) that are used -respectively to inform the main computation thread that new auxiliary results -are available (lines~20-21 in \Lst{algo:ch6p2FullOverAsyncComp2} and line~29 in +mutex (\texttt{lockAux}, \texttt{lockRes}, and \texttt{lockWrite}) that are used +to inform the main computation thread that new auxiliary results +are available (lines~20--21 in \Lst{algo:ch6p2FullOverAsyncComp2} and line~31 in \Lst{algo:ch6p2FullOverAsyncComp1}), to inform the auxiliary thread that new -results from the main thread are available (lines~25-26 +results from the main thread are available (lines~27--28 in \Lst{algo:ch6p2FullOverAsyncComp1} and line~7 in \Lst{algo:ch6p2FullOverAsyncComp2}), and to perform exclusive accesses to the -results from those two threads (lines~20,~24 -in \Lst{algo:ch6p2FullOverAsyncComp1} and 9,~13 +results from those two threads (lines~22 and 26 +in \Lst{algo:ch6p2FullOverAsyncComp1} and 9 and 13 in \Lst{algo:ch6p2FullOverAsyncComp2}). Also, an additional array (\texttt{auxRes}) is required to store the results of the auxiliary computations as well as a local array for the input of the auxiliary function (\texttt{auxInput}). That last function has the same general organization as the -send/receive ones, that is a global loop conditioned by the end of the global +send/receive ones, that is, a global loop conditioned by the end of the global process. At each iteration in this function, the thread waits for the availability of new results produced by the main computation thread. This avoids -to perform the same computations several times with the same input data. + performing the same computations several times with the same input data. Then, input data of auxiliary computations % (as supposed here, they often % correspond to the results of the main computations, but may sometimes be @@ -1091,24 +1091,26 @@ is copied with a mutual exclusion mechanism. Finally, auxiliary computations are performed. When they are completed, the associated mutex is unlocked to signal the availability of those auxiliary results to the main computing thread. The main thread regularly checks this availability at the end -of its iterations and takes them into account whenever this is possible. +of its iterations and takes them into account whenever possible. -Finally, we obtain an algorithmic scheme allowing maximal overlap between -CPU and GPU computations as well as communications. It is worth noticing that -such scheme is also usable for systems without GPUs but 4-cores nodes. +Finally, we obtain an algorithmic scheme allowing maximal overlap between CPU +and GPU computations as well as communications. It is worth noticing that such +scheme is also efficiently usable for systems without GPUs but with nodes having +at least four cores. In such contexts, each thread in \Lst{algo:ch6p2FullOverAsyncMain} can +be executed on distinct cores. \subsection{Experimental validation} \label{sec:ch6p2expes} As in~\Sec{ch6:part1}, we validate the feasibility of our asynchronous scheme with some experiments performed with a representative example of scientific -application. It is a three-dimensional version of the -advection-diffusion-reaction process\index{PDE example} that models the evolution of the +application. This three-dimensional version of the +advection-diffusion-reaction process\index{PDE example} models the evolution of the concentrations of two chemical species in shallow waters. As this process is dynamic in time, the simulation is performed for a given number of consecutive time steps. This implies two nested loops in the iterative process, the outer one for the time steps and the inner one for solving the problem at each time. -Full details about this PDE problem can be found in~\cite{ChapNRJ2011}. That +Full details about this PDE problem can be found in~\cite{ChapNRJ2011}. This two-stage iterative process implies a few adaptations of the general scheme presented above in order to include the outer iterations over the time steps, but the inner iterative process closely follows the same scheme. @@ -1116,7 +1118,7 @@ inner iterative process closely follows the same scheme. We show two series of experiments performed with 16 nodes of the first cluster described in~\Sec{ch6:p1expes}. The first one deals with the comparison of synchronous and asynchronous computations. The second one is related to the use -of auxiliary computations. In the context of our PDE application, they consist in +of auxiliary computations. In the context of our PDE application, they consist of the update of the Jacobian of the system. \subsubsection*{Synchronous and asynchronous computations} @@ -1138,10 +1140,10 @@ corresponds in fact to $30\times30\times30\times2$ values. \label{fig:ch6p2syncasync} \end{figure} -The results obtained show that the asynchronous version is sensibly faster than +The results obtained show that the asynchronous version is significantly faster than the synchronous one for smaller problem sizes, then it becomes similar or even a bit slower for larger problem sizes. A closer comparison of computation and -communication times in each execution confirms that this behavior is consistent. +communication times of each execution confirms that this behavior is consistent. The asynchronous version is interesting if communication time is similar or larger than computation time. In our example, this is the case up to a problem size between 50 and 60. Then, computations become longer @@ -1161,18 +1163,18 @@ the system. In such cases, it is necessary to compute the vector $\Delta x$ in $F'\times \Delta x=-F$ to update $x$ with $\Delta x$. There are two levels of iterations, the inner level to get a stabilized version of $x$, and the outer level to compute $x$ at the successive time steps in the simulation process. In -this context, classical algorithms either compute $F'$ only at the first iteration +this context, classic algorithms either compute $F'$ at only the first iteration of each time step or at some iterations but not all because the computation of $F'$ is done in the main iterative process and it has a relatively high computing cost. However, with the scheme presented above, it is possible to continuously compute -new versions of $F'$ in parallel to the main iterative process without +new versions of $F'$ in parallel with the main iterative process without penalizing it. Hence, $F'$ is updated as often as possible and taken into account in the main computations when it is relevant. So, the Newton process should be accelerated a little bit. We compare the performance obtained with overlapped Jacobian updatings and -non-overlapped ones for several problem sizes, see~\Fig{fig:ch6p2aux}. +non overlapped ones for several problem sizes (see~\Fig{fig:ch6p2aux}). \begin{figure}[h] \centering \includegraphics[width=.75\columnwidth]{Chapters/chapter6/curves/recouvs.pdf} @@ -1182,31 +1184,31 @@ non-overlapped ones for several problem sizes, see~\Fig{fig:ch6p2aux}. \end{figure} The overlap is clearly efficient as the computation times with overlapping -Jacobian updatings are much better than without overlap. Moreover, the ratio -between the two versions tend to increase with the problem size, which is as +Jacobian updatings are much better than the ones without overlap. Moreover, the ratio +between the two versions tends to increase with the problem size, which is as expected. Also, we have tested the application without auxiliary computations at all, that is, the Jacobian is computed only once at the beginning of each time step of the simulation. The results for this last version are quite similar to the overlapped auxiliary computations, and even better for small problem sizes. -The fact that no sensible gain can be seen on this range of problem sizes is due +The fact that no significant gain can be seen on this range of problem sizes is due to the limited number of Jacobian updates taken into account in the main computation. This happens when the Jacobian update is as long as several iterations of the main process. So, the benefit is reduced in this particular case. -Those results show two things; first, auxiliary computations do not induce great -overhead in the whole process. Second, for this particular application the +Those results show two things. First, auxiliary computations do not induce great +overhead in the whole process. Second, for this particular application the choice of updating the Jacobian matrix as auxiliary computations does not speed up the iterative process. This does not question the parallel scheme in itself -but merely points out the difficulty to identify relevant auxiliary +but merely points out the difficulty of identifying relevant auxiliary computations. Indeed, this identification depends on the considered application and requires a profound specialized analysis. Another interesting choice could be the computation of load estimation for dynamic load balancing, especially in decentralized diffusion strategies where -loads are transferred between neighboring nodes~\cite{BCVG11}. In such case, +loads are transferred between neighboring nodes~\cite{BCVG11}. In such a case, the load evaluation and the comparison with other nodes can be done in parallel -of the main computations without perturbing them. +with the main computations without perturbing them. %%% Local Variables: %%% mode: latex diff --git a/BookGPU/Chapters/chapter6/PartieORWL.tex b/BookGPU/Chapters/chapter6/PartieORWL.tex index ace4698..5ff76bc 100644 --- a/BookGPU/Chapters/chapter6/PartieORWL.tex +++ b/BookGPU/Chapters/chapter6/PartieORWL.tex @@ -1,38 +1,38 @@ -\clearpage -\section{Perspective: A unifying programming model} +%\clearpage +\section{Perspective: a unifying programming model} \label{sec:ch6p3unify} In the previous sections we have seen that controlling a distributed GPU -application when using tools that are commonly available is a quite challenging +application when using tools that are commonly available is quite a challenging task. To summarize, such an application has components that can be roughly -classified as: +classified as \begin{description} \itemsep=0pt -\item[CPU:] CPU bound computations, realized as procedures in the chosen +\item[CPU:] CPU-bound computations, realized as procedures in the chosen programming language -\item[CUDA$_{kern}$:] GPU bound computations, in our context realized as CUDA compute kernels +\item[CUDA$_{kern}$:] GPU-bound computations, in our context realized as CUDA compute kernels \item[CUDA$_{trans}$:] data transfer between CPU and GPU, realized with CUDA function calls \item[MPI:] distributed data transfer routines, realized with MPI communication primitives \item[OpenMP:] inter-thread control, realized with OpenMP synchronization tools such as mutexes -\item[CUDA$_{sync}$] synchronization of the GPU, realized with CUDA functions +\item[CUDA$_{sync}$:] synchronization of the GPU, realized with CUDA functions \end{description} Among these, the last (CUDA$_{sync}$) is not strictly necessary on modern -systems, but still recommended to obtain optimal performance. With or without +systems, but it is still recommended to obtain optimal performance. With or without that last step, such an application is highly complex: it is difficult to design or to maintain, and depends on a lot of different software components. The goal -of this section is to present a new path of development that allows to replace -the last three or four types of components that control the application (MPI, -OpenMP, CUDA$_{sync}$ and eventually CUDA$_{trans}$) by a single tool: -\textbf{O}rdered \textbf{R}ead-\textbf{W}rite \textbf{L}ocks, ORWL\index{ORWL}, -see~\cite{clauss:2010:inria-00330024:1,gustedt:hal-00639289}. Besides the -simplification of the algorithmic scheme that we already have mentioned, the -ongoing implementation of ORWL allows to use a feature of modern platforms that -can improve the performance of CPU bound computations: lock-free atomic +of this section is to present a new path of development that allows the +replacement of the last three or four types of components that control the application (MPI, +OpenMP, CUDA$_{sync}$, and eventually CUDA$_{trans}$) with a single tool: +{O}rdered {R}ead-{W}rite {L}ocks, ORWL\index{ORWL} +(see~\cite{clauss:2010:inria-00330024:1,gustedt:hal-00639289}). Besides the +simplification of the algorithmic scheme that we have already mentioned, the +ongoing implementation of ORWL allows the use of a feature of modern platforms that +can improve the performance of CPU-bound computations: lock-free atomic operations to update shared data consistently. For these, ORWL relies on new interfaces that are available with the latest revision of the ISO standard for -the C programming language, see~\cite{C11}. +the C programming language (see~\cite{C11}). \subsection{Resources} \label{sec:ch6p3resources} @@ -41,57 +41,58 @@ ORWL places all its concepts that concern data and control around a single abstraction: \emph{resources}\index{ORWL!resource}. An ORWL resource may correspond to a local or remote entity and is identified through a \emph{location}\index{ORWL!location}, that is a unique identification through which it can be accessed from all different components of -the same application. In fact, resources and locations (entities and their names +the same application. In fact, resources and locations (entities and their names, so to speak) are mostly identified by ORWL and these words will be used interchangeably. -Resources may be of very different kind: +Resources may be of very different kinds: \begin{description} \item[Data] resources\index{ORWL!resource!data} are entities that represents data and not specific - memory buffers or locations. During the execution of an application it can be + memory buffers or locations. During the execution of an application they can be \emph{mapped} repeatedly into the address space and in effect be represented at different addresses. Data resources can be made accessible uniformly in all - parts of the application, provided that the locking protocol is observed, see - below. Data resources can have different persistence: + parts of the application, provided that the locking protocol is observed (see + below). Data resources can have different persistence: \begin{description} \item[RAM] data resources are typically temporary data that serve only during a single run of the application. They must be initialized at the beginning of - their lifetime and the contents is lost at the end. + their lifetime and the contents are lost at the end. \item[File] data resources are persistent and linked to a file in the file system of the platform. \item[Collective] data resources are data to which all tasks of an application contribute (see below). Examples for such resources are \emph{broadcast}, - \emph{gather} or - \emph{reduce} resources, e.g to distribute initial data or to collect the + \emph{gather}, or + \emph{reduce} resources, e.g., to distribute initial data or to collect the result of a distributed computation. \end{description} - Other types of data resources could be easily implemented with ORWL, e.g web + Other types of data resources could be easily implemented with ORWL, e.g., web resources (through a ftp, http or whatever server address) or fixed hardware addresses. \item[Device] resources\index{ORWL!resource!device} represent hardware entities of the platform. ORWL can then be used to regulate the access to such device resources. In our context the most important such resource is the GPU, but we - could easily use it to represent a CPU core, a camera or other peripheral + could easily use it to represent a CPU core, a camera, or another peripheral device. \end{description} \Lst{algo:ch6p3ORWLresources} shows an example of a declaration of four resources per task. Two (\texttt{curBlock} and \texttt{nextBlock}) are intended to represent the data in a block-cyclic parallel matrix multiplication -(see p.~\pageref{ch6:p1block-cyclic}), -\texttt{GPU} represents a GPU device and \texttt{result} will represent a +(see Section~\ref{ch6:p1block-cyclic}), +\texttt{GPU} represents a GPU device, and \texttt{result} will represent a collective ``gather'' resource among all the tasks. +\pagebreak %\begin{algorithm}[H] % \caption{Declaration of ORWL resources for a block-cyclic matrix % multiplication.} % \label{algo:ch6p3ORWLresources} -\begin{Listing}{algo:ch6p3ORWLresources}{Declaration of ORWL resources for a block-cyclic matrix multiplication} +\begin{Listing}{algo:ch6p3ORWLresources}{declaration of ORWL resources for a block-cyclic matrix multiplication} #include "orwl.h" ... ORWL_LOCATIONS_PER_TASK(curBlock, nextBlock, GPU, result); ORWL_DATA_LOCATION(curBlock); -ORWL_DATA_LOCATION(nexBlock); +ORWL_DATA_LOCATION(nextBlock); ORWL_DEVICE_LOCATION(GPU); ORWL_GATHER_LOCATION(result); \end{Listing} @@ -102,18 +103,18 @@ ORWL_GATHER_LOCATION(result); \label{sec:ch6p3ORWLcontrol} -ORWL regulates access to all its resources, no ``random access'' to a resource +ORWL regulates access to all its resources; no ``random access'' to a resource is possible. It doesn't even have a user-visible data type for resources. \begin{itemize} \item All access is provided through \emph{handle}s\index{ORWL!handle}. Similar to pointers or links, these only refer to a resource and help to manipulate it. Usually several handles to the same resource exist, even inside the same OS process or thread, or in the same application task. -\item The access is locked with RW semantics, where \emph{R} stands for - concurrent \textbf{R}ead~access, and \emph{W} for exclusive - \textbf{W}rite~access. This feature replaces the control aspect of MPI - communications, OpenMP inter-thread control and CUDA$_{sync}$. -\item This access is \textbf{O}rdered (or serialized)\index{ordered access} through a FIFO, \emph{one +\item The access is locked with RW semantics, where {R} stands for + concurrent {R}ead~access, and {W} for exclusive + {W}rite~access. This feature replaces the control aspect of MPI + communications, OpenMP inter-thread control, and CUDA$_{sync}$. +\item This access is {O}rdered (or serialized)\index{ordered access} through a FIFO, \emph{one FIFO per resource}. This helps to run the different tasks of an application in a controlled order and to always have all resources in a known state. This aspect largely replaces and extends the ordering of tasks that MPI typically @@ -126,15 +127,16 @@ is possible. It doesn't even have a user-visible data type for resources. \subsection{Example: block-cyclic matrix multiplication (MM)} \label{sec:ch6p3ORWLMM} -Let us now have a look how a block-cyclic matrix multiplication\index{matrix +Let us now have a look at how a block-cyclic matrix multiplication\index{matrix multiplication!block cyclic} algorithm can be -implemented with these concepts (\Lst{algo:ch6p3ORWLBCCMM}). Inside the loop it mainly consists of three -different operations, of which the first two can be run concurrently, and the +implemented with these concepts (\Lst{algo:ch6p3ORWLBCCMM}). Inside the loop +there are mainly three +different operations, the first two of which can be run concurrently, and the third must be done after the other two. %\begin{algorithm}[H] % \caption{Block-cyclic matrix multiplication, high level per task view.} % \label{algo:ch6p3ORWLBCCMM} -\begin{Listing}{algo:ch6p3ORWLBCCMM}{Block-cyclic matrix multiplication, high level per task view} +\begin{Listing}{algo:ch6p3ORWLBCCMM}{block-cyclic matrix multiplication, high level per task view} typedef double MBlock[N][N]; MBlock A; MBlock B[k]; @@ -162,19 +164,20 @@ for (size_t i = 0; i < k; ++i) { %\end{algorithm} -\Lst{algo:ch6p3ORWLlcopy} shows the local copy operation~3 as it could +\Lst{algo:ch6p3ORWLlcopy} shows the local copy operation~3 from line 17 of +\Lst{algo:ch6p3ORWLBCCMM} as it could be realized with ORWL. It uses two resource handles \texttt{nextRead} and \texttt{curWrite} and marks nested \emph{critical sections} for these handles. Inside the nested sections it obtains pointers to the resource data; the resource is \emph{mapped} into the address space of the program, and then a standard call to \texttt{memcpy} achieves the operation -itself. The operation is integrated in its own \textbf{for}-loop, such that it +itself. The operation is integrated in its own {for}-loop, such that it could run independently in an OS thread by its own. %\begin{algorithm}[H] % \caption{An iterative local copy operation.} % \label{algo:ch6p3ORWLlcopy} -\begin{Listing}{algo:ch6p3ORWLlcopy}{An iterative local copy operation} +\begin{Listing}{algo:ch6p3ORWLlcopy}{an iterative local copy operation} for (size_t i = 0; i < k; ++i) { ORWL_SECTION(nextRead) { MBlock const* sBlock = orwl_read_map(nextRead); @@ -188,14 +191,14 @@ for (size_t i = 0; i < k; ++i) { %\end{algorithm} Next, in \Lst{algo:ch6p3ORWLrcopy} we copy data from a remote task to -a local task. Substantially the operation is the same, only that in the example -different handles (\texttt{remRead} and \texttt{nextWrite}) are used to +a local task. Substantially the operation is the same, save for the +different handles (\texttt{remRead} and \texttt{nextWrite}) that are used to represent the respective resources. %\begin{algorithm}[H] % \caption{An iterative remote copy operation as part of a block cyclic matrix % multiplication task.} %\label{algo:ch6p3ORWLrcopy} -\begin{Listing}{algo:ch6p3ORWLrcopy}{An iterative remote copy operation as part of a block cyclic matrix multiplication task} +\begin{Listing}{algo:ch6p3ORWLrcopy}{an iterative remote copy operation as part of a block cyclic matrix multiplication task} for (size_t i = 0; i < k; ++i) { ORWL_SECTION(remRead) { MBlock const* sBlock = orwl_read_map(remRead); @@ -210,14 +213,14 @@ for (size_t i = 0; i < k; ++i) { Now let us have a look into the operation that probably interests us the most, the interaction with the GPU in \Lst{algo:ch6p3ORWLtrans}. Again there -is much structural resemblance to the copy operations from above, only that we +is much structural resemblance to the copy operations from above, but we transfer the data to the GPU in the innermost block and then run the GPU MM -kernel while we still are inside the critical section for the GPU. +kernel while we are still inside the critical section for the GPU. %\begin{algorithm}[H] % \caption{An iterative GPU transfer and compute operation as part of a block cyclic matrix % multiplication task.} % \label{algo:ch6p3ORWLtrans} -\begin{Listing}{algo:ch6p3ORWLtrans}{An iterative GPU transfer and compute operation as part of a block cyclic matrix multiplication task} +\begin{Listing}{algo:ch6p3ORWLtrans}{an iterative GPU transfer and compute operation as part of a block cyclic matrix multiplication task} for (size_t i = 0; i < k; ++i) { ORWL_SECTION(GPUhandle) { ORWL_SECTION(curRead) { @@ -231,16 +234,16 @@ for (size_t i = 0; i < k; ++i) { %\end{algorithm} Now that we have seen how the actual procedural access to the resources is -regulated we will show how the association between handles and resources is -specified. E.g in our application of block-cyclic MM the \texttt{curRead} handle -should correspond to current matrix block of the corresponding task, whereas +regulated, we will show how the association between handles and resources is +specified. In our application of block-cyclic MM the \texttt{curRead} handle +should correspond to the current matrix block of the corresponding task, whereas \texttt{remRead} should point to the current block of the neighboring task. -Both read operations on these matrix blocks can be effected without creating +Both read operations on these matrix blocks can be performed without creating conflicts, so we would like to express that fact in our resource specification. From a point of view of the resource ``current block'' of a particular task, this means that it can have two simultaneous readers, the task itself performing the transfer to the GPU, and the neighboring task transferring the data to its -``next block''. +``next block.'' \Lst{algo:ch6p3ORWLdecl} first shows the local dynamic declarations of our application; it declares a \texttt{block} type for the matrix blocks, a @@ -249,7 +252,7 @@ have seen so far. %\begin{algorithm}[H] % \caption{Dynamic declaration of handles to represent the resources.} % \label{algo:ch6p3ORWLdecl} -\begin{Listing}{algo:ch6p3ORWLdecl}{Dynamic declaration of handles to represent the resources} +\begin{Listing}{algo:ch6p3ORWLdecl}{dynamic declaration of handles to represent the resources} /* A type for the matrix blocks */ typedef double MBlock[N][N]; /* Declaration to handle the collective resource */ @@ -267,52 +270,54 @@ orwl_handle2 GPUhandle = ORWL_HANDLE2_INITIALIZER; \end{Listing} %\end{algorithm} -With these declarations, we didn't yet tell ORWL much about the resources to -which these handles refer, nor the type (read or write) or the priority (FIFO -position) of the access. This is done in code -\Lst{algo:ch6p3ORWLinit}. The handles for -\Lst{algo:ch6p3ORWLtrans} are given first, \texttt{GPUhandle} will be -accessed exclusively (therefore the \texttt{write}) and, as said, -\texttt{curRead} is used shared (so a \texttt{read}). Both are inserted in the -FIFO of there respective resources with highest priority, specified by the -\texttt{0}s in the third function parameter. The resources to which they -correspond are specified through calls to the macro \texttt{ORWL\_LOCATION}, -indicating the task (\texttt{orwl\_mytid} is the ID of the current task) and the -specific resource of that task, here \texttt{GPU} and \texttt{curBlock}. - -Likewise, a second block of insertions concerns the handles for -\Lst{algo:ch6p3ORWLrcopy}: \texttt{newWrite} reclaims an exclusive -access and \texttt{remRead} a shared. \texttt{remRead} corresponds to a -resource of another task; \texttt{previous(orwl\_mytid)} is supposed to return -the ID of the previous task in the cycle. Both accesses can be effected -concurrently with the previous operation, so we insert with the same priority -\texttt{0} as before. - -Then, for the specification of the third operation -(\Lst{algo:ch6p3ORWLlcopy}) we need to use a different priority: the -copy operation from \texttt{nextBlock} to \texttt{curBlock} has to be performed -after the other operations have terminated. - -As a final step, we then tell ORWL that the specification of all accesses is +With these declarations, we didn't yet tell ORWL much about the resources to +which these handles refer, nor the type (read or write) or the priority (FIFO +position) of the access. This is done in code \Lst{algo:ch6p3ORWLinit} that +shows six insertions of handles into their respective FIFO locations. The +handles \texttt{GPUhandle} and \texttt{curRead} are given first (lines 3 and 4), +\texttt{GPUhandle} will be accessed exclusively (therefore the \texttt{write}) +and, as said, \texttt{curRead} is used in shared access (so a +\texttt{read}). Both are inserted in the FIFO of their respective resources with +highest priority, specified by the \texttt{0}s in the third function +parameter. The resources to which they correspond are specified through calls to +the macro \texttt{ORWL\_LOCATION}, indicating the task (\texttt{orwl\_mytid} is +the ID of the current task) and the specific resource of that task, here +\texttt{GPU} and \texttt{curBlock}. + +Likewise, a second block of insertions concerns the handles \texttt{remRead} and +\texttt{nextWrite} (lines 8 and 9). \texttt{nextWrite} reclaims an exclusive +access and \texttt{remRead} a shared one. \texttt{remRead} corresponds to a +resource of another task; the call to \texttt{previous(orwl\_mytid)} is supposed +to return the ID of the previous task in the cycle. Both accesses can be +performed concurrently with the previous operation, so we insert them with the +same priority \texttt{0} as previously. + +Then, for the specification of the third operation related to handles +\texttt{nextRead} and \texttt{curWrite} (lines 13 and 14), we need to +use a different priority: the copy operation from data locations \texttt{nextBlock} to +\texttt{curBlock} has to be performed after the other operations have +terminated (so the priority \texttt{1}). + +As a final step, we then tell ORWL (line 16) that the specification of all accesses is complete and that it may schedule\index{ORWL!schedule} all these accesses in the respective FIFOs of the resources. %\begin{algorithm}[H] % \caption{Dynamic initialization of access mode and priorities.} % \label{algo:ch6p3ORWLinit} -\pagebreak -\begin{Listing}{algo:ch6p3ORWLinit}{Dynamic initialization of access mode and priorities} +%\pagebreak +\begin{Listing}{algo:ch6p3ORWLinit}{dynamic initialization of access mode and priorities} /* One operation with priority 0 (highest) consists */ -/* in copying from current to the GPU and run MM, there. */ +/* of copying from current to the GPU and running MM, there. */ orwl_write_insert(&GPUhandle, ORWL_LOCATION(orwl_mytid, GPU), 0); orwl_read_insert(&curRead, ORWL_LOCATION(orwl_mytid, curBlock), 0); /* Another operation with priority 0 consists */ -/* in copying from remote to next */ +/* of copying from remote to next */ orwl_read_insert(&remRead, ORWL_LOCATION(previous(orwl_mytid), curBlock), 0); -orwl_write_insert(&nextWrite, ORWL_LOCATION(orwl_mytid, nextBlock), 0); +orwl_write_insert(&nextWrite, ORWL_LOCATION(orwl_mytid,nextBlock), 0); /* One operation with priority 1 consists */ -/* in copying from next to current */ +/* of copying from next to current */ orwl_read_insert(&nextRead, ORWL_LOCATION(orwl_mytid, nextBlock), 1); orwl_write_insert(&curWrite, ORWL_LOCATION(orwl_mytid, curBlock), 1); @@ -322,19 +327,19 @@ orwl_schedule(); \subsection{Tasks and operations} \label{sec:ch6p3tasks} -With that example we have now seen that ORWL distinguishes +With this example we have now seen that ORWL distinguishes \emph{tasks}\index{ORWL!task} and \emph{operations}\index{ORWL!operation}. An ORWL program is divided into tasks that can be seen as the algorithmic units that will concurrently access the resources that the program uses. A task for ORWL is characterized by \begin{itemize} -\item a fixed set of resources that it manages, ``\emph{owns}'', in our example +\item a fixed set of resources that it manages, ``\emph{owns},'' in our example the four resources that are declared in \Lst{algo:ch6p3ORWLresources}. \item a larger set of resources that it accesses, in our example all resources that are used in \Lst{algo:ch6p3ORWLinit}. \item a set of operations that act on these resources, in our example the three operations that are used in \Lst{algo:ch6p3ORWLBCCMM}, and that are - elaborated in Listings~\ref{algo:ch6p3ORWLlcopy},~\ref{algo:ch6p3ORWLrcopy} + elaborated in Listings~\ref{algo:ch6p3ORWLlcopy},~\ref{algo:ch6p3ORWLrcopy}, and~\ref{algo:ch6p3ORWLtrans}. \end{itemize} diff --git a/BookGPU/Chapters/chapter6/PartieSync.tex b/BookGPU/Chapters/chapter6/PartieSync.tex index d213e50..bc08557 100755 --- a/BookGPU/Chapters/chapter6/PartieSync.tex +++ b/BookGPU/Chapters/chapter6/PartieSync.tex @@ -11,29 +11,29 @@ \noindent {\bf Considered parallel algorithms and implementations} \medskip -This section focusses on synchronous parallel algorithms implemented with +This section focuses on synchronous parallel algorithms implemented with overlapping computations and communications\index{overlap!computation and communication}. Parallel synchronous algorithms are -easier to implement, debug and maintain than asynchronous ones, see -Section~\ref{ch6:part2}. Usually, they follow a BSP-like parallel -scheme\index{BSP parallel scheme}, -alternating local computation steps and communication steps, -see~\cite{Valiant:BSP}. Their execution is usually deterministic, excepted +easier to implement, debug, and maintain than asynchronous ones (see +Section~\ref{ch6:part2}). Usually, they follow a BSP-like parallel +scheme\index{BSP parallel scheme} (Bulk Synchronous Parallel model), +alternating local computation steps and communication steps +(see~\cite{Valiant:BSP}). Their execution is usually deterministic, except for stochastic algorithms that contain random number generations. Even in -this case, their execution can be controlled during debug steps, allowing to -track and to fix bugs quickly. +this case, their execution can be controlled during debug steps, allowing the +user to track and to fix bugs quickly. However, depending on the properties of the algorithm, it is sometimes possible to overlap computations and communications. If processes exchange data that is not needed for the -computation that is following immediately, it is possible to implement such +computation immediately following, it is possible to implement such an overlap. We have investigated the efficiency of this approach in previous works~\cite{GUSTEDT:2007:HAL-00280094:1,ChVCV13}, using standard parallel programming tools to achieve the implementation. -The normalized and well known Message Passing Interface (MPI\index{MPI}) includes some asynchronous -point-to-point communication routines, that should allow to implement some +The normalized and well-known Message Passing Interface (MPI\index{MPI}) includes some asynchronous +point-to-point communication routines, that should allow the implementation of some communication/computation overlap. However, current MPI implementations do not achieve -that goal efficiently; effective overlapping with MPI requires a group of +this goal efficiently; effective overlapping with MPI requires a group of dedicated threads (in our case implemented with OpenMP\index{OpenMP}) for the basic synchronous communications while another group of threads executes computations in parallel. @@ -42,11 +42,11 @@ in parallel. % decrease the execution time. Nevertheless, communication and computation are not completely independent on modern multicore architectures: they use shared hardware components such as the -interconnection bus and the RAM. Therefore that approach only saved up to $20\%$ +interconnection bus and the RAM. Therefore, this approach saves only up to $20\%$ of the expected time on such a platform. This picture changes on clusters -equipped with GPU. They effectively allow independence of computations on the -GPU and communication on the mainboard (CPU, interconnection bus, RAM, network -card). We saved up to $100\%$ of the expected time on our GPU cluster, as we +equipped with GPUs. Indeed, GPUs effectively allow independence of computations they +perform and communications done on the mainboard (CPU, interconnection bus, RAM, network +card). We save up to $100\%$ of the expected time on our GPU cluster, as we will expose in the next section. @@ -56,17 +56,16 @@ will expose in the next section. \noindent {\bf Specific interests in GPU clusters} \medskip -In a computing node, a GPU is a kind of scientific coprocessor usually located -on an auxiliary board, with its own memory. So, when data have been transferred -from the CPU memory to the GPU memory, then GPU computations can be achieved on -the GPU board, totally in parallel of any CPU activities (like internode cluster +In a computing node, a GPU is a kind of scientific coprocessor, usually located +on an auxiliary board, with its own memory. So, once data are transferred +from the CPU memory to the GPU memory, GPU computations can be achieved on +the GPU board, totally in parallel with any CPU activities (such as internode cluster communications). The CPU and the GPU access their respective memories and do not -interfere, so they can achieve a very good overlap\index{overlap!computation -and computation} of their activities (better -than two CPU cores). +interfere with each other, so they can achieve a very good overlap\index{overlap!computation +and computation} of their activities (better than two CPU cores). -But using a GPU on a computing node requires to transfer data from the CPU to -the GPU memory, and to transfer the computation results back from the GPU to the +But using a GPU on a computing node requires the transfer of data from the CPU to +the GPU memory, as well as the transfer of the computation results back from the GPU to the CPU. Transfer times are not excessive, but depending on the application they still can be significant compared to the GPU computation times. So, sometimes it can be interesting to overlap the internode cluster communications with both the @@ -74,14 +73,14 @@ CPU/GPU data transfers and the GPU computations. We can identify four main parallel programming schemes on a GPU cluster: \begin{enumerate} -\item parallelizing only 'internode CPU communications' with 'GPU computations', +\item parallelizing only internode CPU communications with GPU computations, and achieving CPU/GPU data transfers before and after this parallel step, -\item parallelizing 'internode CPU communications' with a '(sequential) sequence - of CPU/GPU data transfers and GPU computations', -\item parallelizing 'internode CPU communications' with a 'streamed sequence of - CPU/GPU data transfers and GPU computations', -\item parallelizing 'internode CPU communications' with 'CPU/GPU data transfers' - and with 'GPU computations', interleaving computation-communication +\item parallelizing internode CPU communications with a (sequential) sequence + of CPU/GPU data transfers and GPU computations, +\item parallelizing internode CPU communications with a streamed sequence of + CPU/GPU data transfers and GPU computations, +\item parallelizing internode CPU communications with CPU/GPU data transfers + and with GPU computations, interleaving computation-communication iterations. \end{enumerate} @@ -95,31 +94,36 @@ parallel programming schemes on a GPU cluster: \label{fig:ch6p1overlapnative} \end{figure} -Using CUDA\index{CUDA}, GPU kernel executions are non-blocking, and GPU/CPU data +Using CUDA\index{CUDA}, GPU kernel executions are nonblocking, and GPU/CPU data transfers\index{CUDA!data transfer} -are blocking or non-blocking operations. All GPU kernel executions and CPU/GPU -data transfers are associated to "streams"\index{CUDA!stream}, and all operations on a same stream +are blocking or nonblocking operations. All GPU kernel executions and CPU/GPU +data transfers are associated to "streams,"\index{CUDA!stream} and all operations on a same stream are serialized. When transferring data from the CPU to the GPU, then running GPU -computations and finally transferring results from the GPU to the CPU, there is +computations, and finally transferring results from the GPU to the CPU, there is a natural synchronization and serialization if these operations are achieved on the same stream. GPU developers can choose to use one (default) or several streams. In this first scheme of overlapping, we consider parallel codes using only one GPU stream. -"Non-blocking GPU kernel execution" means a CPU routine runs a parallel +``Nonblocking GPU kernel execution'' means a CPU routine runs a parallel execution of a GPU computing kernel, and the CPU routine continues its execution (on the CPU) while the GPU kernel is running (on the GPU). Then the CPU routine -can initiate some communications with some others CPU, and so it automatically +can initiate some communications with some other CPUs, and so it automatically overlaps the internode CPU communications with the GPU computations (see \Fig{fig:ch6p1overlapnative}). This overlapping is natural when programming with CUDA and MPI: it is easy to deploy, but does not overlap the CPU/GPU data transfers. +\Lst{algo:ch6p1overlapnative} introduces the generic code of a MPI+CUDA +implementation, natively and implicitly overlapping MPI communications with CUDA +GPU computations. + + %\begin{algorithm}[t] % \caption{Generic scheme implicitly overlapping MPI communications with CUDA GPU % computations}\label{algo:ch6p1overlapnative} -\pagebreak -\begin{Listing}{algo:ch6p1overlapnative}{Generic scheme implicitly overlapping MPI communications with CUDA GPU computations} +%\pagebreak +\begin{Listing}{algo:ch6p1overlapnative}{generic scheme implicitly overlapping MPI communications with CUDA GPU computations} // Input data and result variables and arrays (example with // float datatype, 1D input arrays, and scalar results) float *cpuInputTabAdr, *gpuInputTabAdr; @@ -131,7 +135,7 @@ cudaMalloc(&gpuInputTabAdr,sizeof(float)*N); cpuResTabAdr = malloc(sizeof(float)*NbIter); cudaMalloc(&gpuResAdr,sizeof(float)); -// Definition of the Grid of blocks of GPU threads +// Definition of the grid of blocks of GPU threads dim3 Dg, Db; Dg.x = ... ... @@ -158,34 +162,34 @@ for (int i = 0; i < NbIter; i++) { \end{Listing} %\end{algorithm} -\Lst{algo:ch6p1overlapnative} introduces the generic code of a MPI+CUDA -implementation, natively and implicitly overlapping MPI communications with CUDA -GPU computations. Some input data and output results arrays and variables are -declared and allocated from line 1 up to 10, and a computation loop is -implemented from line 21 up to 34. At each iteration: + + +Some input data and output results arrays and variables are +declared and allocated from line~3 through 10, and a computation loop is +implemented from line~22 through 34. At each iteration: \begin{itemize} -\item \texttt{cudaMemcpy} on line 23 transfers data from the CPU memory +\item \texttt{cudaMemcpy} on line~23 transfers data from the CPU memory to the GPU memory. This is a basic and synchronous data transfer. -\item \texttt{gpuKernel\_k1<<>>} on line 26 starts GPU computation - (running a GPU kernel on the grid of blocks of threads defined at line 12 to - 15). This is a standard GPU kernel run, it is an asynchronous operation. The +\item \texttt{gpuKernel\_k1<<>>} on line~26 starts GPU computation + (running a GPU kernel on the grid of blocks of threads defined in lines~13 to + 15). This is a standard GPU kernel run; it is an asynchronous operation. The CPU can continue to run its code. -\item \texttt{MPI\_Sendrecv\_replace} on line 27 achieves some blocking - internode communications, overlapping GPU computations started just before. -\item If needed, \texttt{cudaMemcpy} on line 31 transfers the iteration result from - one variable in the GPU memory at one array index in the CPU memory (in this example the CPU +\item \texttt{MPI\_Sendrecv\_replace} on line~27 achieves some blocking + internode communications, overlapping GPU computations started just previously. +\item If needed, \texttt{cudaMemcpy} on line~31 transfers the iteration result from + one variable in the GPU memory to one array index in the CPU memory (in this example the CPU collects all iteration results in an array). This operation is started after the end of the MPI communication (previous instruction) and after the end of the GPU kernel execution. CUDA insures an implicit synchronization of all operations involving the same GPU stream, like the default stream in this - example. Result transfer has to wait the GPU kernel execution is finished. - If there is no result transfer implemented, the next operation on the GPU - will wait until the GPU kernel execution will be ended. + example. The transfer of the results has to wait until the GPU kernel execution is finished. + If there is no results transfer implemented, the next operation on the GPU + will wait until the GPU kernel execution has ended. \end{itemize} This implementation is the easiest one involving the GPU. It achieves an -implicit overlap of internode communications and GPU computations, no explicit -multithreading is required on the CPU. However, CPU/GPU data transfers are +implicit overlap of internode communications and GPU computations with no explicit +multithreading required on the CPU. However, CPU/GPU data transfers are achieved serially and not overlapped. @@ -208,20 +212,24 @@ When CPU/GPU data transfers are not negligible compared to GPU computations, it can be interesting to overlap internode CPU computations with a \emph{GPU sequence}\index{GPU sequence} including CPU/GPU data transfers and GPU computations (see \Fig{fig:ch6p1overlapseqsequence}). Algorithmic issues of this approach are basic, -but their implementation require explicit CPU multithreading and +but their implementation requires explicit CPU multithreading and synchronization, and CPU data buffer duplication. We need to implement two -threads, one starting and achieving MPI communications, and the other running +threads, one starting and achieving MPI communications and the other running the \emph{GPU sequence}. OpenMP allows an easy and portable implementation of this overlapping strategy. However, it remains more complex to develop and to maintain than the previous strategy (overlapping only internode CPU -communications and GPU computations), and should be adopted only when CPU/GPU +communications and GPU computations) and should be adopted only when CPU/GPU data transfer times are not negligible. +\Lst{algo:ch6p1overlapseqsequence} introduces the generic code of a +MPI+OpenMP+CUDA implementation, explicitly overlapping MPI communications with +GPU sequences. + %\begin{algorithm} % \caption{Generic scheme explicitly overlapping MPI communications with % sequences of CUDA CPU/GPU transfers and CUDA GPU % computations}\label{algo:ch6p1overlapseqsequence} -\begin{Listing}{algo:ch6p1overlapseqsequence}{Generic scheme explicitly overlapping MPI communications with sequences of CUDA CPU/GPU transfers and CUDA GPU computations} +\begin{Listing}{algo:ch6p1overlapseqsequence}{generic scheme explicitly overlapping MPI communications with sequences of CUDA CPU/GPU transfers and CUDA GPU computations} // Input data and result variables and arrays (example with // float datatype, 1D input arrays, and scalar results) float *cpuInputTabAdrCurrent, *cpuInputTabAdrFuture, *gpuInputTabAdr; @@ -234,7 +242,7 @@ cudaMalloc(&gpuInputTabAdr,sizeof(float)*N); cpuResTabAdr = malloc(sizeof(float)*NbIter); cudaMalloc(&gpuResAdr,sizeof(float)); -// Definition of the Grid of blocks of GPU threads +// Definition of the grid of blocks of GPU threads dim3 Dg, Db; Dg.x = ... ... @@ -276,9 +284,9 @@ omp_set_num_threads(2); cudaMemcpyDeviceToHost); } - // - Wait for both threads have achieved their iteration tasks + // - Wait until both threads have achieved their iteration tasks #pragma omp barrier - // - Each thread permute its local buffer pointers + // - Each thread permutes its local buffer pointers tmp = current; current = future; future = tmp; @@ -288,44 +296,56 @@ omp_set_num_threads(2); \end{Listing} %\end{algorithm} -\Lst{algo:ch6p1overlapseqsequence} introduces the generic code of a -MPI+OpenMP+CUDA implementation, explicitly overlapping MPI communications with -\emph{GPU sequences}. Lines 25--62 implement the OpenMP parallel region, -around the computation loop (lines 33--61). For performances it is +Lines~25--62 implement the OpenMP parallel region, +around the computation loop (lines~33--61). For efficient performances it is important to create and destroy threads only one time (not at each iteration): -the parallel region has to surround the computation loop. Lines 1--11 -consist in declaration and allocation of input data arrays and result arrays and -variables, like in previous algorithm (\Lst{algo:ch6p1overlapnative}). However, we implement two input data buffers on the +the parallel region has to surround the computation loop. Lines~3--11 +consist of declaration and allocation of input data arrays and result arrays and +variables, as in the previous algorithm (\Lst{algo:ch6p1overlapnative}). However, we implement two input data buffers on the CPU (current and future version). As we aim to overlap internode MPI communications and GPU sequence, including CPU to GPU data transfer of current input data array, we need to store the received new input data array in a separate buffer. Then, the current input data array will be safely read on the CPU and copied into the GPU memory. -The thread creations\index{OpenMP!thread creation} are easily achieved with one OpenMP directive (line -25). Then each thread defines and initializes \emph{its} local buffer pointers, -and enters \emph{its} computing loop (lines 27--33). Inside the computing -loop, a test on the thread number allows to run a different code in each -thread. Lines 37--40 implement the MPI synchronous communication run by -thread number $0$. Lines 45--52 implement the GPU sequence run by thread -$1$: CPU to GPU data transfer, GPU computation and GPU to CPU result +The thread creations\index{OpenMP!thread creation} are easily achieved with one OpenMP directive (line~25). +Then each thread defines and initializes \emph{its} local buffer pointers, +and enters \emph{its} computing loop (lines~28--33). Inside the computing +loop, a test on the thread number makes it possible to run a different code in each +thread. Lines~37--40 implement the MPI synchronous communication run by +thread number $0$. Lines~45--52 implement the GPU sequence run by thread +$1$: CPU to GPU data transfer, GPU computation, and GPU to CPU result transfer (if needed). Details of the three operations of this sequence have not changed -compared to the previous overlapping strategy. +from the previous overlapping strategy. At the end of \Lst{algo:ch6p1overlapseqsequence}, an OpenMP synchronization -barrier\index{OpenMP!barrier} on line 56 allows to wait OpenMP threads have achieved MPI -communications and GPU sequence, and do not need to access the current input -data buffer. Then, each thread permute its local buffer pointers (lines 58--60), +barrier\index{OpenMP!barrier} on line~56 forces the OpenMP threads to wait until +MPI +communications and GPU sequence are achieved. %, and do not need to access the current input data buffer. +Then, each thread permutes its local buffer pointers (lines~58--60), and is ready to enter the next iteration, processing the new current input array. - %\subsubsection{Overlapping with a streamed GPU sequence} \bigskip +%\pagebreak \noindent {\bf Overlapping with a streamed GPU sequence} \medskip +Depending on the algorithm implemented, it is sometimes possible to split the +GPU computation into several parts processing distinct data. Then, we can +speedup the GPU sequence using several CUDA streams\index{CUDA!stream}. The goal is +to overlap CPU/GPU data transfers with GPU computations\index{overlap!GPU data transfers with GPU computation} inside the GPU + sequence. Compared to the previous overlapping strategy, we have to split the +initial data transfer into a set of $n$ asynchronous and smaller data transfers, +and split the initial GPU kernel call into a set of $n$ calls to the same GPU +kernel. Usually, these smaller calls are deployed with fewer GPU threads +(i.e., associated to a smaller grid of blocks of threads). Then, the first GPU +computations can start as soon as the first data transfer has been achieved, and +next transfers can be done in parallel with next GPU computations (see +\Fig{fig:ch6p1overlapstreamsequence}). + \begin{figure}[t] \centering \includegraphics[width=\columnwidth]{Chapters/chapter6/figures/Sync-StreamSequenceOverlap.pdf} @@ -334,34 +354,25 @@ array. \label{fig:ch6p1overlapstreamsequence} \end{figure} -Depending on the algorithm implemented, it is sometimes possible to split the -GPU computation into several parts processing distinct data. Then, we can -speedup the \emph{GPU sequence} using several CUDA \emph{streams}\index{CUDA!stream}. The goal is -to overlap CPU/GPU data transfers with GPU computations\index{overlap!GPU data transfers with GPU computation} inside the \emph{GPU - sequence}. Compared to the previous overlapping strategy, we have to split the -initial data transfer in a set of $n$ asynchronous and smaller data transfers, -and to split the initial GPU kernel call in a set of $n$ calls to the same GPU -kernel. Usually, these smaller calls are deployed with less GPU threads -(i.e. associated to a smaller grid of blocks of threads). Then, the first GPU -computations can start as soon as the first data transfer has been achieved, and -next transfers can be done in parallel of next GPU computations (see -\Fig{fig:ch6p1overlapstreamsequence}). - -NVIDIA advises to start all asynchronous CUDA data transfers, and then to call +NVIDIA advises starting all asynchronous CUDA data transfers and then calling all CUDA kernel executions, using up to $16$ streams \cite{cudabestpractices}. -Then, CUDA driver and -runtime optimize the global execution of these operations. So, we cumulate two -overlapping mechanisms. The former is controlled by CPU multithreading, and -overlap MPI communications and the \emph{streamed GPU sequence}. The latter is -controlled by CUDA programming, and overlap CPU/GPU data transfers and GPU -computations. Again, OpenMP allows to easily implement the CPU multithreading, -and to wait for the end of both CPU threads before to execute the next instructions +Then, the CUDA driver and +runtime optimize the global execution of these operations. So, we accumulate two +overlapping mechanisms. The former is controlled by CPU multithreading and +overlaps MPI communications and the streamed GPU sequence. The latter is +controlled by CUDA programming and overlaps CPU/GPU data transfers and GPU +computations. Again, OpenMP allows the easy implementation of the CPU multithreading +and waiting for the end of both CPU threads before executing the next instructions of the code. +\Lst{algo:ch6p1overlapstreamsequence} introduces the generic MPI+OpenMP+CUDA +code, explicitly overlapping MPI communications with +streamed GPU sequences\index{GPU sequence!streamed}. + %\begin{algorithm} % \caption{Generic scheme explicitly overlapping MPI communications with streamed sequences of CUDA % CPU/GPU transfers and CUDA GPU computations}\label{algo:ch6p1overlapstreamsequence} -\begin{Listing}{algo:ch6p1overlapstreamsequence}{Generic scheme explicitly overlapping MPI communications with streamed sequences of CUDA CPU/GPU transfers and CUDA GPU computations} +\begin{Listing}{algo:ch6p1overlapstreamsequence}{generic scheme explicitly overlapping MPI communications with streamed sequences of CUDA CPU/GPU transfers and CUDA GPU computations} // Input data and result variables and arrays (example with // float datatype, 1D input arrays, and scalar results) float *cpuInputTabAdrCurrent, *cpuInputTabAdrFuture, *gpuInputTabAdr; @@ -376,7 +387,7 @@ cudaMalloc(&gpuResAdr,sizeof(float)); cudaStream_t TabS[NbS]; for(int s = 0; s < NbS; s++) cudaStreamCreate(&TabS[s]); -// Definition of the Grid of blocks of GPU threads +// Definition of the grid of blocks of GPU threads ... // Set the number of OpenMP threads (to create) to 2 omp_set_num_threads(2); @@ -417,9 +428,9 @@ omp_set_num_threads(2); sizeof(float), cudaMemcpyDeviceToHost); } - // - Wait for both threads have achieved their iteration tasks + // - Wait until both threads have achieved their iteration tasks #pragma omp barrier - // - Each thread permute its local buffer pointers + // - Each thread permutes its local buffer pointers tmp = current; current = future; future = tmp; } // End of computation loop } // End of OpenMP parallel region @@ -431,66 +442,59 @@ for(int s = 0; s < NbS; s++) \end{Listing} %\end{algorithm} -\Lst{algo:ch6p1overlapstreamsequence} introduces the generic MPI+OpenMP+CUDA -code explicitly overlapping MPI communications with -\emph{streamed GPU sequences}\index{GPU sequence!streamed}. Efficient usage of CUDA \emph{streams} requires to execute -asynchronous CPU/GPU data transfers, that needs to read page-locked +Efficient usage of CUDA streams requires executing +asynchronous CPU/GPU data transfers, which implies reading page-locked data\index{page-locked data} in CPU memory. So, CPU -memory allocations on lines 6 and 7 are implemented with \texttt{cudaHostAlloc} instead of -the basic \texttt{malloc} function. Then, $NbS$ \emph{streams} are created on lines 12--14. +memory allocations on lines~6 and 7 are implemented with \texttt{cudaHostAlloc} instead of +the basic \texttt{malloc} function. Then, $NbS$ \emph{streams} are created on lines~12--14. Usually we create $16$ streams: the maximum number supported by CUDA. -An OpenMP parallel region\index{OpenMP!parallel region} including two threads is implemented on lines 17--61 of -\Lst{algo:ch6p1overlapstreamsequence}, similarly to the previous algorithm (see +An OpenMP parallel region\index{OpenMP!parallel region} including two threads is implemented on lines~18--61 of +\Lst{algo:ch6p1overlapstreamsequence}, as in the previous algorithm (see \Lst{algo:ch6p1overlapseqsequence}). Code of thread $0$ achieving MPI communication is unchanged, but -code of thread $1$ is now using streams. Following NVIDIA recommandations, we have first implemented -a loop starting $NbS$ asynchronous data transfers (lines 39--45): transferring $N/NbS$ data on -each stream. Then we have implemented a second loop (lines 46--48), starting asynchronous +code of thread $1$ is now using streams. Following NVIDIA recommandations, we first implement +a loop starting $NbS$ asynchronous data transfers (lines~39--45): transferring $N/NbS$ data on +each stream. Then we implement a second loop (lines~46--48), starting asynchronous executions of $NbS$ grids of blocks of GPU threads (one per stream). Data transfers and kernel executions on the same stream are synchronized by CUDA and the GPU. So, each kernel execution will -start after its data will be transferred into the GPU memory, and the GPU scheduler ensures to start +start after its data has been transferred into the GPU memory, and the GPU +scheduler ensures the start of some kernel executions as soon as the first data transfers are achieved. Then, next data transfers will be overlapped with GPU computations. After the kernel calls, on the different streams, we wait for the end of all GPU threads previously run, calling an explicit synchronization -function on line 49. This synchronization is not mandatory, but it will make the implementation more +function on line~49. This synchronization is not mandatory, but it will make the implementation more robust and will facilitate the debugging steps: all GPU computations run by the OpenMP thread number -$1$ will be achieved before this thread will enter a new loop iteration, or before the computation -loop will be ended. +$1$ will be achieved before this thread enters a new loop iteration, or before the computation +loop has ended. If a partial result has to be transferred from GPU to CPU memory at the end of each loop iteration -(for example the result of one \emph{reduction} per iteration), this transfer is achieved -synchronously on the default stream (no particular stream is specified) on lines 51--54. -Availability of the result values is ensured by the synchronization implemented on line 49. -However, if a partial result has to be transferred on the CPU on each stream, then $NbS$ asynchronous data -transfers could be started in parallel (one per stream), and should be implemented before the -synchronization operation on line 49. The end of the computation loop includes a synchronization -barrier of the two OpenMP threads, waiting they have finished to access the different data -buffers in the current iteration. Then, each OpenMP thread exchanges its local buffer pointers, like -in the previous algorithm. However, after the computation loop, we have added the -destruction of the CUDA streams (lines 63--65). - -Finally, CUDA streams\index{CUDA!stream} have been used to extend \Lst{algo:ch6p1overlapseqsequence} -with respect to its global scheme. \Lst{algo:ch6p1overlapstreamsequence} still creates an -OpenMP parallel region, with two CPU threads, one in charge of MPI communications, and the other -managing data transfers and GPU computations. Unfortunately, using GPU streams require to be able to -split a GPU computation in independent subparts, working on independent subsets of data. -\Lst{algo:ch6p1overlapstreamsequence} is not so generic than \Lst{algo:ch6p1overlapseqsequence}. - - -\subsection{Interleaved communications-transfers-computations overlapping} - -\begin{figure}[t] - \centering - \includegraphics{Chapters/chapter6/figures/Sync-CompleteInterleaveOverlap.pdf} - \caption{Complete overlap of internode CPU communications, CPU/GPU data transfers and GPU - computations, interleaving computation-communication iterations} - \label{fig:ch6p1overlapinterleaved} -\end{figure} - -Many algorithms do not support to split data transfers and kernel calls, and can -not exploit CUDA streams. For example, when each GPU thread requires to access +(for example, the result of one \emph{reduction} per iteration), this transfer is achieved +synchronously on the default stream (no particular stream is specified) on lines~51--54. +Availability of the result values is ensured by the synchronization implemented on line~49. +However, if a partial result has to be transferred onto the CPU on each stream, then $NbS$ asynchronous data +transfers could be started in parallel (one per stream) and should be implemented before the +synchronization operation on line~49. The end of the computation loop includes a synchronization +barrier of the two OpenMP threads, waiting until they have finished accessing the different data +buffers in the current iteration. Then, each OpenMP thread exchanges its local buffer pointers, as +in the previous algorithm. After the computation loop, we have added the +destruction of the CUDA streams (lines~64--65). + +In conclusion, CUDA streams\index{CUDA!stream} have been used to extend +\Lst{algo:ch6p1overlapseqsequence} with respect to its global +scheme. \Lst{algo:ch6p1overlapstreamsequence} still creates an OpenMP parallel +region, with two CPU threads, one in charge of MPI communications and the other +managing data transfers and GPU computations. Unfortunately, using GPU streams +requires the ability to split a GPU computation into independent subparts, +working on independent subsets of data. \Lst{algo:ch6p1overlapstreamsequence} +is not so generic as \Lst{algo:ch6p1overlapseqsequence}. + + +\subsection{Interleaved communications-transfers-computations\\overlapping} + +Many algorithms do not support splitting data transfers and kernel calls, and +cannot exploit CUDA streams, for example, when each GPU thread requires access to some data spread in the global set of transferred data. Then, it is possible to -overlap internode CPU communications and CPU/GPU data transfers and GPU +overlap internode CPU communications, CPU/GPU data transfers, and GPU computations, if the algorithm achieves \emph{computation-communication iterations} and if we can interleave these iterations. At iteration $k$: CPUs exchange data $D_k$, each CPU/GPU couple transfers data $D_k$, and each GPU @@ -499,10 +503,23 @@ achieves computations on data $D_{k-1}$ (see strategy requires twice as many CPU data buffers and twice as many GPU buffers. +\begin{figure}[t] + \centering + \includegraphics{Chapters/chapter6/figures/Sync-CompleteInterleaveOverlap.pdf} + \caption{Complete overlap of internode CPU communications, CPU/GPU data transfers, and GPU + computations, interleaving computation-communication iterations.} + \label{fig:ch6p1overlapinterleaved} +\end{figure} + +\Lst{algo:ch6p1overlapinterleaved} introduces the generic code of a +MPI+OpenMP+CUDA implementation, explicitly interleaving +computation-communication iterations and overlapping MPI communications, CUDA CPU/GPU +transfers, and CUDA GPU computations. + %\begin{algorithm} % \caption{Generic scheme explicitly overlapping MPI communications, CUDA CPU/GPU transfers and CUDA % GPU computations, interleaving computation-communication iterations}\label{algo:ch6p1overlapinterleaved} -\begin{Listing}{algo:ch6p1overlapinterleaved}{Generic scheme explicitly overlapping MPI communications, CUDA CPU/GPU transfers and CUDA GPU computations, interleaving computation-communication iterations} +\begin{Listing}{algo:ch6p1overlapinterleaved}{generic scheme explicitly overlapping MPI communications, CUDA CPU/GPU transfers, and CUDA GPU computations, interleaving computation-communication iterations} // Input data and result variables and arrays (example with // float datatype, 1D input arrays, and scalar results) float *cpuInputTabAdrCurrent, *cpuInputTabAdrFuture; @@ -517,7 +534,7 @@ cudaMalloc(&gpuInputTabAdrFuture,sizeof(float)*N); cpuResTabAdr = malloc(sizeof(float)*NbIter); cudaMalloc(&gpuResAdr,sizeof(float)); -// Definition of the Grid of blocks of GPU threads +// Definition of the grid of blocks of GPU threads dim3 Dg, Db; Dg.x = ... // Indexes of source and destination MPI processes int dest, src; dest = ... @@ -534,7 +551,7 @@ omp_set_num_threads(3); float *gpuFuture = gpuInputTabAdrFuture; float *tmp; - // Computation loop on: NbIter + 1 iteration + // Computation loop on NbIter + 1 iterations for (int i = 0; i < NbIter + 1; i++) { // - Thread 0: achieves MPI communications if (omp_get_thread_num() == 0) { @@ -551,7 +568,7 @@ omp_set_num_threads(3); sizeof(float)*N, // CPU --> GPU (sync. op) cudaMemcpyHostToDevice); } - // - Thread 2: achieves the GPU computations and the result transfer + // - Thread 2: achieves the GPU computations and result transfer } else if (omp_get_thread_num() == 2) { if (i > 0) { gpuKernel_k1<<>>(gpuCurrent);// GPU comp. (async. op) @@ -561,9 +578,9 @@ omp_set_num_threads(3); cudaMemcpyDeviceToHost); } } - // - Wait for both threads have achieved their iteration tasks + // - Wait until both threads have achieved their iteration tasks #pragma omp barrier - // - Each thread permute its local buffer pointers + // - Each thread permutes its local buffer pointers tmp = cpuCurrent; cpuCurrent = cpuFuture; cpuFuture = tmp; tmp = gpuCurrent; gpuCurrent = gpuFuture; gpuFuture = tmp; } // End of computation loop @@ -572,50 +589,48 @@ omp_set_num_threads(3); \end{Listing} %\end{algorithm} -\Lst{algo:ch6p1overlapinterleaved} introduces the generic code of a -MPI+OpenMP+CUDA implementation, explicitly interleaving -computation-communication iterations and overlapping MPI communications, CUDA CPU/GPU -transfers and CUDA GPU computations. As in the previous algorithms, we declare two CPU input data arrays -(current and future version) on line 3, but we also declare two GPU input data arrays on line 4. On -lines 8--11, these four data arrays are allocated, using \texttt{malloc} and +As in the previous algorithms, we declare two CPU input data arrays +(current and future version) on line~3. However, in this version we also declare two GPU input data arrays on line~4. On +lines~8--11, these four data arrays are allocated, using \texttt{malloc} and \texttt{cudaMalloc}. -We do not need to allocate page-locked memory space. On lines 23--65 we -create an OpenMP parallel region, configured to run three threads (see line 21). Lines 26--30 are +We do not need to allocate page-locked memory space. On lines~23--65 we +create an OpenMP parallel region, configured to run three threads (see line~21). Lines~26--30 are declarations of thread local pointers on data arrays and variables (each thread will use its own -pointers). On line 33, the three threads enter a computation loop of \texttt{NbIter + 1} +pointers). On line~33, the three threads enter a computation loop of \texttt{NbIter + 1} iterations. We need to run one more iteration than with previous algorithms. -Lines 34--41 are the MPI communications, achieved by the thread number $0$. They send the +Lines~35--41 are the MPI communications, achieved by the thread number $0$. They send the current CPU input data array to another CPU, and receive the future CPU input data array from another CPU, like in previous algorithms. But this thread achieves communications only during the -\emph{first} \texttt{NbIter} iterations. Lines 43--48 are the CPU to GPU input data -transfers, achieved by thread number $1$. These data transfers are run in parallel of MPI -communications. They are run during the \emph{first} \texttt{NbIter} iterations, and transfer -current CPU input data array into the future GPU data array. Lines 50--57 +\emph{first} \texttt{NbIter} iterations. Lines~43--48 are the CPU to GPU input data +transfers, achieved by thread number $1$. These data transfers are run in parallel with MPI +communications. They are run during the \emph{first} \texttt{NbIter} iterations and transfer +current CPU input data array into the future GPU data array. Lines~50--57 correspond to the code run by -thread number $3$. They start GPU computations, to process the current GPU input data array, and if +thread number $2$. They start GPU computations, process the current GPU input data array, and if necessary -transfer a GPU result at an index of the CPU result array. These GPU computations and result +transfer a GPU result to an index of the CPU result array. These GPU computations and result transfers are run during the \emph{last} \texttt{NbIter} iterations: the GPU computations -have to wait the first data transfer is ended before to start to process any data, and can not run -during the first iteration. So, the activity of the third thread is shifted of one iteration -compared to the activities of other threads. Moreover, the address of the current GPU input data -array has to be passed as a parameter of the kernel call on line 52, in order the GPU threads access -the right data array. Like in previous algorithms the GPU result is copied at one index of the CPU -result array, in lines 53--56, but due to the shift of the third thread activity this index is +have to wait until the first data transfer is ended before starting to process any data and cannot run +during the first iteration. So, the activity of the third thread is shifted by one iteration +compared to the activities of the other threads. Moreover, the address of the current GPU input data +array has to be passed as a parameter of the kernel call on line~52, in order +for the GPU threads to access +the right data array. As in previous algorithms the GPU result is copied to one index of the CPU +result array, in lines~54--56, but due to the shift of the third thread activity this index is now \texttt{(i - 1)}. -Line 60 is a synchronization barrier\index{OpenMP!barrier} of the three OpenMP threads, followed by a pointer permutation -of local pointers on current and future data arrays, on line 62 and 63. Each +Line~60 is a synchronization barrier\index{OpenMP!barrier} of the three OpenMP threads, followed by a pointer permutation +of local pointers on current and future data arrays, on line~62 and 63. Each thread waits for the completion of other -threads to use the data arrays, and then permutes its data array pointers before to -enter a new loop iteration. +threads to use the data arrays, and then permutes its data array pointers before +entering a new loop iteration. -This complete overlap of MPI communications and CPU/GPU data transfers and GPU computations, is not +This complete overlap of MPI communications, CPU/GPU data transfers, and GPU computations is not too complex to implement, and can be a solution when GPU computations are not adapted to use CUDA -streams: when GPU computations can not be split in subparts working on independent subsets of input -data. However, it requires to run one more iterations (a total of \texttt{NbIter + 1} -iterations). Then, if the number of iterations is very small, it could be more interesting not to +streams: when GPU computations cannot be split into subparts working on independent subsets of input +data. However, this requires running one more iteration (a total of \texttt{NbIter + 1} +iterations). If the number of iterations is very small, it could be more interesting not to attempt to overlap CPU/GPU data transfers and GPU computations, and to implement \Lst{algo:ch6p1overlapseqsequence}. @@ -632,19 +647,18 @@ experiments presented in this chapter: \begin{itemize} \item The first consists of 17 nodes with an Intel Nehalem quad-core processor - at 2.67Ghz, 6 Gb RAM and an NVIDIA GeForce GTX480 GPU, each. + at 2.67Ghz, 6 Gb RAM, and an NVIDIA GeForce GTX480 GPU, each. \item The second consists of 16 nodes with an Intel core2 dual-core processor at - 2.67Ghz, 4 Gb RAM and an NVIDIA GeForce GTX580 GPU, each + 2.67Ghz, 4 Gb RAM, and an NVIDIA GeForce GTX580 GPU, each. \end{itemize} % -Both clusters have a Gigabit Ethernet interconnection network that is connected -through a DELL Power Object 5324 switch. The two switches are linked twice, -insuring the interconnection of the two clusters. The software environment +Both clusters have a gigabit Ethernet interconnection network that is connected +through a Dell Power Object 5324 switch. The two switches are linked twice, +ensuring the interconnection of the two clusters. The software environment consists of a Linux Fedora 64bit OS (kernel v. 2.6.35), GNU C and C++ compilers -(v. 4.5.1) and the CUDA library (v. 4.2). - +(v. 4.5.1), and the CUDA library (v. 4.2). %\subsubsection{Validation of the synchronous approach} @@ -656,18 +670,18 @@ consists of a Linux Fedora 64bit OS (kernel v. 2.6.35), GNU C and C++ compilers \centering \includegraphics{Chapters/chapter6/curves/gpuSyncOverlap.pdf} \caption{Experimental performances of different synchronous algorithms computing a - dense matrix product} + dense matrix product.} \label{fig:ch6p1syncexpematrixprod} \end{figure} \label{ch6:p1block-cyclic} -We have experimented our approach of synchronous parallel algorithms with a classic +We have tested our approach of synchronous parallel algorithms with a classic block cyclic algorithm for dense matrix multiplication\index{matrix - multiplication!block cyclic}. This problem requires to split two input matrices ($A$ and $B$) on a ring of -computing nodes, and to establish a circulation of the slices of $A$ matrix on the ring ($B$ matrix + multiplication!block cyclic}. This problem requires splitting two input matrices ($A$ and $B$) on a ring of +computing nodes and establishing a circulation of the slices of $A$ matrix on the ring ($B$ matrix partition does not evolve during all the run). Compared to our generic algorithms, there is no partial result to transfer from GPU to CPU at the end of each computing iteration. The part of the -result matrix computed on each GPU is transferred on the CPU at the end of the computation loop. +result matrix computed on each GPU is transferred onto the CPU at the end of the computation loop. We have first implemented a synchronous version without any overlap of MPI communications, CPU/GPU data transfers, and GPU computations. We have added some synchronizations in the native overlapping @@ -678,9 +692,9 @@ there is a significant increase in cost when comparing a single node (without an two nodes (starting to use MPI communications). But beyond two nodes we get a classical performance curve. -Then, we implemented and experimented \Lst{algo:ch6p1overlapnative}, see +Then, we implemented and tested \Lst{algo:ch6p1overlapnative}, labeled \emph{ovlp-native} in \Fig{fig:ch6p1syncexpematrixprod}. The native -overlap of MPI communications with asynchronous run of CUDA kernels appears efficient. When the +overlap of MPI communications with the asynchronous run of CUDA kernels appears efficient. When the number of nodes increases the ratio of the MPI communications increases a lot (because the computation times decrease a lot). So, there is not a lot of GPU computation time that remains to be @@ -692,10 +706,10 @@ a performance increase. Finally, we implemented \Lst{algo:ch6p1overlapseqsequence}, overlapping MPI communications with a GPU sequence including both CPU/GPU data transfers and GPU computations, -see \emph{ovlp-GPUsequence} in \Fig{fig:ch6p1syncexpematrixprod}. From four -up to sixteen nodes it achieves better performances than \emph{ovlp-native}: we better overlap -MPI communications. However, this parallelization mechanism has more overhead: OpenMP threads -have to be created and synchronized. Only for two nodes it is less efficient than the native +labeled \emph{ovlp-GPUsequence} in \Fig{fig:ch6p1syncexpematrixprod}. From four +up to sixteen nodes it achieves better performances than \emph{ovlp-native}: the +overlapping of MPI communications is wider and thus more efficient. However, this parallelization mechanism has more overhead: OpenMP threads +have to be created and synchronized. With only two nodes it is less efficient than the native overlapping algorithm. Beyond two nodes, the CPU multithreading overhead seems compensated. % No, it doesn't need the more implementation of time, but more implementation % of code :) diff --git a/BookGPU/Chapters/chapter6/biblio6.bib b/BookGPU/Chapters/chapter6/biblio6.bib index 641c3cf..68fafbc 100644 --- a/BookGPU/Chapters/chapter6/biblio6.bib +++ b/BookGPU/Chapters/chapter6/biblio6.bib @@ -53,22 +53,14 @@ chapter = {Optimization methodology for Parallel Programming of Homogeneous or Hybrid Clusters}, publisher = {Saxe-Coburg Publications}, year = {2013}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTseries = {}, - OPTtype = {}, - OPTaddress = {}, - OPTedition = {}, - month = feb, - OPTpages = {}, - note = {to appear}, - OPTannote = {} + isbn = {978-1-874672-57-9}, + url = {http://www.saxe-coburg.co.uk/pubs/future.htm}, + month = feb } @Book{BCC07, author = {Bahi, J. M. and Contassot-Vivier, S. and Couturier, R.}, - title = {Parallel Iterative Algorithms: from sequential to grid computing}, + title = {Parallel Iterative Algorithms: From Sequential to Grid Computing}, publisher = {Chapman \& Hall/CRC}, year = {2007}, series = {Numerical Analysis \& Scientific Computing Series}, @@ -82,7 +74,7 @@ Computing Systems and Applications (HPCS'2002)}, pages = "90--97", year = {2002}, - address = {Moncton, Canada}, + address = {Moncton, New-Brunswick, Canada}, month = jun, } @@ -93,7 +85,7 @@ convergence in asynchronous iterative algorithms}, booktitle = {8th International Meeting on High Performance Computing for Computational Science, VECPAR'08}, pages = {251--264}, year = {2008}, - address = {Toulouse}, + address = {Toulouse, France}, month = jun, } @@ -131,8 +123,8 @@ convergence in asynchronous iterative algorithms}, @InProceedings{Para10, author = {Contassot-Vivier, S. and Jost, T. and Vialle, S.}, title = {Impact of asynchronism on {GPU} accelerated parallel iterative computations}, - booktitle = {PARA 2010 conference: State of the Art in Scientific and Parallel Computing}, - OPTpages = {--}, + booktitle = {PARA 2010 Conference: State of the Art in Scientific and Parallel Computing}, + pages = {43--53}, year = {2010}, address = {Reykjavík, Iceland}, month = jun, @@ -216,17 +208,16 @@ convergence in asynchronous iterative algorithms}, howpublished = {\url{http://www.openmp.org}} } -@article{Hoefler08a, +@inproceedings{Hoefler08a, author = {T. Hoefler and A. Lumsdaine}, title = {Overlapping Communication and Computation with High Level Communication Routines}, -journal ={Cluster Computing and the Grid, IEEE International Symposium on}, -OPTvolume = {0}, -isbn = {978-0-7695-3156-4}, +booktitle = {IEEE International Symposium on Cluster Computing and the Grid}, year = {2008}, pages = {572-577}, note = "\url{http://doi.ieeecomputersociety.org/10.1109/CCGRID.2008.15}", publisher = {IEEE Computer Society}, -address = {Los Alamitos, CA, USA}, +address = {Lyon, France}, +isbn = {978-0-7695-3156-4}, } @Article{Valiant:BSP, @@ -241,7 +232,7 @@ address = {Los Alamitos, CA, USA}, @inproceedings{gustedt:hal-00639289, AUTHOR = {Gustedt, J. and Jeanvoine, E.}, - TITLE = {{Relaxed Synchronization with Ordered Read-Write Locks}}, + TITLE = {{Relaxed synchronization with ordered read-write locks}}, BOOKTITLE = {{Euro-Par 2011: Parallel Processing Workshops}}, YEAR = {2012}, MONTH = May, @@ -259,7 +250,7 @@ address = {Los Alamitos, CA, USA}, @article{clauss:2010:inria-00330024:1, AUTHOR = {Clauss, P.-N. and Gustedt, J.}, - TITLE = {{Iterative Computations with Ordered Read-Write Locks}}, + TITLE = {{Iterative computations with ordered read-write locks}}, JOURNAL = {{Journal of Parallel and Distributed Computing}}, PUBLISHER = {Elsevier}, VOLUME = {70}, @@ -302,9 +293,10 @@ address = {Los Alamitos, CA, USA}, @Book{C11, - editor = {JTC1/SC22/WG14}, - title = {Programming languages - C}, - publisher = {ISO}, + editor = {International standardization working group for the programming language C}, + title = {Programming Languages -- C}, + publisher = {ISO/IEC}, year = 2011, - number = {ISO/IEC 9899}, - edition = {Cor. 1:2012}} + number = {9899}, + edition = {Cor. 1:2012} +} diff --git a/BookGPU/Chapters/chapter6/ch6.tex b/BookGPU/Chapters/chapter6/ch6.tex index 676da7b..65698d7 100755 --- a/BookGPU/Chapters/chapter6/ch6.tex +++ b/BookGPU/Chapters/chapter6/ch6.tex @@ -19,7 +19,7 @@ %% prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},% %% commentstyle=\textit, numbersep=1em, numberstyle=\tiny, numbers=left,% %% numberblanklines=false, mathescape, escapechar=@, - label=#1, caption={#2}} + escapechar=@, label=#1, caption={#2}} }{} %\def\N{$\mathbb N$ } @@ -34,7 +34,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapterauthor{Sylvain Contassot-Vivier}{Université Lorraine, Loria UMR 7503 \& AlGorille INRIA Project Team, Nancy, France.} \chapterauthor{Stephane Vialle}{SUPELEC, UMI GT-CNRS 2958 \& AlGorille INRIA Project Team, Metz, France.} -\chapterauthor{Jens Gustedt}{INRIA Nancy -- Grand Est, AlGorille INRIA Project Team, Strasbourg, France.} +\chapterauthor{Jens Gustedt}{INRIA Nancy--Grand Est, AlGorille INRIA Project Team, Strasbourg, France.} \chapter{Development methodologies for GPU and cluster of GPUs} @@ -56,23 +56,23 @@ % Glossaire \section{Glossary} \begin{Glossary} -\item[AIAC] Asynchronous Iterations - Asynchronous Communications. -\item[Asynchronous iterations] Iterative process where each element is updated +\item[AIAC] Asynchronous Iterations and Asynchronous Communications. +\item[Asynchronous iterations] iterative process where each element is updated without waiting for the last updates of the other elements. -\item[Auxiliary computations] Optional computations performed in parallel to the +\item[Auxiliary computations] optional computations performed in parallel to the main computations and used to complete them or speed them up. -\item[BSP parallel scheme] Bulk Synchronous Parallel, a parallel model that uses - a repeated pattern (superstep) composed of: computation, communication, barrier. -\item[GPU stream] Serialized data transfers and computations performed on a same +\item[BSP parallel scheme] bulk Synchronous Parallel, a parallel model that uses + a repeated pattern (superstep) composed of computation, communication, barrier. +\item[GPU stream] serialized data transfers and computations performed on a same piece of data. -\item[Message loss/miss] Can be said about a message that is either not +\item[Message loss/miss] can be said about a message that is either not sent or sent but not received (possible with unreliable communication protocols). -\item[Message stamping] Inclusion of a specific value in messages of the same tag to +\item[Message stamping] inclusion of a specific value in messages of the same tag to distinguish them (kind of secondary tag). -\item[ORWL] Ordered Read Write Locks, a programming tool proposing a unified +\item[ORWL] Ordered Read-Write Locks, a programming tool proposing a unified programming model. -\item[Page-locked data] Data that are locked in cache memory to ensure fast accesses. -\item[Residual] Difference between results of consecutive iterations in an +\item[Page-locked data] data that are locked in cache memory to ensure fast accesses. +\item[Residual] difference between results of consecutive iterations in an iterative process. \item[Streamed GPU sequence] GPU transfers and computations performed simultaneously via distinct GPU streams. diff --git a/BookGPU/Chapters/chapter6/figures/Sync-NativeOverlap.pdf b/BookGPU/Chapters/chapter6/figures/Sync-NativeOverlap.pdf old mode 100755 new mode 100644 index 2caa6d8970afe13570b2ccc5f2d656245f42667a..a6c6b1aacb7e6cbd90425cf4d57e181d3d5d6b5e GIT binary patch literal 39761 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 diff --git a/BookGPU/Chapters/chapter6/figures/Sync-StreamSequenceOverlap.pdf b/BookGPU/Chapters/chapter6/figures/Sync-StreamSequenceOverlap.pdf index f19ad316f2add5e334e7f17f1043cfc67aecb9e8..cfb5d4ffd33fd87a30af46f90f58189b1cb173a6 100644 GIT binary patch literal 46082 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≀}OSVF#51xvaUmX4`X|V%>LNAGiYDGvVo2 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 JxPk=y{{o(tKCJ)% literal 56256 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�-Zg|U{WHfFAy;W>M5<~dC)QSqrG6xJ@#4B!x4 z%nwepv^1ne=u+VfwagK|=N$AXfar#*Cl7W#kOnK{j`G6 zPt_WYX-c}hC{r|mphAIPKY@x$fwp;pW-~ZvjX|UNt{l?{(@dbV2ggKP4IbGkzKm5; z^To>;BSMUDq0>{OIPoUfhR0FDh^R1NXTT$=1WvxF1R~$Uzeem2U>$@;3d&U(8$xU@ zP*LL4B(WfhC0V;aBb&W&mlV#+pJMtH&o*+M(MXbR$x;snIt<|O=HPug(QI?@G719; zTM_=X0Hh`)1$kM3yhPx^JdSIVMA`zi6(JLve+sGXXBCzu$w^d4dw%6{xI16k%3$mu zL9-p;%#0%R)9B(@8|URc+1Dt)+F#}NJI$GRY=wm|Gj@B+^=|35K;;*cO<+n8Roo3{ zp3bM7vBv(goe)Bm&t#NL7sDM-2XLw%odzBd2;3A4m;DmDJmngXPzUx3%2Cp9(2j)? zv7{`&sHV)Kl_Mp+LMEk!G1nn39rR|yvf|{d=eR8kE=!4w%uFilEu&hZO5PSdr$K>^ zLQGF1i{Vp25>k22A?O$|+^=HkD zLCv>idw8$H)*{4=25bHiyH1}e5`GM**sI>CCPSIGR5F4fz<_O>Ha3E>BhPrUJX3&* zF|W3+)fdTtTaBjgJZWef4>V&oO?Yr3j?btC=Mh>Ft0l84>jvodiB9vH<*~Dz3>D?k zI7thmgI$BLmH@rIIGlD{6htI7mqVWI1Xz!Dipvh0@Cy5inFS`Kcg0$RbbuEtf~SF4 z?E0=D9cNwcL?gcJ8LHlNSrv(~^SoSLY@}n3=~maORG+?GkNKm%8|+A#tU&<*`}9I^ zE$|er$d%eM5~DiZi_ea5X=UegNI9*(c@~pebmzO{C+pX0S#zPTM2gUwi$(m-t(mA$ zU*O{|#Hi$SXe3stS;2Pci8~{9!&w2-kw^XQ37^178F2hyQVNJnfxl@rGCle|;ud^% z?TWg~cgBAv-)Y9=zSxV&ta7blw@OwCgj*=X8o#5?l^JlbVpsBNE`ewD)~O+Ty?cj{6NdJWU+&?bF5Q9RJ!Y$ca_9AK=c2JHz+ z)VuscdF-@0389rK6z)?IvgXKN7s7_O*k40|5HszkpHFlXA#M=j2>G^>yC;)FBeIwiyCV#DZ?Q&UKKU57_QMAFt+}dWw@PDr5)vU@|HWeM4GV@hg z_`1x^e?jRsGwX(b@E;sm4yM;->1wU2;2z8>nNetPAkv{R+G*__r|$o=8Bg7lx6#@M zmcm~SE~gO%C%dCqkm4p)85&uLaAIV^$c1Mp?k%vWAP~F2sP8Cw{L8O_V_@ zS^@zLR+@hHrX7dgeK@OI(2Te!ft8haburtuV(3=cE|#WnzsRuNrd~Hb_u)hjIzS$U zlB+Bu>uVY_a!iBcz{D1kzYT4?V6@kDe(i7jF8h6;?-sSbF8qbx&3fjV$r8?Ays_Y0 zjh#M-X77O|GG}>!q5eapR10l=!HPjg@ylpZWWYbi=*Rl9HxrJKFYFV z@R^+~wy1^NqC;#>B9$W3rCTLDsN@%jexRwxXrgbF)hHEs@%TQbC_FX$x(DY6@}R`8 zZ8bphBUNHT!!U^vvhndq3L@fg>gd>8#0>|swNxi;8<45*_4dFtoIAG#>_EPF@gsT7 zyfdpZs8nFYy&Gr_&3Yt=ls*>?aC)t-rMh9UV+JV=HFbwmV8bp}M|WpiYiCWBMB!>@ zR1_?)W?}5gEY*ov>V+ZK!z06wm6&&vt59}K>w6MSy?1w8oHH7;Uw@AsX5x!>uGl@$ zml%_G)-Rx6=!A%MC?A?C>1G2>qfK>&wZ7$I$ch4TexkdK-!Y#tT!lPJw+7P&t``d+ zSEvWax)X3rIzDSG#eLbCTaN@6y9|nADOxn@RjNw={yXr=ig6RXYoOdUSvWs?NG#O@ z(%lrS*{G`@aWNTWwMT^whPv>T(qY6vE8qbQ;`s%dEjZPRO4I3&wYRx<6Fzx|IRf#{ zDNtu*SL^_X2411Yij@o0B?l3P$A6<82OGtT9T*jsF!L>4NH^h?6Rsy&PR+^c*&VRA zHzltfhtAxFsgC7V-Yyo(1FGU~&R7bkkQkyB>h6=9lj)6Cy=I(jNHNWK4ECtKP}?+w0(NgKs2E zpWF3f1AtuW7b5Ip_w4Bb}qhif>eSbq0CYX{w%D z_~or!RJrs|>7C?xytIPH9zCDZQ@FBPYLQ;!K+gbsf7Kj&$tSs2$Ay#+7J<4o4Z26o zxzL74X}s#VqKf^J^`+sG`qmeC_-*nN!;y-db!lt6l{e^8B`J6r$fBTy=Zd;}8SofQ zDs?HbHcDI?SP|K1Z0ejEezmD->H~E*jeSi|`Mn^(o!X%4(+be9F{^4FM&oD}EOxF| zr>0+?f@~J-ROpm`FAo3)s7$V<_N!O1N{2gXPH4(X|EYt$SHf!apj@4oI{a7=q!qt1 zc4Rebcz8yCrh5i`7I{wp8)M)|86*p&{byakvY><5M5l(dN5n2oGB`jGB(oIweUPHwC&`Al3 zv~7HDQmRuo!OIs zvV4+lc*ddmRNk3ITnEns6cya?^<1tt&Rb-HE$FWVs8Ww>5LvCvN8Z||o?8&aJDF?D z+A0q?+t@f9u*N*jJlJKBm!eY1Q^oc=#WD+<-3XVfUClFaMJihd@}$A-gPR$L&+Td= za7$_x4JF+&_`Q*2f%HAZW9Z_un1irw!i=^9Q(JOPV&aUF+MkKf)9bUHgh4fSrfpm* zCx}xH()#uHlM@|+w(}JXy~JU>z4g^@+1_TNV>;T{_#1TA(dRi|l}9JwkD%2$`@?^aH;uIvXoQqznI^XgrR@r|8yx-r5q1#(nY;UhjY2ni=5-AHhE!w4F-}-bIn{Hmg7~pWB6bY(kz|XgVS8^!W_fC%nw}Ori7D{b%OWcgjWp= zMJykn!T}9shMcOn#5Mf;ERZ6UMW9HGULu^P5n=ZVC5Bl;30IjlUwggF zE{N2&9>6m=4(PKWt&%nD%hN#W>5L7Xe*E;-S1e67!nLQ>Po`d^xo*qCg_F3sefQds z!2Q`sv(Q6_>5s58tf`pcj}K*7dvs`7#^L}mIP*Pi`F>0d7rEf{O}X%o=JLEZ;fDy3 zzYG$d@HriO=mHoA2s_d-8|~|ku`Vrllq@#YB~n|r4!yN^lj?7adL13@&96k>uZR&*+qlS0Ues1ka%KF*0ET)f6f3c~7GeeM zJF>-xH;RYM?U}%^&~(di3Qc2oOo$>O4MsG|M$B-Bd3Zu)RqP=ni~S;XNeldzqCp07 z1{o-{m`#bD;=u)!4Yw)FgN93+AqPuVuWEqZf!~zhNANYIFXBgjlh4*m%})bBtiQ4r zNCsQj{{TkU!>1pM!V8v=MlAIWb3ei5re0bS0g<37)qVO~s%v1Mhno7-z;mYkqwae) z?0VH>CbhaMR8&tB=S5k-u+=|(N`-m?xOLMnzXNCc;XO-YDEfmI%T&*mYFdUZW!EDR7g$= znTr+z85ye<2ZK=K8KMNL%21170wGK=$V||R03p(#;i23Jsk}`CIf0ENR#@39<2sle zkuMIeH@~VHkMN#LDbIl5_4cXB_k*ELw?)EZ5{OiiF%Cqq1W3=;5qZt1t|2)sjtggW zPN;ks+nFrUdg)YbEp;-^26`P5yY&;%mHDIHZ}qM1ajN#vl06tQrC{&^0iM7XnxPJa zxv_`NT;*80^@3?`H3|=E3E$M30v$u=)_A^IGkQuFWv&XoDLg7!h1dF>mOGY)d7#R3POOM@Blc0zpgDgMXrZ_3 zx{4qB4sRynsuoAXr)J*;tW>IL)YN|CZS9{Y(hUAatB!ip?o001@w7QMT3ISpXty4b z_m9@l_TDg3DDVw3b$ed%+Z0T#Dr3`TLZ4)nfYY z`qaU1w^v2zK~q1#1g>t1rA|w4g$9g{1H!L@}8QKfblhh=XHM2n11B5*?YhOvY}~If}BAue(A8swbyT zFr##~UQ#r0b^T9q-i^Z1*vx(9!4IN$O3iI1d$G7G_q`!Qyn2Sc&u1;~l4X#tQ;EeL~5zWRU zNrKh`Y(9NJk4Gcs4^Mf(gbrwGpQ#(Bcd!VOI>VQ(J7U}#V&M-GMr*Fogszi@^bVfM z6i)|dRZmsRYnIGu7IENu0IN1-vA9qkEde)~^ilhTEis@BxL zosS+=Bx%=lWTgazBJha7wk4%n+@$md#tm<(EL`h3)_KW z*hxw4Ufcfl63-+@YEW9>>i@$3ApSDLH|6H(eRHYTS=#pG!alV+u{N=1(Ldx@)j*9|ky91VdfAfQ zlI@cH)EhPyW0urD`(;l8yYBN2r3w~V`fF(XxJI~A*`|fNH;^T38sqV2K_ZNsjI#KX z%VxqH*cj%VK)Prvb)An0?N$v*+cId;f=jU9))9Q|vJG-}p_@{q-o%<@KKMZ4P zR|I+h@EcFNr~?vxs;!U|c!grFh;ScjpL5xj@uh%XGTJbCs<0=59>)P{5|+@lc`j(j z>^r-4p)=5&*!3(FJ?xJ{N@(XO|Fgat7%-`ajSJboy*r;pGlXj#hmP#MwO4L2T5$H%uP)+(W5md^!Mr^8|)h3;^>qpM1!Hv zEtz8LeFw7OpdIQ?C#_be4`R;q4L`(m2TE#Jug~kU3Ae8nt#G~*T?Ui>E%A;Yzi`z+ z*yIVuQqi_JpRj}~%0^6!u}xjtm(F^6^8>bMqu=H$xf@+zQTV8KVT4;a0ox4uepMD9HuI{MnWUJu_y8#Q#yTo zY(IzgG|$0a|mZ z2#qq2#e5WM2~rohsc$;b2g>K%oS&=`Q4l^a|H#qu>kFGs+@6Ta3u{b~sY*;hBz6NZ zPWT3-R=l`Jng=5Oh{T;hL}HJm-)L^S4_*2#^=mo3sfi?n=cHc0*unHuC7G&&33#7GZC^74JFDWzX&Wc>5##<)51yZ`T$6 z@XuB-m&r0NrFODCIJHrD+dg+)C2yQIF_s)TV~I=5XAe031p3ACi}weApuNLUeqi3^_6eUJ%fFNQMt&!KNBIf*E6fe< zItY?5oF0AZ;(cYmspQy&#rKpHrV3oi{v|FV1;T5gbz7ExlU25%I$& zIbrR9Dtm2!Ip~mZ2TW5! zKYn7_j^ZoFofL$h;R#wXG!-(oYlCp({=^~_Vvc{Aa&RU2W)nVwpY?KWi^gy^FeWiN z9rYL73~%ld^%HjADal9WkEj^IhpIw+-kGS%;)}?fn@=a=9p7w2o{1!pI$KhG<7kKt zVuR$`3H81*Xoevid`xg%iGAE5czh__{Uh!Fxo14HNlabwH3I^J0)Na=29K=BCKL9K z#2T`UA4^Aq%t|1RC1HGAqk06>4Oqv=oD26<;FYoS@v+?#ky zYD++v2jcGqBeXx|k$BHL@N}*XDj3(-_Wfi_iOD&G28DDU1d!uW_F1g&0`WDCvVir9m+??H9#2x0{1Y6V&lf~W_f{v8}1fcFQe7uD|b$%@nm zvGGBXr62z?(rusLUS3x;NUy1t8ZlX@nvA+{T9oV{MT2{d_7&5Q-vZFOtlO$bZVdCfNH_5fT>_VB9fL zS;<6U5*%qw>_Ys#gG@Di+(4mBI_fAJ$))U8`6J<(*w)f%4*UTFz!_iop_?- z>!!bPoeyNclt!#ZfV;Xc$;;Sv_N-3_^!74B#*lqOe}SUzFSs|!wWtpWuitM}AM0CJ z*2lI!*58*L_uciOgI2!>;y(wXWi_twn6|@?HRlt0XIm6>kDbb~@%Z$@>cB$AS{nXY zHOk&^)Z0)|=dM@*xH&7TBrsGgr(>q+U!lqnbJMs^cXZ@t)Q+zq=qB9LJ`YHH`P>q> z(&}hOLtw0dVC(i`iI=7U{ZcPGruzcjqvJI8X14$|}?-rvz=X4EHkvE~=5 znaDII_8s&M3s5CZf(id+a7!mBscDj|sgRPYpG|J?zG}q>WcV@Pf{(STqXF!F{lr{# zEd^_dtg6gY_HulI-!je=5)vh8ANAOrmyGEp%c3U{_+vv8&8MUv66<(BF=?qp|Gt)r$FXUz$=_8qO`*CyJ|j1umcC zj-09HrAjr6=&ziZoL=JjtD$H;h!0hH^INL3N8{k1WCB^*Y_U#>tc#syU|vPbvj;*=2>K|Bi zeig|Vw;aObeL$wZ&%Li6^at_%7H+(%+9C+|r6_V>-%^)KR#mdE%TJle3nyd(S& zu*Ou~-)3xx)rAOfIsBrg#_2~L0rLor>8Lm(?}x17#@ScGIO5Suq-$m9Tl>_gJCG62 zJ(=vRI&M#%6K^qBHW8(-Q(v&Am|7zUeyX4zS17mOE&I`Pq7mIp z?X6;=tOJsrP~pO43rEJ`d`LS?vw{ZVkc4<)kNBhrpWW$+I4Fe-$;10d9l&p|2^&Ol z(ulDH`3(R36PV$Hrn8$rRF>GeVWO5<_!5QN6$gr*kJFrFtOMHTGEgEQ8bDlbwzL-_=}lW_5?qM)sS z0K`~fw#ffHkYIg(1Pm`x&f_VgEn|fqkgcSkM`$je6qscl5XAQ_2fYHOcbMMHoeKG| zxGwOYo(vlJ8!mfjLLaUxhWKBFlV=V0Y+a~rrh?OKHMPW5X1+_O;%adEY<$`y`y;az zVRB4FWk7`Eps2-O{xb0qtZ1=~Od(nL#cf?lU7Ot2PdbJ}Bt-tT`QG54 zrX7g}VPLi012Y&myNBe`?q+bi7xlw-cdhOXIGw-~$8}l*1Sb<94yjTLL<8vrRRNGc z>Wa8dm}1dBiNCH=+YnPnL={Ka%{~&QK%2kL$uvkYTnEh=|7`mGo?NzMRm8?AANP}L z4|c|$$^*p$ezm|-#(WqUKRAI_!VE@tRpQI8*NS)U=N< zKm6$Wjt^J`S>>1BX$fLqs&oNPMT?P1P$Ikr8AlX+$0LoRCbSQ0QLn*+z#p=tK4v5t zw+BC-F|N#XY+P^N&-cpkG2|8vAE(@=>M+6>)DKo7!x%Unm5du~7s7z0gzS|kk5Ng& zi9kHmWV1tiz-DrXdhYNt(Dk*^?Io_ej;-!Kx{z{owbI3lsvfhF0x{-cb8NuP$9&)z z@yW_ahjEL4kCFJwlJL!!=v^t+2PiQ-{xjf~Yw@2r+3bc|C1bHidz7bhX~#??V7Oru zK3#bs0^_p~hE}r@vNOU!9Nn|9!a-($OhxL_caDCGM(Hxc^`b~Z5;=NGCT5%b#ZqIU z3+NZ)=Y`#W2?sH9$L`Mnh1|$FlAT^KFTQ0N5B&nl7l#~ucUMY<%AXz{3-hTqS}%r+ zNfue&H$e=992p7Ml!oc@gM(^qoo@bx&EP+PYxEjo&&LhYgH(`IUstGL|+Cg{fJj1xfW3U>-NK& zK>nKX@iowW?fzwjfMigGg4|DlM8S0&BtGEZW8L==IB<0B?d*(*7A@I6V2+Olcb$EZ z%Kjm~eQB6Q)(3z6)>--Pa|mOehhn4GfDfc%Vtk|q%-%T2*J$18ExcdQU3#JCo^0RO zJq!PLY5+t$x29DIStgEX2u=r$5hNg5ikA zBd{J&{l?rE@p3Posb7|A_3vscOr9)dmJ>6cFr6{$M=Y8F&nn#tC&`uOY^)`d;Nd`= zB?+>C4<<(i`j-$-??{C$F^)AqH?b<#rQ~?&c!A?=xs@1Q2<&c;xo~nizs-m}{|U#~a+;_k>U?zi3%lXh zFb?mToeiE#w-~M+9yjG7?(r(X;gfi_a>{{J+eLbWi)(+ znAK*DEz+leXR~A25d?D)F%iYb6C5m9de38d`**A*j)PdfYHE@&4q{~Cns+S+m%Ia1 zTTWqhfmZGfHI4>*oGUO-Gd(;k&4b=*_C@b)!s&yaw&m)eNI?8l_rJ!FolNKl@T<0W zVymqg%_m?`yo23-x5x3QZ00HmIIu2GmBeEqI1p$g_^Y-TIf7b;<170`0{s^(YQU;{v0GU07_VR%S?WiOfEP_eAjt30Qvey;YMeBO$bV95MJ@ z?(jHyvh-}=X(R>WRR4!g!PFYO3A~2Y9J@;#TY)*H&76q3+WCs7tKYa_X2Ao#*L@G6 z&>k_OdlHw)#-2=GiY`3D4S!*W=2p?~h1q0!4LfDs>YiEG?q@$b9)5u$Wr1pc8HEz? zj1tFk!gTaKl4x+gQ+wLPVOZ?x#7>Y{UTeE`pUJpV_h3a~5=Q6Y$?06Mc|M zBV5n$kf9E`4N{SrvX8q5{c|4?Kfk`U=9s=KG>Fvp8GEuC2GlXrwPbppcA=9t3UNLa z5`%Y5E>L&ZKBb)#*(+(N=h?YLU_x2YlrLr=%JH>eawW@`xm}4$7tPwRX3V37Ph21; z6KPM}E|Gxy#SR`bWrQ)BSKUE!zz}r8h6@d-6%=D=M;t`^hht`}dhRqMw|_IGQxRn;xVKO={1mRZ7KOK(w-%8+5H{OB{3nj-tr~_7&FG4r4Pzt1oq9$<2Zx4Az>1oQmPKJ57SIIX!J~?%YI_dqLkb)rw z3_1;k!p#FF7eN)nmAHH1q(uhcq|q^rg^=zU73JeqtW?jzedXrB5@{Z3pkJ_p{z3ZQ zz>h%1d2Soku1^%c9d_VK}kO( znF$5%tERV&`saX-$#cD^ePA2uofWYTeFF9o{NNfDefn&JUmYu!H3E$%(iMYn!;(d{ z6+T8Ay8uJ5TJsgtbP5oxytueSau%cBNndA?sbp|`z{*~-q!YmB6GPCzf3z`tZjhv@Dj7q6P-zMkLz zO5x*DM_S{^Jze!xrbN)*;F)ED&4uHF*mkIvJ?5#^tV4reqg9Y^i?hD1zOLTSZ+Q9_ z4IIr(wRC$`TUI^8&SFFMHPy~iLpOlwJ>n$sVoW=47;;5n)u;a1;of2A;QfZ9XZ~Gv zYhlyGb&UM2zD{4Mxhi#5u(y`Qe12!ey@h{WJe|D0eplCBMLoM=viVMrbW*V zf-JkKRMbE^QlJjlFr#G6rqhZ;r6xKp`rYg1^U~jvomD;K%Jvo==`Qqzt%nQp`rgrM zXH(P1tBnQzzg~t@eNXcUFnS+PmZCKGq>NOPjusE}Ql6rJ)>V=$6cQDHiESPvgWb@+ z8|3pt1X4gZ>%~bI0U*gZKn%!;5KiWiFTd_# zPS%d&?1HziRNgXU zMN&8B&JYFNKqvzR&}y9Gr?Usz4|Rq=?tQ%Dq?07vh(YRR}Lod zi>RB(RI`c{b%)=R6fN6iTWK5S|47%M6jY)7jyyU+1kDGhB*zUO=z9YNPL{SsP!|RD zW6?09j^zTi>LTdLFmzNxJ`{;K+Aa%NFojVqY3|2!JI|(BY|&NR`m0@9$&JQnwE|kD z;Rt(3_{}!>el8P;DF?Eji4||{^UcX@C6`L>#o;X2#1qzqQl>HCrz-7E%;y9mkUn-K zpO_Ci*x@XpaTxH>lFV7WLLObIjqFP@Hs@)F0Z)m;O1C@>0WV?8WjV7Z*N00x-aagx z!_~?#Bs3*9d-3=4^LGg%DTt_%Y)WVkZj3lR<#|NwFCjgipnss1tJJHBPkgKWjqw+= z;^`*Go@q_|z<`}$pP9j~RV`@wlWWTOH_9kcXj6Wn;d8TgM?fygwEH20iGC&PSP$Dk zlQGrUVH$QGQ(eW1*q>4Xk6~GK=G09zT#aQn1r<_b_8q60Wvai``u*-lO@GeI4hf)> z)9@_m^qP=F;Ffuo{)VN%x z@c;VARKdD=G8G^Jps*+xq0CzdO|iK`KeW0+`-;v}5C_d5->4a7BWBZ)+3s=?DF)|K zx5#Ie#lyIv6DXrsNW*N?*DnC>xl`&K#xEDOAqEJnxs(YFB-E^U9V4DGOB!!VlUBUa z_a!^9tS&B&h~dV>D93$A9n<%pkF6nsx%AIBPl@Su*3BG4(bsnTz$K0|gcZ9&g!P(X zr@fjvGqvc3czeAwF>jAg-IPz3HludSq~EU&Hfn6XyC%1&?_T=uM%C3XBY zkKZz~OU}3)B71rwJLsDJ)0h^CU8|(CYNo}+qy%`G8=|PEV#TBmo=yj0FJcJttN8N) z#sx8>4Iwos`mHpdE3R2lGZce6qBJOXYB6rnQRdxth%@Qdod?g4$1Nlemhy1hGk=*e zn>gnk2!|9?bRE&tHm9Ydqlu-gk(Q7fKcb{r!G?sJR;=>qhlB$p zOx_q``|A%Sl7EDw*r)dfMJs`!Nmg2d$T;T`SD*qP!6Sp%M9hR5Hybu=9F@yBR@VM8 zqH5)|rqAr3s@*#qAK#dw%ai;$35#yKPKpFI+6#F2^OsoWYSFqau;Mi5tgkOl6>X$D zYqTVDRZlC1#9_0D{L!iut^YL?xP^F zZrPmH`*J*8I+p-{NoUSLK?jkS3GdV!vlXeU>4hs5ptc%J2Ep&A?UdzHUC4q5dS)XV zo$G2@7lz@HgWt5{yeXn9sS>~iJx5|uI2HIeR6bqJ_^1Ic^DjHj*n;;0>V6(h$^e*M zGdu`+_6A;4W@|}rKo`}7vaE*pyiuQ_pfiY%Gd?a+>MpG+#Sz8KO*V8zn3vFjd1I1} z<4y|ic?Q9ZXx9L3NDLB2pl)`i5V9BoYpWZWWw#$G#W-dW0inM0@OZ}AsNo4=an2CN zQ%gx9u&UdvgjT+Drd7<#mkjlrbyc-Z1fXinB_5x8nc9|YmHwvZSL?*0_M9^!WnHHQ zLOY9dndfgyp+fl^7W(!bebkCb)p{~Ip*7bR<~Lg4H(t^W*n2KD&ElIAi&S1UVwjDU zx|PA4j2)yD*TQPh5*o+SjMTI!C-uB!mMfZJ0F)lNerZM5vYxsfEe#Fi!qJp8LxiU1 zMn6&`>hvTEx9V3kGdVXQwHX&?GcARXnP(vN6s%?@7GRl7KK+21T+!?&R?szw<;`DO z<>9P9fg%UBl!o+tFA{~MyJBhbf%~tfektIQ?i=&ob>e0!8Z$qcK{pw-9_)PP^L%~o zojP>rl8&1!#JBajsJ1!!6TL5Xph@1}rv53eL8ODA{e#%9caL<#n?LYL;?G)4e*Sqj z@zU8!sm3pqt!nDeQk~l!JmlgP+}-`}IcU8bCmp+%@DkRHXh%?}1=2GB%A>&$C&=ZC za8{hf;@kaO)GsoIc@c01&HTnG`{tW=3lbNO7bFQ?I}UN%U4d|EY9$JCaYRSdt6D`9 zS8M{Ls2IOWvgKp8aO|%1uhE^bT}}Eh2x-A)a}!dF+Ond`pPu<`k8gd*6_4G?M zZ7!5AbKqk;zN>z`Hzo0ke;Mar>a{C#M49U1k9tk#PAEy?U#<6EYovX8tMvIL88q3o zx##`qAM`IVMiD$GYY-dc><}pT#ERTa#Jx>gDk4r{taO&fur9 zR2MEN3@AaX!a0OVqpH0V)uj?OQH&)&L3wraMjvicWB7}L#KQ$eqv zYw6y)Hb=Xc+Cd;-?6dwz%N@29RXj^_cMwvBa{%xYSN$z>*Qncod&M zbJmabSejg`q_{W_~az zC{FcC0-`n$%LzC>u=3E_5H1!JYZy4%1#0%N;|wem1rCZkB1oR6VR+TB0Sg;#;nc~R z!@mqIP|@sbe0}Xo6`J%Z$`BmwhD?KfPRtYYr0DSP)~Gy)+1Bnf6Nc_IobWWtMgWH{ zukFq7D|7VgUI=OW=o<9oD^#Qi(ps)(pCX0EWpo+3T$ctVwJUhP^G-}0)un;=V;EpX z0~~|OQ!Q}9Mv9Z1!hSLb-=Ggr4su!uMj>THZDvtyNCej*mlK4Dj8h5Yq+3_H-*d-? z(ct~#fu#V&6QqOOW$lM{qZ#otY%iSrl4Wnw02&*SFYI{>&jZiNN#?u zr-5AYk}cNX#m|KKxHZj-choI*Qt?htCwYX~Gig-Jee7ryaYvg=r<(Ewf|b3qjj>PQ z;ZwD})TiltvsyYkxP$azt-46Qc~9q}(Gv93=BMtLhTI4N`q35TYn4C9rg~9&$RXvQ zG~)0!t+Hd78fg_FJw+7dcNqMl77&i3N)O-@2W;n{qE9;237IGv4;^d*^ux0D8jR9r z&2m!EGrDOkQ|v#lwsJckc?!H1ye{1q1e!z1__GfoHS`U8{D$6B)DUQQA!-#N$8=Ew zMtoLet2ov2`|3SlS|pqG8MMr6r@syMuqf}5mHatkVovV)@1SBLk)Il8(B{@=I$sq@ zL+6l8N(>KG!^++=rRqD6cbYz={pw=nFhEgsh!^WVET3~K=$vuvOp8)9Mfo~JIpSNvhvRic%%Hug3n6{cuhZJkm8KT7 zWy%D9Jo!_u;3eMfh$8F*$rQKu5d%9$V~>$EWqvLwtn416NuW^gJ7zh1_3U(0TwN>) zvQ~M0-qr8kq%&@^%Cxhg5#TD^{Ro#}P3IuC(|qB+XNsK${c#8GcVzchTH2KLa_R+Y zmL_zO@$0vYd*`?e3%qhzg+U8hsX7sL{zl`yHi5eyuc-X7@<;|#mps?)GJH$Gf_IO= z3cBM^a#DuLe(vORsm6Px=d&D4Ck*d4SK)l)mF!OUDBBizN#cr`=<~`G{JM1B;i<44 z^^}?(+1)B#d~X_xWYwK^bM3PqJwD+P8UA2jJ`F4IMzZr1$1FvjKe8@u%`m?u={;wz zU=7Wd!kbqgZ;^AQ*R+?n$M($7?ISJ$zpfz(9=bR4Ph!pQAHQ$W_BI}Wh@fkv_aa3v zv+Pn!!PTG2@ZBFim=FCJmXRR|YTOOYz=-}BL+;cmq=5Z?i8N|Eg!kK9S(0{06jwi` zIn^jBQTIOW>apTJ4Mx*kH~7S))!bv(<%5cmH35AE{6fhU`aDO4c2Q0}0VdpDNoL`p z>lw5wX#&yPw(;x)n(~M}{xdY|T{of5% zCd{m92Y<3#2R)tXI?bARcRj#!g1roWFW1=~7+lX-HH#H3SB*j0+})00<3g{MzdY%P zsZ4fDFUpgGzgv(SFnQ3*^NMPVlYLptx+>T&ad41Wk?j1St3>tp*yf!(xt$kM#3X;?J}oksYaNfZ9PL&g5w+)V_tB2zQ;U z$!qFQxTVNjOB;dSj~GVw9!L-nFLx@M@L{=V8#ju{Zo96ZoE#Hq8d_5R`>vNtcbdV( zxN8$R!@q;8>^|g72Q?lVRPCL*yC-j5>XW@iBlRO?1~UFs#4wjp%M;)l7FfeCJZfG4 zDpTYbCHaT*d}feaBAx9-a;ku;l!_Io_@vP`Ve`EH^BlWZe|n{6GOcN-cJ{sZGWRM9 ze?g;ma{u1mAZ3aB$N4%)l6QhfFY>P@#RZ+YM;hKfRu|jGn{$b2%GrFg_PMRt=FX7k;u@sFqI?gN(@mNTaj%>6!HR%GrEb63RdeI7^I zcvF35#H(|&Nee#s&ecLxYf!*&n?aV!w!QC*iw4x14Nj*_!g{0gEPF0x=I$V{4WI;` zu0;7>w?4PhpLq_X)R-`oR?F<3njrZ)y4iX{5J7>)$ z`WW|hnWvZbb44A8`UzGK8ybuiKQMaPKWFp~?8hA(+PCA3r1pNi{ZOYwiu1!x!~W^f zH%5od_IIvOaT*e^s>aS*&wjqnHcm;5tN$9n*Nu%Gi{qWI)3=IikOXy%z2?XejWtPF z5B<;>nR!$7M_op0XxARz;;!>Btm`=35plU)D0=Yr!l%li zw=A!eCnKX_q_eGF;!AZUzC-QIuJKj&AMHE+aqKD)@$kwxvyr2&c53b=zv;PMD5JFQ zW;_f!oETfH`C{~WaSh3`9Or-F*n!0Syn>u~MM?R9B)jI~;AtUlVXWixqvsP-T7~tJ z+8;{oa(Mxls9kxh!!{o#yi8CdBpDh{zU07`$4;o_b%NO{dYUGd;tY>`(F zBV#agzD3Sc*j#Wa-J_<^ZtWQ{9~boaql0&lR7rH>St`o8?eUQkM?0boPisdB^(pRP)zAt| z#OWPZJufXwbz3RpeDa)Lv`7V9XeOgO($vTG^s~(`)OZ&VDJpCiuY8nNsr5@aZ>bv9Sj)J9=p?;TmCO^agLR1l zJihN_mgi>Y8ahZp7Z-)qE^>%UqHvfZ;El$Kk>H99QNFIK${k0M_0%GqiC@%SbBP`* z(%G{-EN*%IT}+79+o~Ic`ir4A;EWIThK32hDC&!rX6NAgqhE)MLpxlJ#@#vQZb|MN z51U-rmte4VV!bxMuo7|Y!$Ki2Y(+1v&%`MzQTB58!sPWzLZJG#*5}2YQVFwzOOE55 z>Qk7<772E@U+;KvHGlAYMqH;&@j99vDVkTT9n$2~P+w_jNj)?^*vFgVD-qh{44e3yT z3X{*bw(jZaeD+tSTX5&V-IFb_$Ad4+* zRvJP>&lWkBJ>yjxGpuVHeo}5Pje+c~GF>Vy5M0s^BCf5AH>gMJZ)M5A;eQcHHd!(R zGK=U)WD$8Fre3F5eja3q6~W*ug9L#_eI1LUq~hyAB)O7Vpi^WD)m<4pTU7@JQ5}`R zmM8+0;GquuQ=*PPgKX+=Xh!mPC1D)FDtI0x6(Yc3A;CIZY(l`2_iE|$`a}( z23isu3cgrhng8nr=tzN4}I7k6 zKtaExK?%^o66lUpCqE4$i;RauVQ@L%14WuaF<1l|i-aD7!mv=N668Bgp!k5PI)eQWT2|S5NWzc~RfI;QqAn7ml-V{<8L=R^wiMdgBna@FN?)1e_39?bP zza{M7P9f2QK=|L2NTY3Z`Gy`=gHH0Ik=2-%Ii z5gQYzJPe4~k%V=kGiXGh-GSe#0Qwwp0|gMEO~H62;3kX8awFq6;i&4y`n+(XZomuc zMs%krgMH;3$xcKsHx?Lg?!Kw*__-QxRQ%_~rXA$3z5bzAn<4=2K-nN)4--5O=wG`2 zy^a1lK>=EyGT3M1d<0fZ761U+pH#oU9ngP5UHYGpE&~t`H-G~qd;>bt8rTio!QfCN z6oWu-LJkatf&n!En*T-P3mT-qfspP0h#^}U89e?AGtrkpcH)78;0T_LgYEMLLZeU! z6vzqmMTUSY0Mo`cE|B{d8486&1CzSGkwFna_*-O9^!K)a5e&6e54lATfk2?Q=qX~h z_(cIJ`(6*Z@dV$-2Uoysygt8;83jXr?_;9?{}7A97QYB2bc+myhC{#e0SD-(0RQtF zzepGiwIvn=61DX?V3;kjAQcq8j~Pe-FuCok4;F(+bt5wXE-eURO7$lL^#wsp=yVnc z*bHO>g6O(C(Lo!nYQh82)d1NjAr#cK;Al0ZA_k?dsICChRE5FdD5$D}795U1AvEy+ dUBiwCAiOeJL$a^B)V1|A7Di diff --git a/BookGPU/Chapters/chapter7/biblio7.bib b/BookGPU/Chapters/chapter7/biblio7.bib index decfed8..53c555c 100644 --- a/BookGPU/Chapters/chapter7/biblio7.bib +++ b/BookGPU/Chapters/chapter7/biblio7.bib @@ -269,7 +269,7 @@ MRREVIEWER = {H. K. Cheng}, } @article{ch7:Cavaleri2007603, -title = "Wave modelling - The state of the art", +title = "Wave modelling--The state of the art", journal = "Progress in Oceanography", volume = "75", number = "4", @@ -416,7 +416,7 @@ year = "1984" } @article{ch7:AbottEtAl1978, -author = "Abott, M. B. Petersens, H. M. and Skovgaard, O.", +author = "Abott, M. B. and Petersens, H. M. and Skovgaard, O.", title = "On the numerical modelling of short waves in shallow water", journal = "Journal of Hydraulic Research", volume = "16", @@ -427,7 +427,7 @@ year = "1978" @ARTICLE{ch7:MS98, AUTHOR = "Madsen, P. A. and Sch{\"{a}}ffer, H. A.", -TITLE = "Higher order Boussinesq-type equations for surface gravity waves - derivation and analysis.", +TITLE = "Higher order Boussinesq-type equations for surface gravity waves--derivation and analysis.", JOURNAL = "Advances in Coastal and Ocean Engineering", VOLUME = "356", YEAR = "1998", -- 2.39.5