cache hierarchy. We assume the simplest case: i.e. no caching. In practice, this is a reasonable assumption, as visibilities are often stored in no particular order. Therefore, the desired grid (and convolution functions in the case of convolutional gridding) are essentially random, meaning that all memory accesses go to the main memory and bypass the caches.

For the fast Gauss transform, gridding a visibility requires the updating of $(q'+1)^2 N_B$ complex coefficients. The coefficients must be read into the processor, updated, and written back to memory, requiring $2 (q'+1)^2 N_B$ memory transactions per visibility.

For degridding, the coefficients do not need to be written back to memory, therefore the only $(q'+1)^2 N_B$ memory transactions are required.

### Storage

For an image size of $N_{\rm pix}^2$, the gridding operation requires storage for $(N_{\rm pix}/L)^2 (p- p_d+1)^2$ complex coefficients. Degridding requires the same storage.

Performance of convolutional gridding and degridding
----------------------------------------------------

In this section we derive the operations count, memory bandwidth and storage required to perform gridding and degridding with stored convolution funcitons. In order to put the two methods on equal footing in terms of imaging performance, we will use Gaussian anti-aliasing functions for the $w$-projection, rather than the commonly-used prolate 