README.md
			
		
		
			
			
		
	
	Libc mem* benchmarks
This framework has been designed to evaluate and compare relative performance of memory function implementations on a particular host.
It will also be use to track implementations performances over time.
Quick start
Setup
Python 2 being deprecated it is advised to used Python 3.
Then make sure to have matplotlib, scipy and numpy setup correctly:
apt-get install python3-pip
pip3 install matplotlib scipy numpy
To get good reproducibility it is important to make sure that the system runs in
performance mode. This is achieved by running:
cpupower frequency-set --governor performance
Run and display memcpy benchmark
The following commands will run the benchmark and display a 95 percentile confidence interval curve of time per copied bytes. It also features host informations and benchmarking configuration.
cd llvm-project
cmake -B/tmp/build -Sllvm -DLLVM_ENABLE_PROJECTS=libc -DCMAKE_BUILD_TYPE=Release
make -C /tmp/build -j display-libc-memcpy-benchmark-small
Benchmarking regimes
Using a profiler to observe size distributions for calls into libc functions, it was found most operations act on a small number of bytes.
| Function | % of calls with size ≤ 128 | % of calls with size ≤ 1024 | 
|---|---|---|
| memcpy | 96% | 99% | 
| memset | 91% | 99.9% | 
| memcmp1 | 99.5% | ~100% | 
Benchmarking configurations come in two flavors:
- small
- Exercises sizes up to 1KiB, representative of normal usage
- The data is kept in the L1cache to prevent measuring the memory subsystem
 
- Exercises sizes up to 
- big
- Exercises sizes up to 32MiBto test large operations
- Caching effects can show up here which prevents comparing different hosts
 
- Exercises sizes up to 
1 - The size refers to the size of the buffers to compare and not the number of bytes until the first difference.
Benchmarking targets
The benchmarking process occurs in two steps:
- Benchmark the functions and produce a jsonfile
- Display (or renders) the jsonfile
Targets are of the form <action>-libc-<function>-benchmark-<configuration>
- actionis one of :- run, runs the benchmark and writes the- jsonfile
- display, displays the graph on screen
- render, renders the graph on disk as a- pngfile
 
- functionis one of :- memcpy,- memcmp,- memset
- configurationis one of :- small,- big
Superposing curves
It is possible to merge several json files into a single graph. This is
useful to compare implementations.
In the following example we superpose the curves for memcpy, memset and
memcmp:
> make -C /tmp/build run-libc-memcpy-benchmark-small run-libc-memcmp-benchmark-small run-libc-memset-benchmark-small
> python libc/utils/benchmarks/render.py3 /tmp/last-libc-memcpy-benchmark-small.json /tmp/last-libc-memcmp-benchmark-small.json /tmp/last-libc-memset-benchmark-small.json
Useful render.py3 flags
- To save the produced graph --output=/tmp/benchmark_curve.png.
- To prevent the graph from appearing on the screen --headless.
Under the hood
To learn more about the design decisions behind the benchmarking framework, have a look at the RATIONALE.md file.