HeNCE [BDG+93] is a tool environment supporting the development and execution of parallel programs based on graphical specifications. A program is specified by a graph whose nodes are user defined sequential subroutines written in C or Fortran. In addition, the graph may contain special nodes for conditionals, loops, fans, and pipes. Fans are used to dynamically replicate parts of the graph, thus allowing to express data parallelism. The graph's arcs represent dependencies between nodes, i.e. they define data flow between the subroutines. The semantics of this graph is similar to a data-flow graph: A subroutine node is executed, when its predecessors have completed and its input data is available.
From this graphical representation and the bodies of the user's subroutines, HeNCE generates a parallel program that is able to run on top of PVM. Each subroutine node translates into one PVM process, or a number of replicated processes if it is inside a fan. The placement of these processes on available machines is controlled by a user defined cost-matrix specifying the cost of executing a subroutine on a particular machine. The code for the communication between the different processes necessary for passing data between graph nodes is automatically built by HeNCE.
HeNCE also offers support for the compilation of the resulting program, for configuring the parallel virtual machine, and for running the program. In addition, basic performance monitoring and visualization is provided, using traces generated during the program's execution. These traces can be examined post-mortem or during runtime in a continuous-play or a single-step mode. During the animation, the execution state of each subroutine node is indicated in the program's graphical specification. The possible states are ``not ready'', ``started'', ``executing'', ``function completed'', and ``exited''. An annotation of each node also shows how many copies of this node are in the running or idle state. In addition, there are two other views: The host map shows all machines used by the program together with their state (performing bookkeeping, running user subroutine) and the subroutine nodes executing on them. The utilization graph displays the state of each host over a time axis.