context of hierarchical matrix operations, effective compression relies on the ability to perform the computation of large batches of independent SVDs of small matrices of low numerical rank. Randomized methods [@halko2011finding] are well suited for computing a truncated SVD of these types of matrices and are built on three computational kernels: the QR factorization, matrix-matrix multiplications and SVDs of smaller $k \times k$ matrices. Motivated by this task, we discuss the implementation of high performance batched QR and SVD kernels on the GPU, focusing on the more challenging SVD tasks.

The remainder of this paper is organized as follows. Section \[sec:background\] presents different algorithms used to compute the QR factorization and the SVD as well as some considerations when optimizing for GPUs. Section \[sec:batch\_qr\] discusses the batched QR factorization and compares its performance with existing libraries. Sections \[sec:registers\], \[sec:shared\] and \[sec:block\_global\] discuss the various implementations of the SVD based on the level of the memory hierarchy in which the matrices can reside. Specifically, Section \[sec:registers\] describes the implementation for very small matrix sizes that can fit in registers, Section \[sec:shared\] describes the implementation for matrices that can reside in shared memory, and Section \[sec:block\_global\] describes the block Jacobi implementation for 