Scientific parallel programs often undergo significant performance tuning before meeting performance expectation. Performance tuning naturally involves a diagnosis process -- locating performance bugs that make a program inefficient and explaining them in terms of high-level program design. In this talk, I will present a systematic approach to diagnosing parallel programs with minimum user intervention. We exploit program semantics and parallelism embedded in parallel programming models to search and explain performance bugs. First, I will present observations of existing performance analysis methods that motivate our work. Then I will describe conceptual components and processes involved in model-based automatic performance diagnosis. Finally, I will show our experience diagnosing parallel Divide-and-Conquer, Wavefront, and Master-worker programs using the method proposed.