Couturier and al.~\cite{Raphaelall01} proposed two methods of parallelization for
a shared memory architecture and for distributed memory one. They were able to
compute the roots of sparse polynomials of degree 10,000 in 430 seconds with only 8
-personal computers and 2 communications per iteration. Comparing to the sequential implementation
-where it takes up to 3,300 seconds to obtain the same results, the authors show an interesting speedup.
+personal computers and 2 communications per iteration. Compared to sequential implementations
+where it takes up to 3,300 seconds to obtain the same results, the
+authors' work experiment show an interesting speedup.
-Very few works had been performed since this last work until the appearing of
+Few works have been conducted after those works until the appearance of
the Compute Unified Device Architecture (CUDA)~\cite{CUDA10}, a
parallel computing platform and a programming model invented by
NVIDIA. The computing power of GPUs (Graphics Processing Unit) has exceeded that of CPUs. However, CUDA adopts a totally new computing architecture to use the
\section{Ehrlich-Aberth method}
\label{sec1}
-A cubically convergent iteration method for finding zeros of
-polynomials was proposed by O. Aberth~\cite{Aberth73}. The Ehrlich-Aberth method contain 4 main steps, presented in the following.
+A cubically convergent iteration method to find zeros of
+polynomials was proposed by O. Aberth~\cite{Aberth73}. The
+Ehrlich-Aberth method contains 4 main steps, presented in what
+follows.
+
%The Aberth method is a purely algebraic derivation.
%To illustrate the derivation, we let $w_{i}(z)$ be the product of linear factors
equi-spaced points on a circle of center 0 and radius r, where r is
an upper bound to the moduli of the zeros. Later, Bini and al.~\cite{Bini96}
performed this choice by selecting complex numbers along different
-circles and relies on the result of~\cite{Ostrowski41}.
+circles which relies on the result of~\cite{Ostrowski41}.
\begin{equation}
\label{eq:radiusR}
%following equation~\ref{Eq:EA} which will enable the convergence towards
%polynomial solutions, provided all the roots are distinct.
-Here we give a second form of the iterative function used by Ehrlich-Aberth method:
+Here we give a second form of the iterative function used by the Ehrlich-Aberth method:
\begin{equation}
\label{Eq:Hi}
\end{equation}
It can be noticed that this equation is equivalent to Eq.~\ref{Eq:EA},
but we prefer the latter one because we can use it to improve the
-Ehrlich-Aberth method and find the roots of very high degrees polynomials. More
+Ehrlich-Aberth method and find the roots of high degree polynomials. More
details are given in Section~\ref{sec2}.
\subsection{Convergence Condition}
The convergence condition determines the termination of the algorithm. It consists in stopping the iterative function when the roots are sufficiently stable. We consider that the method converges sufficiently when:
\section{Improving the Ehrlich-Aberth Method for high degree polynomials with exp-log formulation}
\label{sec2}
With high degree polynomial, the Ehrlich-Aberth method implementation,
-as well as the Durand-Kerner implement, suffers from overflow problems. This
-situation occurs, for instance, in the case where a polynomial
-having positive coefficients and a large degree is computed at a
+as well as the Durand-Kerner implementation, suffers from overflow problems. This
+situation occurs, for instance, in the case where a polynomial,
+having positive coefficients and a large degree, is computed at a
point $\xi$ where $|\xi| > 1$, where $|z|$ stands for the modolus of a complex $z$. Indeed, the limited number in the
mantissa of floating points representations makes the computation of $p(z)$ wrong when z
is large. For example $(10^{50}) +1+ (- 10^{50})$ will give the wrong result
of $0$ instead of $1$. Consequently, we can not compute the roots
-for large degrees. This problem was early discussed in
-~\cite{Karimall98} for the Durand-Kerner method, the authors
+for large degrees. This problem was discussed earlier in
+~\cite{Karimall98} for the Durand-Kerner method. The authors
propose to use the logarithm and the exponential of a complex in order to compute the power at a high exponent.
\begin{equation}
%%\end{equation}
Using the logarithm (eq.~\ref{deflncomplex}) and the exponential (eq.~\ref{defexpcomplex}) operators, we can replace any multiplications and divisions with additions and subtractions. Consequently, computations
-manipulate lower absolute values and the roots for large polynomial's degrees can be looked for successfully~\cite{Karimall98}.
+manipulate lower absolute values and the roots for large polynomial degrees can be looked for successfully~\cite{Karimall98}.
-Applying this solution for the iteration function Eq.~\ref{Eq:Hi} of Ehrlich-Aberth method, we obtain the iteration function with exponential and logarithm:
+Applying this solution for the iteration function Eq.~\ref{Eq:Hi} of
+Ehrlich-Aberth method, we obtain the following iteration function with exponential and logarithm:
%%$$ \exp \bigl( \ln(p(z)_{k})-ln(\ln(p(z)_{k}^{'}))- \ln(1- \exp(\ln(p(z)_{k})-ln(\ln(p(z)_{k}^{'})+\ln\sum_{i\neq j}^{n}\frac{1}{z_{k}-z_{j}})$$
\begin{equation}
\label{Log_H2}
\section{Implementation of simultaneous methods in a parallel computer}
\label{secStateofArt}
-The main problem of simultaneous methods is that the necessary
+The main problem of simultaneous methods is that the
time needed for convergence is increased when we increase
the degree of the polynomial. The parallelization of these
algorithms is expected to improve the convergence time.
Authors usually adopt one of the two following approaches to parallelize root
finding algorithms. The first approach aims at reducing the total number of
-iterations as by Miranker
+iterations as in Miranker
~\cite{Mirankar68,Mirankar71}, Schedler~\cite{Schedler72} and
Winograd~\cite{Winogard72}. The second approach aims at reducing the
computation time per iteration, as reported
There are many schemes for the simultaneous approximation of all roots of a given
polynomial. Several works on different methods and issues of root
-finding have been reported in~\cite{Azad07, Gemignani07, Kalantari08, Zhancall08, Zhuall08}. However, Durand-Kerner and Ehrlich-Aberth methods are the most practical choices among
+finding have been reported in~\cite{Azad07, Gemignani07, Kalantari08,
+ Zhancall08, Zhuall08}. However, the Durand-Kerner and the Ehrlich-Aberth methods are the most practical choices among
them~\cite{Bini04}. These two methods have been extensively
-studied for parallelization due to their intrinsics parallelism, i.e. the
-computations involved in both methods has some inherent
+studied for parallelization due to their intrinsic parallelism, i.e. the
+computations involved in both methods have some inherent
parallelism that can be suitably exploited by SIMD machines.
-Moreover, they have fast rate of convergence (quadratic for the
+Moreover, they have fast a rate of convergence (quadratic for the
Durand-Kerner and cubic for the Ehrlich-Aberth). Various parallel
algorithms reported for these methods can be found
in~\cite{Cosnard90, Freeman89,Freemanall90,Jana99,Janall99}.
other processors at the end of each iteration (synchronous). Therefore they
cause a high degree of memory conflict. Recently the author
in~\cite{Mirankar71} proposed two versions of parallel algorithm
-for the Durand-Kerner method, and Ehrlich-Aberth method on a model of
+for the Durand-Kerner method, and the Ehrlich-Aberth method on a model of
Optoelectronic Transpose Interconnection System (OTIS). The
algorithms are mapped on an OTIS-2D torus using $N$ processors. This
solution needs $N$ processors to compute $N$ roots, which is not
-practical for solving polynomials with large degrees.
+practical for solving large degree polynomials.
+
%Until very recently, the literature did not mention implementations
%able to compute the roots of large degree polynomials (higher then
%1000) and within small or at least tractable times.
%% texture space, which reside in external DRAM, and are accessed via
%% read-only caches.
-\section{ Implementation of Ehrlich-Aberth method on GPU}
+\section{ Implementation of the Ehrlich-Aberth method on GPU}
\label{sec5}
%%\subsection{A CUDA implementation of the Aberth's method }
%%\subsection{A GPU implementation of the Aberth's method }
Using Eq.~\ref{eq:Aberth-H-GS} to update the vector solution
\textit{Z}, we expect the Gauss-Seidel iteration to converge more
-quickly because, just as any Jacobi algorithm (for solving linear systems of equations), it uses the most fresh computed roots $z^{k+1}_{i}$.
+quickly because, just as any Jacobi algorithm (for solving linear
+systems of equations), it uses the freshest computed roots $z^{k+1}_{i}$.
%The $4^{th}$ step of the algorithm checks the convergence condition using Eq.~\ref{eq:Aberth-Conv-Cond}.
%Both steps 3 and 4 use 1 thread to compute all the $n$ roots on CPU, which is very harmful for performance in case of the large degree polynomials.
%In CUDA programming, all the instructions of the \verb=for= loop are executed by the GPU as a kernel. A kernel is a function written in CUDA and defined by the \verb=__global__= qualifier added before a usual \verb=C= function, which instructs the compiler to generate appropriate code to pass it to the CUDA runtime in order to be executed on the GPU.
-Algorithm~\ref{alg2-cuda} shows sketch of the Ehrlich-Aberth method using CUDA.
+Algorithm~\ref{alg2-cuda} shows a sketch of the Ehrlich-Aberth method using CUDA.
\begin{enumerate}
\begin{algorithm}[H]
\caption{CUDA Algorithm to find roots with the Ehrlich-Aberth method}
\KwIn{$Z^{0}$ (Initial root's vector), $\varepsilon$ (Error tolerance
- threshold), P (Polynomial to solve), Pu (Derivative of P), $n$ (Polynomial's degrees), $\Delta z_{max}$ (Maximum value of stop condition)}
+ threshold), P (Polynomial to solve), Pu (Derivative of P), $n$ (Polynomial degrees), $\Delta z_{max}$ (Maximum value of stop condition)}
\KwOut {$Z$ (Solution root's vector), $ZPrec$ (Previous solution root's vector)}
\verb=(while(...))= are executed as kernels by the GPU. The
first kernel named \textit{save} in line 7 of
Algorithm~\ref{alg2-cuda} consists in saving the vector of
-polynomial's root found at the previous time-step in GPU memory, in
+polynomial roots found at the previous time-step in GPU memory, in
order to check the convergence of the roots after each iteration (line
10, Algorithm~\ref{alg2-cuda}).
}
\end{algorithm}
-The first form executes formula the EA function Eq.~\ref{Eq:Hi} if the modulus
-of the current complex is less than the a certain value called the
-radius i.e. ($ |z^{k}_{i}|<= R$), else the kernel executes the EA.EL
-function Eq.~\ref{Log_H2}
+If the modulus
+of the current complex is less than a given value called the
+radius i.e. ($ |z^{k}_{i}|<= R$), then the classical form of the EA
+function Eq.~\ref{Eq:Hi} is executed else the EA.EL
+function Eq.~\ref{Log_H2} is executed.
(with Eq.~\ref{deflncomplex}, Eq.~\ref{defexpcomplex}). The radius $R$ is evaluated as in Eq.~\ref{R.EL}.
The last kernel checks the convergence of the roots after each update
converged. It should be noticed that, as blocks of threads are
scheduled automatically by the GPU, we have absolutely no control on
the order of the blocks. Consequently, our algorithm is executed more
-or less in an asynchronous iteration model, where blocks of roots are
-updated in a non deterministic way. As the Durand-Kerner method has
-been proved to converge with asynchronous iterations, we think it is
-similar with the Ehrlich-Aberth method, but we did not try to prove
+or less with the asynchronous iteration model, where blocks of roots
+are updated in a non deterministic way. As the Durand-Kerner method
+has been proved to converge with asynchronous iterations, we think it
+is similar with the Ehrlich-Aberth method, but we did not try to prove
this in that paper. Another consequence of that, is that several
-executions of our algorithm with the same polynomial do no give
-necessarily the same result (but roots have the same accuracy) and the
-same number of iterations (even if the variation is not very
+executions of our algorithm with the same polynomial do not
+necessarily give the same result (but roots have the same accuracy)
+and the same number of iterations (even if the variation is not very
significant).
%First, performances of the Ehrlich-Aberth method of root finding polynomials
%implemented on CPUs and on GPUs are studied.
-We performed a set of experiments on the sequential and the parallel algorithms, for both sparse and full polynomials and different sizes. We took into account the execution times, the polynomial size and the number of threads per block performed by sum or each experiment on CPU and on GPU.
+We performed a set of experiments on the sequential and the parallel algorithms, for both sparse and full polynomials of different sizes. We took into account the execution times, the polynomial size and the number of threads per block performed by sum or each experiment on CPU and on GPU.
All experimental results obtained from the simulations are made in
double precision data, the convergence threshold of the methods is set
on the GPU is faster than those implemented on the CPU.
However, the execution time for the
CPU (4 cores) implementation exceed 5,000s for 250,000 degrees
-polynomials. In counterpart, the GPU implementation for the same
+polynomials. On the other hand, the GPU implementation for the same
polynomials do not take more 100s. With the GPU
-we can solve high degrees polynomials very quickly up to degree
- of 1,000,000. We can also notice that the GPU implementation are
- almost 40 faster then those implementation on the CPU (4 cores).
+we can solve high degree polynomials very quickly up to degree 1,000,000. We can also notice that the GPU implementation are
+ almost 40 times faster then the implementation on the CPU (4 cores).
\subsection{Influence of the number of threads on the execution times of different polynomials (sparse and full)}
To optimize the performances of an algorithm on a GPU, it is necessary to maximize the use of cores GPU (maximize the number of threads executed in parallel). In fact, it is interesting to see the influence of the number of threads per block on the execution time of Ehrlich-Aberth algorithm.
-For that, we notice that the maximum number of threads per block for the Nvidia Tesla K40 GPU is 1,024, so we varied the number of threads per block from 8 to 1,024. We took into account the execution time for both sparse and full of 10 different polynomials of size 50,000 and 10 different polynomials of size 500,000 degrees.
+For that, we noticed that the maximum number of threads per block for
+the Nvidia Tesla K40 GPU is 1,024, so we varied the number of threads
+per block from 8 to 1,024. We took into account the execution time for
+10 different sparse and full polynomials of degree 50,000 and of degree 500,000.
\begin{figure}[htbp]
\centering
\label{fig:02}
\end{figure}
-The figure 2 show that, the best execution time for both sparse and full polynomial are given when the threads number varies between 64 and 256 threads per bloc. We notice that with small polynomials the best number of threads per block is 64, Whereas, the large polynomials the best number of threads per block is 256. However,In the following experiments we specify that the number of thread by block is 256.
+Figure~\ref{fig:02} shows that, the best execution time for both
+sparse and full polynomial are given when the threads number varies
+between 64 and 256 threads per block. We notice that with small
+polynomials the best number of threads per block is 64, whereas for large polynomials the best number of threads per block is
+256. However, in the following experiments we specify that the number
+of threads per block is 256.
+
\subsection{Influence of exp-log solution to compute high degree polynomials}
-In this experiment we report the performance of the exp-log solution described in Section~\ref{sec2} to compute very high degrees polynomials.
+In this experiment we report the performance of the exp-log solution described in Section~\ref{sec2} to compute high degree polynomials.
\begin{figure}[htbp]
\centering
\includegraphics[width=0.8\textwidth]{figures/sparse_full_explog}
-\caption{The impact of exp-log solution to compute very high degrees of polynomial.}
+\caption{The impact of exp-log solution to compute high degree polynomials}
\label{fig:03}
\end{figure}
execution time of the Ehrlich-Aberth method without this solution,
with full and sparse polynomials degrees. We can see that the
execution times for both algorithms are the same with full polynomials
-degrees less than 4,000 and sparse polynomials less than 150,000. We
+degree inferior to 4,000 and sparse polynomials inferior to 150,000. We
also clearly show that the classical version (without exp-log) of
-Ehrlich-Aberth algorithm do not converge after these degree with
-sparse and full polynomials. In counterpart, the new version of
-Ehrlich-Aberth algorithm with the exp-log solution can solve very
+Ehrlich-Aberth algorithm does not converge after these degrees with
+sparse and full polynomials. On the contrary, the new version of
+the Ehrlich-Aberth algorithm with the exp-log solution can solve
high degree polynomials.
%in fact, when the modulus of the roots are up than \textit{R} given in ~\ref{R},this exceed the limited number in the mantissa of floating points representations and can not compute the iterative function given in ~\ref{eq:Aberth-H-GS} to obtain the root solution, who justify the divergence of the classical Ehrlich-Aberth algorithm. However, applying exp-log solution given in ~\ref{sec2} took into account the limit of floating using the iterative function in(Eq.~\ref{Log_H1},Eq.~\ref{Log_H2} and allows to solve a very large polynomials degrees .