From 0cd5e33087ba2395b349cfca863c4c73948029ab Mon Sep 17 00:00:00 2001 From: couturie Date: Wed, 27 Mar 2013 22:03:25 +0100 Subject: [PATCH] new --- BookGPU/Chapters/chapter19/biblio.bib | 407 ++++++++++++++++ BookGPU/Chapters/chapter19/ch19.tex | 459 ++++++++++++++++++ BookGPU/Chapters/chapter19/code.cu | 67 +++ BookGPU/Chapters/chapter19/fig/ex_matrix.pdf | Bin 0 -> 4836 bytes .../chapter19/fig/final-scoo-book.pdf | Bin 0 -> 6704 bytes BookGPU/Chapters/chapter19/fig/gpu-cpu.pdf | Bin 0 -> 55505 bytes BookGPU/Chapters/chapter19/fig/matrix-mid.pdf | Bin 0 -> 27140 bytes BookGPU/Chapters/chapter19/fig/matrix-str.pdf | Bin 0 -> 13675 bytes BookGPU/Chapters/chapter19/fig/matrix-uns.pdf | Bin 0 -> 78107 bytes .../Chapters/chapter19/fig/partitioning.pdf | Bin 0 -> 6296 bytes BookGPU/Chapters/chapter19/fig/scoo-a.pdf | Bin 0 -> 43675 bytes BookGPU/Chapters/chapter19/fig/scoo.pdf | Bin 0 -> 13891 bytes 12 files changed, 933 insertions(+) create mode 100644 BookGPU/Chapters/chapter19/biblio.bib create mode 100755 BookGPU/Chapters/chapter19/ch19.tex create mode 100644 BookGPU/Chapters/chapter19/code.cu create mode 100644 BookGPU/Chapters/chapter19/fig/ex_matrix.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/final-scoo-book.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/gpu-cpu.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/matrix-mid.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/matrix-str.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/matrix-uns.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/partitioning.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/scoo-a.pdf create mode 100644 BookGPU/Chapters/chapter19/fig/scoo.pdf diff --git a/BookGPU/Chapters/chapter19/biblio.bib b/BookGPU/Chapters/chapter19/biblio.bib new file mode 100644 index 0000000..f6f43d0 --- /dev/null +++ b/BookGPU/Chapters/chapter19/biblio.bib @@ -0,0 +1,407 @@ +@article{ch19:matrix-collection, + author = {Duff, I. S. and Grimes, Roger G. and Lewis, John G.}, + title = {Sparse matrix test problems}, + journal = {ACM Trans. Math. Softw.}, + issue_date = {March 1989}, + volume = {15}, + issue = {1}, + month = {March}, + year = {1989}, + pages = {1--14}, + acmid = {62043}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + +@Conference{ch19:spmv-iccs, + author = {Dang, Hoang-Vu and Schmidt, Bertil}, + title = {{The Sliced COO format for Sparse Matrix-Vector Multiplication on CUDA-enabled GPUs}}, + year = {2012}, + pages = {57-66}, + booktitle = {Proc. ICCS, Procedia Vol. 9} +} + +@article{ch19:spmv-ccpe, + author = {Bertil Schmidt and + Hans Aribowo and + Hoang-Vu Dang}, + title = {{Iterative Sparse Matrix-Vector Multiplication for accelerating + the Block Wiedemann Algorithm over GF(2) on Multi-graphics + Processing Unit Systems}}, + journal = {Concurrency and Computation: Practice and Experience}, + volume = {25}, + number = {4}, + year = {2013}, + pages = {586-603}, +} + +@misc{ch19:matview, + author = { Jim Kohl }, + url = {http://www.csm.ornl.gov/~kohl/MatView/}, + title = {MatView: Scalable Sparse Matrix Viewer}, + year = {2008}, +} + +@inproceedings{ch19:nvidia-spmv, + author = {Bell, Nathan and Garland, Michael}, + title = {Implementing sparse matrix-vector multiplication on throughput-oriented processors}, + booktitle = {SC '09: Proceedings of the Conference on High Performance Computing Networking, Storage and Analysis}, + year = {2009}, + isbn = {978-1-60558-744-8}, + pages = {1--11}, + location = {Portland, Oregon}, + doi = {http://doi.acm.org/10.1145/1654059.1654078}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + +@article{ch19:bellpack, + author = {Choi, Jee W. and Singh, Amik and Vuduc, Richard W.}, + title = {{Model-driven autotuning of sparse matrix-vector multiply on GPUs}}, + journal = {SIGPLAN Not.}, + volume = {45}, + issue = {5}, + month = {January}, + year = {2010}, + issn = {0362-1340}, + pages = {115--126}, + numpages = {12}, + acmid = {1693471}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {gpu, performance modeling, sparse matrix-vector multiplication}, +} + +@inproceedings{ch19:europar, + author = {Bertil Schmidt and + Hans Aribowo and + Hoang-Vu Dang}, + title = { {Iterative Sparse Matrix-Vector Multiplication for Integer + Factorization on GPUs} }, + booktitle = {Euro-Par (2)}, + year = {2011}, + pages = {413-424}, + ee = {http://dx.doi.org/10.1007/978-3-642-23397-5_41}, + crossref = {DBLP:conf/europar/2011-2}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@proceedings{ch19:DBLP:conf/europar/2011-2, + editor = {Emmanuel Jeannot and + Raymond Namyst and + Jean Roman}, + title = {Euro-Par 2011 Parallel Processing - 17th International Conference, + Euro-Par 2011, Bordeaux, France, August 29 - September 2, + 2011, Proceedings, Part II}, + booktitle = {Euro-Par (2)}, + publisher = {Springer}, + series = {Lecture Notes in Computer Science}, + volume = {6853}, + year = {2011}, + isbn = {978-3-642-23396-8}, + ee = {http://dx.doi.org/10.1007/978-3-642-23397-5}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@article{ch19:Thome:subqad, + author = {Thom\'{e}, Emmanuel}, + title = { {Subquadratic Computation of Vector Generating Polynomials and Improvement of the Block Wiedemann Algorithm} }, + journal = {J. Symb. Comput.}, + volume = {33}, + issue = {5}, + month = {May}, + year = {2002}, + issn = {0747-7171}, + pages = {757--775}, + numpages = {19}, + url = {http://portal.acm.org/citation.cfm?id=612306.612319}, + doi = {10.1006/jsco.2002.0533}, + acmid = {612319}, + publisher = {Academic Press, Inc.}, + address = {Duluth, MN, USA}, +} + +@ARTICLE{ch19:nfs, + author = {Peter L. Montgomery}, + title = {A Survey of Modern Integer Factorization Algorithms}, + journal = {CWI Quarterly}, + year = {1994}, + volume = {7}, + pages = {337--366} +} + +@article{ch19:wie, + author = {Wiedemann, D H}, + title = {Solving sparse linear equations over finite fields}, + journal = {IEEE Trans. Inf. Theor.}, + volume = {32}, + issue = {1}, + month = {January}, + year = {1986}, + issn = {0018-9448}, + pages = {54--62}, + numpages = {9}, + url = {http://dl.acm.org/citation.cfm?id=13738.13744}, + doi = {10.1109/TIT.1986.1057137}, + acmid = {13744}, + publisher = {IEEE Press}, + address = {Piscataway, NJ, USA}, +} + +@inproceedings{ch19:wie-guass, + author = {LaMacchia, Brian A. and Odlyzko, Andrew M.}, + title = {Solving Large Sparse Linear Systems over Finite Fields}, + booktitle = {Proceedings of the 10th Annual International Cryptology Conference on Advances in Cryptology}, + series = {CRYPTO '90}, + year = {1991}, + isbn = {3-540-54508-5}, + pages = {109--133}, + numpages = {25}, + url = {http://dl.acm.org/citation.cfm?id=646755.705355}, + acmid = {705355}, + publisher = {Springer-Verlag}, + address = {London, UK, UK}, +} + +@book{ch19:book:mpi, + author = {Quinn, Michael}, + edition = {1}, + howpublished = {Hardcover}, + isbn = {0072822562}, + month = jun, + posted-at = {2010-04-02 13:14:26}, + priority = {2}, + publisher = {McGraw-Hill Science/Engineering/Math}, + title = {{Parallel Programming in C with MPI and OpenMP}}, + year = {2003} +} + +@INPROCEEDINGS{ch19:mpi:col, + author = {Rajeev Thakur}, + title = {Improving the performance of collective operations in MPICH}, + booktitle = {Recent Advances in Parallel Virtual Machine and Message Passing Interface. Number 2840 in LNCS, Springer Verlag (2003) 257–267 10th European PVM/MPI User’s Group Meeting}, + year = {2003}, + pages = {257--267}, + publisher = {Springer Verlag} +} + +@INPROCEEDINGS{ch19:reduce_tree, + author = {Pitch Patarasuk and Xin Yuan}, + title = {Bandwidth Efficient Allreduce Operation on Tree Topologies}, + booktitle = {IEEE IPDPS Workshop on High-Level Parallel Programming Models and Supportive Environments}, + year = {2007} +} + +@InProceedings{ch19:aoki, + author = {Aoki, Kazumaro and Shimoyama, Takeshi and Ueda, Hiroki}, + title = {{Experiments on the Linear Algebra Step in the Number Field Sieve}}, + booktitle = {Proceedings of the Security 2nd international conference on Advances in information and computer security}, + series = {IWSEC'07}, + year = {2007}, + isbn = {3-540-75650-7, 978-3-540-75650-7}, + location = {Nara, Japan}, + pages = {58--73}, + numpages = {16}, + _url = {http://portal.acm.org/citation.cfm?id=1778902.1778909}, + acmid = {1778909}, + publisher = {Springer-Verlag}, + address = {Berlin, Heidelberg}, + keywords = {block Lanczos, ethernet, integer factoring, number field sieve, parallel computation}, +} + +@InProceedings{ch19:kilobit, +author = {Kazumaro Aoki and Jens Franke and Thorsten Kleinjung and Arjen K. Lenstra and Dag Arne Osvik}, +title = {{A Kilobit Special Number Field Sieve Factorization.}}, +booktitle = {ASIACRYPT}, +year = {2007} +} + +@techreport{ch19:nvidia, + author = {Nathan Bell and Michael Garland}, + title = {{Efficient Sparse Matrix-Vector Multiplication on {CUDA}}}, + month = dec, + year = {2008}, + institution = {NVIDIA Corporation}, + type = {NVIDIA Technical Report}, + number = {NVR-2008-004}, +} + +@TechReport{ch19:rsa170, +author = {Dominik Bonenberger and Martin Krone}, +title = {{Factorization of RSA-170}}, +institution = {Ostfalia University of Applied Sciences}, +year = {2010}, +url = {http://public.rz.fh-wolfenbuettel.de/~kronema/pdf/rsa170.pdf}, +} + +@article{ch19:exactspmv, + author = {Brice Boyer and + Jean-Guillaume Dumas and + Pascal Giorgi}, + title = {{Exact Sparse Matrix-Vector Multiplication on GPU's and Multicore + Architectures}}, + journal = {CoRR}, + volume = {abs/1004.3719}, + year = {2010}, + ee = {http://arxiv.org/abs/1004.3719}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@article{ch19:bw, +author = {Don Coppersmith}, +title = {{Solving Homogeneous Linear Equations Over GF(2) via Block Wiedemann Algorithm}}, +journal = {Mathematics of Computation}, +volume = {62}, +year = {1994}, +doi = {10.2307/2153413}, +masid = {1254705} +} + +@InProceedings{ch19:hwang, + author = {Wontae Hwang and + Dongseung Kim}, + title = {{Load Balanced Block Lanczos Algorithm over GF(2) for Factorization + of Large Keys}}, + booktitle = {HiPC}, + year = {2006}, + pages = {375-386}, + ee = {http://dx.doi.org/10.1007/11945918_38}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@InProceedings{ch19:rsa768, +author = {{Kleinjung, T., et al.}}, +title = {{Factorization of a 768-Bit RSA Modulus}}, +booktitle = {International Crytology Conference}, +year = {2010}, +pages = {333--350}, +doi = {10.1007/978-3-642-14623-7_18}, +masid = {13669015} +} + +@article{ch19:hetero768, + author = {{Kleinjung, T., et al.}}, + HAL_ID = {inria-00535765}, + _URL = {http://hal.inria.fr/inria-00535765/en/}, + title = { {A} {H}eterogeneous {C}omputing {E}nvironment to {S}olve the 768-bit {RSA} {C}hallenge}, + language = {{A}nglais}, + affiliation = {{L}aboratory for {C}ryptologic {A}lgorithms - {LACAL} - {\'E}cole {P}olytechnique {F}{\'e}d{\'e}rale de {L}ausanne - {NTT} {I}nformation {S}haring {P}latform {L}aboratories - {ISL} - {N}ippon {T}elegraph \& {T}elephone {C}orporation - {NTT} - {S}ilverbrook {R}esearch - silverbrook research - {D}epartment of {M}athematics - {U}niversity of {B}onn - {B}onn {U}niversit{\"a}t - {U}niversity of {B}onn - {CARAMEL} - {INRIA} {N}ancy - {G}rand {E}st / {LORIA} - {INRIA} - {CNRS} : {UMR}7503 - {U}niversit{\'e} {H}enri {P}oincar{\'e} - {N}ancy {I} - {U}niversit{\'e} {N}ancy {II} - {I}nstitut {N}ational {P}olytechnique de {L}orraine - {EPFL} / {D}omaine {IT} - {DIT} - {\'E}cole {P}olytechnique {F}{\'e}d{\'e}rale de {L}ausanne - {M}icrosoft {R}esearch - {M}icrosoft - {S}cientific {C}omputing and {C}ontrol {T}heory - {MAS}2 - {CWI} - {S}wiss {I}nstitute of {B}ioinformatics - {L}ausanne - {SIB} - {S}wiss {I}nstitute of {B}ioinformatics }, + publisher = {{S}pringer-{V}erlag }, + journal = {{C}luster {C}omputing }, + audience = {internationale }, + year = {2010}, +} + +@inproceedings{ch19:grid, + HAL_ID = {inria-00502899}, + _URL = {http://hal.inria.fr/inria-00502899/en/}, + title = { {Using a Grid Platform for Slving Large Sparse Linear Systems over {GF}(2)}}, + author = {{K}leinjung, {T}horsten and {N}ussbaum, {L}ucas and {T}hom{\'e}, {E}mmanuel}, + language = {{A}nglais}, + affiliation = {{L}aboratory for {C}ryptologic {A}lgorithms - {LACAL} - {\'E}cole {P}olytechnique {F}{\'e}d{\'e}rale de {L}ausanne - {ALGORILLE} - {INRIA} {L}orraine - {LORIA} - {INRIA} - {CNRS} : {UMR}7503 - {U}niversit{\'e} {H}enri {P}oincar{\'e} - {N}ancy {I} - {U}niversit{\'e} {N}ancy {II} - {I}nstitut {N}ational {P}olytechnique de {L}orraine - {CARAMEL} - {INRIA} {N}ancy - {G}rand {E}st / {LORIA} - {INRIA} - {CNRS} : {UMR}7503 - {U}niversit{\'e} {H}enri {P}oincar{\'e} - {N}ancy {I} - {U}niversit{\'e} {N}ancy {II} - {I}nstitut {N}ational {P}olytechnique de {L}orraine }, + booktitle = {11th {ACM}/{IEEE} {I}nternational {C}onference on {G}rid {C}omputing ({G}rid 2010) }, + address = {{B}russels {B}elgique }, + audience = {internationale }, + month = {10}, + year = {2010}, +} + +@inproceedings{ch19:sle, + author = {Alexander Monakov and + Anton Lokhmotov and + Arutyun Avetisyan}, + title = {{Automatically Tuning Sparse Matrix-Vector Multiplication + for GPU Architectures}}, + booktitle = {HiPEAC}, + year = {2010}, + pages = {111-125}, + ee = {http://dx.doi.org/10.1007/978-3-642-11515-8_10}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@inproceedings{ch19:bl, +author = {Peter L. Montgomery}, +title = {{A Block Lanczos Algorithm for Finding Dependencies Over GF(2)}}, +booktitle = {Theory and Application of Cryptographic Techniques}, +year = {1995}, +pages = {106--120}, +masid = {674965} +} + +@article{ch19:cuda, + author = {Nickolls, John and Buck, Ian and Garland, Michael and Skadron, Kevin}, + title = {{Scalable Parallel Programming with CUDA}}, + journal = {Queue}, + issue_date = {March/April 2008}, + volume = {6}, + issue = {2}, + month = {March}, + year = {2008}, + issn = {1542-7730}, + pages = {40--53}, + numpages = {14}, + _url = {http://doi.acm.org/10.1145/1365490.1365500}, + doi = {http://doi.acm.org/10.1145/1365490.1365500}, + acmid = {1365500}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + +@article{ch19:gpu, + author = {Nickolls, John and Dally, William J.}, + title = {{The GPU Computing Era}}, + journal = {IEEE Micro}, + volume = {30}, + issue = {2}, + month = {March}, + year = {2010}, + issn = {0272-1732}, + pages = {56--69}, + numpages = {14}, + acmid = {1804055}, + publisher = {IEEE Computer Society Press}, + address = {Los Alamitos, CA, USA}, + keywords = {GPU computing, CUDA, scalable parallel computing, heterogeneous CPU\&\#x002B, GPU coprocessing, Tesla GPU architecture, Fermi GPU architecture, NVIDIA.}, +} + +@misc{ch19:cuda-guide, + author = {NVIDIA}, + url = {http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf}, + title = {{CUDA C Programming Guide}}, + year={2011}, +} + +@misc{ch19:p-reduction, + author = {Mark Harris}, + url = {http://developer.download.nvidia.com/compute/cuda/1_1/Website/projects/reduction/doc/reduction.pdf}, + title = {{Optimizing parallel reduction in CUDA}}, + year={2007}, +} + +@misc{ch19:rsa190-factored, + url = {http://www.mersenneforum.org/showthread.php?t=14177}, + title = {{RSA190 factored}}, + year={2010} +} + +@misc{ch19:cadonfs, + author = {{Gaudry, P., et al.}}, + title = {{CADO-NFS}}, + url = {http://cado-nfs.gforge.inria.fr/}, + year = {2010} +} + +@MISC{ch19:cusp, + author = "Nathan Bell and Michael Garland", + title = {{Cusp: Generic Parallel Algorithms for Sparse Matrix and Graph Computations}}, + year = "2010", + url = "http://cusp-library.googlecode.com", + note = "Version 0.1.0" +} + +@misc{ch19:msieve, + author = {Jason Papadopoulos}, + title = {{Msieve}}, + url = {http://sourceforge.net/projects/msieve/}, + year = {2010} +} diff --git a/BookGPU/Chapters/chapter19/ch19.tex b/BookGPU/Chapters/chapter19/ch19.tex new file mode 100755 index 0000000..ea65a11 --- /dev/null +++ b/BookGPU/Chapters/chapter19/ch19.tex @@ -0,0 +1,459 @@ +\chapterauthor{Bertil Schmidt, Hoang-Vu Dang}{Johannes Gutenberg University of Mainz} + +\chapter{Solving large sparse linear systems for integer factorization on GPUs} +\label{chapter19} + +\section{Introduction} +\label{ch19:intro} + +The Number Field Sieve (NFS)\index{iterative methods!Number Field Sieve} is the current state-of-the-art integer factorization method. It requires the solution of a large sparse linear system over GF(2) (called the linear algebra step). The Block Wiedemann\index{Number Field Sieve!Block Wiedemann} (BW)\cite{ch19:bw} algorithm can be used to solve such a large sparse linear system efficiently using iterative sparse matrix vector multiplication (SpMV). + +Recent integer factorization efforts have been using CPU clusters to solve the large sparse linear system \cite{ch19:kilobit,ch19:rsa768}. The RSA-768 factorization \cite{ch19:rsa768}, for example, reported a runtime of 3 months for the linear algebra step on a cluster with 48 AMD dual hex-core CPUs. Previous work on parallelizing the linear algebra step focused on using CPU clusters and grids \cite{ch19:aoki,ch19:hwang,ch19:grid,ch19:hetero768}. In this chapter, we present a CUDA approach that can be used to accelerate the costly iterative SpMV operation for matrices derived from NFS. + +The memory access pattern in the SpMV operation generally consists of regular access patterns over the matrix and irregular access patterns over the vector. The irregular access pattern over the vector is a challenge that is pronounced more on the GPU than on the CPU, because of the smaller cache and the restrictive memory access pattern requirement to achieve maximum performance. However, a high-end GPU has an order-of-magnitude higher bandwidth than a high-end CPU; e.g. a GeForce GTX 580 has 192.4 GB/s memory bandwidth, while an Intel Core-i7 has a maximum of 25.6 GB/s memory bandwidth. + +SpMV on the GPU has been explored previously in several papers \cite{ch19:nvidia,ch19:exactspmv,ch19:bellpack,ch19:sle} for matrices derived from scientific computing applications. However, sparse matrices derived from NFS have generally different properties, i.e. they are larger, have a few dense rows and have many extremely sparse rows. The large size of the matrix causes the BL and BW algorithms to require a large number of SpMV iterations. This means that the time spent for matrix preprocessing and matrix data transfer to the GPU memory are negligible compared to the total runtime. Thus, approaches to SpMV on GPUs for NFS matrices may be different from previously published GPU SpMV approaches. We further present an extension of our SpMV method for binary-valued NFS matrices to single-precision floating-point matrices. + +\section{Block Wiedemann Algorithm} +\label{ch19:block-wiedemann} + +The BW algorithm heuristically finds $n$ vectors in the kernel space \index{Number Field Sieve!kernel space}of a $d \times d$ binary matrix $B$, $n$ is one of two parameters $m, n$, called blocking factors\index{Number Field Sieve!blocking factors}. BW consists of the following steps: + +\begin{itemize} +\item \textbf{Step 1 (BW1):} Compute the matrix sequence + +\begin{equation} +A_i = x \cdot B^i \cdot y, \forall i=1,...,{\frac{d}{m}}+{ \frac{d}{n} }+O(1) +\end{equation} + + where $x,y$ are randomly chosen binary matrices of size $m \times d$ and $d \times n$ respectively. +\item \textbf{Step 2 (BW2):} The Berlekamp-Massey\index{Number Field Sieve!Berlekamp-Massey} algorithm \cite{ch19:Thome:subqad} is used to compute a generating polynomial of the matrix sequence $A$ from BW1 in the form +\begin{equation} +F(X)= \sum_{i=1}^{{ \frac{d}{n} }+O(1)} {C_i \cdot X^i} +\end{equation} +where $C_i$ is a $n \times n$ binary matrix + +\item \textbf{Step 3 (BW3):} Compute the sequence of matrices $S$ of size $d \times n$ such that +\begin{equation} +S_i = B^i \cdot y \cdot C_i, \forall i=1,...,{\frac{d}{n}}+O(1) +\end{equation} + +With high probability, $B \cdot \sum{S_i} = 0$ for which $\sum{S_i}$ is output as a solution. +\end{itemize} + +We can treat $x$, $y$ and $S_i$ as vectors of block width $m$ or $n$. Assuming $B$ is a sparse matrix with $\gamma$ non-zeros per row on average and ignoring $m$ and $n$ as constant, the complexity of BW1 and BW3 is $O(\gamma d^2)$. Using the subquadratic algorithm by Thome \cite{ch19:Thome:subqad}, BW2 has a complexity of $O(d \log^2{d})$. Thus our approach to accelerate BW is based on accelerating BW1 and BW3 on a GPU while BW2 is still done on a CPU. + +\section{SpMV OVER GF(2) for NFS matrices using existing formats on GPUs} +\label{ch19:existingspmv} + In this section, we review a few relevant previously published sparse matrix formats on GPUs and study their performance when applied to sparse matrices over GF(2) derived from integer factorization with NFS. + + We consider the sparse binary matrix $B$ of size $d \times d$ and a dense vector $X$ of size $d \times n$ bit, where $n$ is called the \emph{blocking factor}. Mordern processors generally support 64-bit operations. Thus, typical blocking factors are of the form of $64 \cdot k, \; k \in \mathbb{N}$. Note that doubling the blocking factor roughly halves the number of SpMV iterations required but doubles the input vector size. + + For all $0 \leq i \leq d-1$ let $c\_index[i]$ column index array of $B[i]$ which contains the indices of the non-zero entries of row $i$. Then, the following pseudocode shows a single SpMV iteration of $B$ with input vector $X$ and result vector $Y$. + +%% \begin{algorithm} +%% \caption{SpMV-COLUMN-INDEX} +%% \begin{algorithmic} +%% \REQUIRE $c\_index[i]$: column array of rows $i$ of $B$;\\ +%% $X$: input vector +%% \ENSURE $Y=B \cdot X$ +%% \FOR{$i=0$ to $d-1$} +%% \STATE $Y[i]=0$ +%% \FORALL{$ind$ $\in$ $c\_index[i]$} +%% \STATE $Y[i] = Y[i] \oplus X[ind]$ +%% \COMMENT{$\oplus:$ bitwise XOR operation} +%% \ENDFOR +%% \ENDFOR +%% \end{algorithmic} +%% \end{algorithm} + + +\begin{algorithm} +\caption{SpMV-COLUMN-INDEX} +% \begin{algorithmic} + \KwIn{$c\_index[i]$: column array of rows $i$ of $B$} + \KwIn{ $X$: input vector} + \KwOut{ $Y=B \cdot X$} + \For{$i=0$ to $d-1$}{ + $Y[i]=0$\; + \ForAll {$ind$ $\in$ $c\_index[i]$} { + $Y[i] = Y[i] \oplus X[ind]$\; + \CommentSty{$\oplus:$ bitwise XOR operation} +} +} +% \end{algorithmic} +\end{algorithm} + + + The costly operations in the SpMV pseudocode are the memory accesses for loading $ind$, $X[ind]$, $Y[i]$ and storing $Y[i]$. To speed up those operations on any architecture a common approach is to design a cache-friendly order of accessing the memory. The order is especially important for the vectors $X$ and $Y$, since their memory locations might be accessed multiple times. Accesses to $Y$ can be minimized by storing the intermediate results in fast memory and only write the accumulated result to $Y$. + + CUDA implementations of SpMV generally store both matrix and vectors in \emph{global memory}. Memory accesses to $B$ and $Y$ can usually be coalesced. Memory accesses to $X$ are random and non-coalesced thus having higher latency, but \emph{texture memory} can be used to take advantage of the \emph{texture cache}. Intermediate results could utilize \emph{shared memory} which has low latency however is very limited in size and only shared between threads of the same block. Shared memory is further divided into \emph{banks}. When threads in a warp access the shared memory, \emph{bank conflicts} should be avoided otherwise the access will be serialized. + + We now briefly review the CUDA implementation of a number of SpMV matrix formats published in previous papers \cite{ch19:nvidia,ch19:sle}. We also describe the data structure in which the matrix in Figure \ref{fig:ex_matrix} is stored using the format as an example. Please note that when storing a binary matrix, the $value$ array can be removed. + +\begin{figure}[t] + \centering + \includegraphics[width=4cm]{Chapters/chapter19/fig/ex_matrix.pdf} + \caption{An example square matrix of size $6 \times 6$ (zero values are not shown)} + \label{fig:ex_matrix} +\end{figure} + + \subsubsection*{Coordinate list (COO)\index{Compressed storage format!COO}} +For each non-zero, both its column and row indices are explicitly stored. The Cusp implementation \cite{ch19:cusp} stores elements in sorted order of row indices ensuring that entries with the same row index are stored contiguously. + + \begin{lstlisting} + coo.row_index = {0, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5} + coo.col_index = {2, 1, 4, 1, 3, 0, 2, 4, 2, 0, 5} + coo.value = {3, 1, 5, 2, 4, 6, 8, 10, 9, 7, 11} + \end{lstlisting} + + \subsubsection*{Compressed Sparse Row (CSR)\index{Compressed storage format!CSR}} Non-zeros are sorted by the row index, and only their column indices are explicitly stored in a column array. Additionally, the vector $row\_start$ stores indices of the first non-zero element of each row in the column array. + + \begin{lstlisting} + csr.row_start = {0, 1, 3, 5, 8, 9, 12} + csr.col_index = {2, 1, 4, 1, 3, 0, 2, 4, 2, 0, 5} + csr.value = {3, 1, 5, 2, 4, 6, 8, 10, 9, 7, 11} + \end{lstlisting} + + \subsubsection*{Ellpack (ELL)\index{Compressed storage format!ELL}} Let $K$ be the maximum number of non-zero elements in any row of the matrix. Then, for each row, ELL stores exactly $K$ elements (extra padding is required for rows that contain less than $K$ non-zero elements). Only column indices are required to store in an array, the row index can be implied since exactly $K$ elements are stored per row. The Cusp implementation store the column indices in a transposed manner so that consecutive threads can access consecutive memory addresses. + + \begin{lstlisting} + ell.col_index = { + 2, 1, 1, 0, 2, 0, + *, 4, 3, 2, *, 5, + *, *, *, 4, *, *} + ell.value = { + 3, 1, 2, 6, 9, 7, + *, 5, 4, 8, *, 11, + *, *, *, 10, *, *} + \end{lstlisting} + + \subsubsection*{Hybrid (HYB)\index{Compressed storage format!HYB}} The HYB format heuristically computes an value $K$ and store $K$ non-zeros per rows in the ELL format. When a row has more than $K$ non-zeros, the trailing non-zeros are stored in COO. This design decreases the storage overhead due to ELL padding elements and thus improve the overall performance. + \begin{lstlisting} + hyb.nnz_per_row = 2 + hyb.ell.col_index = {2, 1, 1, 0, 2, 0, *, 4, 3, 2, *, 5} + hyb.ell.value = {3, 1, 2, 6, 9, 7, *, 5, 4, 8, *, 11} + hyb.coo.row_index = {3} + hyb.coo.col_index = {4} + hyb.coo.value = {10} + \end{lstlisting} + + \subsubsection*{Sliced Ellpack (SLE)\index{Compressed storage format!SLE}} This format partitions the matrix into horizontal slices of $S$ adjacent rows \cite{ch19:sle}. Each slice is stored in ELLPACK format. The maximum number of non-zeros may be different for each slice. An additional array $slice\_start$ is used to index the first element in each slice. The matrix rows are usually sorted by the number of non-zeros per row in order to move rows with similar number of non-zeros together. + \begin{lstlisting} + sle.slice_size = 2 + sle.col_index = { + 2, 1, *, 4, + 1, 0, 3, 2, *, 4, + 2, 0, *, 5} + sle.value = { + 3, 1, *, 5, + 2, 6, 4, 8, *, 10 + 9, 7, *, 11} + sle.slice_start = {0, 4, 10, 14} + \end{lstlisting} + + \begin{table} + \caption{Properties of some NFS matrices} + \centering + \begin{tabular} + {| l || c | c | c | c | c | c |} + \hline + & RSA-170 & RSA-190 & KILOBIT & RSA-768 \\ + \hline + Max dimension & 10.4M & 26.1M & 66.7M & 192M \\ + Non-zeros & 994.7M & 2,451M & 9,538M & 27,797M\\ + Max row weight & 5.5M & 14M & 28.2M & 82.6M\\ + Min row weight & 3 & 3 & 2 & 2\\ + Avg row weight & 95.08 & 93.6 & 143 & 144\\ + \hline + \end{tabular} + + \label{table:rsa_matrix} + \end{table} + +The existing formats do not achieve good performance due to the special structure of NFS matrices. Row weights of an NFS matrix have a very wide range (see Table \ref{table:rsa_matrix}). Hence using one warp or one thread per row (as in CSR or ELLPACK) results in an unbalanced workload. Moreover, the NFS matrices are highly unstructured, which does not facilitate cache-friendly vector access patterns using existing formats. These reasons have motivated our design of a new format. + +\section{A hybrid format for SpMV on GPUs} +\label{Implementation} + +As a preprocessing step, we reorder the rows of the matrix by their \emph{row weight}, in non-increasing order. The row weight of row $j$ of $B$ is defined as the total number of non-zero elements in row $j$. We then partition the sorted matrix rows into at most four consecutive parts. Each part uses a different format. The different formats are optimized for the sparseness properties of each partition as shown in Figure \ref{fig:partitioning}. For the densest part, we use a dense format. When the matrix gets less dense, we switch to another format which we call \index{Compressed storage format!Sliced COO} Sliced COO (SCOO). SCOO has three variants, small, medium, and large. Our formats are now described in more detail. + +\begin{figure}[t] + \centering + \includegraphics[scale=1.3]{Chapters/chapter19/fig/partitioning.pdf} + \caption{Partitioning of a row-sorted NFS matrix into four formats} + \label{fig:partitioning} +\end{figure} + + \subsection{Dense Format} + The dense format is used for the dense part of the matrix. This format uses 1 bit per matrix entry. Within a column, 32 matrix entries are stored as a 32 bit integer. Thus, 32 rows are stored as $N$ consecutive integers. + + Each CUDA thread works on a column. Each thread fetches one element from the input vector in coalesced fashion. Then, each thread checks the 32 matrix entries one by one. When the matrix entry is a non-zero, the thread performs a XOR operation between the element from the input vector and the partial result for the row. This means each thread only accesses the input vector once to do work on up to 32 non-zeros. The partial result from each thread needs to be stored and combined to get the final result for the 32 rows. These operations are performed in CUDA shared memory. + + The 32 threads in a warp share 32 shared memory entries to store the partial results from the 32 rows. Since all threads in a warp execute a common instruction at a time, access to these 32 entries can be made exclusive. The result from each warp in a thread block is combined using p-reduction on shared memory. The result from each thread block is combined using an atomic XOR operation on global memory. + + When the blocking factor is larger than 64, access to the shared memory needs to be reorganized to avoid bank conflicts. Each thread can read/write up to 64 bit data at a time to the shared memory. If a thread is accessing 128 bit data for example, two read/write operations need to be performed. Thus, there will be bank conflicts if we store 128 bit data on contiguous addresses. We can avoid bank conflicts by having the threads in a warp first access consecutive 64 bit elements representing the first halves of the 128 bit elements. Then, the threads again access consecutive 64 bit elements representing the second halves of the 128 bit elements. The same modification can be applied to other formats as well. + + \subsection{Sliced COO} + The SCOO format is adapted from the CADO-NFS software for CPUs \cite{ch19:cadonfs}. The aim is to reduce irregular accesses to the input vector and increase the texture cache hit rate. SCOO stores the column index and the row index of each non-zero. A number of consecutive rows form a slice. Non-zeros within a slice are sorted by their column index. We give an example of SCOO in Figure \ref{fig:scoo-1}, threads working on a slice can access contiguous elements from the input vector. In the figure, S1, S2 are two slices. Entries in the input vector denote the corresponding non-zero elements that the input vector element is multiplied with. + + For each non-zero, two bytes are used to store the column index. However, two bytes are not enough for large RSA matrices. Thus, we further divide a slice into groups. Group $i$ contains non-zeros with column index between $i \times 2^{16}$ and $(i+1) \times 2^{16} - 1$. An additional array stores the starting position of each group in the slice. + + \begin{figure}[t] + \centering + \includegraphics[height=5cm]{Chapters/chapter19/fig/scoo.pdf} + \caption{Example of the memory access pattern for a $6 \times 6$ matrix stored in Sliced COO format (Slice Size = 3 rows).} + \label{fig:scoo-1} + \end{figure} + + +\lstinputlisting[label=ch19:lst:spmv,caption=SpMV with SCOO format]{Chapters/chapter19/code.cu} + + One thread block works on a slice, one group at a time. Neighboring threads work on neighboring non-zeros in the group in parallel. Each thread works on more than one row of the matrix. Thus, each thread needs some storage to store the partial result and combine them with the result from the other threads to generate the final output. Each entry costs equally as the element of the vector i.e. the blocking factor in byte. Shared memory is used as intermediate storage as they have low latency however it is limited to 48 KB per SM in Fermi. The global memory is only accessed once at the end to write the final output. The CUDA kernel for SpMV with Sliced COO format is shown in Listing \ref{ch19:lst:spmv}. + + Since neighboring non-zeros may or may not come from the same row (recall that we sorted them by column index), many threads may access the same entry in the shared memory if it is used to store result of the same rows. Thus, shared memory entries are either assigned exclusively to a single thread or shared by using atomic XOR operations. Based on the way we allocate the shared memory, we further divide the Sliced COO format into three different subformats: small, medium, and large. + + \begin{table} + \caption{Sliced COO subformat comparison (\# rows per slices is based on $n=64$) } + \centering + \begin{tabular} + { | c || c | c | c |} + \hline + Sliced COO subformats & Small & Medium & Large \\ + \hline + Memory Sharing & No sharing & Among Warp & Among Block\\ + Access method & Direct & Atomic XOR & Atomic XOR\\ + Bank conflict & No & No & Yes\\ + \# Rows per Slice & 12 & 192 & 6144 \\ + \hline + \end{tabular} + \label{table:scoo} + \end{table} + + \subsubsection*{Small Sliced (SS) COO} + In this subformat, each thread has one exclusive entry in shared memory to store the partial result for each row. The assignment of the shared memory is organized such that each thread in a warp accesses only one bank and there is no bank accessed by more than one thread. Thus, there is no bank conflict. A p-reduction operation on shared memory is required to combine partial results from each thread. + + The maximum number of rows per slice is calculated as \emph{size of shared memory per SM in bits / (number of threads per block * blocking factor)}. We use 512 threads per block for 64 bit blocking factor which gives 12 rows, and 256 threads per block for 128 and 256 bit blocking factor, which gives 12 and 6 rows, respectively. Hence, one byte per row index is sufficient for this subformat. + + \subsubsection*{Medium Sliced (MS) COO} + In this subformat, each thread in a warp gets an entry in the shared memory to store the partial result for each row. However, this entry is shared with the threads in other warps. Access to the shared memory uses an atomic XOR operation. Each thread in a warp accesses only one bank, avoiding bank conflicts. A p-reduction operation on shared memory is required to combine the 32 partial results. + + The maximum number of rows per slice is calculated as \emph{size of shared memory per SM in bits / (32 * blocking factor)} where 32 is the number of threads in a warp. This translates to 192, 96, and 48 rows per slice for blocking factor of 64, 128, and 256 bit, respectively. Hence, one byte per row index is sufficient for this format. + + \subsubsection*{Large Sliced (LS) COO} + In this subformat, the result for each row gets one entry in shared memory, which is shared among all threads in the thread block. Access to shared memory uses an atomic XOR operation. Thus, there will be bank conflicts. However, this drawback can be compensated by a higher texture cache hit rate. There is no p-reduction on shared memory required. + + The maximum number of rows per slice is calculated as \emph{size of shared memory per SM in bits / blocking factor}. This translates to 6144, 3072, and 1536 rows per slice for blocking factor of 64, 128, and 256 bit, respectively. We use two bytes for the row index. + \linebreak + \linebreak + \noindent Table \ref{table:scoo} summarizes the differences between the three subformats. + \begin{itemize} + \item[a)] Each thread in a block is allocated one memory entry for the result of a row and works on consecutive 12 rows. A p-reduction to Thread\#1 is needed to get the final result of one row. + \item[b)] Each warp in a block is allocated one memory entry per row and works on 192 consecutive rows, threads in each warp use atomic XOR to update the value in a given entry. A p-reduction for each row to memory in Warp\#1 is needed to obtain the final result of that row. + \item[c)] A thread block works on 6144 consecutive rows and share the memory entry of each row. Any update to the memory has to use atomic XOR. + \end{itemize} + + \subsection{Determining the cut-off point of each format} + \label{ch19:mat-partition-1} + To determine which format to use, we compare the performance of two consecutive formats in terms of giga non-zeros (\emph{gnnz}) per second for a given matrix, starting with the dense format and the SS-COO format. The two formats start from the same row (starting from the first row) and work on the minimum number of rows possible. For the dense format, the minimum number of rows is 32. For the SS-COO format (and its variants), the minimum number of rows is \emph{the number of rows in a slice} times \emph{the number of multiprocessors in the GPU}, since one thread block works on one slice and one thread block is assigned to one multiprocessor. + + The next comparison depends on the result of the current comparison. If the dense format performs better, we decide to use it for rows 1 to 32, and we continue comparing the dense format and the SS-COO format starting from row 33. However, if the SS-COO format performs better, we compare its performance with the next format, MS-COO, starting from the same row, and so on. The idea is to stop considering the denser format once the sparser format outperforms it. Once we get to the comparison between MS-COO and LS-COO, and LS-COO performs better, we don't need to do any further comparisons. LS-COO should be used for the rest of the matrix. + + For Sliced COO format, it is essential to note that when one slice is assigned to each multiprocessor, the load for one multiprocessor may be much higher than that of the other multiprocessors. This is because the matrix rows have been reordered by their weight in a non-increasing order, so the first slice contains more non-zero entries than the rest. Thus, we need to further reorder the rows such that each multiprocessor gets the same level of load. + + The cut-off point determination is performed once per matrix and as a preprocessing step. Its runtime is equivalent to less than five iterations of SpMV. + + +\section{SCOO for Single-Precision Floating-Point Matrices} +The design of SCOO depends on performing atomic operations to combine the partia results. Atomic operations for double-precision are not available on current CUDA-enabled devices. Thus, we only present the SCOO extension for single-precision floating-point matrices. + +To extend SCOO for genereal matrices in real numbers, we first adapt to the variety of sparsity in real number matrices. Unlike NFS matrices, the sparsity is not predictable. Hence instead of using three subformats (SS-COO, MS-COO, LS-COO) with a fixed slice size (12, 192, 6144), we make the slice size a variable. Let $h$ denote the slice size, $S$ denote the size in byte of shared memory per thread block ($S=49152$ for Fermi) and $b$ denote the size of each matrix value in byte ($b=4$ for single-precision floating point). $h$ must be a positive integer value of the form of $h = \frac{S}{2^{i} b}$, $\forall{0 \leq i \leq T}$ where $T=\log_2{\textit{(maximum number of thread per block)}}$. + +For example in Fermi GPUs, single-precision floating point, $h \in \{12288, 6144, 3072, 1536, 768, 384, 192, 96, 48, 24, 12\}$ for $S=49152, b=4, T=10$. The algorithm in Section \ref{ch19:mat-partition-1} can be used to determine the cut-off point for each sub-formats. Figure \ref{fig:final-scoo} illustrates the final matrix in SCOO format assuming the number of multiprocessors in the GPU is $5$ and the row index is ranging from $0..d-1$. $H_i$ and $r_i$ is the slice size and starting row index of the sub-matrix $i$. + +\begin{figure}[t] + \centering + \includegraphics[width=8cm]{Chapters/chapter19/fig/final-scoo-book.pdf} + \caption{Partitioning of a row-sorted floating-point matrix into SCOO format.} + \label{fig:final-scoo} +\end{figure} + +More details of the SCOO format for floating-point matrices can be found in \cite{ch19:spmv-iccs} + +\section{Performance Evaluation} +\label{ch19:result} + +\subsection{Experimental Setup} +\begin{table} +\caption{Overview of hardware used in the experiments} +\begin{center} +\begin{tabular}{|l|l|l|l|} +\hline +Hardware & C2075 & GTX-580 & Core-i7 2700K\\ +\hline +\# Cores &448& 512 & 4\\ +\hline +Clock speed (Ghz)&1.15& 1.57 &3.5\\ +\hline +Memory type & GDDR5 & GDDR5 & DDR3-1600 \\ +\hline +Memory size (GB)&6 & 3 &16\\ +\hline +Max Memory bandwidth (GB/s)& 144 & 192 & 21 \\ +\hline +\end{tabular} +\end{center} +\label{table:hardware} +\end{table} + +Table \ref{table:hardware} specifies the GPUs and the CPU workstation used for performance evaluation. The performance is measured in terms of $ggnz$ and $Gflop/s$ for binary and floating-point matrices. Measured GPU performance does neither include PCIe data transfers nor matrix preprocessing. These are realistic assumptions since SpMV applications usually consist of a large number of iterations where the sparse matrix is iteratively multiplied by the input/output vectors. + +Our source code is compiled and executed using CUDA toolkit and driver version $4.2$ under Linux Ubuntu 12.04. + +\subsection{Experimental results of SpMV on NFS matrix} +We have evaluated our implementation on an NVIDIA Tesla C2075 (ECC disabled) with 6 GB RAM. We have compared the GPU performance with the open-source CADO-NFS \cite{ch19:cadonfs} program running on Intel Core i7-920 CPU with 12 GB DDR3-1066 memory. The RSA-170 matrix (see Table \ref{table:rsa_matrix}) is used for performance evaluation. + +The speedups compared to the multi-threaded CADO-NFS bucket implementation on an Intel Core i7-920 are given in brackets. The GPU memory required to store the sparse matrix and the corresponding bytes per non-zero (nnz) are also reported. CADO-NFS contains several CPU optimized SpMV implementations using multi-threading and SSE instructions. In this experiment, we compare the performance of our implementation to the CPU cache-optimized bucket format of CADO-NFS using 8 threads. + +\begin{table}[t] + \caption{Performance of SpMV on RSA-170 matrix} + \label{table:rsa170} + \centering + \begin{tabular} + { | c || c | c | c | c |} + \hline + Blocking & C2075 & 2 x C2075 & Core i7-920 & GPU memory \\ + factor & (speedup) & (speedup) & CADO-NFS & (bytes/nnz) \\ + \hline + 64 & 4.28 (4.9) & 8.38 (9.5) & 0.88 & 2748 MB (2.90)\\ + 128 & 2.78 (5.6) & 5.37 (10.7) & 0.5 & 2967 MB (3.13)\\ + 256 & 1.88 (7.0) & 3.68 (13.6) & 0.27 & 3000 MB (3.16)\\ + + \hline + \end{tabular} +\end{table} + + Table \ref{table:rsa170} shows the result. The dual-GPU implementation achieves speedups between 1.93 and 1.96 compared to the single-GPU performance. + + Table \ref{table:individual} show the individual performance of each sub-format (in \emph{gnnz/s}), the percentage of non-zeros are included in bracket. The result show that the performance decreases when the matrix gets sparser. The MS-COO and LS-COO performance degrade when the blocking factor is increased from 64 to 128 and 256 bit. This is caused by the increased number of bank conflicts and serialization of atomic XOR operations on larger blocking factors. Thus, the SS-COO format gets a higher percentage of non-zeros with 128 and 256 bit blocking factor. + + More detail results of our full Block Wiedemann CUDA implementation as well as a multi-GPU implementation can be found in \cite{ch19:spmv-ccpe} + +\begin{table}[h] + \caption{Performance for each of the four sub-format partitions of the RSA-170 matrix on a C2075.} + \label{table:individual} + \centering + \begin{tabular} + { | c || c | c | c | c | c |} + \hline + Blocking factor & Dense & SS-COO & MS-COO & LS-COO \\ + \hline + 64 & 13.66 (24\%) & 9.66 (11\%) & 8.13 (13\%) & 2.77 (52\%) \\ + 128 & 9.66 (15\%) & 7.53 (24\%) & 3.23 (6\%) & 1.86 (55\%) \\ + 256 & 7.00 (15\%) & 4.21 (21\%) & 2.34 (6\%) & 1.33 (58 \%) \\ + \hline + \end{tabular} +\end{table} + +\subsection{Experimental results of SpMV on floating-point matrices} +\label{ch19:result-2} +\npthousandsep{,} + +\begin{table} +\caption{Overview of sparse matrices used for performance evaluation} +\begin{center} +\begin{tabular}{|l|n{8}{0}|n{9}{0}|n{3}{2}|l|} +\hline +{Name} & row & column & nz/row & Description \\ +\hline +GL7d19 &1911130&1955309&19.53& combinatorial problem \\ +\hline +relat9 &12360060&549336&3.15& combinatorial problem \\ +\hline +wikipedia-20070206 &3566907&3566907&12.62& directed graph \\ +\hline +wb-edu &9845725&9845725&5.81& directed graph\\ +\hline +road\_usa &23947347&23947347&2.41& undirected graph \\ +\hline +hugebubbles-00010 &19458087&19458087&3.00& undirected graph \\ +\hline +circuit5M &5558326&5558326&10.71&circuit simulation\\ +\hline +nlpkkt120 &3542400&3542400&26.85&optimization problem\\ +\hline +cage15 &5154859&5154859&19.24&directed weighted\\ +\hline +kron\_g500-logn21 &2097152&2097152&86.82&undirected multigraph\\ +\hline +indochina-2004&7414866&7414866&26.18& directed graph \\ +\hline +nlpkkt160 &8345600&8345600&27.01&optimization problem\\ +\hline +rgg\_n\_2\_24\_s0 &16777216&16777216&15.80&undirected random\\ +\hline +uk-2002 &18520486&18520486&16.10&directed graph\\ +\hline +\end{tabular} +\end{center} +\label{table:matrices} +\end{table} + +\begin{figure} +\label{fig:mat-visual} +\centering + \subfigure[nlpkkt120] { + \includegraphics[width=100pt]{Chapters/chapter19/fig/matrix-str.pdf} + \label{fig:mat-str} + } + \subfigure[Relat9 - first 10000 rows] { + \includegraphics[width=100pt]{Chapters/chapter19/fig/matrix-mid.pdf} + \label{fig:mat-mid} + } + \subfigure[GL7d19 - first 500 rows and columns] { + \includegraphics[width=100pt]{Chapters/chapter19/fig/matrix-uns.pdf} + \label{fig:mat-unstr} + } + + \caption{Visualization of \emph{nlpkkt120}, \emph{Relat9}, and \emph{GL7d19} matrix.} +\end{figure} + +\begin{figure} +\centering +\includegraphics[height=5cm]{Chapters/chapter19/fig/scoo-a.pdf} +\caption{Performance comparison of SCOO and other GPU formats for each test matrix on a Fermi Tesla C2075 (ECC disabled).} +\label{fig:scoo-vs-gpu} +\end{figure} + +\subsubsection{Performance comparison to existing GPU formats} +We compare the performance of our SCOO format to available SpMV implementations on both GPU and CPU. The set of selected test matrices are collected from the University of Florida Sparse Matrix Collection \cite{ch19:matrix-collection}. We have chosen the biggest matrices from different areas that with their corresponding input and output vector can still fit into the 6GB global memory of a C2075 GPU. Table \ref{table:matrices} gives an overview of those matrices. + +We compare the SCOO format to the CSR, COO and HYB format of Cusp 0.3.0. Other Cusp formats are not able to run on the large tested matrices that we selected. The results are shown in Figure \ref{fig:scoo-vs-gpu}. The performance are in terms of Gflop/s which is based on the assumption of two flops per non-zero entry of the matrix \cite{ch19:nvidia-spmv, ch19:bellpack}. + +The SCOO format achieves a stable performance for different matrices in single-precision mode. In most cases a performance of over 10 Gflop/s can be sustained. For some highly unstructured matrices such as \emph{GL7d19}, \emph{wikipedia-20070206}, \emph{rgg\_n\_2\_24\_s0} and \emph{kron\_g500-logn21} SCOO achieves high speedups ranging from 3 to 6 compared to the best performaning Cusp format. + +For most matrices, HYB produces the best performance among the tested Cusp formats. HYB is able to outperform SCOO only for two matrices: \emph{nlpkkt120} and \emph{nlpkkt160}. Both matrices have a similar structure i.e. they consist of consecutive rows that have a very similar number of non-zero coefficients which is suitable to be stored in the ELL section of the HYB format. Moreover the non-zeros are close to each other facilitating coaleasing and cache-friendly access patterns by nature. SCOO is able to outperform COO and CSR for all tested matrices. + +In matrix $Relat9$ we observe some patterns but the matrix is still generally unstructured, thus SCOO is able to achieve about 2 times speed up compared to HYB which is the best among tested Cusp formats in this case. The average speedup of SCOO for the tested matrices is 3.0 compared to CSR, 5.02 compared to COO, 2.15 compared to HYB. + +We show the visualization of sparse matrices \emph{nlpkkt120}, \emph{Relat9}, \emph{GL7d19} in Figure \ref{fig:mat-str}, \ref{fig:mat-mid}, {fig:mat-unstr} using MatView \cite{ch19:matview}. The white color represents zero entries, gray color represents non-zero entries. + +\subsubsection{Performance comparison to a CPU implementation} +\begin{figure} +\centering +\includegraphics[width=200pt]{Chapters/chapter19/fig/gpu-cpu.pdf} + +\caption{Performance of the SCOO on a GTX-580 and a CPU implementation using MKL performed on a Core-i7 2700K using 8 threads.} +\label{fig:scoo-vs-cpu} +\end{figure} + +We use the Intel MKL library 10.3 in order to compare SCOO performance to an optimized CPU implementation. MKL SpMV receives the input matrices in CSR format. The results are shown in Figure \ref{fig:scoo-vs-cpu}. Using a GTX-580, we achieve speedups ranging between 5.5 and 18 over MKL on a 4-core CPU with hyper-threading using 8 threads. Also note that the SCOO performance on a GTX-580 is around 1.5 times faster than on the C2075 due to the increased memory bandwidth and clock speed. The storage requirement for the \emph{rgg\_n\_2\_24\_s0} and \emph{uk-2002} matrices and associated input/output vectors slightly exceeds the 3 GB global memory of the GTX-580 and thus are not included. + +\section{Conclusion} +\label{ch19:conclusion} +In this chapter, we have presented our implementation of iterative SpMV for NFS matrices on GPUs with the CUDA programming language. Our GPU implementation takes advantage of the variety of sparseness properties in NFS matrices to produce suitable formats for different parts. The GPU implementation shows promising improvement over an optimized CPU implementation. As the size of integers in factorization projects is expected to increase further, the linear algebrea step of NFS will become an even bigger bottleneck. The size and sparseness of matrices generated by the NFS sieving step are growing significantly with the size of the integer to be factored. Thus, a big GPU cluster is required to accelerate the linear algebra step. However, in order to achieve scalability for bigger problem sizes, the amount of GPU RAM and data transfer bandwidth need to be increased in addition to the number of GPUs. + +We further adapted the proposed Sliced COO format to single-precision floating-point numbers and evaluated it with large and sparse matrices derived from other computational science applications. We have published our code at [-to be updated-]. + +\putbib[Chapters/chapter19/biblio] + diff --git a/BookGPU/Chapters/chapter19/code.cu b/BookGPU/Chapters/chapter19/code.cu new file mode 100644 index 0000000..3a95e55 --- /dev/null +++ b/BookGPU/Chapters/chapter19/code.cu @@ -0,0 +1,67 @@ +// compute y = B*x (B is stored in SCOO formats [ cols, rows, values, offsets, numPacks, numRows ]) +// LANE_SIZE = 2^k +// NUM_ROWS_PER_SLICE is computed based on sparsity +template +__global__ void +sliced_coo_kernel( + const uint32_t numRows, + const uint32_t numPacks, + const uint32_t * cols, + const uint16_t * rows, + const float * values, + const uint32_t * offsets, + const float * x, + float * y) +{ + const int thread_lane = threadIdx.x & (LANE_SIZE-1); // ~ threadIdx.x % LANE_SIZE + const int row_lane = threadIdx.x/(LANE_SIZE); + + __shared__ float sdata[NUM_ROWS_PER_SLICE][LANE_SIZE]; + + const uint32_t packNo=blockIdx.x; + const uint32_t limit = ( (packNo==numPacks-1)?((numRows-1)%NUM_ROWS_PER_SLICE)+1:NUM_ROWS_PER_SLICE ); + + const uint32_t begin = offsets[packNo]; + const uint32_t end = offsets[packNo+1]; + for(int i=row_lane; i16 && thread_lane<16) + p[des]+=p[(des+16)&(LANE_SIZE-1)]; __syncthreads(); + if (LANE_SIZE>8 && thread_lane<8) + p[des]+=p[(des+8)&(LANE_SIZE-1)]; __syncthreads(); + if (LANE_SIZE>4 && thread_lane<4) + p[des]+=p[(des+4)&(LANE_SIZE-1)]; __syncthreads(); + if (LANE_SIZE>2 && thread_lane<2) + p[des]+=p[(des+2)&(LANE_SIZE-1)]; __syncthreads(); + if (LANE_SIZE>1 && thread_lane<1) + p[des]+=p[(des+1)&(LANE_SIZE-1)]; __syncthreads(); + } + + __syncthreads(); + const uint32_t actualRow = packNo * NUM_ROWS_PER_SLICE; + + for(int r = threadIdx.x; r < limit; r+=THREADS_PER_BLOCK) + y[actualRow+r] = sdata[r][thread_lane]; +} diff --git a/BookGPU/Chapters/chapter19/fig/ex_matrix.pdf b/BookGPU/Chapters/chapter19/fig/ex_matrix.pdf new file mode 100644 index 0000000000000000000000000000000000000000..de0e3d83fe2db7113f50da1b32191bf7ec730a21 GIT binary patch literal 4836 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 literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/gpu-cpu.pdf b/BookGPU/Chapters/chapter19/fig/gpu-cpu.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ccbfc09b20579ed9ba90142d232cef4ada8b4079 GIT binary patch literal 55505 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 AUH||9 literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/matrix-mid.pdf b/BookGPU/Chapters/chapter19/fig/matrix-mid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..803d6754aa048b9f6b39864a43ac1cd2e2abb274 GIT binary patch literal 27140 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 literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/matrix-str.pdf b/BookGPU/Chapters/chapter19/fig/matrix-str.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5600e7d104534d598fd3f6eb5550ba1780547ae5 GIT binary patch literal 13675 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 literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/matrix-uns.pdf b/BookGPU/Chapters/chapter19/fig/matrix-uns.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bed87ffce72bed0c222eb381e2bfcf7b5a68b0fe GIT binary patch literal 78107 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 literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/scoo-a.pdf b/BookGPU/Chapters/chapter19/fig/scoo-a.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a391d3f295b631bba5bee8aea29ec71f6528f9c5 GIT binary patch literal 43675 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 K5S*9iM)^1KtJq-x literal 0 HcmV?d00001 diff --git a/BookGPU/Chapters/chapter19/fig/scoo.pdf b/BookGPU/Chapters/chapter19/fig/scoo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a88976fb2fdf9ab3e51e85893073047fc6f0d6e GIT binary patch literal 13891 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 literal 0 HcmV?d00001 -- 2.39.5