Check out the new USENIX Web site. next up previous
Next: Discovering compute time Up: Design overview Previous: Design overview

Discovering data dependencies

In general, one can automatically discover the data dependencies across all nodes by throttling each node in turn. When a node is being throttled, its I/O is delayed until all other nodes either exit or block/spin on an event. If a node exits, then it is obviously not dependent on the node being throttled. Conversely, any node that blocks must have some data dependency, perhaps only indirectly, with the throttled node. To reflect these dependencies, the throttled node will add a SIGNAL() to its trace and the blocking nodes will add a corresponding WAIT() to their traces. Figure 3 illustrates an example.

Of course, delaying every I/O could increase the running time of an application considerably. For this reason, one can selectively determine which I/Os to delay (I/O sampling) and which nodes to throttle (node sampling), thereby trading replay accuracy for tracing time. This trade-off is discussed further in Section 5.

Figure 3: Example of trace annotation
\begin{figure}\begin{center}
\epsfig{file=fig/write-read.eps, scale=1.0}
\end{ce...
...ition, computation
time can be added as \texttt{COMPUTE()} calls.}
\end{figure}



Michael Mesnier 2006-12-22