<?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>Software Dev Blog &#187; OpenMP</title>
	<atom:link href="http://www.software-dev-blog.de/tag/openmp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.software-dev-blog.de</link>
	<description>Multicore-Programmierung, Multithreading &#38; Visual Computing</description>
	<lastBuildDate>Thu, 09 Feb 2012 19:54:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Warum Task-basierter Programmcode so performant ist</title>
		<link>http://www.software-dev-blog.de/warum-task-basierter-programmcode-so-performant-ist/12/2011/</link>
		<comments>http://www.software-dev-blog.de/warum-task-basierter-programmcode-so-performant-ist/12/2011/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 14:27:59 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Ijntel Cilk Plus]]></category>
		<category><![CDATA[Intel TBB]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Task]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1877</guid>
		<description><![CDATA[Die Preisfrage des heutigen Tages lautet: Was haben Intel Threading Building Blocks, Intel Cilk Plus, Microsoft Parallel Patterns Library und OpenMP gemeinsam? Wie? Nö! Bitte? Genau, sie unterstützen allesamt das Konzept der task-basierten Programmierung. Soll heißen, dass Sie als Entwickler nicht mehr in Threads denken müssen (was viel zu fehleranfällig und umständlich und wenig skalierend [...]]]></description>
			<content:encoded><![CDATA[<p>Die Preisfrage des heutigen Tages lautet: Was haben <a title="Das leistet Flow Graph von Intel Threading Building Blocks 4.0" href="http://www.software-dev-blog.de/das-leistet-flow-graph-von-intel-threading-building-blocks-4-0/10/2011/">Intel Threading Building Blocks</a>, <a title="Intel Cilk Plus nun als Open Source-Version verfügbar" href="http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/">Intel Cilk Plus</a>, <a href="http://msdn.microsoft.com/de-de/library/dd492418.aspx" target="_blank">Microsoft Parallel Patterns Library</a> und <a title="OpenMP 3.1 mit neuen Features und Funktionen" href="http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/">OpenMP</a> gemeinsam? Wie? Nö! Bitte? Genau, sie unterstützen allesamt das Konzept der task-basierten Programmierung.</p>
<p>Soll heißen, dass Sie als Entwickler nicht mehr in Threads denken müssen (was viel zu fehleranfällig und umständlich und wenig skalierend ist), sondern nur noch in Tasks, also in Aufgaben. Und diese Aufgaben werden möglichst automatisch auf die vorhandenen Ressourcen, sprich Prozessoren beziehungsweise Prozessorkerne beziehungsweise Threads, von den zugrunde liegenden Mechanismen verteilt.</p>
<p>Diese Herangehensweise hat zahlreiche Vorteile, von denen ich die vier wichtigsten herausgepickt habe und Sie mit Ihnen teilen möchte.</p>
<p><strong>1. In die Zukunft gerichtet:</strong> Auf Basis eines task-basierten Designs ist der zugrunde liegende Algorithmus so aufgebaut, dass er auch in Zukunft bestmöglich skaliert, da sich sämtliche Aufgaben beliebig auf 4, 8, 16, 32, etc. Prozessorkerne verteilen lassen. Falls Sie also zum Beispiel eine Bildbearbeitungssoftware entwickeln, die task-basiert arbeitet, können Sie sicher sein, dass ein sehr großes Bild von einer größeren Anzahl von Tasks manipuliert wird. Und die hierfür zuständige Bibliothek kümmert sich dann um eine ausgewogene Berechnung auf allen verfügbaren Ressourcen.</p>
<p><strong>2. Minimaler Overhead:</strong> Alle erwähnten Bibliotheken haben eines gemeinsam: sie arbeiten mithilfe von Threadpools, in denen sämtliche Threads erzeugt, verwaltet und gelöscht werden. Das Gute am zugehörigen Thread Manager ist dessen Flexibilität: er lässt sich so einstellen, dass nicht ständig neue Threads erzeugt und wieder gelöscht werden, wenn es viel sinnvoller und effizienter ist, die Threads &#8220;am Leben&#8221; zu halten und bei Bedarf wieder aufzuwecken. Das sorgt nämlich für den geringsten Overhead.</p>
<p><strong>3. &#8220;Lokale&#8221; Cache-Inhalte:</strong> Intel TBB und Konsorten verfügen über einen Mechanismus, der es zumindest teilweise ermöglicht, jeden Task genau auf dem Prozessorkern laufen zu lassen, wo sich die lokalen Task-Cache-Daten befinden. Dies gelingt zwar nicht vollständig, aber gerade Intel TBB und Intel Cilk Plus sind in dieser Disziplin ziemlich gut.</p>
<p><strong>4. Dynamischer Scheduler:</strong> Was ist der Tod eines ausgewogenen Multicore-Systems? Genau, es gibt Ressourcen, die wegen Unterbeschäftigung brach liegen, und andere, die die ganze Arbeit verrichten müssen. Das Zauberwort hierfür nennt sich dymanisches Schedulen der Threads, was von Intel TBB und Co. zur Laufzeit vorgenommen wird. Damit können Sie sich sein, dass Ihre Software auf einem Mehrkernsystem optimal skaliert.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/warum-task-basierter-programmcode-so-performant-ist/12/2011/&via=sw_devtwits&text=Warum Task-basierter Programmcode so performant ist&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/warum-task-basierter-programmcode-so-performant-ist/12/2011/&via=sw_devtwits&text=Warum Task-basierter Programmcode so performant ist&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/warum-task-basierter-programmcode-so-performant-ist/12/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intel Cilk Plus nun als Open Source-Version verfügbar</title>
		<link>http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/</link>
		<comments>http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 13:21:55 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Cilk Plus]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[TBB]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1758</guid>
		<description><![CDATA[Intel gibt den Cilk Plus Compiler und die Runtime (Linux) als Open Source zur allgemeinen, kostenlosen Nutzung frei. Sämtliche Cilk-Plus Source-Files und Libraries können Sie ab sofort von dieser Seite downloaden. Sollten Sie Fragen zu Cilk Plus haben, auf Fehler oder Probleme bei der Bedienung stoßen, wenden Sie sich bitt an das Intel Cilk Plus [...]]]></description>
			<content:encoded><![CDATA[<p>Intel gibt den <a href="http://software.intel.com/en-us/articles/intel-cilk-plus-open-source/" target="_blank">Cilk Plus Compiler und die Runtime (Linux) als Open Source</a> zur allgemeinen, kostenlosen Nutzung frei. Sämtliche <a href="http://gcc.gnu.org/svn/gcc/branches/cilkplus" target="_blank">Cilk-Plus Source-Files und Libraries</a> können Sie ab sofort <a href="http://gcc.gnu.org/svn/gcc/branches/cilkplus" target="_blank">von dieser Seite downloaden</a>.</p>
<p>Sollten Sie Fragen zu Cilk Plus haben, auf Fehler oder Probleme bei der Bedienung stoßen, wenden Sie sich bitt an das <a href="http://software.intel.com/en-us/forums/intel-cilk-plus/" target="_blank">Intel Cilk Plus Forum</a>. Dort finden Sie auch Hinweise zu aktuellen Patches wie dem <a href="http://software.intel.com/en-us/forums/showthread.php?t=85266&amp;o=a&amp;s=lr" target="_blank">aktuellen Cilk Plus Patch for gcc 4.7 </a>vom 31.8.2011.</p>
<p>Damit festigt Intel das Ziel, allen Programmierern auf Basis von C/C++ eine gleichermaßen einfache und effektive Programmiersprache beziehungsweise Extensions an die Hand zu geben, die dabei hilft, parallelen Code zu entwickeln. Seit 2009 hat Intel die Cilk-Technologie in eigene Produkte integriert und zu Cilk Plus weiterentwickelt, um sein Portfolio mit <a href="http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/" target="_blank">OpenMP</a> und den <a href="http://software.intel.com/en-us/articles/intel-tbb/" target="_blank">Threading Building Blocks</a> abzurunden.</p>
<p>Ähnlich wie bei OpenMP kennt Cilk Plus so genannte Keywords (<strong>spawn, sync, inlet, abort</strong>), mit deren Hilfe sich ein seriell programmierter Quellcodeabschnitt in ein parallel ablaufendes Konstrukt verwandelt. Ein beliebtes und oft verwendetes Beispiel ist die rekursive Berechnung von Fibonacci-Zahlen. Hier ein Code-Sample:</p>
<p>01 cilk int fib (int n)<br />
02 {<br />
03     if (n &lt; 2) return n;<br />
04     else<br />
05     {<br />
06             int x, y;<br />
07<br />
08             x = spawn fib (n-1);<br />
09             y = spawn fib (n-2);<br />
10<br />
11              sync;<br />
12<br />
13              return (x+y);<br />
14     }<br />
15 }</p>
<p>Die entscheidenden Schlüsselwörter lauten <strong>spawn</strong> (Zeile 8 und 9) und <strong>sync</strong> (Zeile 11). Diese Keywords sorgen dafür, dass die Funktion parallel auf zwei oder mehreren Prozessorkernen ausgeführt wird. Den Rest übernimmt die Runtime von Cilk Plus, die sich um das Erstellen von Threads kümmert, um das Synchronisieren derselben und um das richtige Beenden der parallel laufenden Threads. Dies ist auch der große Unterschied zu OpenMP.</p>
<p>Einen sehr guten Grundlagenartikel zu den Unterschieden zwischen OpenMP und Cilk liefert Michaels Beitrag vom Juli 2010: <a href="(http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/" target="_blank">Infos aus erster Hand zu Cilk</a>.</p>
<p>Zudem empfehle ich James Reinders&#8217; Blog-Beitrag <a href="http://software.intel.com/en-us/blogs/2011/08/09/parallelism-as-a-first-class-citizen-in-c-and-c-the-time-has-come/" target="_blank">Parallelism as a First Class Citizen in C and C++, the time has come</a>, in dem er die Bedeutung von Task-Parallelisierung und Daten-Parallelisierung verdeutlicht und zeigt, wie sich beide Programmieraufgaben mit Cilk Plus realisieren lassen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/&via=sw_devtwits&text=Intel Cilk Plus nun als Open Source-Version verfügbar&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/&via=sw_devtwits&text=Intel Cilk Plus nun als Open Source-Version verfügbar&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/intel-cilk-plus-nun-als-open-source-version-verfugbar/09/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenMP 3.1 mit neuen Features und Funktionen</title>
		<link>http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/</link>
		<comments>http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 14:27:37 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Schleifen]]></category>
		<category><![CDATA[Update]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1677</guid>
		<description><![CDATA[Über OpenMP konnte man auf diesem Blog schon eine ganze Menge lesen. Und jetzt wurde die Spezifikation 3.1 veröffentlicht. Zwar ist es nur ein Minor Release, das aber einige neue, interessante Features und Funktionen bereit hält. Das konnte man aber auch erwarten, schließlich stammt die Version 3.0 aus dem Jahr 2008. Zusammenfassend sei gesagt, dass [...]]]></description>
			<content:encoded><![CDATA[<p>Über OpenMP konnte man auf diesem Blog <a title="AVX mit Visual Studio 2010 und OpenMP optimal einsetzen" href="http://www.software-dev-blog.de/avx-mit-visual-studio-2010-und-openmp-optimal-einsetzeni/01/2011/">schon</a> <a title="OpenMP: Schleifen anpassen für Multithreading-Ausführung" href="http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/">eine</a> <a title="OpenMP: fünf Bedingungen für parallele Schleifen" href="http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/">ganze</a> <a title="Workshop: parallel Programmieren mit OpenMP" href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">Menge</a> <a title="Multithreading-Konzepte: OpenMP, APIs und Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">lesen</a>. Und jetzt wurde die Spezifikation 3.1 veröffentlicht. Zwar ist es nur ein Minor Release, das aber einige neue, interessante Features und Funktionen bereit hält. Das konnte man aber auch erwarten, schließlich stammt die Version 3.0 aus dem Jahr 2008. Zusammenfassend sei gesagt, dass die Spezifikation unter anderem vordefinierte min- und max-Operatoren vorsieht, das atomic-Konstrukt erweitert und den Task-Konstrukten neue Attribute spendiert wurden. Im einzelnen wirken sich die Veränderungen wie folgt aus:</p>
<p><strong>min / max:</strong> Mit diesen beiden neuen Operatoren sind Entwickler nicht mehr dazu gezwungen, eigene Workarounds zu bauen, um zugehörige parallele Reduktionskonstrukte zu entwerfen. Solche Konstrukte sind beispielsweise beim Ermitteln der Kreiszahl Pi von großem Vorteil. Zumal, wenn mit min-max-Operatoren die Unter- und Obergrenzen sehr einfach begrenzt werden können.</p>
<p><strong>atomic:</strong> Mit dem erweiterten atomic-Konstrukt ist in Zukunft die Übergabe von Variablenwerten möglich, die beispielsweise mittels <em><strong>#omp pragma atomic</strong></em> während der Ausführung einer Schleife automatisch aktualisiert werden. Dies soll dynamische Scheduler ermöglichen, und zwar ohne den Einsatz zeitaufwändiger Locks und Kritischer Abschnitte (critical regions). Darüber hinaus ermöglicht das aktualisierte atomic-Konstrukt das explizite Speichern und Lesen von einzelnen Speicherzellen, die mit solch einem Konstrukt in Zusammenhang stehen.</p>
<p><strong>Task-Konstrukte:</strong> Auch das Task-Modell von OpenMP wurde optimiert. So sollen Entwickler mit dem neuen Konstrukt <em><strong>taskyield</strong></em> eigene Scheduler-Zeitpunkte definieren können. Damit kann man der OpenMP-Runtime mitteilen, dass ein bestimmter Task zugunsten eines anderen angehalten wird, um ihn später fortzusetzen.</p>
<p>Darüber hinaus lassen sich die Gültigkeitsbereiche der Daten innerhalb paralleler Task-Konstrukte noch genauer spezifizieren. Dazu wurden die neuen Attribute <em><strong>final</strong></em> und <em><strong>mergeable</strong></em> eingeführt. So kann mit Hilfe des Konstrukts <em><strong>#pragma omp task [final (ausdruck)]</strong></em> im Falle von <em><strong>ausdruck=true</strong></em> ein Task unmittelbar beendet werden. Das gilt dann auch für sämtliche Child-Tasks. Dies soll in Kombination mit dem Attribut <em><strong>mergeable</strong></em> zu feiner granulierten Parallelkonstrukten führen und zudem für einen geringeren Thread-Overhead sorgen</p>
<p>Falls Sie an der gesamten OpenMP-Spezifikation 3.1 interessiert sind: Hier finden Sie das <a href="http://www.openmp.org/mp-documents/omp3.1-2011.0203a.pdf" target="_blank">passende PDF-Dokument</a> dazu.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/&via=sw_devtwits&text=OpenMP 3.1 mit neuen Features und Funktionen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/&via=sw_devtwits&text=OpenMP 3.1 mit neuen Features und Funktionen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/openmp-3-1-mit-neuen-features-und-funktionen/07/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OOP 2011: Stephen Blair-Chappell über Chancen und Grenzen der Parallel-Programmierung</title>
		<link>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/</link>
		<comments>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 17:36:53 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Cilk]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1466</guid>
		<description><![CDATA[Am gestrigen Dienstag hatte ich auf der OOP 2011 die Gelegenheit, den sehr interessanten Vortrag „Parallelising Legacy Programs“ von Stephen Blair-Chappell, Mitarbeiter der Intel Compiler Labs zu verfolgen. Zu Deutsch: Es ging um das Thema „Parallelisieren bestehender Anwendungen“. Klingt zunächst recht trocken und sehr theoretisch. Stephen hat – trotz vieler Code-Beispiele – seinen Vortrag aber [...]]]></description>
			<content:encoded><![CDATA[<p>Am gestrigen Dienstag hatte ich <a href="http://www.software-dev-blog.de/oop-2011-ralph-de-wargny-zu-tools-und-trends-fur-software-entwickler/01/2011/">auf der OOP 2011</a> die Gelegenheit, den sehr interessanten Vortrag „Parallelising Legacy Programs“ von Stephen Blair-Chappell, Mitarbeiter der Intel Compiler Labs zu verfolgen. Zu Deutsch: Es ging um das Thema „Parallelisieren bestehender Anwendungen“. Klingt zunächst recht trocken und sehr theoretisch. Stephen hat – trotz vieler Code-Beispiele – seinen Vortrag aber didaktisch sehr gut aufgebaut, so dass auch Einsteiger viel nützliches Wissen mitnehmen konnten.</p>
<p>Im Übrigen hatte ich auch die Gelegenheit, nach der Session mit Stephen persönlich zu sprechen und ein kurzes Video-Interview zu führen. Das werde ich selbstverständlich auch in Kürze auf dieser Seite veröffentlichen.</p>
<h3>Fallstricke</h3>
<p>Zurück aber zu den Vorteilen und Fallstricken der Parallel-Programmierung. Stephen konnte anhand früherer Projekte sehr eindrucksvoll demonstrieren, dass der erste Schritt der Parallelisierung immer darin besteht, den vorhandenen Code zu verstehen und zu analysieren. Klingt banal, in der Praxis aber passieren genau hier die meisten Fehler. So verfallen auch erfahrene Programmierer der Verlockung, vorschnell neuen Code zu implementieren, anstatt frühere Schwachstellen zu korrigieren. Der Effekt: Trotz erfolgreicher Ausrichtung auf mehrere Prozessorkerne zeigen die Anwendungen keinen nennenswerten Geschwindigkeitsgewinn.</p>
<h3>4-Stufen-Methode</h3>
<p>Dann ist die Ursachenforschung kompliziert und sehr aufwändig. Stephen erklärte, dass mitunter sogar ein aktiver Virenscanner als Bremsklotz einer Parallel-Anwendung fungieren kann. Diese Dinge sollte man demnach schon beim Check des seriellen Codes im Auge behalten. Daraus ergibt sich für Programmierer eine 4-Stufen-Methode bei der Parallelisierung, die grundsätzlich eingehalten werden sollte:</p>
<ol>
<li>Analyse des seriellen Codes hinsichtlich möglicher &#8220;Hotspots&#8221;</li>
<li>Implementierung von Parallelkonstrukten auf Basis passender Programmiermodelle</li>
<li>Fehlersuche mithilfe geeigneter Tools</li>
<li>Optimierung des neuen, parallelisierten Codes</li>
</ol>
<p>Die für die Implementierung gewählten Programmiermodelle (Sprache, Bibliotheken, Methoden) sind dabei sowohl vom ursprünglichen Code als auch von der Zielsetzung des Projektes abhängig. Stephen konnte hier in unterschiedlichen Szenarien beispielsweise die Vorteile von <a href="http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/">Cilk</a> und <a href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP</a> erläutern und verdeutlichten, dass sowohl der Compiler als auch die Hardware eines Systems über die Performance der Anwendung entscheiden.</p>
<p>Am Ende des Vortrags ging Stephen auf ein Thema ein, das bei aller Begeisterung für Multicore gerne übersehen wird: Auch Parallel-Programmierung ist nicht immer der Weisheit letzter Schluss. In einigen Fällen reicht es aus, den seriellen Code zu optimieren. Aber diese Frage sollte eigentlich schon während der Analyse beantwortet werden.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/&via=sw_devtwits&text=OOP 2011: Stephen Blair-Chappell über Chancen und Grenzen der Parallel-Programmierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/&via=sw_devtwits&text=OOP 2011: Stephen Blair-Chappell über Chancen und Grenzen der Parallel-Programmierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Infos aus erster Hand zu Cilk</title>
		<link>http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/</link>
		<comments>http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 07:40:41 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Cilk]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tasks]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1408</guid>
		<description><![CDATA[Wie ich ja kürzlich per Twitter vermeldet habe, saß ich am Dienstag mit Mario Deilmann von Intel beisammen, um über ein paar mögliche Themen für das Software Dev Blog zum Thema Multicore-Programmierung zu reden. Und so haben wir diverse Themen evaluiert und identifiziert, und als erstes Ergebnis veröffentliche ich heute ein paar Infos zu Cilk, [...]]]></description>
			<content:encoded><![CDATA[<p>Wie ich ja kürzlich <a href="http://twitter.com/mhuelskoetter/status/17321418946" target="_blank">per Twitter vermeldet</a> habe, saß ich am Dienstag mit Mario Deilmann von Intel beisammen, um über ein paar mögliche Themen für das Software Dev Blog zum Thema Multicore-Programmierung zu reden. Und so haben wir diverse Themen evaluiert und identifiziert, und als erstes Ergebnis veröffentliche ich heute ein paar Infos zu <a href="http://www.software-dev-blog.de/cilk-parallele-programmierung-mit-intelligenten-ansatzen/08/2009/">Cilk</a>, die mir Mario in mein iPhone diktiert hat. Und so gibt es dann nach und nach zu Cilk und den anderen Themen weitere interessante Informationen.</p>
<p>Die Idee von Cilk ist recht einfach: Man erhält ein serielles Programm, wie man das schon von <a href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP</a> kennt. Allerdings kann das mit OpenMP &#8220;unterwandert&#8221; werden, indem man Abhängigkeiten in den Code einbaut. Bei Cilk hingegen werden die zu parallelisierenden Codeteile einfach mithilfe bestimmter Spawn-Konstrukte ausgelagert. Zudem können die so parallelisierten Abschnitte wieder serialisiert werden, indem man die Spawn-Befehle einfach wieder aus dem Code herausnimmt. Daneben gibt es ein weiteres Cilk-Konstrukt, das mittels einer for-Methode Schleifen parallelisiert.</p>
<p>Das Tolle an Cilk ist der zugeghörige Scheduler, der sehr schlau ist und task-orientiert arbeitet, und nicht wie bei OpenMP thread-basiert. Dabei werden stets möglichst viele Tasks an den Scheduler übergeben, der diese mit einem intelligenten Algorithmus auf die vorhandenen Thread-Ressourcen verteilt. Der Scheduler ist übrigens derart skalierend, dass auch große Rechensysteme optimal ausgenutzt werden.</p>
<p>So skalierte ein cilk-optimiertes Schachprogramm auf einem Rechner mit 512 Kernen so gut, dass es den dritten Platz in einem großen Schachturniert belegte. Der Trick des Cilk-Schedulers besteht übrigens darin, dass die Tasks per Zufall auf die Threads verteilt werden und nicht nach &#8220;menschlichen&#8221; Kriterien. Ach ja: Das Work Stealing hat seinen Ursprung im Cilk-Scheduler und wurde sukzessive in die <a href="http://www.software-dev-blog.de/review-multicore-programmierung-auf-den-dotnetpro-powerdays-teil-2/07/2010/">Microsoft-Scheduler</a> eingebaut.</p>
<p>Daneben muss mit Cilk nicht darauf geachtet werden, dass die zu parallelisierenden Aufgaben (Tasks) logisch angeordnet sind. Einzige Voraussetzung für eine cilk-basierte Parallelisierung ist die Unabhängigkeit der Tasks zueinander, so dass jeder Task eine Spawn-Methode zugewiesen werden kann. Darüber hinaus dürfen die jeweiligen Codeabschnitte nicht von globalen Variablen abhängen beziehungsweise diese nicht modifizieren. Ansonsten bekommt man es ganz leicht mit Data Races zu tun.</p>
<p>Allerdings ist zu berücksichtigen, dass es mit Cilk wie bei OpenMP, TPL und PPL vor allem um eine Lastverteilung geht, und nicht um eine Verteilung von Funktionalitäten auf die vorhandenen Ressourcen.</p>
<p>Schön an Cilk ist auch die einfache Handhabung: Außer den beiden Spawn- und For-Konstrukten muss man nichts lernen, sodass selbst ungeübte C- und C++-Entwickler Cilk ziemlich schnell einsetzen können. Das Gute an Cilk ist auch seine Vorhersehbarkeit: Sobald das cilk-optimierte Programm vorliegt, kann man anhand der gegebenen Parameter genau berechnen, was die Parallelisierung in Sachen Rechenleistung bringen wird.</p>
<p>Eine Besonderheit an Cilk sind die sogenannten Hyperobjects, mit denen ein parallelisierter Codeabschnitt seine eigene Sicht auf globale Variablen bekommt. Soll heißen, dass jeder Thread seinen eigenen Zugriff auf die globalen Variablen erhält, ohne diese zu verändern, so dass es nicht zu Data Races kommen kann. Dabei wird das Ganze lock-frei realisiert, da für jeden Thread eine eigene Speicherzelle angelegt wird, deren Inhalte am Schluss wieder zusammen geführt werden, so dass das richtige Ergebnis in der globalen Variable steht. Praktisch an Hyperobjects ist auch die Tatsache, dass man eigene anlegen kann. Damit ist Cilk ein ganzes Stück flexibler als OpenMP oder TBB.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/&via=sw_devtwits&text=Infos aus erster Hand zu Cilk&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/&via=sw_devtwits&text=Infos aus erster Hand zu Cilk&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/infos-aus-erster-hand-zu-cilk/07/2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parallel Studio: Das sagen die Betatester</title>
		<link>http://www.software-dev-blog.de/parallel-studio-das-sagen-die-beta-tester/06/2009/</link>
		<comments>http://www.software-dev-blog.de/parallel-studio-das-sagen-die-beta-tester/06/2009/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 12:37:35 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1059</guid>
		<description><![CDATA[Parallel Studio ist jetzt etwas mehr als eine Woche alt. Das schreit förmlich nach ein paar interessanten Infos rund um die Entwicklersuite. So zeigt beispielsweise ein interne Umfrage unter Betatestern: 75 Prozent aller teilnehmenden Entwickler konnten bereits nach 15 Minuten sinnvolle und nachvollziehbare Ergebnisse produzieren. Ebenfalls 75 Prozent haben Parallel Studio als &#8220;empfehlenswert&#8221; eingestuft (8 [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Happy Birthday, Parallel Studio!" href="http://www.software-dev-blog.de/happy-birthday-parallel-studio/05/2009/">Parallel Studio</a> ist jetzt etwas mehr als eine Woche alt. Das schreit förmlich nach ein paar interessanten Infos rund um die Entwicklersuite. So zeigt beispielsweise ein interne Umfrage unter Betatestern:</p>
<ul>
<li>75 Prozent aller teilnehmenden Entwickler konnten bereits nach 15 Minuten sinnvolle und nachvollziehbare Ergebnisse produzieren.</li>
</ul>
<ul>
<li>Ebenfalls 75 Prozent haben Parallel Studio als &#8220;empfehlenswert&#8221; eingestuft (8 von 10 Sternen im Mittel).</li>
</ul>
<ul>
<li>86 Prozent der teilnehmenden Betatester glauben, dass die Threading-Methoden von Parallel Studio (<a title="OpenMP" href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP</a>, <a title="Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">Intel TBB</a>, etc.) für ihre Zwecke völlig ausreichend sind.</li>
</ul>
<ul>
<li>71 Prozent der Betatest-Entwickler konnten einen Geschwindigkeitszuwachs bei ihren Anwendungen messen, und das nur wegen des Umstiegs auf den integrierten <a title="Intel C++-Compiler" href="http://www.software-dev-blog.de/optimierte-compiler-helfen-beim-parallelisieren/12/2008/">Intel-C++-Compiler</a>, der natürlich äußerst multithreading-tauglich ist.</li>
</ul>
<p>Und es gibt sogar schon erste Referenzgeschichten, die den Einsatz von Parallel Studio in ein bestehendes Projekt verdeutlichen sollen. Dazu gehört beispielsweise die in Paris ansässige Firma <a title="Die offzielle Pressemeldung von Open Cascade bzgl. ihrer Parallel-Studio-Erfahrungen" href="http://www.opencascade.org/about/news/issue144/" target="_blank">Open Cascade</a>, die die gleichnamige Opensource-Software entwickelt hat und für Kunden <a title="Beispiele von Open-Cascade-Anwendungen" href="http://www.opencascade.org/showroom/screenshots/" target="_blank">in deren Anwendungen integriert</a>. Mit <em>Open Cascade</em> lassen sich komplexe und sehr aufwendige 3D-Modelle erstellen, wie sie beim Produktdesign, in der Simulationstechnik und in anderen Bereichen verwendet werden.</p>
<p>Da die Berechnung und grafische Umsetzung solcher 3D-Modelle sehr rechenintensiv und <em>Open Cascade</em> zudem C++-basiert ist, kam für mehr Leistung und schnellere Berechnungen Parallel Studio zum Einsatz. Schnell zeigte sich, dass der <a title="Parallel Amplifier" href="http://www.software-dev-blog.de/parallel-studio-serie-mehr-infos-zum-parallel-amplifier/02/2009/">Parallel Amplifier</a> typische Hotspots mit wenig Aufwand entdecken konnte. So ließ sich beispielsweise die Berechnung von geometrischen Flächen drastisch beschleunigen, indem dem betreffenden Algorithmus ein eigener Thread zugewiesen werden konnte, der bei Bedarf immer wieder parallel ausgeführt werden kann.</p>
<p>Aber auch der <a title="Parallel Inspector" href="http://www.software-dev-blog.de/parallel-studio-serie-mehr-infos-zum-parallel-inspector/02/2009/">Parallel Inspector</a> half dabei, Open Cascade zu verbessern und schneller zu machen. Das führte insgesamt zu einer doppelt so schnellen Rechengeschwindigkeit und einer Reduzierung von Speicherproblemen (Meomory Leaks).</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-studio-das-sagen-die-beta-tester/06/2009/&via=sw_devtwits&text=Parallel Studio: Das sagen die Betatester&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-studio-das-sagen-die-beta-tester/06/2009/&via=sw_devtwits&text=Parallel Studio: Das sagen die Betatester&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/parallel-studio-das-sagen-die-beta-tester/06/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenMP: Schleifen anpassen für Multithreading-Ausführung</title>
		<link>http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/</link>
		<comments>http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 14:32:24 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=993</guid>
		<description><![CDATA[Gestern habe ich mit einer neuen Serie angefangen, die sich intensiv mit dem Thema OpenMP beschäftigt. Im ersten Teil ging es sehr fundamental um die Voraussetzungen, die eine Schleife erfüllen muss, um per OpenMP multithreading-tauglich zu sein. Heute geht es um die Frage, welche Dinge zu beachten sind, damit eine Schleife ordnungsgemäß in mehrere Threads [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern habe ich mit einer neuen Serie angefangen, die sich intensiv mit dem Thema OpenMP beschäftigt. <a title=" OpenMP: Fünf Bedingungen für parallele Schleifen " href="http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/">Im ersten Teil</a> ging es sehr fundamental um die Voraussetzungen, die eine Schleife erfüllen muss, um per OpenMP multithreading-tauglich zu sein. Heute geht es um die Frage, welche Dinge zu beachten sind, damit eine Schleife ordnungsgemäß in mehrere Threads aufgeteilt werden kann.</p>
<p>Zunächst einmal: Das Threaden von Schleifenkonstrukten bedeutet nichts anderes, als dass unabhängige Schleifeniterationen auf mehreren Threads gleichzeitig ausgeführt werden können, was natürlich Rechenzeit pro Takt spart. Hierzu wird die Schleife in eine neue Form gebracht, die das Parallelisieren derselben überhaupt erst ermöglicht. Dies ist aber nur umsetzbar, wenn die Schleife <strong>keine Abhängigkeiten</strong> aufweist.</p>
<p>Daher muss man als Entwickler zunächst einmal mit einem passenden Tool wie <a title="VTune Performance Analyzer" href="http://www.software-dev-blog.de/quellcode-schwachstellen-mit-intel-vtune-aufspuren/11/2008/">VTune Performance Analyzer</a> diejenige Schleife finden, die insgesamt die meiste Rechenzeit verschlingt. Anschließend wird diese umstrukturiert, um festzustellen, dass keine iterationsübergreifenden Abhängigkeiten bestehen. Erst dann sollte diese Schleife mithilfe eines OpenMP-Pragmas parallelisiert werden.</p>
<p><span id="more-993"></span>Dabei geht es um <a title="Mit dem Thead Checker lassen sich Data Races und Dead Lock in Multithread-Code aufspüren" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">bereits dargestellte Datenabhängigkeiten</a>, die in Data Race Conditions oder Dead Locks münden können. Man unterscheidet zwischen drei wesentlichen Abhängigkeiten:</p>
<p><strong>Flussabhängigkeit (Schreiben-vor-Lesen):</strong> Eine Anweisung ist von einer anderen abhängig, wenn der erste Befehl ein Datum speichert, das der nachfolgende lesen will.</p>
<p><strong>Ausgabeabhängigkeit:</strong> Zwei Befehle speichern in dieselbe Speicherzelle ihre Daten.</p>
<p><strong>Antiabhängigkeit (Lesen-vor-Schreiben): </strong>Ein Befehl liest ein Datum, bevor dieses überhaupt gespeichert wird.</p>
<p>Um zu zeigen, wie sich das Umstellen von Schleifencode auf die richtige Ausführung des gesamten Programms auswirkt, folgen an dieser Stelle zwei Beispiele: ein nicht-funktionierendes und ein OpenMP-taugliches.</p>
<p><strong>Nicht-funktionierende OpenMP-Schleife wegen einer iterationsübergreifenden Abhängigkeit!</strong></p>
<p><em><strong>x[0]  = 0;<br />
y[0] = 1;<br />
#pragma omp parallel for private(k)</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong>for ( k = 1; k &lt; 100; k++ ) {<br />
<span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;.</span></strong></em><em><strong>x[k] = y[k-1] + 1; // Operation 1<br />
<span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;.</span></strong></em><em><strong>y[k] = x[k-1] + 2; // Operation 2</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;..</span> }</strong></em></p>
<p><strong>OpenMP-basiertes Threading mittels einer Strip-Mining-Transformation</strong></p>
<p><em><strong>x[0]  = 0;<br />
y[0] = 1;<br />
x[49] = 74; // abgeleitet von der Gleichung x(k)=x(k-2)+3<br />
</strong></em><em><strong>y[49] = 74; // abgeleitet von der Gleichung y(k)=y(k-2)+3</strong></em></p>
<p><em><strong>#pragma omp parallel for private(m, k)</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;..</span></strong></em><em><strong></strong></em><em><strong>for ( m=0; m&lt;2; m++ ) {<br />
</strong></em><em><strong></strong></em><em><strong></strong></em><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;.</span></strong></em><em><strong>for ( k = M*49+1;  k &lt; m*50+50; k++)</strong></em> {</p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;&#8230;.</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;.</span></strong></em><em><strong>x[k] = y[k-1] + 1; // Operation 1<br />
<span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;&#8230;..</span></strong></em><em><strong>y[k] = x[k-1] + 2; // Operation 2</strong></em><em><strong><span style="color: #ffffff;"><br />
</span></strong></em><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span></strong></em><em><strong><span style="color: #ffffff;">..</span></strong></em><em><strong></strong></em><em><strong>}<br />
</strong></em><em><strong><span style="color: #ffffff;">&#8230;.</span></strong></em><em><strong></strong></em><em><strong>}</strong></em></p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/&via=sw_devtwits&text=OpenMP: Schleifen anpassen für Multithreading-Ausführung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/&via=sw_devtwits&text=OpenMP: Schleifen anpassen für Multithreading-Ausführung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/openmp-schleifen-anpassen-fur-multithreading-ausfuhrung/04/2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenMP: fünf Bedingungen für parallele Schleifen</title>
		<link>http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/</link>
		<comments>http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 13:14:36 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=992</guid>
		<description><![CDATA[Das Thema OpenMP steht bei vielen Lesern dieses Blogs hoch im Kurs. Das liegt zum einen an der Parallel-Computing-Seite von MSDN, auf der ein entsprechender Beitrag lange verlinkt war. Zum anderen findet Google meine OpenMP-Bemühungen wohl ganz nett, zumindest steht besagter Artikel im deutschsprachigen Index auf dem fünften Platz. Daher starten wir heute mit einer [...]]]></description>
			<content:encoded><![CDATA[<p>Das Thema OpenMP steht bei vielen Lesern dieses Blogs hoch im Kurs. Das liegt zum einen an der <a title=" Infos rund ums Parallele Programmieren auf MSDN " href="http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/">Parallel-Computing-Seite von MSDN</a>, auf der ein entsprechender Beitrag lange verlinkt war. Zum anderen findet Google meine OpenMP-Bemühungen wohl ganz nett, zumindest steht <a title=" Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">besagter Artikel</a> im deutschsprachigen Index auf dem fünften Platz.</p>
<p>Daher starten wir heute mit einer Serie, die sich mit kleineren und größeren Aspekten der OpenMP-basierten Programmierung beschäftigt. Also mit solchen Fragen wie:</p>
<ul>
<li>Welche Bedingungen müssen erfüllt sein, damit OpenMP-basierende Schleifen überhaupt in parallelen Threads ausgeführt werden können?</li>
<li>Welche Dinge sind zu beachten, damit eine Schleife ordnungsgemäß in mehrere Threads aufgeteilt werden kann?</li>
<li>Wie lässt sich möglicher Threading-Overhead vermeiden?</li>
<li>Wie kann man das Optimum aus OpenMP herausholen?</li>
<li>Wie lassen sich sinnvoll OpenMP-Bibliotheksfunktionen und -Umgebungsvariablen einsetzen?</li>
<li>Wie geschieht das Kompilieren und Debuggen mithilfe von OpenMP?</li>
<li>Wovon hängt eine maximale Multithread-Leistung auf OpenMP-Basis ab?</li>
</ul>
<p><strong>Welche Bedingungen müssen erfüllt sein, damit OpenMP-basierende Schleifen überhaupt in parallelen Threads ausgeführt werden können?</strong></p>
<p>1. In der Version 2.5 müssen Schleifenvariablen vom Typ <em><strong>vorzeichenbehafteter Integer</strong></em> sein. Mit der OpenMP-Spezifikation 3.0 ist diese Beschränkung weggefallen.</p>
<p>2. Die Vergleichsoperation muss in der Form <em><strong>loop_variable </strong><strong>&lt;, &lt;=</strong></em> oder <em><strong>&gt;=</strong><strong> loop_invariant_integer</strong></em> sein.</p>
<p>3. Der Inkrementteil (z.B. <em><strong>i++</strong></em>) der for-Schleife muss additiv oder substraktiv sein, und zwar mit einem schleifeninvarianten Wert.</p>
<p>4. Ist die Vergleichsoperation vom Typ <em><strong>&lt;</strong></em> oder <em><strong>&lt;=</strong></em>, muss die die Schleifenvariable bei jeder Iteration erhöht werden. Umgekehrt muss die Variable dekrementiert werden (also bei &gt; oder &gt;=).</p>
<p>5. Die Schleife muss zwingend einen Eintritt und einen Austritt haben. Daher sind nicht erlaubt: Sprünge aus der Schleife heraus bzw. von außen in die Schleife hinein. Das gilt beispielsweise für <em><strong>goto</strong></em>- oder <em><strong>break</strong></em>-Anweisungen oder für Ausnahmebehandlungen. Eine Ausnahme dieser Regel stellt die <em><strong>exit</strong></em>-Anweisung dar, die die komplette Anwendung beendet.</p>
<p>Diese Bedingungen müssen aus Kompilierungsgründen eingehalten werden. Andernfalls kann keine automatische Parallelisierung erfolgen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/&via=sw_devtwits&text=OpenMP: fünf Bedingungen für parallele Schleifen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/&via=sw_devtwits&text=OpenMP: fünf Bedingungen für parallele Schleifen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/openmp-funf-bedingungen-fur-parallele-schleifen/04/2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Workshop: parallel Programmieren mit OpenMP</title>
		<link>http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/</link>
		<comments>http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 14:39:36 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=880</guid>
		<description><![CDATA[Über OpenMP habe ich hier schon des öfteren gebloggt, aber noch nie so wirklich im Detail. Das wird sich heute schlagartig ändern, denn ein lieber Kollege (danke, Edmund!) hat mir am Wochenende einen sehr anschaulichen Artikel zukommen lassen, der mir als Grundlage für das heutige Posting dient. Den kompletten Beitrag samt Programmierbeispiel anhand der Kreiszahl [...]]]></description>
			<content:encoded><![CDATA[<p>Über OpenMP habe ich hier schon des öfteren <a title=" Multithreading-Konzepte: OpenMP, APIs und Intel TBB " href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">gebloggt</a>, aber noch nie so wirklich im Detail. Das wird sich heute schlagartig ändern, denn ein lieber Kollege (danke, Edmund!) hat mir am Wochenende einen sehr anschaulichen Artikel zukommen lassen, der mir als Grundlage für das heutige Posting dient. Den kompletten Beitrag samt Programmierbeispiel anhand der Kreiszahl Pi gibt es <a title="Artikel vollstänidg als PDF laden" href="http://www.all-electronics.de/track?p=1&amp;ci=38244&amp;ct=article&amp;l=http://imperia.mi-verlag.de/imperia/md/content/ai/ae/fachartikel/ei/2009/02/ei09_02_028.pdf" target="_blank">als PDF zum Download</a>.</p>
<p>Zunächst einmal: <a title="OpenMP.org" href="http://www.OpenMP.org" target="_blank">OpenMP</a> liegt in der Version 3.0 vor und stellt eine <strong>standardisierte Programmierungsmethode</strong> dar. In Sachen Komplexität bewegt sie sich zwischen den herkömmlichen Threads &#8211; also API-Threads, PThreads oder WinThreads &#8211; und den höher entwickelten <a title="Intel Threading Building Blocks" href="http://www.software-dev-blog.de/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Intel TBB</a> oder der geplanten Parallel Pattern Library (PPL), die von Microsoft kommen wird.</p>
<p>Daraus ergeben sich zwei wesentliche Aspekte: OpenMP ist weitaus <strong>einfacher</strong> zu verstehen, zu implementieren und zu testen als die Low-Level-Threads, bei denen sich der Programmierer um viele Dinge selbst kümmern muss, was das Ganze natürlich extrem fehleranfällig macht.</p>
<p>Die Kehrseite von OpenMP ergibt sich aus der <strong>geringeren Komplexität</strong>: Nicht alle Programmieraufgaben lassen sich mit OpenMP erledigen, was den Entwickler natürlich ein wenig einschränkt. OpenMP versteht sich vor allem sehr gut auf das Parallelisieren von rechenintensiven <strong>Schleifenkonstrukten</strong>.</p>
<p><span id="more-880"></span>Doch für welche Projekte eignet sich OpenMP am besten? Nun, hier ist vor allem der <strong>inkrementelle Ansatz</strong> zu nennen. Hierbei wird Stück für Stück ein bestehendes seriell programmiertes Programm mit einem geeigneten Tool wie dem <a title="VTune Performance Analyzer" href="http://www.software-dev-blog.de/quellcode-schwachstellen-mit-intel-vtune-aufspuren/11/2008/">VTune Performance Analyzer</a> auf sein Parallelisierungspotenzial hin untersucht, um so schrittweise sequenziellen Programmcode in parallelen zu überführen. Das Gute dabei ist die Tatsache, dass es einen <strong>Masterthread</strong> gibt, der die sequenzielle Programmausführung steuert.</p>
<p>Sobald die Anwendung an einen Punkt kommt, wo es simultan werden kann, <strong>verzweigt</strong> die Ausführung in eine feste Anzahl von Threads. Wenn dieser Programmteil beendet ist, verzweigt die Anwendung wieder in den sequenziellen Masterthread. Ein weiterer Vorteil von OpenMP ist die Möglichkeit, bei der Programmausführung die parallelen Code-Abschnitte per &#8220;Schalter&#8221; zu deaktivieren, um somit aufgetretene Fehler <strong>im Seriellmodus zu debuggen</strong>. Das erleichtert das Auffinden vorhandener Bugs ungemein.</p>
<p>Die Implementierung von parallelem Code auf OpenMP-Basis ist übrigens recht einfach: Hierzu stehen dem Programmierer bestimmte <strong>Derektiven (Pragmas)</strong>, die <strong>OpenMP-Bibliothek und Umgebungsvariablen</strong> zur Verfügung. Bei der Überführung von seriellem in parallelen Programmcode müssen dann nur ein paar Programmzeilen eingefügt werden. Das ist unter anderem die Bibliothek <strong><em>omp.h</em></strong>, die passende Anzahl von Threads sowie einer Umgebungsvariablen und die <strong>Pragma-Anweisung</strong> selbst, die sich um das Parallelisieren des vormals seriellen Programmcodes kümmert.</p>
<p>Das nachfolgende Beispiel berechnet <strong>mithilfe einer Integralfunktion die Kreiszahl Pi</strong>. Die blau eingefärbten Programmzeilen sind die hinzugefügten OpenMP-Variablen sowie das zugehörige Pragma. Übrigens: Nur der in den geschweiften Klammern stehende Programmteil wird parallel ausgeführt. In diesem Fall also die Formel, die iterativ Pi ermittelt.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-883" style="margin: 5px 10px;" title="Simualtane Berechnung der Kreiszahl Pi mithilfe zweier parallel ablaufender Threads" src="http://www.software-dev-blog.de/wp-content/images/2009/02/openmp-pi.jpg" alt="Simualtane Berechnung der Kreiszahl Pi mithilfe zweier parallel ablaufender Threads" width="441" height="395" /></p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/&via=sw_devtwits&text=Workshop: parallel Programmieren mit OpenMP &related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/&via=sw_devtwits&text=Workshop: parallel Programmieren mit OpenMP &related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parallel-Bibliotheken helfen bei der Software-Entwicklung</title>
		<link>http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/</link>
		<comments>http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 13:19:27 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Optimieren]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=866</guid>
		<description><![CDATA[Ende Januar habe ich auf Basis eines Vortrags von Walter Tichy, Uniprofessor in Karlsruhe, 12 Thesen und 12 passende Antithesen zum Thema Multicore-Programmierung aufgestellt. These Nummer 12 beschäftigt sich mit Professor Tichys Aussage, es gäbe für bestimmte, immer wiederkehrende Aufgaben der Parallelprogrammierung noch nicht die passenden Tools auf dem Markt. Schon seinerzeit habe ich dagegen [...]]]></description>
			<content:encoded><![CDATA[<p>Ende Januar habe ich auf Basis eines Vortrags von <a title="Walter Tichy: &quot; In der Parallelprogrammierung steckt die Zukunft&quot;" href="http://www.software-dev-blog.de/in-der-parallelprogrammierung-steckt-die-zukunft/01/2009/">Walter Tichy</a>, Uniprofessor in Karlsruhe, <a title=" 12 Thesen und Antithesen zur Multicore-Programmierung " href="http://www.software-dev-blog.de/12-thesen-und-antithesen-zur-multicore-programmierung/01/2009/">12 Thesen und 12 passende Antithesen</a> zum Thema Multicore-Programmierung aufgestellt. These Nummer 12 beschäftigt sich mit Professor Tichys Aussage, es gäbe für bestimmte, immer wiederkehrende Aufgaben der Parallelprogrammierung noch nicht die passenden Tools auf dem Markt.</p>
<p>Schon seinerzeit habe ich dagegen gesprochen, da sehr wohl Software-Werkzeuge existieren wie die <a title=" Software-Projekte mit Multicore-Bibliotheken optimieren " href="http://www.software-dev-blog.de/software-projekte-mit-multicore-bibliotheken-optimieren/12/2008/">Integrated Performance Primitives</a> (IPP), die vor allem Entwickler von Multimedia-Software bei ihrer Arbeit unterstützen sollen. So basieren zahlreiche MP3- und AAC-Encoder/-Decoder auf Teilen der IPP-Bibliotheken, in denen übrigens viele Mannjahre Entwicklungsarbeit stecken.</p>
<p>Mit den IPP lassen sich einzelne Funktionen für das Encoden von Audio- und Videostreams mehr oder weniger per Drag &amp; Drop für eigene Anwendungen nutzen, die dann bestimmte Aufgaben hochparallelisiert ausführen &#8211; ohne dass der Programmierer sich darüber Gedanken machen muss, wie dies funktioniert. Bekannte Beispiele hierfür sind H.264-, MPEG-4- und AAC-basierte Encoder.</p>
<p>Aber auch im medizinischen Bereich für die rechenintensive Auswertung von Ultraschallbildern kommen IPP-Bibliotheken zum Einsatz. Damit lassen sich hochkomplexe 3D-Bilder deutlich schneller analysieren, da die vorhandenen Prozessoren simultan die Berechnungen durchführen können. Somit spart der Einsatz der IPP im günstigsten Fall drei bis vier Mannjahre Entwicklungszeit, die das Programmieren solcher Parallel-Bibliotheken resp. der zugehörigen Anwendung in Anspruch nähmen.</p>
<p><span id="more-866"></span>Ein weiteres bekanntes Beispiel ist auch der Winzip-Codec, der mithilfe von IPP parallelisiert wurde und damit eine erheblich beschleunigte Kompression und Dekompression von Daten auf Multicore-Systemen ermöglicht. Hierbei kümmert sich IPP auf Basis von <a title=" Multithreading-Konzepte: OpenMP, APIs und Intel TBB " href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">OpenMP</a> (also mithilfe spezieller Pragma-Konstrukte) sogar um die Skalierung von Winzip, indem die einzelnen Threads möglichst gleichmäßig auf die vorhandenen Prozessorkerne verteilt werden.</p>
<p>Das Tolle an den IPPs sind auch die Anschaffungskosten: Es werden nämlich umgerechnet gerade mal 200 Dollar pro Entwickler fällig, dem für diesen geringen Betrag sämtliche vorgefertigte Funktionen zur Verfügung stehen. Unterstützt werden Window, Linux und Mac OS X, zudem gehört eine 30-Tage-Testversion zum Angebot und für nicht-kommerzielle Linux-Anwendungen kosten die <a title="Mehr Infos und Download-Links zu den IPP" href="http://www.intel.com/cd/software/products/asmo-na/eng/perflib/302910.htm" target="_blank">Integrated Performance Primitives</a> keinen einzigen Cent.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/&via=sw_devtwits&text=Parallel-Bibliotheken helfen bei der Software-Entwicklung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/&via=sw_devtwits&text=Parallel-Bibliotheken helfen bei der Software-Entwicklung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Serie: Mit Parallel Studio Anwendungen multithreaden (2)</title>
		<link>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/</link>
		<comments>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 12:55:23 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=834</guid>
		<description><![CDATA[Am Freitag habe ich eine kleine Serie um Parallel Studio gestartet. Im ersten Teil geht es um den Parallel Composer, mit dessen Hilfe paralleler Quellcode erzeugt werden kann. Das heutige zweite Kapitel handelt von den Komponenten Parallel Inspector und Parallel Amplifier. Mit dem Parallel Inspector lassen sich Multithread-Anwendungen in vielfältiger Weise debuggen. Es  geht allerdings [...]]]></description>
			<content:encoded><![CDATA[<p>Am Freitag habe ich eine kleine Serie um Parallel Studio gestartet. <a title="Hier geht's zum ersten Teil der Parallel-Studio-Serie" href="http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/">Im ersten Teil</a> geht es um den Parallel Composer, mit dessen Hilfe paralleler Quellcode erzeugt werden kann. Das heutige zweite Kapitel handelt von den Komponenten Parallel Inspector und Parallel Amplifier.</p>
<p>Mit dem Parallel Inspector lassen sich Multithread-Anwendungen in vielfältiger Weise debuggen. Es  geht allerdings um weit mehr als das bloße Aufspüren von Quellcode-Fehlern:</p>
<ul>
<li>Es spielt keine Rolle, welche <a title="Multithreading-Konzepte OpenMP und Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">Programmiermethode</a> eingesetzt wird. Parallel Inspector unterstützt nämlich OpenMP (besser: er basiert darauf), kommt aber auch mit <a title="Intel Threading Building Blocks" href="http://www.software-dev-blog.de/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Intel TBB</a> und Windows Threads klar.</li>
</ul>
<ul>
<li>Fehler wie Dead Locks und Race Conditions werden zur Laufzeit gefunden, bevor sie der Kunde findet.</li>
</ul>
<ul>
<li>Das Laufzeitverhalten wird vollständig aufgezeichnet, um so nachträglich und detailliert mögliche Fehler und Probleme innerhalb der parallelisierten Anwendung zu identifizieren.</li>
</ul>
<ul>
<li>Im Gegensatz zu anderen Testtools können schwer auffindbare, nicht-deterministische Fehler mit Parallel Inspector aufgespürt werden.</li>
</ul>
<ul>
<li>Pate des Parallel-Debuggers ist der <a title="Intel Thread Checker" href="http://www.software-dev-blog.de/12-thesen-und-antithesen-zur-multicore-programmierung/01/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checker</a>. Damit bekommt man ein zuverlässiges, weil erprobtes Tool an die Hand zum Debuggen seiner Anwendungen.</li>
</ul>
<ul>
<li>Parallel Inspector fügt sich nahtlos in Visual Studio ein.</li>
</ul>
<p><span id="more-834"></span>Sobald die parallelisierte Anwendung auf Fehler hin überprüft und von denselben befreit werden konnte, schlägt die Stunde des Parallel Amplifier. Mit diesem Optimierungstool lassen sich folgende Dinge anstellen:</p>
<ul>
<li>Es bildet die zu optimierenden Quellcode-Bereiche grafisch so ab, dass sich das Skalierungspotenzial mit wenigen Blicken erfassen lässt.</li>
</ul>
<ul>
<li>Kein Trail-and-Error mehr, da das Laufzeitverhalten zuverlässig vermessen und bewertet werden kann.</li>
</ul>
<ul>
<li>Die Optimierungen finden auf einer abstrakten Ebene statt. Damit sind Kenntnisse über die zugrundeliegende Prozessorarchitektur oder des Assemblercodes überflüssig.</li>
</ul>
<ul>
<li>Das Tool ist entstanden auf <a title="whatif.intel.com" href="http://wwww.whatif.intel.com" target="_blank">whatif.intel.com</a> im Dialog zwischen Endanwendern und Intel-Ingenieuren.</li>
</ul>
<ul>
<li>Parallel Inspector basiert auf dem Thread Profiler und <a title="VTune Performance Analyzer" href="http://www.software-dev-blog.de/quellcode-schwachstellen-mit-intel-vtune-aufspuren/11/2008/">VTune Performance Analyzer</a> und steht damit für ein zuverlässiges Tool, das auf rund 15 Jahre Entwicklungsarbeit made by Intel zurückblickt.</li>
</ul>
<ul>
<li>Vollständige Visual-Studio-Integration.</li>
</ul>
<p>Und, immer noch wissenshungrig in Sachen Parallel Studio?! Dann solltet ihr morgen wieder vorbeischaun. Dann gibt es mehr dazu &#8230;</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/&via=sw_devtwits&text= Serie: Mit Parallel Studio Anwendungen multithreaden (2)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/&via=sw_devtwits&text= Serie: Mit Parallel Studio Anwendungen multithreaden (2)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serie: Mit Parallel Studio Anwendungen multithreaden (1)</title>
		<link>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/</link>
		<comments>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 17:28:20 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=828</guid>
		<description><![CDATA[Heute beginnt auf dem Software Dev Blog die Serie &#8220;Mit Parallel Studio Anwendungen multithreaden&#8221;. In den geplanten Folgen geht es im Einzelnen um die Komponenten Parallel Composer, Parallel Inspector und Parallel Amplifier. Der erste Teil handelt vom Parallel Composer, der mit einer Reihe nützlicher Tools die Parallelisierung serieller Anwendungen erleichtern soll. Hierfür bietet er vereinfachte [...]]]></description>
			<content:encoded><![CDATA[<p>Heute beginnt auf dem Software Dev Blog die Serie &#8220;Mit <a title="Intel Parallel Studio ab sofort als Beta erhältlich " href="http://www.software-dev-blog.de/intel-parallel-studio-ab-sofort-als-beta-erhaltlich/02/2009/">Parallel Studio</a> Anwendungen multithreaden&#8221;. In den geplanten Folgen geht es im Einzelnen um die Komponenten Parallel Composer, Parallel Inspector und Parallel Amplifier.</p>
<p>Der erste Teil handelt vom Parallel Composer, der mit einer Reihe nützlicher Tools die Parallelisierung serieller Anwendungen erleichtern soll. Hierfür bietet er</p>
<ul>
<li>vereinfachte Multithread-Funktionen, die allesamt auf OpenMP 3.0 basieren und als solche im Hintergrund eingesetzt werden</li>
</ul>
<ul>
<li>Vektorisierungspragmas in Kombination mit den SSE2-/SSE3-/SSSE3- und SSE4-Befehlen</li>
</ul>
<ul>
<li><a title="Multithreading-Konzepte OpenMP und Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">OpenMP 3.0</a></li>
</ul>
<ul>
<li>einfache Integration in die Entwicklungsumgebung von Microsoft Visual Studio</li>
</ul>
<ul>
<li>Intel Parallel Debugger Extensions als Plugin für Visual Studio</li>
</ul>
<ul>
<li> <a title="Intel Threading Building Blocks" href="http://www.software-dev-blog.de/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Intel Threading Building Blocks</a></li>
</ul>
<ul>
<li> Lambda-Funktionen (nur C++) für den vereinfachten Austausch mit Intel TBB</li>
</ul>
<ul>
<li><a title="Software-Projekte mit Multithread-Bibliotheken optimieren" href="http://www.software-dev-blog.de/software-projekte-mit-multicore-bibliotheken-optimieren/12/2008/">Intel Integrated Performance Primitives</a></li>
</ul>
<ul>
<li>Unterstützung der Vektorschreibweise (arr[i])</li>
</ul>
<ul>
<li>automatische Parallelisierung von Quellcode</li>
</ul>
<ul>
<li>Diagnosetools, die beim Entwickeln von Multithread-Quellcode helfen</li>
</ul>
<ul>
<li>zahlreiche Multithread-Beispiele mit dem entsprechenden Quellcode</li>
</ul>
<p>Und am Montag gibt es dann <a title="Mehr Infos zu Parallel Inspector und Parallel Amplifier" href="http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden-2/02/2009/">mehr Infos zu Parallel Inspector und Parallel Amplifier</a> <span style="text-decoration: line-through;">ein anschauliches Beispiel, Infos zu OpenMP 3.0 und einiges mehr</span>. Und die zusätzlichen Infos zu OpenMP und Co. gibt es am Dienstag &#8230;</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/&via=sw_devtwits&text=Serie: Mit Parallel Studio Anwendungen multithreaden (1)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/&via=sw_devtwits&text=Serie: Mit Parallel Studio Anwendungen multithreaden (1)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multithreading-Konzepte: OpenMP, APIs und Intel TBB</title>
		<link>http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/</link>
		<comments>http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 17:07:00 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Konzept]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[TBB]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=297</guid>
		<description><![CDATA[Für die parallele Programmierung bieten sich diverse Alternativen an, von denen hier drei vorgestellt werden sollen: OpenMP, Threading-APIs und Intel Threading Building Blocks. OpenMP: Diese Threading-Methode ist relativ simpel zu handhaben, da in den Quellcode sogenannte Pragmas eingebaut werden, die der jeweilige Compiler richtig interpretieren kann – oder auch nicht. OpenMP eignet sich vor allem [...]]]></description>
			<content:encoded><![CDATA[<p>Für die <a title="Alle Beiträge zum Thema parallele Programmierung" href="http://www.software-dev-blog.de/category/multicore/">parallele Programmierung</a> bieten sich diverse Alternativen an, von denen hier drei vorgestellt werden sollen: OpenMP, Threading-APIs und Intel Threading Building Blocks.</p>
<p><strong>OpenMP:</strong> Diese Threading-Methode ist relativ simpel zu handhaben, da in den Quellcode sogenannte Pragmas eingebaut werden, die der jeweilige Compiler richtig interpretieren kann – oder auch nicht. OpenMP eignet sich vor allem für die Parallelisierung einfacher Schleifenkonstrukte und prozeduraler Datenstrukturen. Aufgrund seiner Historie lässt sich OpenMP gut in nativen Programmierumgebungen (C++ und Fortran) einsetzen, dafür leider gar nicht in managed Code (C#, .NET).</p>
<p><strong>Threading-APIs:</strong> Spezielle Threading-APIs wie Win32- oder <a title="Wiki-Infos zu POSIX" href="http://de.wikipedia.org/wiki/POSIX" target="_blank">POSIX</a> eignen sich nicht so gut zum Implementieren von Parallel-Code. Dabei werden die Multithreading-Konstrukte in eigenen Funktionen verpackt. Die Ergebnisse werden dann als Pointer übergeben, und hier steckt die Schwierigkeit bei der Arbeit mit Threading-APIs: Funktionsprototypen und Datenstrukturen müssen aufwendig modifiziert werden, was häufig die Abstraktion des Codes und das Programmdesign zerstört. Außerdem muss man sich als Programmierer selbst um das Erzeugen, Verwalten und Synchronisieren der Threads kümmern, was sehr mühsam ist. Daneben unterstützen Threading-APIs C++ nur sehr schlecht und oft gar nicht.</p>
<p><strong>Intel Threading Building Blocks:</strong> Hierbei handelt es sich um eine C++-Bibliothek, die ähnlich wie die Standard Template Library eines herkömmlichen Compilers aufgebaut ist. Die <a title="Webseite zu Intel TBB" href="http://www.intel.com/cd/software/products/asmo-na/eng/threading/threadbuildblocks/294797.htm" target="_blank">Intel TBB</a> stellen hochentwickelte Abstraktionsmodelle zur Verfügung, um eine flexible Programmierung zu ermöglichen. Das bedeutet, dass beispielsweise Iteratoren, die in Container verpackt sind, mithilfe der Intel TBB relativ einfach parallelisiert werden können.</p>
<p>Die Idee hierbei ist recht simpel: Anstatt Threads spezifiziert man einzelne Aufgaben (Tasks), die der TBB Scheduler auf die vorhandenen Hardware-Threads abbildet. Man muss sich also nicht mehr um die Synchronisation der Threads und ähnliches kümmern. Außerdem skaliert eine mithilfe der Intel TBB parallelisierte Anwendung sehr gut, da je nach verfügbaren Prozessorkernen und damit verbundenen Threads die Software um ein Vielfaches schneller ausgeführt werden kann.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/&via=sw_devtwits&text=Multithreading-Konzepte: OpenMP, APIs und Intel TBB&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/&via=sw_devtwits&text=Multithreading-Konzepte: OpenMP, APIs und Intel TBB&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tipps, Infos &amp; Tricks rund ums parallele Programmieren</title>
		<link>http://www.software-dev-blog.de/tipps-infos-tricks-rund-ums-parallele-programmieren/11/2008/</link>
		<comments>http://www.software-dev-blog.de/tipps-infos-tricks-rund-ums-parallele-programmieren/11/2008/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:37:41 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[Surftipp]]></category>
		<category><![CDATA[TBB]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=138</guid>
		<description><![CDATA[Das Thema „Paralleles Programmieren“ ist ein weites Feld, auf dem man sich ohne die passenden Tipps und Tricks, ohne hilfreiche Anleitungen und nützliche Webseiten-Empfehlungen ziemlich schnell verirren kann. Aus diesem Grund hat das Medienunternehmen Jupiter Online Media gemeinsam mit seinem Partner Intel eine Webseite ins Leben gerufen, die genau das leisten soll: helfen, anleiten, empfehlen. [...]]]></description>
			<content:encoded><![CDATA[<p>Das Thema „Paralleles Programmieren“ ist ein weites Feld, auf dem man sich ohne die passenden Tipps und Tricks, ohne hilfreiche Anleitungen und nützliche Webseiten-Empfehlungen ziemlich schnell verirren kann. Aus diesem Grund hat das Medienunternehmen Jupiter Online Media gemeinsam mit seinem Partner Intel eine Webseite ins Leben gerufen, die genau das leisten soll: helfen, anleiten, empfehlen.</p>
<p>Diese Seite nennt sich <a title="Webseite go-parallel.com" href="http://go-parallel.com" target="_blank">go-parallel.com</a> und berichtet in regelmäßigen Abständen über das parallele Multicore-Universum der Software-Entwicklung. Zu diesem Zweck ist die Seite in fünf Bereich unterteilt:  „Getting Started“, „Concurrent Programming“, „Community and Opinion“, „Tools and Tips“ und „Advanced Concepts“.</p>
<p>So findet man in <a title="Sektion &quot;Getting started&quot;" href="http://www.devx.com/go-parallel/Door/32532#gettingStarted" target="_blank">„Getting Started“</a> hilfreiche Anleitungen, wie man beispielsweise eine komplette <a title="Mehr Infos zu Intel Threading Building Blocks" href="http://www.intel.com/cd/software/products/asmo-na/eng/294797.htm" target="_blank">TBB-Umgebung</a> unter Windows einrichtet und wie die Programmierung einer TBB-kompatiblen Anwendung funktioniert. Aber auch Themen wie <a title="Mehr Infos zu OpenMP" href="http://openmp.org/wp/" target="_blank">OpenMP</a> werden dort behandelt.</p>
<p><span id="more-138"></span><a title="Abschnitt &quot;Concurrent Programming&quot;" href="http://www.devx.com/go-parallel/Door/32532#concurrentProgram" target="_blank">„Concurrent Programming“</a> führt dann das fort, was unter „Getting Started“ begonnen wurde. So lernt man Teile der Intel TBB besser kennen und wie man diese für seine eigenen Projekte schneller einsetzen kann. Wie zum Beispiel den Algorithmus „parallel_scan“, mit dessen Hilfe sich einzelne Programmabschnitte in ihre Einzelteile zerlegen lassen, damit diese parallel ausgeführt werden können, was natürlich die Leistung der Anwendung erhöht. Vor allem, wenn dies rekursiv geschieht.</p>
<p>Die Sektion <a title="Abschnitt &quot;Community and Opinion&quot;" href="http://www.devx.com/go-parallel/Door/32532#communityAndOpinion" target="_blank">„Community and Opinion“</a> lässt echte Profis zur Wort kommen. Wie Claire Cates, die für das <a title="Mehr Infos zu SAS" href="http://www.sas.com/offices/europe/germany/index.html" target="_blank">Software-Unternehmen SAS</a> arbeitet und die über ihre Erfahrung mit den Intel-Tools Thread Checker und Thread Profiler spricht, die ja beide Teil des <a title="Mehr Infos über nützliche Intel-Tools" href="http://www.software-dev-blog.de/software-projekte-mit-intel-tools-optimieren/10/2008/" target="_blank">VTune Performance Analyzer</a> sind.</p>
<p><a title="Abschnitt &quot;Tools and Tips&quot;" href="http://www.devx.com/go-parallel/Door/32532#toolsAndTips" target="_blank">„Tools and Tips“</a> ist eine echte Fundgrube, wenn es um all die Intel-Tools geht, die Software-Entwicklern bei ihrer Arbeit helfen sollen. So erfährt man eine Menge über Intel Compiler und die Bibliothekssammlung Intel TBB, aber auch OpenMP ist Gegenstand dieses Abschnitts.</p>
<p>Mit <a title="Abschnitt &quot;Advanced Concepts&quot;" href="http://www.devx.com/go-parallel/Door/32532#advanceConcepts" target="_blank">„Advanced Concepts“</a> geht go-parallel.com noch einen Schritt weiter und stellt neue Technologien und Projekte vor, die Programmierer in der Zukunft unterstützen sollen. Aber auch von der Gegenwart ist die Rede: Wie man Software für Multicore-Plattformen schreibt, Programme auf Intel-Rechnern testet und wie sich bestehende Windows-Anwendungen auf Mac OS X migrieren lassen. All das und vieles mehr lernt man auf <a title="go-parallel.com" href="http://go-parallels.com" target="_blank">go-parallels.com</a>.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/tipps-infos-tricks-rund-ums-parallele-programmieren/11/2008/&via=sw_devtwits&text=Tipps, Infos & Tricks rund ums parallele Programmieren &related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/tipps-infos-tricks-rund-ums-parallele-programmieren/11/2008/&via=sw_devtwits&text=Tipps, Infos & Tricks rund ums parallele Programmieren &related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/tipps-infos-tricks-rund-ums-parallele-programmieren/11/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

