Fault-Tolerance Techniques for High-Performance Computing