Fix some documentation problems
| @ -105,14 +105,14 @@ state. | ||||
| 
 | ||||
| The channels can be updated in three ways: | ||||
| 
 | ||||
| 1) A fixed state can be set to the channel using `chan_set()`, which | ||||
| 1. A fixed state can be set to the channel using `chan_set()`, which | ||||
| overrides the previous state. | ||||
| 
 | ||||
| 2) The new state can be stored in a stack with `chan_push()` and | ||||
| 2. The new state can be stored in a stack with `chan_push()` and | ||||
| `chan_pop()`, to remember the history of the previous states. The | ||||
| emitted event will be the one on the top. | ||||
| 
 | ||||
| 3) Using a punctual event. | ||||
| 3. Using a punctual event. | ||||
| 
 | ||||
| Setting the channel state is commonly used to track quantities such as | ||||
| the number of threads running per CPU. While the stack mode is commonly | ||||
| @ -133,7 +133,7 @@ An example program may be instrumented like this: | ||||
| 		instr("Xf]"); | ||||
| 	} | ||||
| 
 | ||||
| Then, in the emulator, when processing the events "Xf[" and "Xf]", we | ||||
| Then, in the emulator, when processing the events `Xf[` and `Xf]`, we | ||||
| could track of the state as follows: | ||||
| 
 | ||||
