From: Raphael Couturier Date: Wed, 17 Apr 2013 09:53:40 +0000 (+0200) Subject: new X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/book_gpu.git/commitdiff_plain/b59596b1c8419b7e13191270be64b855dd28d01e new --- diff --git a/BookGPU/BookGPU.tex b/BookGPU/BookGPU.tex index 3cea1e7..95ea162 100755 --- a/BookGPU/BookGPU.tex +++ b/BookGPU/BookGPU.tex @@ -137,6 +137,7 @@ \makeindex +%\includeonly{Chapters/chapter17/ch17} \begin{document} diff --git a/BookGPU/Chapters/chapter17/ch17.aux b/BookGPU/Chapters/chapter17/ch17.aux index f23e546..c515b8c 100644 --- a/BookGPU/Chapters/chapter17/ch17.aux +++ b/BookGPU/Chapters/chapter17/ch17.aux @@ -1 +1,121 @@ \relax +\@writefile{toc}{\author{Guillaume Laville}{}} +\@writefile{toc}{\author{Christophe Lang}{}} +\@writefile{toc}{\author{Kamel Mazouzi}{}} +\@writefile{toc}{\author{Nicolas Marilleau}{}} +\@writefile{toc}{\author{B\IeC {\'e}n\IeC {\'e}dicte Herrmann}{}} +\@writefile{toc}{\author{Laurent Philippe}{}} +\@writefile{loa}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {chapter}{\numberline {16}Implementing MAS on GPU}{363}} +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{chapter17}{{16}{364}} +\@writefile{toc}{\contentsline {section}{\numberline {16.1}Introduction}{364}} +\newlabel{ch17:intro}{{16.1}{364}} +\@writefile{toc}{\contentsline {section}{\numberline {16.2}Running Agent-Based Simulations}{365}} +\newlabel{ch17:ABM}{{16.2}{365}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.2.1}Multi-agent systems and parallelism}{365}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.2.2}MAS Implementation on GPU}{367}} +\newlabel{ch17:subsec:gpu}{{16.2.2}{367}} +\@writefile{toc}{\contentsline {section}{\numberline {16.3}A first practical example}{368}} +\newlabel{ch17:sec:1stmodel}{{16.3}{368}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.3.1}The Collembola model}{368}} +\newlabel{ch17:subsec:collembolamodel}{{16.3.1}{368}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.1}{\ignorespaces Evolution algorithm of Collembola model\relax }}{369}} +\newlabel{ch17:fig:collem_algorithm}{{16.1}{369}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.3.2}Collembola Implementation}{369}} +\newlabel{ch17:listing:collembola-diffuse}{{16.1}{370}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {16.1}Collembola OpenCL Diffusion kernel}{370}} +\newlabel{ch17:listing:collembola-reduc}{{16.2}{370}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {16.2}Collembola OpenCL reduction kernel}{370}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.3.3}Collembola performance}{371}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.2}{\ignorespaces Performance of the Collembola model on CPU and GPU\relax }}{372}} +\newlabel{ch17:fig:mior_perfs_collem}{{16.2}{372}} +\@writefile{toc}{\contentsline {section}{\numberline {16.4}Second example}{372}} +\newlabel{ch17:sec:2ndmodel}{{16.4}{372}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.4.1}The MIOR model}{372}} +\newlabel{ch17:subsec:miormodel}{{16.4.1}{372}} +\@writefile{loa}{\contentsline {algocf}{\numberline {16}{\ignorespaces Evolution step of each Meta-Mior (microbial colony) agent\relax }}{373}} +\newlabel{ch17:seqalgo}{{16}{373}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.4.2}MIOR Implementation}{373}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.3}{\ignorespaces Execution distribution retained on GPU\relax }}{374}} +\newlabel{ch17:fig:gpu_distribution}{{16.3}{374}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {16.4.2.1}Execution mapping on GPU}{374}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {16.4.2.2}Data structures translation}{375}} +\newlabel{ch17:subsec:datastructures}{{16.4.2.2}{375}} +\newlabel{ch17:listing:mior_data_structures}{{16.3}{375}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {16.3}Main data structures used in a MIOR simulation}{375}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.4}{\ignorespaces Compact representation of the topology of a MIOR simulation\relax }}{376}} +\newlabel{ch17:fig:csr_representation}{{16.4}{376}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {16.4.2.3}Critical resources access management}{376}} +\newlabel{ch17:subsec:concurrency}{{16.4.2.3}{376}} +\newlabel{ch17:listing:mior_kernels}{{16.4}{377}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {16.4}Main MIOR kernel}{377}} +\newlabel{ch17:fig:mior_launcher}{{16.5}{378}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {16.5}MIOR simulation launcher}{378}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {16.4.2.4}Termination detection}{378}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.4.3}Performance of MIOR implementations}{379}} +\newlabel{ch17:subsec:miorexperiments}{{16.4.3}{379}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.5}{\ignorespaces CPU and GPU performance on a Tesla C1060 node\relax }}{380}} +\newlabel{ch17:fig:mior_perfs_tesla}{{16.5}{380}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.6}{\ignorespaces CPU and GPU performance on a personal computer with a Geforce 8800GT\relax }}{381}} +\newlabel{ch17:fig:mior_perfs_8800gt}{{16.6}{381}} +\@writefile{toc}{\contentsline {section}{\numberline {16.5}Analysis and recommendations}{381}} +\newlabel{ch17:analysis}{{16.5}{381}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.7}{\ignorespaces Execution time of one multi-simulation kernel on the Tesla platform\relax }}{382}} +\newlabel{ch17:fig:monokernel_graph}{{16.7}{382}} +\@writefile{lof}{\contentsline {figure}{\numberline {16.8}{\ignorespaces Total execution time for 1000 simulations on the Tesla platform, while varying the number of simulations for each kernel\relax }}{382}} +\newlabel{ch17:fig:multikernel_graph}{{16.8}{382}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.5.1}Analysis}{382}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.5.2}MAS execution workflow}{383}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.5.3}Implementation challenges}{384}} +\@writefile{toc}{\contentsline {subsection}{\numberline {16.5.4}MCSMA}{384}} +\newlabel{ch17:Mcsma}{{16.5.4}{384}} +\@writefile{toc}{\contentsline {section}{\numberline {16.6}Conclusion}{385}} +\newlabel{ch17:conclusion}{{16.6}{385}} +\@writefile{toc}{\contentsline {section}{Bibliography}{386}} +\@setckpt{Chapters/chapter17/ch17}{ +\setcounter{page}{390} +\setcounter{equation}{0} +\setcounter{enumi}{3} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{25} +\setcounter{footnote}{1} +\setcounter{mpfootnote}{0} +\setcounter{part}{6} +\setcounter{chapter}{16} +\setcounter{section}{6} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{8} +\setcounter{table}{0} +\setcounter{numauthors}{0} +\setcounter{parentequation}{4} +\setcounter{subfigure}{0} +\setcounter{lofdepth}{1} +\setcounter{subtable}{0} +\setcounter{lotdepth}{1} +\setcounter{lstnumber}{21} +\setcounter{ContinuedFloat}{0} +\setcounter{AlgoLine}{17} +\setcounter{algocfline}{16} +\setcounter{algocfproc}{16} +\setcounter{algocf}{16} +\setcounter{nprt@mantissa@digitsbefore}{0} +\setcounter{nprt@mantissa@digitsafter}{0} +\setcounter{nprt@exponent@digitsbefore}{0} +\setcounter{nprt@exponent@digitsafter}{0} +\setcounter{nprt@digitsfirstblock}{0} +\setcounter{nprt@blockcnt}{0} +\setcounter{nprt@cntprint}{0} +\setcounter{proposition}{1} +\setcounter{theorem}{0} +\setcounter{exercise}{0} +\setcounter{example}{0} +\setcounter{definition}{0} +\setcounter{proof}{1} +\setcounter{lstlisting}{5} +} diff --git a/BookGPU/Chapters/chapter17/ch17.tex b/BookGPU/Chapters/chapter17/ch17.tex index 9b1c611..6ad3a8c 100755 --- a/BookGPU/Chapters/chapter17/ch17.tex +++ b/BookGPU/Chapters/chapter17/ch17.tex @@ -3,7 +3,7 @@ \chapterauthor{Kamel Mazouzi}{Femto-ST Institute, University of Franche-Comte, France} \chapterauthor{Nicolas Marilleau}{Femto-ST Institute, University of Franche-Comte, France} \chapterauthor{Bénédicte Herrmann}{Femto-ST Institute, University of Franche-Comte, France} -%\chapterauthor{Laurent Philippe}{Femto-ST Institute, University of Franche-Comte, France} +\chapterauthor{Laurent Philippe}{Femto-ST Institute, University of Franche-Comte, France} \newlength\mylen \newcommand\myinput[1]{% diff --git a/BookGPU/Chapters/chapter18/ch18.aux b/BookGPU/Chapters/chapter18/ch18.aux index ab5fa84..230f20a 100644 --- a/BookGPU/Chapters/chapter18/ch18.aux +++ b/BookGPU/Chapters/chapter18/ch18.aux @@ -2,45 +2,45 @@ \@writefile{toc}{\author{Rapha\IeC {\"e}l Couturier}{}} \@writefile{toc}{\author{Christophe Guyeux}{}} \@writefile{loa}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {chapter}{\numberline {17}Pseudorandom Number Generator on GPU}{389}} +\@writefile{toc}{\contentsline {chapter}{\numberline {17}Pseudorandom Number Generator on GPU}{391}} \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\newlabel{chapter18}{{17}{389}} -\@writefile{toc}{\contentsline {section}{\numberline {17.1}Introduction}{389}} -\@writefile{toc}{\contentsline {section}{\numberline {17.2}Basic Remindees}{391}} -\newlabel{section:BASIC RECALLS}{{17.2}{391}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.1}A Short Presentation of Chaos}{391}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.2}On Devaney's Definition of Chaos}{391}} -\newlabel{sec:dev}{{17.2.2}{391}} -\newlabel{Devaney}{{17.1}{391}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.3}Chaotic iterations}{392}} -\newlabel{subsection:Chaotic iterations}{{17.2.3}{392}} -\newlabel{Chaotic iterations}{{2}{392}} -\newlabel{eq:generalIC}{{17.4}{393}} -\newlabel{equation Oplus}{{17.5}{393}} -\@writefile{toc}{\contentsline {section}{\numberline {17.3}Toward Efficiency and Improvement for CI PRNG}{393}} -\newlabel{sec:efficient PRNG}{{17.3}{393}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.1}First Efficient Implementation of a PRNG based on Chaotic Iterations}{393}} -\newlabel{algo:seqCIPRNG}{{17.1}{393}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {17.1}C code of the sequential PRNG based on chaotic iterations}{393}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.2}Efficient PRNGs based on Chaotic Iterations on GPU}{394}} -\newlabel{sec:efficient PRNG gpu}{{17.3.2}{394}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.3}Naive Version for GPU}{394}} -\@writefile{loa}{\contentsline {algocf}{\numberline {17}{\ignorespaces Main kernel of the GPU ``naive'' version of the PRNG based on chaotic iterations\relax }}{395}} -\newlabel{algo:gpu_kernel}{{17}{395}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.4}Improved Version for GPU}{395}} -\newlabel{IR}{{18}{396}} -\@writefile{loa}{\contentsline {algocf}{\numberline {18}{\ignorespaces Main kernel for the chaotic iterations based PRNG GPU efficient version\relax }}{396}} -\newlabel{algo:gpu_kernel2}{{18}{396}} -\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.5}Chaos Evaluation of the Improved Version}{396}} -\@writefile{toc}{\contentsline {section}{\numberline {17.4}Experiments}{397}} -\newlabel{sec:experiments}{{17.4}{397}} -\@writefile{toc}{\contentsline {section}{\numberline {17.5}Summary}{397}} -\@writefile{lof}{\contentsline {figure}{\numberline {17.1}{\ignorespaces Quantity of pseudorandom numbers generated per second with the xorlike-based PRNG\relax }}{398}} -\newlabel{fig:time_xorlike_gpu}{{17.1}{398}} -\@writefile{toc}{\contentsline {section}{Bibliography}{399}} +\newlabel{chapter18}{{17}{391}} +\@writefile{toc}{\contentsline {section}{\numberline {17.1}Introduction}{391}} +\@writefile{toc}{\contentsline {section}{\numberline {17.2}Basic Remindees}{393}} +\newlabel{section:BASIC RECALLS}{{17.2}{393}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.1}A Short Presentation of Chaos}{393}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.2}On Devaney's Definition of Chaos}{393}} +\newlabel{sec:dev}{{17.2.2}{393}} +\newlabel{Devaney}{{17.1}{393}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.2.3}Chaotic iterations}{394}} +\newlabel{subsection:Chaotic iterations}{{17.2.3}{394}} +\newlabel{Chaotic iterations}{{2}{394}} +\newlabel{eq:generalIC}{{17.4}{395}} +\newlabel{equation Oplus}{{17.5}{395}} +\@writefile{toc}{\contentsline {section}{\numberline {17.3}Toward Efficiency and Improvement for CI PRNG}{395}} +\newlabel{sec:efficient PRNG}{{17.3}{395}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.1}First Efficient Implementation of a PRNG based on Chaotic Iterations}{395}} +\newlabel{algo:seqCIPRNG}{{17.1}{395}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {17.1}C code of the sequential PRNG based on chaotic iterations}{395}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.2}Efficient PRNGs based on Chaotic Iterations on GPU}{396}} +\newlabel{sec:efficient PRNG gpu}{{17.3.2}{396}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.3}Naive Version for GPU}{396}} +\@writefile{loa}{\contentsline {algocf}{\numberline {17}{\ignorespaces Main kernel of the GPU ``naive'' version of the PRNG based on chaotic iterations\relax }}{397}} +\newlabel{algo:gpu_kernel}{{17}{397}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.4}Improved Version for GPU}{397}} +\newlabel{IR}{{18}{398}} +\@writefile{loa}{\contentsline {algocf}{\numberline {18}{\ignorespaces Main kernel for the chaotic iterations based PRNG GPU efficient version\relax }}{398}} +\newlabel{algo:gpu_kernel2}{{18}{398}} +\@writefile{toc}{\contentsline {subsection}{\numberline {17.3.5}Chaos Evaluation of the Improved Version}{398}} +\@writefile{toc}{\contentsline {section}{\numberline {17.4}Experiments}{399}} +\newlabel{sec:experiments}{{17.4}{399}} +\@writefile{toc}{\contentsline {section}{\numberline {17.5}Summary}{399}} +\@writefile{lof}{\contentsline {figure}{\numberline {17.1}{\ignorespaces Quantity of pseudorandom numbers generated per second with the xorlike-based PRNG\relax }}{400}} +\newlabel{fig:time_xorlike_gpu}{{17.1}{400}} +\@writefile{toc}{\contentsline {section}{Bibliography}{401}} \@setckpt{Chapters/chapter18/ch18}{ -\setcounter{page}{401} +\setcounter{page}{403} \setcounter{equation}{5} \setcounter{enumi}{3} \setcounter{enumii}{0} diff --git a/BookGPU/sunil.cls b/BookGPU/sunil.cls index 44e5e66..bc2fad6 100755 --- a/BookGPU/sunil.cls +++ b/BookGPU/sunil.cls @@ -1193,11 +1193,39 @@ \chapter@authorfour\vskip6\p@ {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationfour} \fi + \ifnum\c@numauthors=5 + \chapter@authorone\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationone}\vskip12\p@ + \chapter@authortwo\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationtwo}\vskip12\p@ + \chapter@authorthree\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationthree}\vskip12\p@ + \chapter@authorfour\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationfour}\vskip12\p@ + \chapter@authorfive\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationfive} + \fi + \ifnum\c@numauthors=6 + \chapter@authorone\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationone}\vskip12\p@ + \chapter@authortwo\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationtwo}\vskip12\p@ + \chapter@authorthree\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationthree}\vskip12\p@ + \chapter@authorfour\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationfour}\vskip12\p@ + \chapter@authorfive\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationfive}\vskip12\p@ + \chapter@authorsix\vskip6\p@ + {\it\fontsize{10\p@}{10\p@}\selectfont\chapter@affiliationsix} + \fi } \gdef\chapter@authorone{}\gdef\chapter@affiliationone{}% \gdef\chapter@authortwo{}\gdef\chapter@affiliationtwo{}% \gdef\chapter@authorthree{}\gdef\chapter@affiliationthree{}% \gdef\chapter@authorfour{}\gdef\chapter@affiliationfour{}% + \gdef\chapter@authorfive{}\gdef\chapter@affiliationfive{}% + \gdef\chapter@authorsix{}\gdef\chapter@affiliationsix{}% \vskip 14.6\p@ {\leftskip\secnumwidth\def\author##1##2{}\@input{\thechapter.toc}\par}% } @@ -1214,12 +1242,20 @@ % \newif\iffinishedfromfour \global\finishedfromfourfalse +% +\newif\iffinishedfromfive +\global\finishedfromfivefalse +% +\newif\iffinishedfromsix +\global\finishedfromsixfalse %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newcommand\singleauthorchapter{\finishedfromonetrue} \newcommand\twoauthorchapter{\finishedfromtwotrue} \newcommand\threeauthorchapter{\finishedfromthreetrue} \newcommand\fourauthorchapter{\finishedfromfourtrue} +\newcommand\fiveauthorchapter{\finishedfromfivetrue} +\newcommand\sixauthorchapter{\finishedfromsixtrue} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif\iffinish @@ -1229,16 +1265,22 @@ \newsavebox\@AUtwobox \newsavebox\@AUthreebox \newsavebox\@AUfourbox +\newsavebox\@AUfivebox +\newsavebox\@AUsixbox % \newsavebox\@AUaffonebox \newsavebox\@AUafftwobox \newsavebox\@AUaffthreebox \newsavebox\@AUafffourbox +\newsavebox\@AUafffivebox +\newsavebox\@AUaffsixbox % \newsavebox\@finalAUboxfromone \newsavebox\@finalAUboxfromtwo \newsavebox\@finalAUboxfromthree \newsavebox\@finalAUboxfromfour +\newsavebox\@finalAUboxfromfive +\newsavebox\@finalAUboxfromsix %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\@ca#1#2{% @@ -1251,7 +1293,8 @@ \fi %%%%%%%%%%%%%%% -\ifnum\c@numauthors>4 +\ifnum\c@numauthors>6 + %\setcounter{numauthors}{0} \resetcounter{numauthors} \fi \stepcounter{numauthors} @@ -1280,7 +1323,20 @@ \sbox\@finalAUboxfromfour{\copy\@AUfourbox} \def\chapter@authorfour{\copy\@finalAUboxfromfour} \def\chapter@affiliationfour{\copy\@AUafffourbox} -\fi} +\fi \ifnum\c@numauthors=5 + \sbox\@AUfivebox{\CAPlusOneFont#1} + \sbox\@AUafffivebox{\vbox{\hsize\textwidth\CAAPlusOneFont\noindent #2\par}} + \sbox\@finalAUboxfromfive{\copy\@AUfivebox} + \def\chapter@authorfive{\copy\@finalAUboxfromfive} + \def\chapter@affiliationfive{\copy\@AUafffivebox} +\fi \ifnum\c@numauthors=6 + \sbox\@AUsixbox{\CAPlusOneFont#1} + \sbox\@AUaffsixbox{\vbox{\hsize\textwidth\CAAPlusOneFont\noindent #2\par}} + \sbox\@finalAUboxfromsix{\copy\@AUsixbox} + \def\chapter@authorsix{\copy\@finalAUboxfromsix} + \def\chapter@affiliationsix{\copy\@AUaffsixbox} +\fi +} \def\@caplusone{\@ifstar{\@scaplusone}{\@ifnextchar[{\@xcaplusone}{\@xcaplusone[]}}} @@ -1737,4 +1793,4 @@ \endinput %% %% End of file `sunil.cls'. - \ No newline at end of file +