Since most parallel programming is done using sequential languages extended with communication constructs, most research into source-level debugging has involved methods of extending sequential debuggers with support for multiple processes and message tracking. One of the challenges of this approach, particularly when applied to MIMD programs, is scalability. The p2d2[Hoo96] debugger, for instance, provides support for up to 256 processes, with information available at various levels of detail. The user interface provides views of the computation as a whole, of groups of processes, and of individual threads. Debugger commands can be issued to any of these levels of focus.
Another approach to the scalability problem which also addresses the problem of non-reproducible behavior is event-based debugging, which requires what might be considered a super-source-level view of computation. The user specifies the computation in terms of high-level events, and the debugger automatically compares this specification to the executing code. While it has been shown that this approach can be successfully applied in some situations [She96], it is not an ideal solution, since it requires the user to learn a new language for event specification.
As mentioned above, the difficulty of MIMD parallel debugging is due, in part, to the nondeterminism and large state-space of multiple asynchonous processes. Since data-parallel programs do not display these characteristics, the structure provided by the language should simplify the task of source-level debugging. A similar situation is discussed by Cohn[Coh91] in his attempt to provide source-level debugging of automatically parallelized code. Because the code generated by a thread splitting transformation is regular and well-structured, it is possible to reconstruct a sequential view from the execution of the parallel computation.