<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>datenkobold.de &#187; pahole</title>
	<atom:link href="http://www.datenkobold.de/weblog/tags/pahole/feed" rel="self" type="application/rss+xml" />
	<link>http://www.datenkobold.de/weblog</link>
	<description>das Weblog von Steffen Bauch</description>
	<lastBuildDate>Tue, 04 May 2010 22:42:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Speicheroptimierung mit pahole</title>
		<link>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole</link>
		<comments>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole#comments</comments>
		<pubDate>Tue, 22 Dec 2009 09:05:03 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[pahole]]></category>
		<category><![CDATA[Speicheroptimierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=517</guid>
		<description><![CDATA[Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt.
Werden bei der Programmierung in C zusammengesetzten Datentypen wie struct verwendet [...]


Keine ähnlichen Artikel gefunden.]]></description>
			<content:encoded><![CDATA[<p>Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt.</p>
<p>Werden bei der Programmierung in C zusammengesetzten Datentypen wie <code>struct</code> verwendet ist es m&#246;glich, dass aus Gr&#252;nden des Alignments zwischen den Teilelementen der Struktur nicht genutzte F&#252;llbytes eingef&#252;gt werden. Zur&#252;ckzuf&#252;hren ist das Einf&#252;gen dieser F&#252;llbytes auf die Rechnerarchitektur und die Art und Weise wie ein Prozessor auf den Hauptspeicher zugreift. Wenn ein Prozessor Daten aus dem Hauptspeicher liest, dann erfolgt der Zugriff mit der Verarbeitungsbreite des Prozessors. Ist der Prozessor ein 32-bit Prozessor, dann werden in einem Schritt 4 Byte gelesen. Diese Annahme gilt f&#252;r alle weiteren Beispiele.</p>
<p>Ein Datenelement ist dann richtig im Speicher angeordnet, wenn seine Speicheradresse einem ganzzahligen Vielfachen seiner Gr&#246;&#223;e entspricht. F&#252;r diesen Fall kann der Prozessor das Datenelement optimal einlesen (ohne &#220;berlappung und notwendige Verschiebung) und das Datenelement wird als aligned bezeichnet. Werden nun Elemente mit unterschiedlichen Speichergr&#246;&#223;en wie unsigned short (2 Byte), unsigned char (1 Byte) oder unsigned int (4 Byte) in einem Verbunddatentyp gemischt verwendet ist es m&#246;glich, dass F&#252;llbytes eingef&#252;gt werden um das Alignment zu gew&#228;hrleisten.</p>
<p>Zur weiteren Erkl&#228;rung soll nun folgende Datenstruktur betrachtet werden:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> alpha<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> beta<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> gamma<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> delta<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In dieser Datenstruktur wird zwischen den Elementen beta und gamma ein F&#252;llbyte eingef&#252;gt um gamma entsprechend den Alignment-Anforderungen auszurichten. Das F&#252;llbyte ist notwendig, da alpha und beta zusammen 3 Byte, also beispielhaft die Adressen 0 bis 2 belegenen und gamma als Datentyp mit 4 Byte Speicherbedarf auf Adresse 4 ausgerichtet wird. Die Adresse 3 bleibt dann ungenutzt und geht als verf&#252;gbarer Speicher verloren. Diese L&#246;cher in den Strukturen sind nicht optimal und k&#246;nnen teilweise durch Umordnen der Elemente entfernt werden. Das manuelle Berechnen dieser L&#246;cher ist zwar m&#246;glich, durch geeignete Werkzeuge allerdings auch automatisierbar.</p>
<p>Das Linux-Werkzeug pahole (Poke-a-Hole) ist ein Hilfsmittel um Datenstrukturen zu analysieren, Alignement-L&#246;cher zu identifizieren und Umordnungsvorschl&#228;ge anzugeben. Ziel ist die Reduzierung von Strukturgr&#246;&#223;en im Speicher und dadurch die Reduzierung des Speicherbedarfs von Programmen w&#228;hrend der Laufzeit. Ein wichtiger Effekt ist au&#223;erdem die bessere Ausnutzung von Caches und dadurch eine Beschleunigung des Programms bei Speicheroperationen. Durch die Entfernung der F&#252;llbytes entsteht eine geringere Belastung des Speicherbusses.</p>
<p>Da pahole kein Tool zur statischen Quellcodeanalyse ist, sondern den mit Debug-Informationen ausgestatteten Object-Code untersucht, sind neben dem Build-Werkzeug <code>cmake</code> zum Kompilieren noch weitere Bibliotheken zur Unterst&#252;tzung des DWARF2-Debug-Formates notwendig. Die Installation erfolgt unter Ubuntu mit:</p>
<pre>
sudo aptitude install libdw-dev libelf-dev cmake
</pre>
<p>Der Programmcode von pahole ist aufgrund des Ursprungs in der Linux-Kernel-Entwicklergemeinde im Kernel-Git-Repository verf&#252;gbar, man erh&#228;lt den Quellcode mit folgendem Befehl:</p>
<pre>
git clone git://git.kernel.org/pub/scm/linux/kernel/git/acme/pahole.git
</pre>
<p>Unter Ubuntu 9.10 Karmic Koala ist unter Umst&#228;nden wie in diesem <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=534529">Bugreport</a> beschrieben vor dem Kompilieren noch ein Patch notwendig. Dabei ist der <code>find_library</code> Ausdruck f&#252;r <code>EBL_LIBRARY</code> in <code>cmake/modules/FindDWARF.cmake</code> durch <code>set (EBL_LIBRARY -ldw)</code> zu ersetzen.</p>
<p>Das Kompilieren und die Installation erfolgt dann im Verzeichnis pahole mit den Befehlen:</p>
<pre>
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install
</pre>
<p>Das zu untersuchende Programm <code>hello</code> oder Object-File <code>hello.o</code> ist dann mit dem Compiler im Debug-Modus, also <code>gcc -g</code> zu kompilieren. Der Befehl</p>
<pre>
pahole hello
</pre>
<p>beziehungsweise</p>
<pre>
pahole hello.o
</pre>
<p>gibt dann einen Bericht in folgender Art f&#252;r alle verwendeten, nicht-anonymen Strukturen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">short</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>         alpha<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     0     2 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              beta<span style="color: #339933;">;</span>         <span style="color: #808080; font-style: italic;">/*     2     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* XXX 1 byte hole, try to pack */</span>
&nbsp;
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>               gamma<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     4     4 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              delta<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     8     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* size: 12, cachelines: 1, members: 4 */</span>
	<span style="color: #808080; font-style: italic;">/* sum members: 8, holes: 1, sum holes: 1 */</span>
	<span style="color: #808080; font-style: italic;">/* padding: 3 */</span>
	<span style="color: #808080; font-style: italic;">/* last cacheline: 12 bytes */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der hinzugef&#252;gte Kommentar enth&#228;lt f&#252;r jedes Element die Adresse in Bezug auf den Anfang der Struktur und die Gr&#246;&#223;e des Elementes. Zus&#228;tzlich werden L&#246;cher in den Strukturen und die Gesamtgr&#246;&#223;e der Struktur angegeben.</p>
<p>Neben der Identifikation der ungenutzten Speicherbereiche kann mit dem Befehl</p>
<pre>
pahole -RC test_data hello
</pre>
<p>auch ein Hinweis f&#252;r die Reorganisation der Elemente ausgegeben werden. Im vorhandenen Beispiel w&#228;re dies die Anordnung des Elementes delta nach beta und vor gamma um das Loch von einem Byte zu f&#252;llen.</p>
<p>Abschlie&#223;end bleibt anzumerken, dass die Relevanz dieser Optimierungen auf modernen 64-bit Architekturen h&#246;her ist, da durch die gr&#246;&#223;ere Verarbeitungsbreite L&#246;cher in den Strukturen h&#228;ufiger auftreten und diese auch gr&#246;&#223;er sind.</p>


<p>Keine ähnlichen Artikel gefunden.</p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
