From 53c9c6f65fe2bda5ba0dbe328b45daa53d0ec326 Mon Sep 17 00:00:00 2001 From: Raphael Couturier Date: Mon, 21 Jan 2013 15:53:04 +0100 Subject: [PATCH 1/1] ajout ch9 --- BookGPU/BookGPU.tex | 1 + BookGPU/Chapters/chapter9/biblio9.bib | 582 +++++++++++ BookGPU/Chapters/chapter9/ch9.tex | 903 ++++++++++++++++++ .../chapter9/figures/classification.pdf | Bin 0 -> 11023 bytes .../Chapters/chapter9/figures/paraMeta.pdf | Bin 0 -> 12819 bytes .../chapter9/figures/paradiseoGPU.pdf | Bin 0 -> 9360 bytes BookGPU/Makefile | 2 +- 7 files changed, 1487 insertions(+), 1 deletion(-) create mode 100644 BookGPU/Chapters/chapter9/biblio9.bib create mode 100644 BookGPU/Chapters/chapter9/ch9.tex create mode 100644 BookGPU/Chapters/chapter9/figures/classification.pdf create mode 100644 BookGPU/Chapters/chapter9/figures/paraMeta.pdf create mode 100644 BookGPU/Chapters/chapter9/figures/paradiseoGPU.pdf diff --git a/BookGPU/BookGPU.tex b/BookGPU/BookGPU.tex index 4919211..15fe175 100755 --- a/BookGPU/BookGPU.tex +++ b/BookGPU/BookGPU.tex @@ -137,6 +137,7 @@ \include{Chapters/chapter6/ch6} \include{Chapters/chapter7/ch7} \include{Chapters/chapter8/ch8} +\include{Chapters/chapter9/ch9} \include{Chapters/chapter11/ch11} \include{Chapters/chapter14/ch14} \include{Chapters/chapter15/ch15} diff --git a/BookGPU/Chapters/chapter9/biblio9.bib b/BookGPU/Chapters/chapter9/biblio9.bib new file mode 100644 index 0000000..5c32a72 --- /dev/null +++ b/BookGPU/Chapters/chapter9/biblio9.bib @@ -0,0 +1,582 @@ +@Article{talbi2002TaxonomyOfMth, + author={E-G. Talbi}, + title = {A Taxonomy of Hybrid Metaheuristics}, + journal = {Journal of Heuristics}, + year = {2002}, + volume = {8}, + number = {5}, + month = {September}, + pages = {541-564}, + annote = {Kluwer Academic Publishers} +} + +@Book{talbi2009mfdti, + author={E-G. Talbi}, + title={Metaheuristics: From design to implementation}, + publisher = {Wiley}, + year ={2009} +} + +@Unpublished{ Pierskalla1967Q3AP, + author = {W. P. Pierskalla}, + title = {The Multi-Dimensional Assignment Problem}, + note = {Technical Memorandum No. 93, Operations Research Department, CASE Institute of Technology}, + month = {September}, + year = {1967} +} + +@Article{ Hahn2008q3ap, + AUTHOR = {P. M. Hahn and B-J. Kim and T. Stützle and S. Kanthak and W. L. Hightower and Z. Ding and H. Samra and M. Guignard}, + TITLE = {The Quadratic Three-dimensional Assignment Problem: Exact and Approximate Solution Methods}, + JOURNAL = {European Journal of Operational Research }, + volume = {184}, + pages = {416-428}, + year = {2008} +} + +@Article{ glover1986, + author = {F. Glover}, + title = {Future paths for integer programming and links to artificial intelligence}, + journal = {Computers and Operations Research}, + volume = {13}, + number = {5}, + issn = {0305-0548}, + pages = {533-549}, + year = {1986} +} + +@article{Ahuja:2007:VLN:1528422.1528438, + author = {R. K. Ahuja and K. C. Jha and J. B. Orlin and D. Sharma}, + title = {Very Large-Scale Neighborhood Search for the Quadratic Assignment Problem}, + journal = {INFORMS J. on Computing}, + issue_date = {Fall 2007}, + volume = {19}, + number = {4}, + month = oct, + year = {2007}, + issn = {1526-5528}, + pages = {646--657}, + numpages = {12}, + url = {http://dx.doi.org/10.1287/ijoc.1060.0201}, + doi = {10.1287/ijoc.1060.0201}, + acmid = {1528438}, + publisher = {INFORMS}, + address = {Institute for Operations Research and the Management Sciences (INFORMS), Linthicum, Maryland, USA}, + keywords = {combinatorial optimization, computational testing, heuristics, neighborhood search, quadratic assignment problem} +} + +@article{DBLP:journals/ijfcs/LoukilMMTB12, + author = {L. Loukil and + M. Mehdi and + N. Melab and + E-G. Talbi and + P. Bouvry}, + title = {{Parallel Hybrid Genetic Algorithms for Solving Q3AP on Computational + Grid}}, + journal = {Int. J. Found. Comput. Sci.}, + volume = {23}, + number = {2}, + year = {2012}, + pages = {483-500}, + ee = {http://dx.doi.org/10.1142/S0129054112400242}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@Article{stutzle2006ILSforQAP, + AUTHOR = {T. Stutzle}, + TITLE = {Iterated local search for the quadratic assignment problem}, + JOURNAL = {European Journal of Operational Research}, + YEAR = {2006}, + volume = {174}, + number = {3}, + pages = {1519-1539}, + month = {November} +} + +@Article{Glover1989TS, + author = {F. Glover}, + title = {Tabu search}, + journal = {{ORSA Journal on Computing}}, + year = {1989}, + volume = {1}, + number = {3}, + pages = {190 - 206} +} + +@Article{ Kirkpatrick1983SA, + author = {S. Kirkpatrick and C. D. Gellat and M. P. Vecchi}, + title = {Optimization by simulated annealing}, + journal = {Science}, + year = {1983}, + volume = {220}, + pages = {671 - 680} +} + +@TechReport{stutzle1999ILSforQAP, + author = {T. Stutzle}, + title = {Iterated local search for the quadratic assignment problem}, + institution = {AIDA-99-03, FG Intellektik, FB Informatik, TU Darmstadt}, + year = {1999} +} + + +@InCollection{DBLP:reference/opt/HansenM09, + author = {P. Hansen and N. Mladenovic}, + title = {Variable Neighborhood Search Methods}, + booktitle = {Encyclopedia of Optimization}, + year = {2009}, + pages = {3975 - 3989}, + ee = {http://dx.doi.org/10.1007/978-0-387-74759-0_694}, + crossref = {DBLP:reference/opt/2009}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@Article{HansenMladenovic1997VNS, +author = {P. Hansen and N. Mladenovic}, +title = {Variable neighborhood search}, +journal = {Computers and Operations Research}, +year = {1997}, +volume = {24}, +number = {11}, +pages = {1097 - 1100} +} + +@inproceedings{luong2010large, + title = {{Large Neighborhood Local Search Optimization on Graphics Processing Units}}, + author = {T. V. Luong and N. Melab and E-G. Talbi}, + booktitle = {{Workshop on Large-Scale Parallel Processing (LSPP) in Conjunction with the International Parallel \& Distributed Processing Symposium (IPDPS)}}, + address = {Atlanta, {\'E}tats-Unis}, + year = {2010}, + pdf = {http://hal.inria.fr/inria-00520465/PDF/journalGPU.pdf} +} + +@incollection{luong2012ppsn, +author={T. V. Luong and E. Taillard and N. Melab and E-G. Talbi}, +title={{Parallelization Strategies for Hybrid Metaheuristics Using a Single GPU and Multi-core Resources}}, +isbn={978-3-642-32963-0}, +booktitle={Parallel Problem Solving from Nature - PPSN XII}, +series={Lecture Notes in Computer Science}, +url={http://dx.doi.org/10.1007/978-3-642-32964-7_37}, +publisher={Springer Berlin Heidelberg}, +volume={7492}, +pages={368-377}, +year={2012} +} + +@article{gerald2012, + author = {G. Paul}, + title = {{A GPU implementation of the Simulated Annealing Heuristic + for the Quadratic Assignment Problem}}, + journal = {CoRR}, + volume = {abs/1208.2675}, + year = {2012}, + url = {http://arxiv.org/abs/1208.2675} +} + +@article{cecilia, +author = {J. M. Cecilia and J. M. García and A. Nisbet and M. Amos and M. Ujaldón}, +title = {{Enhancing data parallelism for Ant Colony Optimization on GPUs}}, +journal = {Journal of Parallel and Distributed Computing}, +volume = {73}, +number = {1}, +pages = {42 - 51}, +year = {2013} +} + +@article{pinel2012JPDC, +author = {F. Pinel and B. Dorronsoro and P. Bouvry}, +title = {{Solving very large instances of the scheduling of independent tasks problem on the GPU}}, +journal = {Journal of Parallel and Distributed Computing}, +volume = {73}, +number = {1}, +pages = {101 - 110}, +year = {2012} +} + +@inproceedings{pugace, + title = {{PUGACE, a cellular Evolutionary Algorithm framework on GPUs }}, + author = {N. Soca and J. L. Blengio and M. Pedemonte and P. Ezzatti}, + booktitle = {{IEEE Congress on Evolutionary Computation (CEC)}}, + year = {2010} + } + +@inproceedings{libCuda, + author = {Y. S. G. Nashed and R. Ugolotti and P. Mesejo and S. Cagnoni}, + title = {{libCudaOptimize: an open source library of GPU-based metaheuristics}}, + booktitle = {Proceedings of the fourteenth international conference on Genetic and evolutionary computation conference companion}, + series = {GECCO Companion '12}, + year = {2012}, + pages = {117--124} + } + +@techreport{taillardFant, + author = {E. D. Taillard}, + title = {{FANT: Fast ant system}}, + booktitle={Technical Report, IDSIA-46-98}, + series={Lugano: IDSIA}, + year = {1998} +} + +@article{audreyANT, +author ={A. Delévacq and P. Delisle and M. Gravel and M. Krajecki}, +title = {{Parallel Ant Colony Optimization on Graphics Processing Units}}, +journal = {Journal of Parallel and Distributed Computing}, +volume = {73}, +number = {1}, +pages = {52 - 61}, +year = {2013} +} + +@incollection{paradiseoGPU, +author={Melab, N. and Luong, T.V. and Boufaras, K. and Talbi, E.G.}, +title={{Towards ParadisEO-MO-GPU: A Framework for GPU-Based Local Search Metaheuristics}}, +booktitle={Advances in Computational Intelligence}, +series={Lecture Notes in Computer Science}, +volume={6691}, +pages={401-408}, +year={2011} +} + +@incollection{luongMultiStart, +author={T. V. Luong and N. Melab and E-G. Talbi}, +title={{GPU-Based Multi-start Local Search Algorithms}}, +booktitle={Learning and Intelligent Optimization}, +series={Lecture Notes in Computer Science}, +volume={6683}, +pages={321-335}, +year={2011} +} + +@incollection{wongOldGPU2006, +author={T. T. Wong and ML Wong}, +title={{Parallel Evolutionary Algorithms on Consumer-Level Graphics Processing Unit}}, +booktitle={Parallel Evolutionary Computations}, +series={Studies in Computational Intelligence}, +volume={22}, +pages={133-155}, +year={2006} +} + +@inproceedings{tsutsui, + author = {S. Tsutsui and N. Fujimoto}, + title = {{ACO with tabu search on a GPU for solving QAPs using move-cost adjusted thread assignment}}, + booktitle = {Proceedings of the 13th annual conference on Genetic and evolutionary computation}, + series = {GECCO '11}, + pages = {1547--1554}, + year = {2011} +} + +@inproceedings{tsutsuiGAQAP, + author = {S. Tsutsui and N. Fujimoto}, + title = {{Solving quadratic assignment problems by genetic algorithms with GPU computation: a case study}}, + booktitle = {Proceedings of the 11th Annual Conference Companion on Genetic and Evolutionary Computation Conference: Late Breaking Papers}, + series = {GECCO '09}, + pages = {2523--2530}, + year = {2009} +} + +@incollection{maitreEASEA, +author={K. Frédéric and M. Ogier and J. Santiago and B. Laurent and C. Pierre}, +title={{Speedups between 70 and 120 for a generic local search memetic algorithm on a single GPGPU chip}}, +booktitle={Applications of Evolutionary Computation}, +series={Lecture Notes in Computer Science}, +volume={6024}, +pages={501-511}, +year={2010} +} + +@incollection{albaCGAGPU, +author={P. Vidal and E. Alba}, +title={{Cellular Genetic Algorithm on Graphic Processing Units}}, +booktitle={Nature Inspired Cooperative Strategies for Optimization (NICSO 2010)}, +series={Studies in Computational Intelligence}, +volume={284}, +pages={223-232}, +year={2010} +} + +@inproceedings{maitre2009, + author = {O. Maitre and L. Baumes and N. Lachiche and A. Corma and P. Collet}, + title = {{Coarse grain parallelization of evolutionary algorithms on GPGPU cards with EASEA}}, + booktitle = {Proceedings of the 11th Annual conference on Genetic and evolutionary computation}, + series = {GECCO '09}, +pages = {1403--1410}, + year = {2009} + } + +@inproceedings{kannan, + author = {S. Kannan and R. Ganji}, + title = {{Porting AutoDock to Cuda}}, + booktitle = {IEEE Congress on Evolutionary Computation}, + series = {CEC2010}, + year = {2010} +} + +@incollection{yu2005, +year={2005}, +isbn={978-3-540-28320-1}, +booktitle={Advances in Natural Computation}, +volume={3612}, +series={Lecture Notes in Computer Science}, +doi={10.1007/11539902_134}, +title={Parallel Genetic Algorithms on Programmable Graphics Hardware}, +url={http://dx.doi.org/10.1007/11539902_134}, +author={Q. Yu and C. Chen and Z. Pan}, +pages={1051-1059} +} + +@inproceedings{li2007, + author = {J-M. Li and X-J. Wang and R-S. He and Z-X. Chi}, + title = {{An Efficient Fine-grained Parallel Genetic Algorithm Based on GPU-Accelerated}}, + booktitle = {Proceedings of the 2007 IFIP International Conference on Network and Parallel Computing Workshops}, + series = {NPC '07}, + year = {2007}, + isbn = {0-7695-2943-7}, + pages = {855--862}, + numpages = {8}, + acmid = {1307070}, + publisher = {IEEE Computer Society}, + address = {Washington, DC, USA} +} + +@incollection{pospichal10, +year={2010}, +isbn={978-3-642-12238-5}, +booktitle={Applications of Evolutionary Computation}, +volume={6024}, +series={Lecture Notes in Computer Science}, +doi={10.1007/978-3-642-12239-2_46}, +title={Parallel Genetic Algorithm on the Cuda Architecture}, +url={http://dx.doi.org/10.1007/978-3-642-12239-2_46}, +publisher={Springer Berlin Heidelberg}, +author={P. Pospichal and J. Jaros and J. Schwarz}, +pages={442-451} +} + +@incollection{zhang09, +year={2009}, +isbn={978-3-642-04842-5}, +booktitle={Advances in Computation and Intelligence}, +volume={5821}, +series={Lecture Notes in Computer Science}, +editor={Cai, Zhihua and Li, Zhenhua and Kang, Zhuo and Liu, Yong}, +doi={10.1007/978-3-642-04843-2_4}, +title={Implementation of Parallel Genetic Algorithm Based on Cuda}, +url={http://dx.doi.org/10.1007/978-3-642-04843-2_4}, +publisher={Springer Berlin Heidelberg}, +keywords={Genetic Algorithm; Parallel Genetic Algorithm; Cuda}, +author={S. Zhang and Z. He}, +pages={24-30} +} + +@inproceedings{zhou2009, + author = {Y. Zhou and Y. Tan}, + title = {{GPU-based parallel particle swarm optimization}}, + booktitle = {Proceedings of the Eleventh conference on Congress on Evolutionary Computation}, + series = {CEC'09}, + year = {2009}, + isbn = {978-1-4244-2958-5}, + location = {Trondheim, Norway}, + pages = {1493--1500}, + numpages = {8}, + url = {http://dl.acm.org/citation.cfm?id=1689599.1689796}, + acmid = {1689796}, + publisher = {IEEE Press}, + address = {Piscataway, NJ, USA} +} + +@article{Janiak_et_al_2008, + title={{Tabu search on GPU}}, + author={A. Janiak and W. Janiak and M. Lichtenstein}, + journal={Journal of Universal Computer Science}, + volume={14}, + number={14}, + pages={2416--2427}, + year={2008} +} + +@article{zhu_et_al_2008, + title={{SIMD tabu search for the quadratic assignment problem with graphics hardware acceleration}}, + author={W. Zhu and J. Curry and A. Marquez}, + journal={International Journal of Production Research}, + volume={48}, + number={4}, + pages={1035--1047}, + year={2010}, + publisher={Taylor \& Francis} +} + +@inproceedings{arenas2011, + author = {M. G. Arenas and A. M. Mora and G. Romero and P. A. Castillo}, + title = {{GPU computation in bioinspired algorithms: a review}}, + booktitle = {Proceedings of the 11th international conference on Artificial neural networks conference on Advances in computational intelligence - Volume Part I}, + series = {IWANN'11}, + pages = {433--440}, + year = {2011} +} + +@article{BlumMeta, + author = {C. Blum and A. Roli}, + title = {Metaheuristics in combinatorial optimization: Overview and conceptual comparison}, + journal = {ACM Comput. Surv.}, + volume = {35}, + issue = {3}, + month = {September}, + pages = {268--308}, + year = {2003} +} + +@inproceedings{catala2007, + title={Strategies for accelerating ant colony optimization algorithms on graphical processing units}, + author={A. Catala and J. Jaen and JA. Modioli}, + booktitle={Evolutionary Computation, 2007. CEC 2007. IEEE Congress on}, + pages={492--500}, + year={2007}, + organization={IEEE} +} +%-------------------------------- + +@inproceedings{Wong_et_al_2005, + title={Parallel evolutionary algorithms on graphics processing unit}, + author={M.L. Wong and T. T. Wong and K.L. Fok}, + booktitle={Evolutionary Computation, 2005. The 2005 IEEE Congress on}, + volume={3}, + pages={2286--2293}, + year={2005}, + organization={IEEE} +} +@article{Fok_et_al_2007, + title={Evolutionary computing on consumer graphics hardware}, + author={K.L. Fok and T.T. Wong and M.L. Wong}, + journal={Intelligent systems, IEEE}, + volume={22}, + number={2}, + pages={69--78}, + year={2007}, + publisher={IEEE} +} +@inproceedings{Wong_2009, + title={Parallel multi-objective evolutionary algorithms on graphics processing units}, + author={M.L. Wong}, + booktitle={Proceedings of the 11th Annual Conference Companion on Genetic and Evolutionary Computation Conference: Late Breaking Papers}, + pages={2515--2522}, + year={2009}, + organization={ACM} +} + +@inproceedings{Luo_et_al_2006, + title={{Cellular genetic algorithms and local search for 3-SAT problem on graphic hardware}}, + author={Z. Luo and H. Liu}, + booktitle={Evolutionary Computation, 2006. CEC 2006. IEEE Congress on}, + pages={2988--2992}, + year={2006}, + organization={IEEE} +} + +@inproceedings{Zhu_2009, + title={{A study of parallel evolution strategy: pattern search on a GPU computing platform}}, + author={W. Zhu}, + booktitle={Proceedings of the first ACM/SIGEVO Summit on Genetic and Evolutionary Computation}, + pages={765--772}, + year={2009}, + organization={ACM} +} + +@inproceedings{Arora_et_al_2010, + title={{Parallelization of binary and real-coded genetic algorithms on GPU using Cuda}}, + author={R. Arora and R. Tulshyan and K. Deb}, + booktitle={Evolutionary Computation (CEC), 2010 IEEE Congress on}, + pages={1--8}, + year={2010}, + organization={IEEE} +} + +@article{Munawar_et_al_2009hybrid, + title={{Hybrid of genetic algorithm and local search to solve max-sat problem using nvidia Cuda framework}}, + author={A. Munawar and M. Wahib and M. Munetomo and K. Akama}, + journal={Genetic Programming and Evolvable Machines}, + volume={10}, + number={4}, + pages={391--415}, + year={2009}, + publisher={Springer} +} + +@inproceedings{Van_et_al_2010parallel, + title={{Parallel hybrid evolutionary algorithms on GPU}}, + author={T.V. Luong and N. Melab and E-G. Talbi}, + booktitle={IEEE Congress on Evolutionary Computation (CEC), 2010 }, + pages={1--8}, + year={2010}, + organization={IEEE} +} + +@article{Van_et_al_2010local, + title={{Local search algorithms on graphics processing units. A case study: The permutation perceptron problem}}, + author={T. V. Luong and N. Melab and E-G. Talbi}, + journal={Evolutionary Computation in Combinatorial Optimization}, + pages={264--275}, + year={2010}, + publisher={Springer} +} + +@article{Van_et_al_2011b, + title={{GPU-Based approaches for multiobjective local search algorithms. a case study: the flowshop scheduling problem}}, + author={T. V. Luong and N. Melab and E-G. Talbi}, + journal={Evolutionary Computation in Combinatorial Optimization}, + pages={155--166}, + year={2011}, + publisher={Springer} +} + +@inproceedings{Melab_et_al_2010, + title={{GPU-based island model for evolutionary algorithms}}, + author={T.V. Luong. and N. Melab and E-G. Talbi}, + booktitle={Genetic and Evolutionary Computation Conference (GECCO)}, + year={2010} +} + + +@techreport{Cuda, + title = {{NVIDIA Cuda C Programming Best Practices Guide, http://developer.download.nvidia.com/compute/Cuda/2 3/toolkit/docs/NVIDIA Cuda BestPracticesGuide 2.3.pdf.}} +} + +@article{nowotniak, + title={{GPU-based massively parallel implementation of metaheuristic algorithms}}, + author={R. Nowotniak and J. Kucharski}, + journal={Automatyka}, + volume={15}, + number={3}, + pages={595--611}, + year={2011} +} + +@article{grid5000, +title={{Grid’5000 French nation-wide grid. https://www.grid5000.fr}}, +} + +@article{burkard1991qaplib, + title={{QAPLIB-A quadratic assignment problem library}}, + author={Burkard, R.E. and Cela, E. and Karisch, S. and Rendl, F.}, + url={http://www.seas.upenn.edu/qaplib/} +} + +@article{paradiseo, + title={{ParadisEO: A framework for the reusable design of parallel and distributed metaheuristics}}, + author={S. Cahon and N. Melab and E-G. Talbi}, + journal={Journal of Heuristics}, + volume={10}, + number={3}, + pages={357--380}, + year={2004}, + publisher={Springer} +} + +@book{garey, + author = {M. R. Garey and D. S. Johnson}, + title = {{Computers and Intractability; A Guide to the Theory of NP-Completeness}}, + year = {1990}, + isbn = {0716710455}, + publisher = {W. H. Freeman \& Co.}, + address = {New York, NY, USA} +} \ No newline at end of file diff --git a/BookGPU/Chapters/chapter9/ch9.tex b/BookGPU/Chapters/chapter9/ch9.tex new file mode 100644 index 0000000..dce1889 --- /dev/null +++ b/BookGPU/Chapters/chapter9/ch9.tex @@ -0,0 +1,903 @@ +\chapterauthor{Malika Mehdi}{CERIST Research Center, DTISI, 3 rue des frères Aissou, 16030 Ben-Aknoun, Algiers, Algeria} + +\chapterauthor{Lakhdar Loukil}{University of Oran, Algeria} + +\chapterauthor{Ahc\`{e}ne Bendjoudi}{CERIST Research Center, DTISI, 3 rue des frères Aissou, 16030 Ben-Aknoun, Algiers, Algeria} + +\chapterauthor{Nouredine Melab}{Université Lille 1, LIFL/UMR CNRS 8022, 59655-Villeneuve d’Ascq cedex, France} + +\chapter{Parallel GPU-accelerated Metaheuristics} +\label{chapter9} +\section{Introduction} +This chapter presents GPU-based parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics}, challenges and issues related to the particularities of the GPU architecture and a synthesis on the different implementation strategies used in the literature. The implementation of parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} on GPUs is not straightforward. The traditional models used in CPUs must be rethought to meet the new requirements of GPU architectures. This chapter is organized as follows. +Combinatorial optimization\index{Combinatorial~optimization} and resolution methods are introduced in Section~\ref{ch8:sec:optim}. The main traditional parallel models used for metaheuristics are recalled in Section~\ref{ch8:sec:paraMeta}. Section~\ref{ch8:sec:challenges} highlights the main challenges related to the GPU implementation of metaheuristics. A +state-of-the-art of GPU-based parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} is summarized in Section~\ref{ch8:sec:state}. Finally, a case study is presented in Section~\ref{ch8:sec:case} and some concluding remarks are given in Section~\ref{ch8:conclusion} + +\section{Combinatorial optimization} +\label{ch8:sec:optim} + +Combinatorial optimization\index{Combinatorial~optimization} (CO) is a branch of applied and discrete mathematics. +It consists in finding optimal configuration(s) among a finite set of possible configurations +(or solutions) of a given combinatorial optimization problem (COP). The set of all possible solutions noted $S$ is called solution space or search space. Each solution in $S$ is defined by its real cost calculated by an objective function. COPs are generally defined as follows~\cite{blumMeta}:\\ %(Definition~\ref{def:cops}) + + +%\begin{minipage}{0.5\linewidth} +A combinatorial problem $P=(S,f)$ can be defined by: +\begin{itemize} +\item a set of decision variables $X$, +\item an objective function $f$ to optimize (minimize or maximize) over the set $S$, +\item subject to constraints on the decision variables.\\ +\end{itemize} +%\end{minipage} + +COPs are generally formulated as mixed integer programming problems (MIPS) and most of them are NP-hard~\cite{garey}. According to the quality level of solutions and deadlines required +for solving an optimization problem, two classes of optimization +methods can be distinguished: \emph{exact methods} and +\emph{approximate methods}. Exact methods allow one to reach optimal +solution(s) of the handled optimization problem with a proof of its or +their optimality. The most known methods of this class are the +\emph{branch and bound technique}, \emph{dynamic programming}, +\emph{constraint programming}, \emph{A* algorithm}, etc. However, +optimization problems, whether practical or academic, are often +complex and NP-hard. Moreover, a large number of real-life +optimization problems encountered in science, engineering, economics +and business are usually large-size problems for which the size of +the potential solution domain increases dramatically with the size +of the problem instance. Such problems cannot be tackled using exact +methods due to the excessive computation time needed by these +methods to catch optimal solution(s). In such +situation, approximate methods (or \textit{metaheuristics}) offer an +alternative approach to solve these problems. Indeed, these methods +allow one to reach good quality solutions in reasonable computation time +compared to exact methods but with no guarantee to find optimal or +even bounded solutions. This is due to the nature of the search +process adopted by these approaches which consists in performing a +search in a subset of the whole search space.\\ + +Regarding the number of solutions considered at each iteration in +the search process, two classes of metaheuristics can be +distinguished~\cite{talbi2009mfdti}: \textit{solution-based} and +\textit{population-based} metaheuristics. In the rest of this chapter, the term \emph{s-metaheuristic} refers to solution-based metaheuristic and the term \emph{p-metaheuristic} refers to population-based metaheuristic. In s-metaheuristics, the search process starts with a single solution (generally set at random) and iteratively improves it by exploring +its neighborhood in the search space. The most known +methods in this class are local search methods that include +\emph{simulated annealing}\index{Metaheuristics!simulated~annealing}~\cite{Kirkpatrick1983SA}, \emph{tabu +search}~\cite{Glover1989TS}, \emph{iterated local search\index{Metaheuristics!iterated local search}}~\cite{stutzle2006ILSforQAP}, \emph{variable neighborhood search}~\cite{HansenMladenovic1997VNS}, etc. + +Unlike s-metaheuristics, p-metaheuristics start with a population of solutions and implement an iterative process that evolves the current population towards a new +population of better quality solutions. The process is repeated +until a stopping criterion is satisfied. \emph{Evolutionary +algorithms}, \emph{swarm optimization} and \emph{ant colonies} fall +into this class. + + +\section{Parallel models for metaheuristics}\label{ch8:sec:paraMeta} +Optimization problems, whether real-life or academic, are more often +NP-hard and CPU time and/or memory consuming. Metaheuristics allow +to significantly reduce the computational time of the search process +but remain time-consuming particularly when it comes to tackle +large-size problems. \\ + +The use of parallelism in the design of metaheuristics is a relevant +approach that is widely adopted by the combinatorial optimization +community for various reasons: + +\begin{itemize} + \item One of the main goals of parallelism is to reduce the search +time. This will allow the design of high performance optimization +methods and to solve large-size optimization problems. + + \item Sequential processor architectures have reached their +physical limit that prevents creating faster processors. The current +trend of microprocessor manufacturers consists in placing multiple +cores on a single chip. Nowadays, laptops and workstations are +multi-core processors. In addition, the evolution of network +technologies and the proliferation of broadband networks have made +possible the emergence of clusters of workstations (COWs), networks +of workstations (NOWS) and large-scale networks of machines (grids) +as platforms for high performance computing. +\end{itemize} + +From the granularity of parallelism point of view, three major parallel +models for metaheuristics can be distinguished~\cite{talbi2009mfdti}: \emph{algorithmic-level}\index{Metaheuristics!algorithmic-level parallelism}, +\emph{iteration-level} \index{Metaheuristics!iteration-level parallelism} and \emph{solution-level} as illustrated in Figure~\ref{ch8:fig:paraMeta}. \\ + +\begin{figure}[h!] +\centerline{\includegraphics[width=0.6\textwidth]{Chapters/chapter9/figures/paraMeta.pdf}} +\caption{Parallel models for metaheuristics} +\label{ch8:fig:paraMeta} +\end{figure} + +\begin{itemize} + +\item{In algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} parallel model, several self-contained +metaheuristics are launched in parallel. The parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} +may start with identical or different solutions (s-metaheuristics case) or populations (p-metaheuristics +case), their parameter settings such as the size of tabu list for +tabu search\index{Metaheuristics!tabu~search}, transition probabilities for ant colonies, mutation and +crossover probabilities for evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm}s may be the same +or different. The parallel processes may evolve independently or in +cooperative manner. In cooperative parallel models, the algorithms +exchange information related to the search during evolution in order +to find better and more robust solutions.} + +\item{In iteration-level\index{Metaheuristics!iteration-level parallelism} parallel model, the focus is on the +parallelization of each iteration of the metaheuristic. Indeed, +metaheuristics are generally iterative search processes. Moreover, +the most resource-consuming part of a metaheuristic is the +evaluation of the generated solutions at each iteration. For +s-metaheuristics (e. g. tabu search\index{Metaheuristics!tabu~search}, simulated +annealing, variable neighborhood search), the evaluation and +generation of the neighborhood is the most time-consuming step of +the algorithm particularly when it comes to deal with large +neighborhood sets. In this parallel model, the neighborhood is +decomposed into partitions, each partition is evaluated in a +parallel way. For p-metaheuristics (e. g. +evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm}s, ant colonies, swarm optimization), +iteration-level\index{Metaheuristics!iteration-level parallelism} parallel model arises naturally since these +metaheuristics deal with a population of independent solutions. In +evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm}s, for instance, the iteration-level\index{Metaheuristics!iteration-level parallelism} model +consists in decomposing the whole population into several partitions where +each partition is evaluated in parallel.} + +\item{In solution-level\index{Metaheuristics!solution-level~parallelism} parallel model, the focus is on the +parallelization of the evaluation of a single solution. This model +is useful when the objective function and/or the constraints are +time and/or memory consuming. Unlike the two previous parallel +models, the solution-level\index{Metaheuristics!solution-level~parallelism} parallel model is problem-dependent.} +\end{itemize} + +\section{Challenges for the design of GPU-based metaheuristics} +\label{ch8:sec:challenges} + +Developing GPU-based parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} is not straightforward. +The parallel models have to be rethought to meet the new requirements +of the GPU architecture. Several major issues have to be taken into account both at design and +implementation levels to develop efficient metaheuristics on GPU. +These issues are mainly related to the size and latency of the GPU memories, +thread synchronization and divergence, the distribution of tasks and data +transfer between the CPU and GPU~\cite{luongMultiStart}. + +\subsection{Data placement on a hierarchical memory} +\index{GPU Challenges!data~placement} +During the execution of metaheuristics on GPU, the different threads +may access multiple data structures from multiple memory spaces. These +memories have different sizes and access latencies. Nevertheless, faster +memories (registers, shared and constant memories) are generally very +small in size and the larger memories (global memory) are relatively slower. +On the other hand, p-metaheuristics require the exploration of a large +amount of individuals to diversify the search. Moreover, an efficient +execution of s-metaheuristics requires exploring large neighborhoods. +Thus, programmers have to take into account this point to efficiently place the different data structures of the metaheuristic on the different memories to benefit from both the +faster memories and the larger ones. A deep study has to be performed +on both the metaheuristic data structures (size and access frequency) +and the GPU memories (size and access latency) to identify which data +will be placed on which memory. Generaly, the most accessed ones should +be put on faster memories (registers, shared memory) and larger ones on +the lager memories (global memory). Moreover, an efficient mapping between +threads and the corresponding metaheuristic elements (one neighbor per thread, +one individual per thread, single population per threads block, one ant per +thread, etc.) must be defined to unsure a maximum occupancy of the GPU and +to cover CPU/GPU communication\index{GPU Challenges!CPU/GPU~communication} and memory access times.\\ + +According to the used metaheuristic and to the handled problem, the data +values may have different types and different ranges of their values. The data +types should then be chosen carefully and the ranges of the data values should +be analyzed to minimize the amount of occupied memory space.\\ + +In addition to the size and latency of GPU memories issues, the memory access pattern +is another important issue to be dealt with to speedup GPU-based metaheuristics. +Indeed, the different memories have been designed to achieve specific features that +programmers must take into account to optimize their codes and then to benefit from +these features. For instance, the global memory is optimized for coalesced accesses. +The texture, respectively the constant memory are read-only memories and optimized +for uncoalesced accesses respectively for simultaneously accesses of all threads to +the same location~\cite{luongMultiStart}. Therefore, to improve the performance of the kernel execution, the programmers should put coalesced data on global memory, uncoalesced read-only (e.g. metaheuristic instance data) on texture, concurrent read-only on constant memory (e.g. +data for fitness evaluation that all threads concurrently access), and the most accessed +data structures on the shared memory (e.g. population of individuals for a CUDA thread +block). + +\subsection{Threads synchronization} +\index{GPU Challenges!threads~synchronization} +The thread synchronization issue is caused by both the GPU architecture and the synchronization requirements +of the implemented method. Indeed, GPUs are based on a multi-core architecture +organized into several multi-processors (Streaming Multiprocessor SM) supporting the +SPMD model (Single Program Multiple Data). Each SM contains several cores executing +the same instruction of different threads following the SIMD model (Single Instruction +Multiple Data). These threads belong to a warp (a group of 32 threads) and handle +different data elements. Furthermore, an efficient execution of applications on GPU +is achieved when launching a large amount of threads (thousands of threads)~\cite{CUDA}. +However, the execution order of these thousands of threads is unknown by the programmer +making the prediction of their execution order a challenging issue. On an other hand, +the developer has to control explicitly the threads through the insertion of barrier +synchronizations in the codes to avoid concurrent accesses to data structures and to meet some requirements related to data-dependent synchronizations. + +\subsection{Thread divergence} + +Thread divergence\index{GPU Challenges!thread~divergence} is another challenging issue in GPU-based metaheuristics~\cite{cecilia, pugace, audreyANT}. Generally, metaheuristics contain irregular loops and conditional instructions when generating and evaluating the neighborhood (s-metaheuristics), respectively the population (p-metaheuristics) in the same block. In addition, the decision of applying or not a crossover or a mutation on an individual in a genetic algorithm\index{Metaheuristics!genetic~algorithm} and the exploration of different paths using an ant colony\index{Metaheuristics!ant~colony~optimization} are random operations. Threads of the same warp have to execute simultaneously instructions leading to different branches whereas in a SIMD model the threads of a same warp execute the same instruction at a time. Consequently, the different branches of a conditional instruction which is data-dependent lead to a serial execution of the different threads degrading the performance of the application in +terms of execution time. The challenge here is then to revisit the traditional irregular metaheuristic codes to eliminate these divergences. + +\subsection{Task distribution and CPU/GPU communication} + +The performance of GPU-based metaheuristics in terms of execution time could be improved +by choosing the most appropriate parallel model (algorithmic-level\index{Metaheuristics!algorithmic-level parallelism}, instruction-level, +solution-level\index{Metaheuristics!solution-level~parallelism}). Moreover, an efficient decomposition of the metaheuristic and efficient +assignment of code portions between the CPU and GPU should be adopted. The objective +is to take benefit from the GPU computing power without affecting the efficiency and +the behavior of the metaheuristic and without losing performance in CPU/GPU communication\index{GPU Challenges!CPU/GPU~communication} +and memory accesses. In order to decide which part of the metaheuristic will be executed +on which component, one should perform a careful analysis on the serial code of the +metaheuristic, identify the compute-intensive tasks (e.g. exploration of the neighborhood, +evaluation of individuals, etc.), and then offload them to the GPU, while the reminder +tasks still run on the CPU in a serial way. \\ + +On another hand, the CPU/GPU communication\index{GPU Challenges!CPU/GPU~communication} is done through the global memory which is a +slow memory making the memory transfer between the CPU and GPU time-consuming and can +significantly degrade the performance of the application. Therefore, accesses to this +memory should be optimized by minimizing the amount of transferred data between the +two components in order to reduce the communication time and then the whole execution +time of the metaheuristic. + +\section{State-of-the-art parallel metaheuristics on GPUs} +\label{ch8:sec:state} +After more than two decades of research devoted by the combinatorial optimisation +community for developing adequate parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} for different types of +parallel architectures (clusters, supercomputers and grids), the actual developement +of GPGPU brings new challenges for parallel metaheuristics\index{Metaheuristics!parallel~metaheuristics} on SIMD architectures.\\ + +The first works on metaheuristic algorithms implemented on GPUs have started on old +graphics cards before the appearance of modern GPUs equipped with high level +programming interfaces such as CUDA and OpenCL. Among these pioneering works we cite +the work of Wong \emph{et al.}~\cite{wongOldGPU2006} ($2006$) dealing with the implementation +of EAs on graphics processing cards and the work by Catala \emph{et al.} in~\cite{catala2007} ($2007$) where the ACO\index{Metaheuristics!ant~colony~optimization} algorithm is implemented on old GPU architectures. Yu \emph{et al.}~\cite{yu2005} and Li \emph{et al.}~\cite{li2007} proposed a full parallelization of genetic algorithm\index{Metaheuristics!genetic~algorithm}s on old GPU architectures using shader libraries based on Direct3D and OpenGL.\\ + +Such architectures are based on pre-configured pipelined stages used to accelerate +the transformation of 3D geometric primitives into pixels. Implementing a general-purpose +algorithm on such pre-configured architectures is very hard and requires the +tailoring of the algorithm's data and instructions to fit the pipelined stages +of the GPU. Since then, GPU architectures have evolved to become programmable using high level +programming interfaces. In this section we will focus only on recent state-of-the-art works +dealing with metaheuristics implementation on modern programmable GPUs. +In this review two classes are considered: (1) s-metaheuristics on GPUs and +(2) p-metaheuristics on GPUs. A comparative study is +done between the main works and a classification of the different existing strategies is proposed in Section~\ref{ch8:sec:synthesis}. + +\subsection{Implementing solution-based metaheuristics on GPUs} + + +A very basic local search algorithm starts with an initial solution generated either at random +or by the mean of a specific heuristic and is based on two elementary components: the generation +of neighborhood structures using an elementary move function and a selection function which +determines which solution in the current neighborhood +will replace the actual search point. The search continues as long as there is +improvement and stops when there is no better solution in the current neighborhood. +The exploration (or evaluation) of the different moves of a given neighborhood is done +independently for each move. Thus, the easiest way to accelerate a local search algorithm +is to parallelize the evaluation of the neighborhood (instruction-level parallelism). This +is by far the most used scheme in the literature for parallelizing local search algorithms +on GPUs. Nevertheless, small neighborhoods may lead to non optimal occupation of the CUDA +threads which may lead in its turn to an overhead due to the communication and memory latencies. +Therefore, large neighborhoods are necessary for efficient implementation of +local searches on GPUs.\\ + +Luong \emph{et al.}~\cite{luong2010large} proposed efficient mappings for large neighborhood +structures on GPUs. In this work, three different neighborhoods are studied and mapped to the +hierarchical GPU for binary problems. The three neighborhoods are based on the \emph{Hamming} distance. The move operators used in the three neighborhoods consider \emph{Hamming} distances of 1, 2 and 3 respectively (it consists on flipping the binary value of one, two or three positions at a time in the candidate binary vector, respectively). In~\cite{luong2010large}, each thread is associated to a unique solution in the neighborhood. The addressed issue is how to efficiently map the different neighborhoods on the device memory. More explicitly, how to calculate the memory index of each solution associated to each CUDA thread's \textit{id}. +%For 1-Hamming neighborhoods, as there is exactly n solutions in the neighborhood, the mapping of this neighborhood to CUDA threads is obvious: the CPU host offloads to GPU exactly $n$ threads, and each thread id is associated to one index in the binary vector. In the case of 2-Hamming and 3-Hamming neighborhoods, each thread id should be mapped respectively to two and three indexes in the candidate vector. +The three neighborhoods are implemented and experimented on the Permuted Perceptron Problem (PPP) using a tabu search\index{Metaheuristics!tabu~search} algorithm (TS). Accelerations from $9.9 \times$ to $18.5 \times$ are obtained on different problem sizes.\\ % The experiments are performed on an Intel Xeon 8 cores 3GHz coupled with an NVIDIA GTX 280 card.\\ + +In the same context, Deevacq \emph{et al.}~\cite{audreyANT} proposed two parallelization strategies inspired by the multi-walk parallelization strategy, of a 3-opt iterated local search\index{Metaheuristics!iterated local search} algorithm (ILS) over a CPU/GPU architecture. In the first strategy, each LS is associated to a unique CUDA thread and improves a unique solution by generating +its neighborhood. On the contrary, the second strategy associates each solution to a +CUDA block and the neighborhood exploration is parallelized on the block threads. In the first strategy, since several LS are executed on different solutions on each MP, the data structures +should be stored on the global memory while the exploration of a single solution at a +time in the second strategy allows the use of the shared memory to store the related +data structures. The two strategies have been experimented on standard benchmarks of +the Traveling Salesman Problem (TSP) with sizes varying from $100$ to $3038$ cities. The results indicate that increasing the number of solutions to be explored simultaneously improves the speedup in the two strategies but on the same time it decreases final solution quality. The greater speedup factor reached by the second strategy is $6 \times$.\\ + +The same strategy is used by Luong \emph{et al.} in~\cite{luongMultiStart} to implement multi-start parallel local search algorithms (a special case of the algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} parallel model +where several homogeneous LS algorithms are used). The multi-start model is combined with iteration-level\index{Metaheuristics!iteration-level parallelism} parallelism: several LS algorithms are managed by the CPU and the neighborhood evaluation step of each algorithm is parallelized on the GPU (each GPU thread is +associated with one neighbor and executes the same evaluation function kernel). +The advantage of such a model is that it allows a high occupancy of the GPU +threads. Nevertheless, memory management\index{GPU Challenges!memory~management} causes new issues due to the quantity of +data to store and to communicate between CPU and GPU. A second proposition for +implementing the same model on GPU consists in implementing the whole LS processes +on GPU and each GPU thread is associated to a unique LS algorithm. This solves the +communication issue encountered in the first model. In addition, a memory management\index{GPU Challenges!memory~management} +strategy is proposed to improve the efficiency of the algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} model: +texture memory is used to avoid memory latency due to uncoalesced memory accesses. +The proposed approaches are implemented on the quadratic assignment problem (QAP) using +CUDA. The acceleration rates obtained for the +algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} with usage of texture memory rise from $7.8\times$ to $12\times$ (for different +QAP benchmark sizes). \\ + +Janiak \emph{et al.}~\cite{Janiak_et_al_2008} implemented two algorithms for +TSP and the flow shop scheduling problem (FSP). These algorithms are based on a +multi-start tabu search\index{Metaheuristics!tabu~search} model. Both of the two algorithms exploit multi-core CPU and GPU. +A full parallelization on GPU is adopted using shader libraries where each thread is +mapped with one tabu search\index{Metaheuristics!tabu~search}. However, even though their experiments report that the +use of GPU speedups the serial execution almost $16 \times$, the mapping of one +thread with one tabu search\index{Metaheuristics!tabu~search} requires a large number of local search algorithms to +cover the memory access latency. The same mapping policy is adopted by Zhu \emph{et al.} in~\cite{zhu_et_al_2008} (one thread is associated to one local search) solving the quadratic assignment problem but using the CUDA toolkit instead of shader libraries.\\ + +Luong \emph{et al.}~\cite{luong2012ppsn} proposed a GPU-based implementation of hybrid metaheuristics on heterogeneous parallel architectures (multi core CPU coupled to one GPU). The challenges of using such a heterogeneous architecture consist on the task distribution between the CPU cores and the GPU in such a way to have optimal performances. Among the three traditional parallel models (solution-level\index{Metaheuristics!solution-level~parallelism}, iteration-level\index{Metaheuristics!iteration-level parallelism} and algorithmic-level\index{Metaheuristics!algorithmic-level parallelism}), the authors pointed out that the most convenient model for the +considered heterogeneous architecture is a hybrid model combining iteration-level\index{Metaheuristics!iteration-level parallelism} +and algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} models. Several CPU threads execute several instances of the same +S-metaheuristic in parallel while the GPU device is associated to one CPU core and used +to accelerate the neighborhood calculation of several S-metaheuristics in the same time. + In order to efficiently exploit the remaining CPU cores, a load +balancing heuristic is also proposed in order to decide on the number of additional +S-metaheuristics to launch on the remaining CPU cores relatively to the efficiency of the GPU calculations. The proposed approach is applied to the QAP using several instances of FANT algorithm~\cite{taillardFant}. \\ + +All the previous works exploit the same parallel models used on CPUs based on the +task parallelism. A different implementation approach is proposed by Paul in~\cite{gerald2012} +to implement a simulated annealing\index{Metaheuristics!simulated~annealing} (SA) algorithm for the QAP on GPUs. Indeed, the author used +a preinitialized matrix \emph{delta} in which the incremental evaluation of simple swap moves are +calculated and stored relatively to the initial permutation $p$. For the GPU implementation, +the authors used the parallel implementation of neighborhood exploration. The time consuming +tasks in the SA-matrix are identified by the authors as: updating the matrix and passing through it to select the next accepted move. To initialize the delta matrix, several threads from different blocks explore different segments of the matrix (different moves) at the same time. In order to select the next accepted swap several threads are also used. Starting from the last move, a group of threads explore different subsets of the delta matrix. The shared memory is used to pre-load all the necessary elements for a given group of threads responsible of the updating of the delta matrix. The main difference in this work compared to the previous works resids in the introduction of a data parallelism using the precalculated delta matrix. The use of this matrix allows to increase the number of threads involved in the evaluation of a single move. Experimentations are done on standard QAP instances from the QAPLIB~\cite{burkard1991qaplib}. Speedups up to $10 \times$ are achieved by the GPU implementation compared +to the same sequential implementation on CPU using SA-matrix.\\ + +\subsection{Implementing population-based metaheuristics on GPUs} + +State-of-the-art works dealing with the implementation of p-metaheuristics on GPUs generally rely +on parallel models and research efforts done for parallelizing different classes of p-metaheuristics over different types of parallel architectures: supercomputers, clusters and computational grids. Three main classes of p-metaheuristics are considered in this section: evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm}s (EAs), ant colony\index{Metaheuristics!ant~colony~optimization} optimization (ACO\index{Metaheuristics!ant~colony~optimization}) and particle swarm optimization\index{Metaheuristics!particle swarm optimization} (PSO). + +\subsubsection*{Evolutionary Algorithms} + +Traditional parallel models for EAs are classified in three main classes: coarse grain models using several sub-populations (islands), master-slave models used for the parallelization of CPU intensive steps (evaluation and transformation) and cellular models based on the use of one population disposed (generally) on a toroidal grid. + +The three traditional models have been implemented on GPUs by several researchers for different +optimization problems. The main chalenges to be raised when implementing the traditional models on GPUs concern (1) the saturation of the GPU in order to cover memory latency by calculations, and (2) efficent usage of the hierarchical GPU memories.\\ + +In~\cite{kannan}, Kannan and Ganji presented a CUDA implementation of the drug discovery application +Autodock (molecular docking application). Autodock uses a genetic algorithm\index{Metaheuristics!genetic~algorithm} to find optimal docking +positions of a ligand to a protein. The most time consuming task in Autodock is the fitness function +evaluation. The fitness function used for a docking problem consists in calculating the energy of the ligand-protein complex (sum of intermolecular energies). The authors explored two different approaches to evaluate the fitness function on GPU. In the first approach, each GPU thread calculates the energy function of a single individual. This approach requires the use of large size populations to saturate the GPU (thousands of individuals). In the second approach each individual is associated to one thread block. The evaluation of the energy function is performed by the threads of the same block. This allows the use of medium population sizes (hundreds of individuals) and the acceleration of a single fitness +evaluation. Another great advantage of the per block approach resides in the use of shared memory instead of global memory to store all the information related to each individual. The obtained speedups range from $10 \times$ to $47 \times$ for population sizes +ranging from $50$ to $10000$. \\ + +Maitre \emph{et al.}~\cite{maitre2009} also exploited the master-slave parallelism of EAs on GPUs using EASEA. EASEA is a C-like metalanguage for easy development of EAs. The user writes a description of the problem specific components (fitness function, problem representation, etc) in EASEA. The code is then compiled to obtain a ready to use evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm}. The EASEA compiler uses genetic algorithm\index{Metaheuristics!genetic~algorithm}LIB and EO Libraries to produce C++ or JAVA written EA codes. In~\cite{maitre2009}, the authors proposed an extension of EASEA to produce CUDA code from the EASEA files. This extension has been used to generate a master-worker parallel EA in which the sequential algorithm is maintained on CPU and the population is sent to GPU for evaluation. Two problems have been considered during the experiments: a benchmark mathematical function and a real problem (molecular structure prediction). In order to maximize the GPU +occupation, very large populations are used (from $2000$ to $20000$). Even though transferring such large +populations from the CPU to the GPU device memory at every generation is very costly, the authors reported important speedups on the two problems on a GTX260 card: $105 \times$ is reported for the benchmark function while for the real problem the reported speedup is $60 \times$. This may be best explained by the complexity of the fitness functions. Nevertheless, there is no indication in the paper about the memory management\index{GPU Challenges!memory~management} of the populations on GPU.\\ + +The master-slave model is efficient when the fitness function is highly time intensive. +Neverethless, it requires the use of large size populations in order to saturate the GPU unless the per-block is used (one individual per-block) when the acceleration of the fitness function itself is possible. The use of many sub-populations of medium sizes is another way to obtain a maximum occupation of the GPU. This is coarse grained prallelism (island model).\\ + +The coarse grained model is used by Pospichal \emph{et al.} in~\cite{pospichal10} to implement a parallel genetic algorithm\index{Metaheuristics!genetic~algorithm} on GPU. In this work the entire genetic algorithm\index{Metaheuristics!genetic~algorithm} is implemented on GPU. This choice is motivated by the overhead induced by the CPU/GPU communication\index{GPU Challenges!CPU/GPU~communication} when only population evaluation is performed on GPU. Each population island is affected to a CUDA thread block and each thread is responsible of a unique individual. Sub-populations are stored on shared memory of each block. Nevertheless, because inter-block communications are not possible on the CUDA architecture, the islands evolve independently in each block and migrations are performed +asynchronously through the global memory. That is, after a given number of generations, selected individuals for migration from each island are copied to the GPU global memory part of the neighbor island and then to its shared memory to replace the worst individuals in the local population. The experiments are performed on three benchmark mathematical functions. During these experiments, the island sizes are varied from $2$ to $256$ individuals and island numbers from $1$ to $1024$. The maximum performance is achieved for high number of islands and increasing population sizes.\\ + +The same strategy is also adopted by Tsuitsui and Fujimoto in~\cite{tsutsuiGAQAP} to implement a coarse grained genetic algorithm\index{Metaheuristics!genetic~algorithm} on GPU to solve the quadratic assignment problem (QAP). Initially, several sub-populations are created on CPU and transfered to the global memory. The sub-populations are organized in the global memory into blocks of $8$ individuals in such a way to allow coalesced memory access by the threads of the same thread block. Each sub-population is allocated to a single thread block in the GPU and transfered to the shared memory to start evolution. Population evaluation and transformation are done in parallel by the different threads of a given block. Migration is also done through the global memory. +Experiments are performed on standard QAP benchmarks from the QAPLIB~\cite{burkard1991qaplib}. The GPU implementation reached speedups of $2.9\times$ to $12.6 \times$ compared to a single core implementation of a coarse grained genetic algorithm\index{Metaheuristics!genetic~algorithm} on a Intel i7 processor.\\ + +Nowotniak \emph{et al.}~\cite{nowotniak} proposed a GPU-based implementation of quantum inspired genetic algorithm\index{Metaheuristics!genetic~algorithm} called QIGA. The used parallel model is a hierarchical model based on two levels: each thread in a block transforms a unique individual and a different population is assigned to each block. The algorithm is entirely run on GPU. A different instance of the QIGA is run on each block and the computations have been shared between 8 GPUs. This approach is very convenient to speedup the experimental process on metaheuristics +that require several independent runs of the same algorithm in order to asses statistical efficiency. The populations are stored in the shared memory, the data matrix used for fitness evaluation is placed in read only constant memory and finally seeds for random numbers generated on the GPU are stored in the global memory.\\ + +In coarse grained parallelism, the use of the per-block approach to implement +the islands (one sub-population per thread block) is almost natural and it +allows the use of shared memory to store the sub-populations. Fine grained +parallel models for EAs (cellular EAs) have been used by many authors to implement +parallel EAs on GPUs. Indeed, the fine grained parallelism of cEAs fits perfectly to +the SIMD architecture of the GPU. \\ + +Pinel \emph{et al.} in~\cite{pinel2012JPDC} developed a highly parallel synchronous cellular genetic algorithm\index{Metaheuristics!genetic~algorithm} (CGA), called GraphCell, to solve the independent task scheduling problem on GPU architectures. In CGAs, the population is arranged into a two dimensional toroidal grid where only neighboring solutions are allowed to interact with each other during the recombination step. In GraphCell, two recombination operators for CGA are especially designed to run efficiently on GPU. Indeed, instead of assigning a single thread to each solution of the population to perform the recombination, in GraphCell, a single thread is assigned to each task of each solution. Offsprings are created by independently modifying the assignment of some tasks in the current solution. Mainly, each thread chooses +one neighboring solution in the grid as second parent using different selection strategies and assigns one task of the solution (first parent) to the machine for which the same task is assigned in the second parent. This +way, the number of threads used for the recombination step is equal to: population size $\times$ size of the solution (number of tasks). This leads to a high number of threads used to accelerate the recombination operators especially when dealing with large instances of the problem. In addition to the recombination operators, the rest of the CGA steps are also parallelized on GPU (fitness evaluation, mutation and replacement).\\ + +A similar work is proposed by Vidal and Alba in~\cite{albaCGAGPU} where a CGA using a toroidal grid is completely implemented on GPU. A direct mapping between the population and the GPU threads is done. At each step, several threads execute the same operations on each individual independently: initialization, computing the neighborhood, selection, crossover, mutation and evaluation. A synchronization is done for all threads to perform the replacement stage and form the next generation. +All the data of the algorithm is placed on the global memory. Several experiments have been performed on a set of standard benchmark functions with different grid sizes ranging from $32^2$ to $512^2$. +The speedups reached by the GPU implementation against the CPU version range from $5\times$ to $24\times$ and increases as the size of the population increases. However, the CPU implementation run faster than the GPU version for all the tested benchmarks when the size of the population is set to $32^2$. When the size of the population is too small, there is not enough computations to cover the overhead created by the call of kernel functions, CPU/GPU communication\index{GPU Challenges!CPU/GPU~communication}s, synchronisation and acces to global memory. Finally, an interesting review on GPU parallel computation in bio-inspired algorithms is proposed by Arenas \emph{et al.} in~\cite{arenas2011}. \\ + +\subsubsection*{Ant Colony Optimization} + +Ant colony optimization (ACO\index{Metaheuristics!ant~colony~optimization}) is another p-metaheuristic subject to parallelization on GPUs. State-of-the-art works on parallelizing ACO\index{Metaheuristics!ant~colony~optimization} focuses on accelerating the tour construction step performed by each ant by taking a task-based parallelism approach, with pheromone deposition on the CPU. + +In~\cite{cecilia}, Cecilia \emph{et al.} presented a GPU-based implementation of ACO\index{Metaheuristics!ant~colony~optimization} for TSP where the two steps (tour construction and pheromone update) are parallelized on the GPU. A data parallelism approach is used to enhance the performance of the tour construction step. The authors used two categories of artificial ants: queen ants associated with CUDA thread-blocks and worker ants associated with CUDA threads. A queen ant represents a simulated ant and worker ants collaborate with the queen ant to accelerate the decision about the next city to visit. The tour construction step of each queen ant is accelerated. Each worker ant maintains a history of the search in a tabu list containing a chronological +ordering of the already visited cities. This memory is used to determine the feasible neighborhood. After all queen ants have constructed their tours, the pheromone trails are updated. For pheromone update, several GPU techniques are also used to increase the data bandwidth of the application mainly by the use of precalculated matrices that are easily updated by several threads (one thread per matrix entry). The achieved speedups are $21 \times$ for tour construction and $20 \times$ for pheromone updates.\\ + +In another work, Tsuitsui \emph{et al.}~\cite{tsutsui} proposed a hybrid algorithm combining ACO\index{Metaheuristics!ant~colony~optimization} metaheuristic and Tabu search (TS)\index{Metaheuristics!tabu~search} implemented on GPU to solve the QAP. A solution of QAP is represented as a permutation of ${1,2,..,n}$ with $n$ being the size of the problem. The TS algorithm is based on the 2-opt neighborhood (swapping of two elements $(i,j)$ in the permutation). The authors pointed out that the move cost of each neighbor depends on the couple $(i,j)$. Two groups of moves are formed according to the move cost. In order to avoid thread divergence\index{GPU Challenges!thread~divergence} within the same warp, the neighborhood evaluation is parallelized in such a way to assign only moves of the same cost to each thread warp. This strategy is called MATA for Move-cost Adjusted Thread Assignment. Concerning the memory management\index{GPU Challenges!memory~management}, all the data of the ACO\index{Metaheuristics! +ant~colony~optimization} (population, pheromone matrix), QAP matrices, TS tabu list, are placed on the global memory of the GPU. Shared memory is used only for working data common to all threads in a given block. + All the +steps of the hybrid algorithm ACO\index{Metaheuristics!ant~colony~optimization}-TS (ACO\index{Metaheuristics!ant~colony~optimization} initialization, pheromone update, construct solutions, applying TS) are implemented as kernel functions on the GPU. The GPU/CPU communication are only used to transfer the best so far solution in order to verify termination conditions. The experiments performed on standard QAP benchmarks showed that the GPU implementation using MATA obtained a speedup of $19 \times$ compared to the CPU implementation, against a speedup of only $5 \times$ when MATA is not used. \\ + +\subsubsection*{Particle Swarm Optimization} +In~\cite{zhou2009} Zhou and Tan proposed a full GPU implementation of a standard PSO algorithm. All the data is stored in global memory (velocities, positions, swarm population, etc). Only working data is copied to shared memory by each thread. The four steps of the PSO have been parallelized on GPU: Fitness evaluation of the swarm, update of local best and global best of each particle and update of velocity and position of each particle. The same strategy is used to parallelize the first and last steps: the evaluation of fitness functions is performed in parallel for each dimension by several threads. It is the case for the update of position and velocities of each particle: one dimension at a time is updated for the whole swarm by several threads. Random numbers needed for updating the velocities and positions for the whole PSO processes are generated on CPU at the starting of the algorithm and transferred to the GPU global memory. For the steps 2 and 3 (update of local +best and global best of each particle), the GPU threads are mapped to the N particles of the swarm one to one. Experiments done on four benchmark functions show speedups ranging from $3.7 \times$ to $9.0 \times$ for swarm sizes ranging from $400$ to $2800$.\\ + +\subsection{Synthesis of the implementation strategies} +\label{ch8:sec:synthesis} +After reviewing some works dealing with GPU-based implementation of metaheuristics, +in this section we will try to come up with a classification of the different +strategies used in the literature for the implementation of metaheuristics on GPUs. +One may distinguish between the parallel models adopted in each metaheuristic (design level) and the way they are exploited on GPU architectures (implementation level). Indeed, even though the parallelization models used in most works for GPUs are inspired from the traditional parallel models of each metaheuristic (on CPU), their implementation could take a different way and sometimes it may result in new parallel models customized for GPUs.\\ + +Traditional parallel models for metaheuristics are based on an intuitive task parallelism: the independent tasks of the algorithms are simply parallelized. For example, in the case of s-metaheuristics, the evaluation of large neighborhoods could be done in parallel since there is no synchronization at this step of the algorithm. That is the case of EAs when it comes to apply the evaluation step. Nevertheless, because of the particularity of the GPU architecture, some authors used new implementation techniques to enhance the data parallelism in the sequential algorithms in order to increase the data throughput of the application.\\ + +From this observation we propose the following classification based on 2 levels: design level and implementation level as illustrated in Figure~\ref{ch8:fig:classification}. The design level regroups the three classes of parallel models used in metaheuristics (solution-level\index{Metaheuristics!solution-level~parallelism}, iteration-level\index{Metaheuristics!iteration-level parallelism}, algorithmic-level\index{Metaheuristics!algorithmic-level parallelism}) with examples for s-metaheuristics, EAs, ACO\index{Metaheuristics!ant~colony~optimization} and PCO. This classification is principally built from the reviewed state-of-the-art works in the previous section. The implementation level refers to the way these parallel design models are implemented on GPU. This classification focuses only on the mapping strategies between the GPU threads and the parallelized tasks (neighborhood evaluation, solution construction and so on). The different implementation strategies are explained in the following sections.\\ + +\begin{figure}[h] +\centerline{\includegraphics[width=1\textwidth]{Chapters/chapter9/figures/classification.pdf}} +\caption{A two level classification of state-of-the-art GPU-based parallel metaheuristics.} +%[Comparison of number of cores in a CPU and in a GPU] +\label{ch8:fig:classification} +\end{figure} + + +\subsubsection*{GPU thread mapping for solution-level parallelism} +\index{GPU-based Metaheuristics!GPU-thread mapping} +Parallel models at solution level consists on parallelizing a time intensive atomic task of the algorithm. Generally, it consists on the fitness evaluation~\cite{kannan}. Nevertheless, crossover operators have also been parallelized by some authors~\cite{pinel2012JPDC}. This kind of models are not always possible as they are problem dependent. The GPU implementation of solution level models uses the per-block mapping: each solution is associated to a block of threads. A second level of parallelism is used inside each block to parallelize the fitness evaluation of a single solution. This kind of mapping allows the use of shared memory to store the data structures of the solution and do not require the use of very large neighborhoods or populations.\\ +%data parallelism in SA-matrix to parallelize +\subsubsection*{GPU thread mapping for iteration-level parallelism} +\index{GPU-based Metaheuristics!GPU-thread mapping} +Iteration-level parallelism consists on parallelizing the tasks performed independently on different solutions. Different mapping strategies are adopted in the reviewed works to implement these models. + +In Figure \ref{ch8:fig:classification}, the first example of iteration-level\index{Metaheuristics!iteration-level parallelism} parallelism is the parallel evaluation of neighborhoods in s-metaheuristics. In most of the reviewed works, a per-thread mapping approach is used: each solution of the neighborhood is mapped to a unique thread in the GPU for evaluation~\cite{luong2010large, audreyANT}. The same mapping is used for master-slave parallel EAs to accelerate the evaluation of large populations. This kind of mappings is only efficient for very large neighborhoods and very large populations (to saturate the GPU). Many authors have pointed out that the use of such large populations (or neighborhoods) may lead to an overhead due to the communication costs between the CPU and the GPU (if the sequential part of the algorithm is placed on CPU). In order to circumvent this issue, many authors have implemented the entire algorithm on GPU~\cite{pospichal10}. On the other hand, as several solutions may be affected +to the same thread block in the GPU, shared memory +could not be used and all the data should be placed on global memory. +%pheromone update data parallelism matrices + +\subsubsection*{GPU thread mapping for algorithmic-level parallelism} +\index{GPU-based Metaheuristics!GPU-thread mapping} +Algorithmic-level parallelism consists on launching several self-contained algorithms in parallel. In the previously reviewed works two algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} models have been used: the multi-start model and the island model (parallel EAs).\\ + +The implementation of the multi-start model is based on two different mapping strategies~\cite{luongMultiStart, audreyANT}: (1) each local search is associated to a unique thread, (2) each solution (from multiple neighborhoods) is associated to a unique thread. +The first mapping strategy (one thread per LS) presents a big drawback: the number of LS to use should be very large to saturate the GPU and cover the memory access latency. On the other hand, the evaluation of the neighborhood of a single LS by one thread is time intensive. Furthermore, shared memory could not be used to store the huge data generated by the different neighborhoods. In the second mapping strategy, the LS algorithms are placed on CPU and the neighborhood evaluation of each LS is parallelized on GPU using per-thread mapping strategy (one thread per solution). This comes to a hierarchical parallel model combining algorithmic-level\index{Metaheuristics!algorithmic-level parallelism} parallelism (multi-start) with iteration-level\index{Metaheuristics!iteration-level parallelism} parallelism (master-worker).\\ + +In the island model, the same mapping is used in all the reviewed works~\cite{tsutsuiGAQAP, nowotniak, maitre2009}: each sub-population (island) is associated to one thread block in the GPU. A second level of parallelism is used inside the block to parallelize the evaluation step of the local population. Migrations are always performed through the global memory as inter-block communications are impossible in CUDA. The first advantage of this hierarchical implementation is that it allows the occupation of a large number of threads even for medium population sizes. The second advantage consists on using shared memory to store sub-populations to benefit from the low latency of shared memory.\\ + +\section{Frameworks for metaheuristics on GPUs} +\label{ch8:sec:frameworks} + +After the first pioneering works of metaheuristics on graphics processing units, +the next challenge is to provide easy to use frameworks and libraries for rapid development +of metaheuristics on GPUs. Although the works on this subject are not yet mature +and do not cover the main metaheuristic algorithms, we will present the only three +works to our knowledge, which propose open source frameworks for developing +metaheuristics on GPUs.\\ + +The three frameworks reviewed in this section are: + PUGACE\index{GPU-based frameworks!PUGACE}~\cite{pugace}, ParadisEO-MO-GPU\index{GPU-based frameworks!ParadisEO-MO-GPU}~\cite{paradiseoGPU}, and libCudaOptimize\index{GPU-based frameworks!libCudaOptimize}~\cite{libcuda}. PUGACE\index{GPU-based frameworks!PUGACE} is a framework for implementing EAs on GPUs. Paradiseo-GPU is an extension of the framework ParadisEO~\cite{paradiseo} for implementing s-metaheuristics on GPU. Finally, libCudaOptimize\index{GPU-based frameworks!libCudaOptimize} +is a library intended for the implementation of p-metaheuristics on GPU. +The three frameworks are presented in more details in the following. + +\subsection{PUGACE\index{GPU-based frameworks!PUGACE}: A framework for implementing evolutionary computation on GPUs} +PUGACE\index{GPU-based frameworks!PUGACE} is a generic framework for easy implementation of cellular evolutionary +algorithms on GPUs implemented using C and CUDA. It is based on the frameworks MALLBA +and JCell (a framework for cellular algorithms). The authors justified the choose of +cellular evolutionary algorithm\index{Metaheuristics!evolutionary~algorithm} by the good feedback found in the literature concerning +its efficient implementation on GPUs compared to other parallel models for EAs (island, +master-slave). The main standard evolutionary operators are already implemented in PUGACE\index{GPU-based frameworks!PUGACE}: +different selection strategies, standard crossover and mutation operators (\emph{PMX, swap, +2-exchange}, etc.). Different problem encoding are also supported. The framework is +organized as a set of modules in which the different functionalities are separated +as much as possible in order to facilitate the extension of the framework. Despite, all +the functions and procedures that execute on GPU are implemented in the same file kernel.cu. \\ + +The implementation strategy adopted on the GPU is as follows. Population initialization +is done on the CPU side and the population is transferred to the GPU. On the GPU side, +each individual is associated to a unique CUDA thread. The function evaluation and mutation +are done on the GPU while selection and replacement are maintained on the CPU. In order +to avoid thread divergence\index{GPU Challenges!thread~divergence} appearing in the same CUDA thread block at the crossover step +(because of the probability of application which may give different results from one +thread to the other), the decision of applying or not a crossover is taken at the block +level and applied to all the individuals within the block. It is the decision on the choose +of the cutting point for the crossover.\\ + +The framework is validated on standard benchmarks of the quadratic assignment problem (QAP). +Speedups of $15.44 \times$ to $18.41 \times$ are achieved compared to a CPU implementation of a cEA using population sizes rising from 512 to 1024 and from 1024 to 2048. + +% The authors noticed an +% improvement on the speedup when the size of the population increases. This is best explained +% by the linear increasing of execution time on CPU side while a sublinear increasing is +% occuring on GPU side (due to a better exploitation of the GPU threads). Neverethless, +% dispite the positive impact of large populations on th parallel efficieny of the implementation +% on GPU, a study on the impact on the final solution quality when using such large populations +% is to be done. Indeed, too large populations on EAs may lead to high diversification of the +% search and poor intensification capabilities, which leads to poor results. +% For the moment, plateforms whith more than one CPU and one GPU are not yet supported in PUGACE\index{GPU-based frameworks!PUGACE}. +% No details on how to get PUGACE\index{GPU-based frameworks!PUGACE} code source are given in the paper. + +\subsection{Paradiseo-MO-GPU} + +Melab \emph{et al.}~\cite{paradiseoGPU} developed a reusable framework ParadisEO-MO-GPU\index{GPU-based frameworks!ParadisEO-MO-GPU} for parallel local search metaheuristics (s-metaheuristics) on GPUs. It focuses on +iteration-level\index{Metaheuristics!iteration-level parallelism} parallel model of S-Metaheuristics which consists in exploring +in parallel the neighborhood of a problem solution on GPU. The framework, +implemented using C++ and CUDA, is an extension of the ParadisEO~\cite{paradiseo} framework +previously developed by the same team for parallel and distributed metaheuristics on both dedicated parallel hardware platforms and computational grids. The objective of this framework is to facilitate the development of GPU-based metaheuristics providing a transparent use of +GPUs to users that are unfamiliar with advanced features of all parallelization +techniques and deployment on GPUs. The framework allows one to efficiently manage +the hierarchical organization of the memories (latencies and sizes) of the GPU +and its communication with the CPU as well as the minimizing of the user +involvement in its management.\\ + +\begin{figure}[h] +\centerline{\includegraphics[width=0.8\textwidth]{Chapters/chapter9/figures/paradiseoGPU.pdf}} +\caption{The squelton of the ParadisEO-MO-GPU\index{GPU-based frameworks!ParadisEO-MO-GPU}.} +%[Comparison of number of cores in a CPU and in a GPU] +\label{ch1:fig:paradiseoGPU} +\end{figure} + +The framework is based on a master-worker model where the master is the CPU and the workers are threads executed by the processing cores of the GPU. The CPU executes the serial part of the metaheuristic and sends only the current solution to the GPU to minimize the transfer cost. The GPU, on its side, generates the neighboring of the received solution and evaluates them at each iteration. All the threads execute the same kernel and according to a static mapping table between the threads and the neighbors where each thread is associated with exactly one neighbor evaluation. After all the neighborhood is generated and evaluated, +it is sent back to the CPU which selects the best solution. + +\subsection{libCudaOptimize: an open source library of GPU-based metaheuristics} +\index{GPU-based frameworks!libCudaOptimize} +LibCudaOptimize~\cite{libcuda} is a C++/Cuda open source library for the design and implementation of metaheuristics on GPUs. Until now, the metaheuristics supported by LibCudaOptimize are: scatter search, differential evolution and particle swarm optimization\index{Metaheuristics!particle swarm optimization}. Nevertheless, the library is designed in such a way to allow further extensions for other metaheuristics and it is still on development phase by the authors. The parallelization strategy adopted on GPU is principally based on fitness evaluation. The sequential structure of the optimization algorithms are maintained on CPU. + +\section{Case study: Accelerating large neighborhood LS method on GPUs for solving the Q3AP} +\label{ch8:sec:case} + +In this case study, a large neighborhood GPU-based local search\index{GPU-based Metaheuristics!GPU-based~local~search} method for solving the quadratic 3-dimensional assignment problem (Q3AP) will be presented. The local search method is an iterated local search\index{Metaheuristics!iterated local search} (ILS)~\cite{stutzle2006ILSforQAP} +using an embedded tabu search\index{Metaheuristics!tabu~search} (TS) algorithm. The ILS principle consists in executing iteratively the embedded local search, +each iteration of the local search process starting from a disrupted local optima reached by the previous local search process. +The disruption heuristic is a performance parameter of an ILS algorithm and should be judiciously defined. A template of an +ILS algorithm is given by the algorithm \ref{ch8:ils_algorithm_template}.\\ + +\begin{algorithm}[H] + \SetAlgoLined + %\KwData{this text} + %\KwResult{how to write algorithm with \LaTeX2e } + $s_{0}$=GenerateInitSol()\; + $s^*$=LocalSearch($s_0$)\; + \Repeat{a maximum number of iterations is reached}{ + $s'$=Perturbate($s^*,history$)\; + $s^{*'}$=LocalSearch($s'$)\; + $s^*$=AcceptationCriteria($s^*,s^{*'},history$)\; + + } +\caption{Iterated local search template} +\label{ch8:ils_algorithm_template} +\end{algorithm} + +% +% \begin{algorithm} +% % \label{ch8:ils_algorithm_template} +% \caption{iterated local search\index{Metaheuristics!iterated local search} template} +% \begin{algorithmic}[1] +% +% \STATE $s_{0}$=\texttt{GenerateInitSol}(); +% +% \STATE $s^*$=\texttt{LocalSearch}($s_0$); +% +% \REPEAT +% \STATE $s'$=\texttt{Perturbate}($s^*,history$); +% \STATE $s^{*'}$=\texttt{LocalSearch}($s'$); +% \STATE $s^*$=\texttt{AcceptationCriteria}($s^*,s^{*'},history$); +% +% \UNTIL {a maximum number of iterations is reached} +% +% \end{algorithmic} +% +% \end{algorithm} + +\subsection{The quadratic 3-dimensional assignment problem} + +The quadratic 3-dimensional assignment problem (Q3AP) is an extension of the well-known NP-hard quadratic assignment +problem (QAP). The latter is one of the most studied problem by the combinatorial optimization community due to its +wide range of practical applications (site planning, schedule problem, computer-aided design, etc.) and to its +computational challenges since it is considered as one of the most computationally difficult optimization problem. + +The Q3AP was firstly introduced by William P. Pierskalla in 1967~\cite{Pierskalla1967Q3AP} and, unlike the QAP, +the Q3AP is a more less studied problem. Indeed, the Q3AP was revisited only this last years and has recently +been used to model some advanced assignment problems such as the symbol-mapping problem encountered in wireless +communication systems and described in~\cite{Hahn2008q3ap}. The Q3AP optimization problem can be mathematically +expressed as follows: + +% debut ----------------------------------------------------------------------------- +\begin{equation*} min \left \{ +\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}\sum_{l=0}^{n-1}\sum_{k=0}^{n-1}\sum_{s=0}^{n-1}\sum_{r=0}^{n-1}c_{ijlksr}x_{ijl}x_{ksr} +\quad+ \right . \end{equation*} + +\begin{equation} \label{Q3APFormulation} \left . +\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}\sum_{l=0}^{n-1}b_{ijl}x_{ijl} +\right \} \end{equation} + +where: + +\begin{eqnarray} + X=(x_{ijl})\in I \cap J \cap L, \label{Q3APConstraints1}\\ + x_{ijl}\in \{0,1\}, \quad i,j,l=0,1,...,n-1. \label{Q3APConstraints2} +\end{eqnarray} $I$, $J$ and $L$ sets are defined as follows: +\begin{displaymath} I=\lbrace X=(x_{ijl}): +\sum_{j=0}^{n-1}\sum_{l=0}^{n-1}x_{ijl}=1, \quad +i=0,1,...,n-1\rbrace \mathrm{;} \end{displaymath} +\begin{displaymath} J=\lbrace X=(x_{ijl}): +\sum_{i=0}^{n-1}\sum_{l=0}^{n-1}x_{ijl}=1, \quad +j=0,1,...,n-1\rbrace \mathrm{;} \end{displaymath} +\begin{displaymath} L=\lbrace X=(x_{ijl}): +\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}x_{ijl}=1, \quad +l=0,1,...,n-1\rbrace \mathrm{.} \end{displaymath} +% fin------------------------------------------------------------------------------ + + +Other equivalent formulations of the Q3AP can be found in the literature. A particularly useful one is the +\textit{permutation-based formulation} wherein the Q3AP can be expressed as follows: + + \begin{equation*} + min\left\{ f(\pi_1,\pi_2) = + \sum_{i=0}^{n-1}\sum_{j=0}^{n-1}c_{i\pi_{1(i)}\pi_{2(i)}j\pi_{1(j)}\pi_{2(j)}} \quad + + \right. +\end{equation*} + +\begin{equation} + \left. \sum_{i=0}^{n-1}b_{i\pi_{1(i)}\pi_{2(i)}}\right + \} \label{Q3APPermutationBasedFormulation} +\end{equation} + +where $\pi_1$ and $\pi_2$ are permutations over the set $\left\lbrace 0,1,\ldots,n-1\right\rbrace$. According to this +formulation, minimizing the Q3AP consists in finding a double permutation $(\pi_1,\pi_2)$ which minimizes the objective +function (\ref{Q3APPermutationBasedFormulation}). + +The Q3AP is proven to be a NP-hard problem since it is an extension of the quadratic assignment problem and of the axial + 3-dimensional assignment problem which are both NP-hard problems. It is particularly computationally difficult since the +number of feasible solutions of an instance of size $n$ is $n! \times n!$. + +\subsection{Iterated tabu search algorithm for the Q3AP} + +To tackle large size instances of the Q3AP and speed up the search process, a parallel iterated local search\index{Metaheuristics!iterated local search} (ILS) +algorithm has been designed. The local search embedded in the ILS is a tabu search\index{Metaheuristics!tabu~search} (TS). A TS procedure~\cite{Glover1989TS} +starts from an initial feasible solution and tries, at each step, to move to a neighboring solution that minimizes the +fitness (for a minimization case). If no such move exists, the neighbor solution that less degrade the fitness is chosen +as a next move. This enables TS process to escape local optima. However, this strategy may generate cycles, i. e. previous +moves can be selected again. To avoid cycles, the TS manages a short-term memory that contains the moves that have been +recently performed. A tabu search\index{Metaheuristics!tabu~search} template is given by the algorithm \ref{TS_pseudo_code}.\\ +% +% \begin{algorithm} +% \label{TS_pseudo_code} +% \caption{Tabu search template} +% \begin{algorithmic}[1] +% \STATE GenerateInitSol($s_0$); +% \STATE TabuList=$\phi$; +% \STATE $t=0$; +% \REPEAT +% \STATE $m(t)$ = SelectBestMove($s(t)$); +% \STATE $s(t+1)$ = ApplyMove($m(t),s(t)$); +% \STATE TabuList = TabuList $\bigcup \{m(t)\}$; +% \STATE $t = t + 1$; +% \UNTIL{a maximum number of iterations is reached} +% +% \end{algorithmic} +% \end{algorithm} + +\begin{algorithm}[H] + \SetAlgoLined + %\KwData{this text} + %\KwResult{how to write algorithm with \LaTeX2e } + GenerateInitSol($s_0$)\; + TabuList=$\phi$\; + $t=0$\; + \Repeat{a maximum number of iterations is reached}{ + $m(t)$ = SelectBestMove($s(t)$)\; + $s(t+1)$ = ApplyMove($m(t),s(t)$)\; + TabuList = TabuList $\bigcup \{m(t)\}$\; + $t = t + 1$\; + + } +\caption{Tabu search template} +\label{TS_pseudo_code} +\end{algorithm} + + +\subsection{Neighborhood functions for the Q3AP} + +The neighborhood function is a crucial parameter in any local search algorithm. Indeed, if the neighborhood function is +not adequate to the problem and/or does not consider the targeted computing framework, any local search algorithm will +fail to reach good quality solutions of the search space. + +Regarding the Q3AP, many neighborhood structures can be considered. A basic neighborhood was proposed and was investigated +in different works of the literature~\cite{Hahn2008q3ap,DBLP:journals/ijfcs/LoukilMMTB12} and consists in the set of all +solutions (double-permutations) generated from the current one by an exchange of two positions in either the first ($\pi_1$) +or the second ($\pi_2$) permutation. This neighborhood that we denote by $N_b$ can be formalized as follows: + +\begin{equation} +\begin{array}{rl} +N_b(\pi_1,\pi_2)=\{&(\pi_1^{'},\pi_2^{'}): \pi_1^{'}[k]=\pi_1[l], \pi_1^{'}[l]=\pi_1[k]\\ + & 0\leq k \neq l < n;\\ + & \pi_1^{'}[i]=\pi_1[i], \quad 0\leq i\neq k,l < n;\\ + & \pi_2^{'}[j]=\pi_2[j], \quad 0\leq jWtApX95-t%irDn{@`lePY-UF-6ub))L*aUPQCMCH555m zHBCs`JK%(lh0pSK^2zBW2?`!N5o44s8xm-Fg2SE9J+X{$gv<0iz2c*ihfJ$Uo$)3m z^@KYKIrS6Imhnv^4cw1RlnY(s5t_GXRcnlU0vwS$7>~i0YMog=0s&?ydG1b7Ry@s#3b#= zk_|&bF+QH)_<@rv2r8jw-St&PRY&!WYfSk|-2}s#3#&(~U-&*%_E{;TzkgxvXh3W= zrlpkMC8S)dFJvd92ufo?m)eX}@wQb9(S23Jr#kqNL5s`)()qfd-8if7^@X;3M||}S zgslv6-Ph@z(jBPi%=kGNt=}@ppAr^K=DXApyfnZ3ld+PrP$?rc5oWDUOw4WOwTpV- zLUzsmXfHzj^wub};4-w;shc0(JPbE_!;4dztzd{@R&5o$w@ zLC}opbq=|6$6#k7DMr1gV{W8msFdr5P2Ig|ESrWu<=oLpy)wu2KD7|C9PMOZ8=0%< zzyS@8gjL*0zxT%4^)!Yf!)-EL;#Ll~tw&Bl_n9XS znx`3qGUKI-Epe!3rM|KDk^QTsMiCO)%LHddl2fxf@ZjC`jA$&vT?MovnJQ(g$B%t( z)vG30Q@_Q=T1E{GFuV(~cXLo9E9%#y8c|^^Dk(t^=yy8DwcXOMb=Og4QC2g%{X@4k zshVkr&m?BBn(~C&;>s9~tRhR2x=p^a^it&u4gR|l6)D@7wW^#1@}flb8_e=U2Yd?A ztD}0K4ECIMVi!$)Lp_`nc!5tZd<9qomSMwJ&99VrUFzD*U(`a0zqYs9!8(x78ZX2; zlKWb_jw>XTQ}`3Lx}0bp-)c)Ar|~^rO|_Asl2A}m=!MVkKiiPWMOoaeN#1%Md+%ox zwBP`)pP^)>lJ~i0j^9~P=Q^~Hqogqo2wJi@neJc8EZd&K`m(BZ_NHBl)xp9LA~6| zyeAqtA`9*pT@dQ$?;J9Fs{WCJgX*k4UDw$fkMm8r(!pVg!eh$kPvoAfMtFXfUUum4 z(Dy218_4*6{_I85+j)*^%GGM63JgkwOMARk(G=-NG2!wj$+UQrMOTUyfgr7f$*MD2 zjC$rk#SMmBHE0M|8Z%Y2YAg(za*Di6t^90M(YAk5!(z~B{pyz^6U8of!xWYISF+r& zY6tQA%d8ev0nTuh)IOnW42o*<7h@YTeVDhq>n%N9qCck1BzJ^>dre-RmWPO{b2jF- z+S|VE`-Z4IT`KHy7;SjpQpDcUimha|{WeBoihh>Sh zF$h)syo7{0P3Gbf>W-4-#I40`ifiw(IOD%4?~iwE6NP9ZR0VX%B=1xTn^|71<_@$z z;LI+Gp!QC6FMm}H*?G6kG{6Zt)Xn{&SGi&;OXz-W?28j@Sw zoDpTud@)8N?@ln)$*wmQlld$QEN_-1vB`^LNngX@&cPWqbnmTz^KUQpawR7|eO>So zk5+U_a)2v+sPU!ob@QiOJ8P9wS!9}U5xJ7dvEhClVg>CqQhs}p?uY%AEQO<5g#!cC zZb_w&Xijt6a5U_Z-N{o#U5OGw&e>%QFp@cnc^L z_enMPldsy*dV`o73f2v2BeXrnbw2~@nt~&mw#KC0eB%4(-mBczpjPqUe5SPJyNC1) z6uS{~tp}IMM%VDuD8q->!}$8?sG!05%xQ)wK~oNT)z;8Vj5II0(aS0BqB$o6SBj)nLVupWr$8gn4{*3@$!?xP1F64Y{y=AX1pI5Pn5r5uvwfh$BICE>I)%@@+ z4G!%}Z2*5Epe2gC=L5$`zczsIJEC}9x-RmW_)SeeyY3-NkgbG{{QQf3j`3%z=1wzvztAar<85{?uxwxb^6V<8$tj+BZcu8?H5! z%ZG_qc<(^8mzkm>xm_izC_ha4M9mqJiL~VVKCCWBLQ+P|>d7CMm>18P(jI6updpQp z8InVdJ4x2_F=2e=FvpZ4s)JiZKtV!1FN^)-6@STzH)*M2$)c^n^kA&j?=Jy zqo#7N{7Llc$%XL&%6D9$S6fY-SAz;q;4G&`M8{ zi^Pe{<}c7!I5yB_i8f+yV=S)S$!YBvC*%l|>{V*Use_?uK zO~eq0_G7nZDX&l3W>{pIo_JF?TrHiiJJE+Fm>-Nv)WOR=J`G}A*}(;^OtN-8KVmjj zR!Nh!T$r`V+k3EorgxgzH7RcBL4JnZd^^Sw7jgd%7oswZi7aXrUb|nA&|AWRs?QJk zd?)?8^e6*AH{%<1v$tBEx6IpbmuRMJoYm{!j#u^5PDmMk=HcmLzdBwpc8?2GrXI=I zM1Nw~W47%SD?#^Cdz6@u%Y-X8#vy^v>ihP^fr^BMtJlvg8HUxC^fupHKT}^HmR|7o zAMfs#ZF;!at&SB8 zjZ0f8p3N?0ubuWkvXJ)!`?J2`U0`6%!P;5Ttf7bG*BhsY;uhfiUlu0ul^u6)-5sfG z`mwn1^yd%ngWbUChDNCX-!I-bwtKjm9_}&evzJ;nCJNs*_KFZ)H*yiw(DKto!&PDg z%eV4Hy>PMZFWdtOU%t$&+?}W^nwapi=pL!N@Ng>xaALhbRP%MCJ$)`;RDpdZdR+%@ zEj~YKHggbnN;Kl&pn=ClLi*a+OTYMM&qVi5c|CY1cr7c$V7DU2W~-6a2!pst9y$FX z?rroluV;IE&jMN28uz=_LiTiyiTjZa+ukv`VtLE!hOQ`6ZwhXDJ+SWkr?iOssmm}5=p{`Svy~VH`1J_* z$wrkf^ysr_P@@#V2gA%CY^{$ zPox-3g!l611B z2J}z_oCn?xMF7v-I(VF&K8k1#fTwZ@V1V)_g6vA(#B2IQ@Z1f7ljML?lyTs6IQ*~! z9>W0zun$TkKuE`TJ!)|1msunge;nsQX`o$@L&FFVKpkyQfS6O0%+{l}gn$w}NFx6> zl_dQa67a`N1skFb2Iu%qbLQA8VikOG1KA?q*QqW=`|*D|O9Z5>SrTw3~TtZCrKh{jPwOvO zq6Xv$cBC2v2f^~OaZ^E|9i4u4NlHjG(oAYV70i0HogCH?gMz@Q0evFM)d&Jdh*JZa zXaWKB&S8d-yaoyaGYBkS9zYI|2NVEBKo!scGy!cu2hax$02{y-umkJ?6yN|j0!{!L zZ~-uY>mMrzumBEl1MmO=AYg0=P5{Bp#tsD#0S~~F_i(i!28Tj|szJZ}y*^0&Uw--n zrTaTb2O9kMpeg)D^^l?>U2OD&I z{;e*1X*?)Z&QRROEd0&dBD;lFf__SM$oZWbFkYelS9;po9PMAbdH5>xpS zRLa0?xD1o$(_x0}lJ2u^;*5fOX!GrP0h!NT*L8XmAAjTx>9p?Px4cxt;1l5Bt8CM( z-cMf^IQ4Yq!_R}o`Q?*@x!v4Bj+{obcM#pxL zLQM-Bqq@#fe1lnI|zm z=RE>&&@uMX+q7*fiftaHS5>6%SEMbwAIarOe@PKimOiTT@zO3sdX#_LmA1OJfLW$HCicoL5_T-IAVQq^s46lZ`a6p;^CDK(o-H)IDvdh)3m+v~UsGoH2 z$QkD^+P`27^pXG8CX=EiaKpoNYD=I?_{x1#`sJ?A{^MSu>&k_#UNaQL?C0>6>lQKL z=eYMCn~uc0M~LW-e7`kD9M4%e(x9cEVA7eGO~I|gU+p29_Nhvw1?n3T&hoMBq$Yzp zo57}aqddF5((CxM{Dr#Y%w&VNRcg~es2j>2uUg@l>k_ZL5j&LTh&7LP((2~35o3R?m;mhrpuD3{e*SRhwIIxLs|5DR~ zAFP}GuQg=`v}p!wCTp%-T&faUU260i&?3gF9jkfE_3XXtR(r(=c6-y`ka2MRAuWsB z!cn=GZt8cExKI~!x$fDTP$xT}EaeIHJ11yw%H@RW-k_rvmG`BZ96k7YKyN&Kp!Ma7 zBLA1w`H#lA^&X3B-^JzPnW;G~d0*%*Dox9`LHmEK_cJbqr=gcObprycIY;){qHwZ{ zl{{u2c&?3T?_2HEU5$ulE1f^LT2M9l)tRO^VxITbTBJ3cyxF8gq+1q0%o|Vd7F!+S zRXB8eLxG{;C}o9&$6UOkdXs|m(y`Bj_i@A5E-zl=rfEDvsb49i!20NY_RhN74Z!E} zdd9R|q7ZT>GoF+FzEvZ0?a%Z@nFU@E+v0hHpTXxW&gJN?!)9YT`%cS3zY*S#KUy`u z*%&PI0!LU=vYhlvbnsrPiqE||njwsEYbtI$Lmt9;kNy3wuvt5s70@Z!-oz}mE0Ig3 z0!UTw^l-Y*y7jokOP02vca%=S^QJxF(huy+9vfQJ)il;pC0Ooobsin3we~X|BRl!Z zIgR`y@(PRFO+}@wpP!TJO5Z(pnHMd(a8g9YQ^KtFcy4L8f&0uFMT=LnQ#7xdaYUzg z;~DLdQg_{pmMfl3drz|8n_m$J9%}csga75SYhvJsml%qVeT#k#cP|=uAh{npIN(Cu}l)iLVjJm>Ys)H`7l8D{c zbQ!5k3eW25J$9JcEgOXmVQ!XCR@o|Jgn)}(}$E8BX2^s0^eaxfg zH}p$0*w-@H-WOebv`=kGKcA^nD|04`zS(Ev;)FTVT~3R^bOFA)=}+R7%nt_S&uX~e z{s?uQ%RTa45l5CmcI>%Pe{Sd|w1f;c@>mberNp602Yp+veVay1U`e_`>)0E^(PUUu zu1iZb!TrI>+d_3y-`?h%$^|i+>5G5Z5^BUP`XHArHrx@XQyp#Jw2t~*D;YBjj>5dA z3hCkU{BmB^Cg)2xHofRl=I10@NpB7IQRC!W;|sPrK4R3BvYl&B+?KLvSNJ?W)ZSgX z{F7Oyp~cE3Vn=dx-08efBAtX5)y*pcwVjLoc;CTkd)VEy9gi&uf7aqqrgXa#Qn%N> z?D^?AE(_0*w-S-`cX@wmHK_+G0RB}8gqsq?&>|gljG78l${05V4^uPRF0Qn_^dQ7lGxWumvkl8Q3m!y@n((p0Nj+XD60e=fG;h6 z$!!qMr!y4lOy0!@sFnGiv%C%~aO`)$&ffnVazX_wy}@;~>3aS5drb zg6le7?i`VRl5p(&)67>?)gwF-?{Ux_4q4$_j;6cUln^J=3m#3;?kN~Zwkyi4K3{r? zHbTZ58@5ub}(`<+$vws$4vv8>$dFHhx^Qp@A8JD6s#y|l1Iy!LK*Sfi{85Nfm1 z@UraDe)PB2)|i-wTjx?K;;J1!ztnR0e$)J7#`+JRZ~Wr;uYLzgD$)x(%m=#8qH|s> zBQEb+0~jhMP>$1X>6YBs52B00%Vv_yq$yWW=0ZU7-)3jDL#6snvg13yaO6TI+nBQkb~GR^R7V zyY1ZM$n-8~uFyuccQb0FmfZcG*=Pn6t*d`1-Oc!0H;zmej(p;|5mV&q@aS%?7>C-* zT(!xh(@qs(W(Gx<4lGe9Ahf z9%ie4XXyF>q@X8s{#E9sbcLzbi>61@EJ|VLD%w_TO=ur!-Yc7(Dofz^4vDF``)zLO z26ub@{tJJB?{4R;t|A)WY7kbx*=g+WJUw4aNjWwAl}|nSyu=k(Ll3tTu@YY=$){rF z#E#vFVJ!?u5Hz=V$;xvu;Kr8l^PEn8#Jb8u(9gcIsFi`&r*A8d++V1Rh6`m zO~Ma(sq*gJnT^SPQ7{rXD>Iy21i+-z6(Zb9t>k3f+qrL;D?`MGk{hqdavyoFolhq! z$&}K6lJZKuYL4QD<4U;b3q2Y-?#+H$*gd51{?`tM`)yrD!b1)wG@Wma{G+Ym7n`MS z4!B8GGmFc5XO>b;%&|pkTP~a-*jt!xKDnZOX4Vjwo@1hB;h=fh+(T;KLwew- z+7Sifc!QPD5{q?UNh4W+8V7}#0ZRg&D?GfW=2Q5T6zeCcsc=?X3p4h|l1hTnY+c0t zsenj>rjq&MY!3L3M<2K3ON_`obaWp+O~@cSh+-W6IK&Gxy~Fk9bf>-zzn=>S!+w}Q zUxxHBSF!Pknhn`L)^DIxAe;FPPO>R}O5O44_*jOHqetRYSuK5a($%gFt=BWU-P%e=;T(ywKK2R2tjL!#dKDz z?CB^Q%}8yrLSE%!!Z@K9DEjPOpPJN4Xg#Bq$LC0qE1dJHRw)r_rFkHKJo2$ob+Ze! z@K{6saWn2q;&1t=82XmIg9cV#bZz8V9PdDWNF6M33yX*)s}%aQvb*uTe#5EJ@A6yL zlZiH^d^}0@w;Ugdoxh))Wa9jWqw^%?Py}@H;;o?rvc`tjRn1=TKAxLXbr`cBy$!|M zqm3OO%|GVYTJXGnxn}v*+VqLX{?_r5F5}Z}fn*Q8eIO*{;h&h?A^P-pwBR=`_16K| zL{sDU=@*U^L;QLAm6Y)YPueahBE%Nuh{j5Buh%tkL(uk8+{VJ1FikfFloMLT7mw2S z)iSX2b+Hq-=a!MCmXxsp!9bLNw~d>C!{N&@1PF*5NO36WX()4$7`!FCUEN$kcnsq0 ziop^jyrsAgr$~Tp(lEdcIbOhD%9L5DrgdhaP1>pj4BtOIf58@kMIJ^r4 zE-1ncip1MHNa%sc;2#3Po)otek?1A?0A5~Rf?h~L9NrOti;If`Fa&@=2!I>{1RpHX z##;bO-~{y@8iF?Ya~hT)cxaQL9nKX%n*eY@81P%sZ>$B4!$L@kZESHKL@90$54636 zgODf;CFCF~AO?qv3&7zhdjS~u5wLYY2*cq*2&9NO?6*3%znS?DeINl;hy?urwj@C4 z)84}lg_q*KrlSG5=7b{<|G?`Y;({^xjSKuuNg|0jF?+X1(?`_o`I4?O0uRP5~l6b41IjR3|R4q9w) zC*gp@yV`(>ZsX<#0)I9{(B}Y{pxn}uAd!eBVo=hDg(!z1{?WjoNrfeWvB5e@aeE8c zqa18JFhp)?zzGM!lQvEun1})tKunK-cK9Vw5De-cLBgP=|7aYF1O8I+A3}II1lB(o zP2kVnMVcD&U;6y_1pT$8f*Z9Iw-;%{{MVNKH{9}f?eqMn(&q(nRZ=B^aUj(akD>&r z5WydC??H$h)*v?w#tpK8wfaAB7?8rp^FIXUw?Z7A=YOm{-al_KyzwXp5Q&EiQFn?Md|;U!;*B(MIhSXiHAXh!-Pe|skyk6w3Vs<7e$PW A#Q*>R literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter9/figures/paraMeta.pdf b/BookGPU/Chapters/chapter9/figures/paraMeta.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3dd6e0c115f094276e0b2e4fedc6e986dc84361e GIT binary patch literal 12819 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 PrDPBwK|xJpEzth}l;zlv literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter9/figures/paradiseoGPU.pdf b/BookGPU/Chapters/chapter9/figures/paradiseoGPU.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e521b36102154d1be011a99d10d04b636ba8e27 GIT binary patch literal 9360 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 Z(kqcv8iqpKc94oHTp1!Jrf-IV{15s4afbi^ literal 0 HcmV?d00001 diff --git a/BookGPU/Makefile b/BookGPU/Makefile index cccd751..1371704 100644 --- a/BookGPU/Makefile +++ b/BookGPU/Makefile @@ -12,7 +12,7 @@ all: bibtex bu6 bibtex bu7 bibtex bu8 -# bibtex bu9 + bibtex bu9 makeindex ${BOOK}.idx pdflatex ${BOOK} pdflatex ${BOOK} -- 2.39.5