Techniques to Improve The Hard And Soft Error Reliability of Distributed Architectures