What does one need to know about problem structure to produce good parallel software?