-
Notifications
You must be signed in to change notification settings - Fork 6
/
profiling.html
254 lines (193 loc) · 10.6 KB
/
profiling.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta name="msapplication-config" content="/browserconfig.xml"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="utf-8"/>
<link rel="apple-touch-icon" type="image/png" href="/apple-touch-icon.png"/>
<link rel="manifest" type="application/manifest+json" href="/site.webmanifest"/>
<link rel="mask-icon" type="image/svg+xml" href="/mask-icon.svg" color="#990000"/>
<link rel="shortcut icon" type="image/png" href="/favicon.png"/>
<title>Drake: Running Profiling Tools</title>
<meta
name="description"
content="Drake ("dragon" in Middle English) is a C++ toolbox started by the Robot
Locomotion Group at the MIT Computer Science and Artificial Intelligence
Lab (CSAIL). The development team has now grown significantly, with core
development led by the Toyota Research Institute. It is a collection of
tools for analyzing the dynamics of our robots and building control
systems for them, with a heavy emphasis on optimization-based design/
analysis.
"/>
<!--
The "Work Sans" font is licensed under the SIL Open Font License (OFL). For
more information, see:
- https://fonts.google.com/specimen/Work+Sans?preview.text_type=custom#about
- https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
-->
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Work+Sans:wght@300;400;600;700;800&display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="/third_party/github-styling/github-markdown.css"/>
<link rel="stylesheet" href="/third_party/dracula/syntax.css"/>
<link rel="stylesheet" href="/third_party/pylons/pylons.css"/>
<link rel="stylesheet" href="/assets/css/main.css"/>
</head>
<body>
<header class="site-header">
<div class="site-header-inner contain">
<a href="/" class="drake-logo">
<img src="/images/drake-logo-white.svg">
</a>
<div class="menu-mobile-toggle">
<span></span>
</div>
<nav class="site-menu">
<ul>
<li class="site-menu-item site-menu-item-main">
<a href="/" class="site-menu-item">Home</a>
</li>
<li class="site-menu-item site-menu-item-main">
<a href="/installation.html" class="site-menu-item">Installation</a>
</li>
<li class="site-menu-item site-menu-item-main">
<a href="/gallery.html" class="site-menu-item">Gallery</a>
</li>
<li class="site-menu-item site-menu-item-main">
API Documentation
<div class="sub">
<a href="/doxygen_cxx/index.html" class="site-menu-item">C++</a>
<a href="/pydrake/index.html" class="site-menu-item">Python</a>
</div>
</li>
<li class="site-menu-item site-menu-item-main">
Resources
<div class="sub">
<a href="/getting_help.html" class="site-menu-item">Getting Help</a>
<a href="https://deepnote.com/workspace/Drake-0b3b2c53-a7ad-441b-80f8-bf8350752305/project/Tutorials-2b4fc509-aef2-417d-a40d-6071dfed9199/%2Findex.ipynb" class="site-menu-item">Tutorials</a>
<a href="/python_bindings.html" class="site-menu-item">Python Bindings</a>
<a href="/developers.html" class="site-menu-item">For Developers</a>
<a href="/credits.html" class="site-menu-item">Credits</a>
</div>
</li>
<li class="search">
<div class="search-icon">
<!-- This is an inline SVG image of a magnifying glass. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 374.9 374.84">
<path d="M235 270a148.74 148.74 0 1 1 35-35l97.74 97.74a24.37 24.37 0 0 1 0 34.58l-.4.4a24.47 24.47 0 0 1-34.58 0L235 270Zm-86.22-7.47A113.75 113.75 0 1 0 35 148.75 113.75 113.75 0 0 0 148.75 262.5Z"/>
</svg>
</div>
<div class="search-bar">
<form id="search_form" action="https://google.com/search" method="get">
<input type="text" name="q" placeholder="Search all of Drake…" />
<input type="hidden" name="q" value="site:drake.mit.edu OR site:underactuated.csail.mit.edu OR site:manipulation.csail.mit.edu" />
</form>
<div class="search-close">
<!-- This is an inline SVG image of an "X". -->
<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 373.61 373.57">
<path d="M219.71 186.77 366.71 40a23.43 23.43 0 1 0-33.13-33.13l-146.77 147-146.77-147A23.43 23.43 0 0 0 6.9 40l147 146.77-147 146.77a23.43 23.43 0 1 0 33.14 33.13l146.77-147 146.77 147a23.43 23.43 0 1 0 33.13-33.13Z"/>
</svg>
</div>
</div>
<ul id="results-container"></ul>
</li>
<li class="github-link">
<a href="https://github.com/RobotLocomotion/drake" class="site-menu-item">GitHub <img src="/third_party/images/GitHub-Mark-Light-64px.png" /></a>
</li>
</ul>
</nav>
</div>
</header>
<div class="page">
<div class="content">
<div class="drake-page">
<header class="drake-page-header">
<div class="contain">
<h1>Running Profiling Tools</h1>
</div>
</header>
<section class="padding">
<div class="contain">
<article class="markdown-body">
<p>This page contains tips and tricks for capturing and understanding profiling
reports.</p>
<p>Some other good references are:</p>
<ul>
<li><a href="https://valgrind.org/docs/manual/cl-manual.html">Callgrid documentation</a></li>
<li><a href="https://kcachegrind.github.io/html/Home.html">Kcachegrind documentation</a></li>
<li><a href="https://baptiste-wicht.com/posts/2011/09/profile-c-application-with-callgrind-kcachegrind.html">Blog post</a></li>
</ul>
<h1 id="installation">Installation</h1>
<p>Install <code class="language-plaintext highlighter-rouge">valgrind</code>, <code class="language-plaintext highlighter-rouge">kcachegrind</code>, and <code class="language-plaintext highlighter-rouge">graphviz</code>. For example on Ubuntu:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install valgrind kcachegrind graphviz
</code></pre></div></div>
<h1 id="compiling-your-example-program">Compiling your example program</h1>
<p>When profiling, you should use a representative example program.</p>
<p>Compile your example program with debug symbols (line numbers) enabled, but
still in optimized mode (<code class="language-plaintext highlighter-rouge">-O2</code>). That will allow you to drill down into
line-by-line performance costs, while maintainaing representative
performance. These builds are usually termed as “release with debug info”.
This is different than “debug builds” which typically have compiler
optimizations disabled (<code class="language-plaintext highlighter-rouge">-O0</code>).</p>
<p>In Bazel, build like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bazel build -c opt --copt=-g //foo/bar:example
</code></pre></div></div>
<p>In CMake, configure like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo
</code></pre></div></div>
<h1 id="capturing-a-trace">Capturing a trace</h1>
<p>Run <code class="language-plaintext highlighter-rouge">valgrind</code> with <code class="language-plaintext highlighter-rouge">callgrind</code> to get profiling data. For example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>valgrind --tool=callgrind bazel-bin/foo/bar/example
</code></pre></div></div>
<p>Each time this is run, it will create an output file file named
<code class="language-plaintext highlighter-rouge">callgrind.out.${PID}</code>. Typically you’d capture just one trace and inspect it
on its own, but in advanced uses you can combine multiple traces.</p>
<p>Oftentimes the call patterns in Drake will be difficult to view under the
default instrumentation settings, so we recommend running with extra flags.
These flags will slow down data collection, but are usually worth it:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>valgrind --tool=callgrind \
--separate-callers=10 \
bazel-bin/foo/bar/example
</code></pre></div></div>
<p>If you’re trying to micro-optimize a function, use <code class="language-plaintext highlighter-rouge">--dump-instr=yes</code> to see
per-instruction costs in the object code disassembly.</p>
<h1 id="viewing-the-trace">Viewing the trace</h1>
<p>Run <code class="language-plaintext highlighter-rouge">kcachegrind</code> to analyze profiling data. For example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kcachegrind callgrind.out.19482
</code></pre></div></div>
<h1 id="profiling-google-benchmark-executables">Profiling Google Benchmark executables</h1>
<p><a href="https://github.com/google/benchmark">Google Benchmark</a> throttles the number of
iterations it runs on each benchmark, which will skew the performance metrics
you see in the profiler. <a href="https://stackoverflow.com/questions/61843343/how-to-special-case-the-number-of-iterations-in-google-benchmark">You may want to manually specify the number of
iterations to run on each
benchmark</a>.</p>
</article>
</div>
</section>
</div>
<footer class="site-footer padding">
<div class="contain">
<a href="/" class="drake-logo">
<img src="/images/drake-logo.svg">
</a>
<div class="footer-menu">
<ul>
<li>
<a href="/doxygen_cxx/index.html" class="site-menu-item">C++</a>
</li>
<li>
<a href="/pydrake/index.html" class="site-menu-item">Python</a>
</li>
<li class="github-link">
<a href="https://github.com/RobotLocomotion/drake" class="site-menu-item">GitHub <img src="/third_party/images/GitHub-Mark-64px.png" /></a>
</li>
</ul>
</div>
</div>
<!-- TODO(eric.cousineau): Consider placing copyright here. -->
</footer>
</div>
</div>
<script src="/assets/js/mobile.js"></script>
<!-- Search -->
<script src="/assets/js/search.js"></script>
</body>
</html>