# compute y = sin(x) + x^2 @jit(nopython=True, cache=True, fastmath=True, parallel=True) defkernel(n, x, y): for i in prange(n): val = x[i] y[i] = np.sin(val) + val * val
n = int(2e8) x = PETSc.Vec().createMPI(n, comm=PETSc.COMM_WORLD) y = PETSc.Vec().createMPI(n, comm=PETSc.COMM_WORLD)
x.set(2.0) y.set(0.0) x_np = x.getArray()
with timeit_ctx("Numba Compile"): kernel.compile((int64, float64[:], float64[:]))
with timeit_ctx("PETSc"): with x as x_loc, y as y_loc: size_loc = x.getLocalSize() kernel(size_loc, x_loc, y_loc)
with timeit_ctx("NumPy"): y_np = np.sin(x_np) + x_np**2
echo -e "\nAdd the following to your ~/.bashrc or run in your terminal to use the \033[1mOptimized\033[0m version:" echo"---------------------------------------------------" echo"export PETSC_DIR=$PETSC_DIR" echo"export PETSC_ARCH=$ARCH_OPT" echo"export PYTHONPATH=\\$PETSC_DIR/\\$PETSC_ARCH/lib:$PYTHONPATH" echo"---------------------------------------------------"
echo -e "\nSwitch to \033[1mDebug\033[0m version when developing:" echo"---------------------------------------------------" echo"export PETSC_ARCH=$ARCH_DEBUG" echo"export PYTHONPATH=\\$PETSC_DIR/\\$PETSC_ARCH/lib:$PYTHONPATH" echo"---------------------------------------------------"
from petsc4py import PETSc PETSc.Options().insertString("-vec_type cuda") opts = PETSc.Options() for k in opts.getAll(): PETSc.Sys.Print(f"{k} = {opts.getString(k)}")
n = 1024 v = PETSc.Vec().create(PETSc.COMM_SELF) v.setSizes(n) v.setFromOptions() v.set(1.0) v.assemblyBegin(); v.assemblyEnd()