One reason to have several compilers is to get an alternate wording for compile time errors. Consider what happens with the following code, which has a distribute statement inside an extrinsic procedure:
       extrinsic(hpf_local) subroutine vprng_local(a)
       use hpf_local_library
!hpf$ distribute (block) a
          :
One compiler complains as follows:
r01n05 % pghpf -c LotsaShifts.f 
PGHPF-S-0034-Syntax error at or near identifier a (LotsaShifts.f: 70)
  0 inform,   0 warnings,   1 severes, 0 fatal for vprng_local
PGHPF/any RS6000/AIX Rel 2.2-1: compilation completed with severe errors
That can be a little mystifying, so we try it with another compiler:
r01n05 % xlhpf -c LotsaShifts.f 
** lotsashifts   === End of Compilation 1 ===
"LotsaShifts.f", line 70.5: 1513-174 (S) The DISTRIBUTE directive 
    must not appear in an EXTRINSIC(HPF_LOCAL) subprogram.
       :
(back to main talk)