programming massively parallel processors a hands on approach david b kirk