| 	int hook_pre_foo(struct ovni_chan *chan, int value) { | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| # Emulation overview | ||||
| 
 | ||||
| The emulator reads the events stored during runtime and reconstructs the | ||||
| execution, restoring the state of each thread and CPU as time evolves. During | ||||
| the emulation process, a detailed trace is generated with the state of the | ||||
| execution in the Paraver PRV format. | ||||
| The emulator `ovniemu` reads the events stored during runtime and | ||||
| reconstructs the execution, restoring the state of each thread and CPU | ||||
| as time evolves. During the emulation process, a detailed trace is | ||||
| generated with the state of the execution in the Paraver PRV format. | ||||
| 
 | ||||
| The emulator has an execution model to represent the real execution that | ||||
| happened on the hardware. It consists of CPUs which can execute multiple threads | ||||
| @ -24,3 +24,18 @@ that use the same CPUs in a single node are grouped into looms. | ||||
| 
 | ||||
| The task model includes the information of MPI and tasks of the | ||||
| programming model (OmpSs-2). | ||||
| 
 | ||||
| ## Design considerations | ||||
| 
 | ||||
| The emulator tries to perform every posible check to detect if there is | ||||
| any inconsistency in the received events from the runtime trace. When a | ||||
| problem is found, the emulation is aborted, forcing the user to report | ||||
| the problem. No effort is made to let the emulator recover from an | ||||
| inconsistency. | ||||
| 
 | ||||
| The emulator critical path is kept as simple as possible, so the | ||||
| processing of events can keep the disk writting as the bottleneck. | ||||
| 
 | ||||
| The linter mode enables more tests which are disabled from the default | ||||
| mode to prevent costly operations running in the emulator by default. | ||||
| The linter tests are enabled when running the ovni testsuite. | ||||
|  | ||||
| @ -2,4 +2,4 @@ | ||||
| 
 | ||||
| The ovni model tracks the state of threads and cpus. | ||||
| 
 | ||||
|  | ||||
|  | ||||
|  | ||||
| Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB | 
							
								
								
									
										17
									
								
								doc/extra.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | ||||
| .rst-content code { | ||||
|   color: inherit; | ||||
|   font-size: 85%; | ||||
|   border: none; | ||||
|   padding: 0px; | ||||
|   background: #f8f8f8; | ||||
| } | ||||
| 
 | ||||
| .rst-content pre code { | ||||
|   color: inherit; | ||||
|   font-size: 80%; | ||||
|   line-height: 1.5em; | ||||
| } | ||||
| 
 | ||||
| p { | ||||
|   line-height: 1.5em; | ||||
| } | ||||
| @ -9,6 +9,10 @@ Instrumentation project. | ||||
| 	unless the grammar rules suggest otherwise, such as starting a | ||||
| 	new sentence. | ||||
| 
 | ||||
| The ovni project implements a fast instrumentation library that records | ||||
| small events (starting at 12 bytes) during the execution of programs to | ||||
| later investigate how the execution happened. | ||||
| 
 | ||||
| The instrumentation process is split in two stages: [runtime](runtime) | ||||
| tracing and [emulation](emulation/). | ||||
| 
 | ||||
|  | ||||
| @ -1,9 +1,13 @@ | ||||
| # Trace specification version 1 | ||||
| # Trace specification | ||||
| 
 | ||||
| !!! Note | ||||
| 
 | ||||
| 	Thie is the trace specification for the version 1 | ||||
| 
 | ||||
| The ovni instrumentation library stores the information collected in a | ||||
| trace following the specification of this document. | ||||
| 
 | ||||
| The complete trace is stored in a top-level directory named "ovni". | ||||
| The complete trace is stored in a top-level directory named `ovni`. | ||||
| Inside this directory you will find the loom directories with the prefix | ||||
| `loom.`. The name of the loom is built from the `loom` parameter of | ||||
| `ovni_proc_init()`, prefixing it with `loom.`. | ||||
| @ -79,7 +83,7 @@ the variable size events just after the header. | ||||
| The header contains the magic 4 bytes of "ovni" and a version number of | ||||
| 4 bytes too. Here is a figure of the data stored in disk: | ||||
| 
 | ||||
| <img src="fig/stream.svg" alt="Stream" width="400px"/> | ||||
| <img src="stream.svg" alt="Stream" width="400px"/> | ||||
| 
 | ||||
| Similarly, events have a fixed size header followed by an optional | ||||
| payload of varying size. The header has the following information: | ||||
| @ -120,7 +124,7 @@ bytes: | ||||
| 
 | ||||
| And in the following figure you can see every field annotated:  | ||||
| 
 | ||||
| <img src="fig/event-normal.svg" alt="Normal event without payload" width="400px"/> | ||||
| <img src="event-normal.svg" alt="Normal event without payload" width="400px"/> | ||||
| 
 | ||||
| Another example of a normal event with 16 bytes of payload, a total of | ||||
| 28 bytes: | ||||
| @ -132,7 +136,7 @@ ff ff ff ff 00 00 00 00  00 00 00 00              |............| | ||||
| 
 | ||||
| In the following figure you can see each field annotated: | ||||
| 
 | ||||
| <img src="fig/event-normal-payload.svg" alt="Normal event with payload content" width="400px"/> | ||||
| <img src="event-normal-payload.svg" alt="Normal event with payload content" width="400px"/> | ||||
| 
 | ||||
| ## Jumbo events | ||||
| 
 | ||||
| @ -157,7 +161,7 @@ data: | ||||
| 
 | ||||
| In the following figure you can see each field annotated: | ||||
| 
 | ||||
| <img src="fig/event-jumbo.svg" alt="Jumbo event" width="400px"/> | ||||
| <img src="event-jumbo.svg" alt="Jumbo event" width="400px"/> | ||||
| 
 | ||||
| ## Design considerations | ||||
| 
 | ||||
| Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB | 
| Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
| Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB | 
| @ -1,23 +1,24 @@ | ||||
| # Tracing a program with ovni | ||||
| # Tracing a program | ||||
| 
 | ||||
| Read carefully this document before using libovni to generate a trace. | ||||
| 
 | ||||
| ## Mark the start and end of processes and threads | ||||
| ## Trace processes and threads | ||||
| 
 | ||||
| Call `ovni_proc_init()` when a new program begins the execution. | ||||
| - Call `ovni_proc_init()` when a new process begins the execution. | ||||
| 
 | ||||
| Call `ovni_thread_init()` when a new thread begins the execution | ||||
| - Call `ovni_thread_init()` when a new thread begins the execution | ||||
| (including the main process thread). Call `ovni_flush()` and | ||||
| `ovni_thread_free()` when it finishes. | ||||
| `ovni_thread_free()` when it finishes (in that order). | ||||
| 
 | ||||
| Call `ovni_proc_fini()` when the program ends, after all threads have | ||||
| - Call `ovni_proc_fini()` when a process ends, after all threads have | ||||
| finished. | ||||
| 
 | ||||
| You can use `ovni_ev_emit()` to record a new event. If you need more | ||||
| than 16 bytes of payload, use `ovni_ev_jumbo_emit()`. | ||||
| than 16 bytes of payload, use `ovni_ev_jumbo_emit()`. See the [trace | ||||
| specification](../trace_spec) for more details. | ||||
| 
 | ||||
| Compile and link with libovni. When you run your program, a new | ||||
| directory ovni will be created in the current directory ($PWD/ovni) | ||||
| directory ovni will be created in the current directory `$PWD/ovni` | ||||
| which contains the execution trace. | ||||
| 
 | ||||
| ## Rules | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| site_name: ovni | ||||
| theme: readthedocs | ||||
| docs_dir: doc | ||||
| extra_css: [extra.css] | ||||
| markdown_extensions: | ||||
|   - admonition | ||||
|   - toc: | ||||
| @ -11,6 +12,7 @@ nav: | ||||
|   - 'Runtime': | ||||
|     - runtime/tracing.md | ||||
|     - runtime/kernel.md | ||||
|     - runtime/trace_spec.md | ||||
|   - 'Emulation': | ||||
|     - emulation/index.md | ||||
|     - emulation/ovni.md | ||||
|  | ||||