Preconditioning techniques for sparse linear systems