Using process-level redundancy to exploit multiple cores for transient fault tolerance