X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/kahina_paper2.git/blobdiff_plain/a055895aab68dd582363f108223327a760bea1ff..769f5a935a7453b848ad1358a006be5949b7c52f:/paper.tex diff --git a/paper.tex b/paper.tex index 2ee181a..6d8658f 100644 --- a/paper.tex +++ b/paper.tex @@ -1,17 +1,8 @@ - - - \documentclass[conference]{IEEEtran} - \usepackage[ruled,vlined]{algorithm2e} - - \hyphenation{op-tical net-works semi-conduc-tor} - \bibliographystyle{IEEEtran} - - \usepackage{amsfonts} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} @@ -26,8 +17,6 @@ \todo[color=orange!10,#1]{\sffamily\textbf{AS:} #2}\xspace} - - \begin{document} \title{Two parallel implementations of Ehrlich-Aberth algorithm for root-finding of polynomials on multiple GPUs with OpenMP and MPI} @@ -123,7 +112,7 @@ This latter approach is more used on clusters to solve very complex problems tha \LZK{Pas d'autres contributions possibles? J'ai supprimé les deux premiers points proposés précédemment.} The paper is organized as follows. In Section~\ref{sec2} we present three different parallel programming models OpenMP, MPI and CUDA. In Section~\ref{sec3} we present the implementation of the Ehrlich-Aberth algorithm on a single GPU. In Section~\ref{sec4} we present the parallel implementations of the Ehrlich-Aberth algorithm on multiple GPUs using the OpenMP and MPI approaches. In section~\ref{sec5} we present our experiments and discuss them. Finally, Section~\ref{sec6} concludes this paper and gives some hints for future research directions in this topic. -%\LZK{A revoir toute cette organization: je viens de la revoir} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -247,20 +236,15 @@ implementation of Ehrlich-Aberth method. Initialize the polynomial $P$ and its derivative $P'$\; Set the initial values of vector $Z$\; Copy $P$, $P'$ and $Z$ from CPU to GPU\; -\While{\emph{not convergence}}{ +\While{$\Delta Z_{max} > \epsilon$}{ $Z^{prev}$ = KernelSave($Z,n$)\; $Z$ = KernelUpdate($P,P',Z,n$)\; $\Delta Z$ = KernelComputeError($Z,Z^{prev},n$)\; $\Delta Z_{max}$ = CudaMaxFunction($\Delta Z,n$)\; - TestConvergence($\Delta Z_{max},\epsilon$)\; } Copy $Z$ from GPU to CPU\; \label{alg1-cuda} -\LZK{J'ai modifié l'algo. Sinon, est ce qu'on doit mettre en paramètre - $Z^{prev}$ ou $Z$ tout court (dans le cas où on exploite - l'asynchronisme des threads cuda!) pour le Kernel\_Update? } -\RC{Le $Z_{prev}$ sert à calculer l'erreur donc j'ai remis Z. La ligne -avec TestConvergence ca fait une ligne de plus.} +\RC{La ligne avec TestConvergence ca fait une ligne de plus.\LZK{Oui j'ai hésité à l'ajouter. On peut faire le test dans la condition de while mais quelle est la valeur initiale de $\Delta Z_{max}$?! Ou bien on s'en fiche?}} \end{algorithm} @@ -307,15 +291,14 @@ $id_{gpu}$ = cudaGetDevice()\; $n_{loc}$ = $n/ngpu$ (local size)\; %$idx$ = $id_{gpu}\times n_{loc}$ (local offset)\; Copy $P$, $P'$ from CPU to GPU\; -\While{\emph{not convergence}}{ +\While{$max > \epsilon$}{ Copy $Z$ from CPU to GPU\; $Z^{prev}$ = KernelSave($Z,n$)\; - $Z_{loc}$ = KernelUpdate($P,P',Z^{prev},n_{loc}$)\; + $Z_{loc}$ = KernelUpdate($P,P',Z,n_{loc}$)\; $\Delta Z_{loc}$ = KernelComputeError($Z_{loc},Z^{prev}_{loc},n_{loc}$)\; $\Delta Z_{max}[id_{gpu}]$ = CudaMaxFunction($\Delta Z_{loc},n_{loc}$)\; Copy $Z_{loc}$ from GPU to $Z$ in CPU\; - $max$ = MaxFunction($\Delta Z_{max},ngpu$)\; - TestConvergence($max,\epsilon$)\; + $max$ = MaxFunction($\Delta Z_{max},ngpu$)\; } \label{alg2-cuda-openmp} \LZK{J'ai modifié l'algo. Le $P$ est mis shared. Qu'en est-il pour