# GPU Support#

## Overview#

PyLops supports computations on GPUs powered by CuPy (`cupy-cudaXX>=10.6.0`

).
This library must be installed *before* PyLops is installed.

Note

Set environment variable `CUPY_PYLOPS=0`

to force PyLops to ignore the `cupy`

backend.
This can be also used if a previous (or faulty) version of `cupy`

is installed in your system,
otherwise you will get an error when importing PyLops.

Apart from a few exceptions, all operators and solvers in PyLops can
seamlessly work with `numpy`

arrays on CPU as well as with `cupy`

arrays
on GPU. Users do simply need to consistently create operators and
provide data vectors to the solvers, e.g., when using
`pylops.MatrixMult`

the input matrix must be a
`cupy`

array if the data provided to a solver is also `cupy`

array.

Warning

Some `pylops.LinearOperator`

methods are currently on GPU:

`pylops.LinearOperator.eigs`

`pylops.LinearOperator.cond`

`pylops.LinearOperator.tosparse`

`pylops.LinearOperator.estimate_spectral_norm`

Warning

Some operators are currently not available on GPU:

Warning

Some solvers are currently not available on GPU:

`pylops.optimization.sparsity.SPGL1`

## Example#

Finally, let’s briefly look at an example. First we write a code snippet using
`numpy`

arrays which PyLops will run on your CPU:

```
ny, nx = 400, 400
G = np.random.normal(0, 1, (ny, nx)).astype(np.float32)
x = np.ones(nx, dtype=np.float32)
Gop = MatrixMult(G, dtype='float32')
y = Gop * x
xest = Gop / y
```

Now we write a code snippet using `cupy`

arrays which PyLops will run on
your GPU:

```
ny, nx = 400, 400
G = cp.random.normal(0, 1, (ny, nx)).astype(np.float32)
x = cp.ones(nx, dtype=np.float32)
Gop = MatrixMult(G, dtype='float32')
y = Gop * x
xest = Gop / y
```

The code is almost unchanged apart from the fact that we now use `cupy`

arrays,
PyLops will figure this out!

Note

The CuPy backend is in active development, with many examples not yet in the docs. You can find many other examples from the PyLops Notebooks repository.