two operations per point (weight times convolution function, add to grid), for a total of $2 M_{\rm k}^2$ operations per visibility. Degridding also requires two operations per point(convolution function times grid, add to result) and and therefore requires $2 M_{\rm k}^2$ operations per visibility.

### Memory bandwidth

Gridding requires the convolution function, and the grid position to be retrieved and written back to memory, requiring $3 M_{k}^2$ memory transactions per visibility. Degridding has no requirement to write back the result, (as the intermediate sum is stored in a register), so only $2 M_{\rm k}^2$ memory transactions are required.

### Storage

To compute the total memory required, we will determine the amount required to store $N_w$ $w$-planes for values of $w$ between $[0, +w_{\rm max}]$, uniformly sampled with width $\Delta w = w_{\rm max}/N_w$. In practice, we need to store $w$-planes for $[-w_{\rm max},0)$, so we will take the above result and multiply by two.

The amount of memory required to store the convolution functions is therefore equal to the sum of the oversampled convolution functions, i.e.:

$$\begin{aligned}
\frac{N_{\rm mem}}{2} & = & \sum_{k = 0}^{N_w}{(\kappa M_k)^2} \nonumber \\
& = & -4 \kappa^2 \log \epsilon \left (N_w \delta_A + \frac{\Delta 