The paper considers performance and reliability of fault-tolerant software running on a hardware system that consists of multiple processing units. The software consists of functionally equivalent but independently developed versions that start execution simultaneously. The computational complexity and reliability of different versions are different. The system completes the task execution when the outputs of a pre-specified number of versions coincide. The processing units are characterized by different availability and processing speed. It is assumed that they are able to share the computational burden perfectly and that execution of each version can be fully parallelized. The algorithm based on the universal generating function technique is used for determining the distribution of system task execution time. This algorithm allows analysts to evaluate complex hardware-software reliability and performance indices such as expected task execution time and probability that the task is completed within a given time. Illustrative examples are also presented.