As such, it is common to use blocking techniques in many algorithms, where a block of data is brought in from global memory and processed in one of the faster memories.

![The memory hierarchy of a modern GPU.[]{data-label="fig:memory_hierarchy"}](memory.pdf){width="45.00000%"}

Related Work
------------

Batched GPU routines for LU, Cholesky and QR factorizations have been developed in [@batchqr_haidar; @batch_haidar; @charara_batch_tdla] using a block recursive approach which increases data reuse and leads to very good performance for relatively large matrix sizes. GPU routines optimized for computing the QR decomposition of very tall and skinny matrices are presented in [@caqr_anderson] where they develop an efficient transpose matrix-vector computation that is employed with some minor changes in this work. GPU-CPU hybrid algorithms for batched SVD using Jacobi and bidiagonalization methods are introduced in [@kotas_svd] where pair generation for the Jacobi method and the solver phase of the bidiagonalization are handled on the CPU. The work in [@Kang2015] employs the power method to construct a rank 1 approximation for 2D filters in convolutional neural networks. Routines to handle the SVD of many matrices on GPUs is presented in [@badolato_2015] where each thread within a warp computes the SVD of a single matrix.

Batched QR Decomposition {#sec:batch_qr}
========================

