X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/book_gpu.git/blobdiff_plain/88ce161b6f410c4d12b011560d4be74f23c4c471..ab4f4a75aa53e25425dbbc4421c45b6e9a037955:/BookGPU/Chapters/chapter11/ch11.tex?ds=sidebyside diff --git a/BookGPU/Chapters/chapter11/ch11.tex b/BookGPU/Chapters/chapter11/ch11.tex index 1bf638e..8007138 100644 --- a/BookGPU/Chapters/chapter11/ch11.tex +++ b/BookGPU/Chapters/chapter11/ch11.tex @@ -7,7 +7,7 @@ \section{Introduction} \label{ch11:Introduction} -Monotonicity preserving interpolation and approximation have received substantial attention in the last thirty years because of their numerous applications in computer aided design, statistics and machine learning \cite{Dierckx1995_book,Kvasov2000_book,deboor2001_book}. Constrained splines are particularly popular because of their flexibility in modelling different geometrical shapes, sound theoretical properties and availability of numerically stable algorithms \cite{Dierckx1995_book,Schumaker1981_book,deboor2001_book}. +Monotonicity preserving interpolation and approximation have received substantial attention in the last thirty years because of their numerous applications in computer aided design, statistics and machine learning \cite{Dierckx1995_book,Kvasov2000_book,deboor2001_book}. Constrained splines are particularly popular because of their flexibility in modelling different geometrical shapes, sound theoretical properties and availability of numerically stable algorithms \cite{Dierckx1995_book,Schumaker1981_book,deboor2001_book}. % It is surprising though that few parallel spline algorithms are available. In this work we examine parallelisation and adaptation for GPUs of a few algorithms of monotone spline interpolation and data smoothing, which arose in the context of estimating probability distributions. @@ -28,14 +28,14 @@ The rest of the chapter is organised as follows. Section \ref{ch11:splines} disc \begin{figure}[h] \centering \includegraphics[angle=0,width=8cm]{Chapters/chapter11/gregory1_plot1.pdf} -\caption{Cubic spline (solid) and monotone quadratic spline (dashed) interpolating monotone data from \cite{Gregory1982}. Cubic spline fails to preserve monotonicity of the data.} +\caption[Cubic spline (solid) and monotone quadratic spline (dashed) interpolating monotone data]{Cubic spline (solid) and monotone quadratic spline (dashed) interpolating monotone data from \cite{Gregory1982}. Cubic spline fails to preserve monotonicity of the data.} \label{ch11:fig1} \end{figure} \begin{figure}[h] \centering \includegraphics[angle=00,width=8cm]{Chapters/chapter11/gregory1_plot2_b.pdf} -\caption{Hermite cubic spline (solid) and Hermite rational spline interpolating monotone data from \cite{Gregory1982} with non-negative prescribed slopes. Despite non-negative slopes, Hermite cubic spline is not monotone.} +\caption[Hermite cubic spline (solid) and Hermite rational spline interpolating monotone data]{Hermite cubic spline (solid) and Hermite rational spline interpolating monotone data from \cite{Gregory1982} with non-negative prescribed slopes. Despite non-negative slopes, Hermite cubic spline is not monotone.} \label{ch11:fig2} \end{figure} @@ -71,7 +71,9 @@ d_1=\left\{\begin{array}{ll} 2\delta_{1}-d_2, & \mbox{if } \delta_{1}(2\delta_1-d_2)>0, \\ 0 & \mbox{otherwise}, \end{array} - \right. \; + \right. + $$ + $$ d_n=\left\{\begin{array}{ll} 2\delta_{n-1}-d_{n-1}, & \mbox{if } \delta_{n-1}(2\delta_{n-1}-d_{n-1})>0,\\ 0 & \mbox{otherwise}. @@ -387,15 +389,17 @@ As expected, the runtimes of both methods differed significantly, as shown in T From the results in Table \ref{ch11:table1} we conclude that serial PAVA is superior to MLS for $n>10^4$. While it is possible to transfer data from GPU to CPU and run PAVA there, it is warranted only for sufficiently large data $n\geq 5 \times 10^5$ , for otherwise the data transfer overheads will dominate CPU time. For smaller $n$, isotone regression is best performed on GPU. -We also see that the use of GPU accelerated MLS by a factor of at least 100. The cost of serial MLS is prohibitive for $n>10^6$. +We also see that the use of GPU accelerated MLS by a factor of at least 100. The cost of serial MLS is prohibitive for $n>10^6$. We should mention that not all isotone regression problems allow a PAV-like algorithm linear in time. When the data may contain large outliers, monotonizing the data is better done not in the least squares sense, but using other cost functionals, such as by minimizing the sum of absolute deviations \cite{Wang} or using M-estimators \cite{Yohai}, which are less sensitive to outliers. It is interesting than in all such cases the solution to isotone regression problem can be found by solving maximin problem $$ -u_i=\max_{k\leq i} \min_{l \geq i} \hat y(k,l), +u_i=\max_{k\leq i} \min_{l \geq i} \hat y(k,l), $$ with $\hat y(k,l)$ being the unrestricted maximum likelihood estimator of $y_k\ldots,y_l$. For quadratic cost function $\hat y(k,l)$ is the mean, as in PAV and MLS algorithms, for the absolute deviations it becomes the median, and for other cost functions an M-estimator of location. The MLS algorithm can be applied to such isotone regression problems with very little modification, while linear in time algorithm may not be available. Our parallel MLS algorithm will be valuable in such cases. -%\renewcommand{\baselinestretch}{1} + + +%% %\renewcommand{\baselinestretch}{1} \begin{table}[!h] \begin{center} \caption{The average CPU time (sec) of the serial PAVA, MLS and parallel MLS algorithms. } \label{ch11:table1} @@ -423,70 +427,74 @@ $n=50 \times 10^6$ &11& 11& -- \\ \end{tabular} \end{center} \end{table} -%\renewcommand{\baselinestretch}{2} +%% %\renewcommand{\baselinestretch}{2} -\begin{figure}[!hp] - \begin{alltt} -\begin{center} -\begin{minipage}{13cm}\small -template -__device__ Tx Aver(Tx z,int i,int j, Tx *z) \{return (z-z[j+1])/(j-i+1);\} - -template -__global__ void monotonizekernel(Tx *y, Tx *z, Tx *u, int *key, int n) -\{ int i = threadIdx.x + blockIdx.x * blockDim.x; - if(icurP) \{ - smallestJ = j; - smallestP = curP; - \} - \} - curP=y[i]; - if(curP > smallestP) t=smallestP; - else smallestJ=i; - key[i]=smallestJ; - u[i]=t; - \} -\} - -template< typename Tx > -void MonotonizeData(Tx *y, int n, Tx *u) \{ - thrust::less_equal binary_pred; - thrust::maximum binary_op2; - thrust::device_vector z_d(n+1); - thrust::device_vector keys_d(n); - thrust::device_ptr y_d(y), u_d(u); - thrust::fill(u_d, u_d+n, -1e100); - thrust::fill(keys_d.begin(), keys_d.end(), 0); - - thrust::reverse_iterator< typename thrust::device_vector::iterator > - y_reverse_b(y_d+n), y_reverse_end(y_d), z_reverse_b(z_d.end()); +%% \begin{figure}[!hp] +%% \begin{alltt} +%% \begin{center} +%% \begin{minipage}{13cm}\small +%% template +%% __device__ Tx Aver(Tx z,int i,int j, Tx *z) \{return (z-z[j+1])/(j-i+1);\} + +%% template +%% __global__ void monotonizekernel(Tx *y, Tx *z, Tx *u, int *key, int n) +%% \{ int i = threadIdx.x + blockIdx.x * blockDim.x; +%% if(icurP) \{ +%% smallestJ = j; +%% smallestP = curP; +%% \} +%% \} +%% curP=y[i]; +%% if(curP > smallestP) t=smallestP; +%% else smallestJ=i; +%% key[i]=smallestJ; +%% u[i]=t; +%% \} +%% \} + +%% template< typename Tx > +%% void MonotonizeData(Tx *y, int n, Tx *u) \{ +%% thrust::less_equal binary_pred; +%% thrust::maximum binary_op2; +%% thrust::device_vector z_d(n+1); +%% thrust::device_vector keys_d(n); +%% thrust::device_ptr y_d(y), u_d(u); +%% thrust::fill(u_d, u_d+n, -1e100); +%% thrust::fill(keys_d.begin(), keys_d.end(), 0); + +%% thrust::reverse_iterator< typename thrust::device_vector::iterator > +%% y_reverse_b(y_d+n), y_reverse_end(y_d), z_reverse_b(z_d.end()); - thrust::inclusive_scan(y_reverse_b, y_reverse_end, z_reverse_b+1); +%% thrust::inclusive_scan(y_reverse_b, y_reverse_end, z_reverse_b+1); - monotonizekernel<<>>(y, thrust::raw_pointer_cast(&z_d[0]), - u, thrust::raw_pointer_cast(&keys_d[0]), n ); +%% monotonizekernel<<>>(y, thrust::raw_pointer_cast(&z_d[0]), +%% u, thrust::raw_pointer_cast(&keys_d[0]), n ); - thrust::sort(keys_d.begin(), keys_d.end()); - thrust::inclusive_scan_by_key(keys_d.begin(), keys_d.end(), - u_d, u_d, binary_pred, binary_op2); -\} -\end{minipage} -\end{center} -\end{alltt} -\caption{Fragments of implementation of a parallel version of the MLS algorithm using Thrust library.} -\label{ch11:algMLS} -\end{figure} +%% thrust::sort(keys_d.begin(), keys_d.end()); +%% thrust::inclusive_scan_by_key(keys_d.begin(), keys_d.end(), +%% u_d, u_d, binary_pred, binary_op2); +%% \} +%% \end{minipage} +%% \end{center} +%% \end{alltt} +%% \caption{Fragments of implementation of a parallel version of the MLS algorithm using Thrust library.} +%% \label{ch11:algMLS} +%% \end{figure} + +\lstinputlisting[label=ch11:algMLS,caption=Fragments of implementation of a parallel version of the MLS algorithm using Thrust library.]{Chapters/chapter11/code4.cu} \section{Conclusion} \label{ch11:conc} We presented three GPU-based parallel algorithms for approximating monotone data: monotone quadratic spline, monotone Hermite rational spline and minimum lower sets algorithm for monotonizing noisy data. These tools are valuable in a number of applications that involve large data sets modeled by monotone nonlinear functions. -The source code of the package monospline is available from \texttt{www.deakin.edu.au/$\sim$ gleb/monospline.html } +The source code of the package monospline is available from \texttt{www.deakin.edu.au/$\sim$gleb/monospline.html } + + \putbib[Chapters/chapter11/biblio11]