<?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; Tutorial</title>
	<atom:link href="http://www.software-dev-blog.de/tag/tutorial/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>Studenten der Informatik, aufgepasst: hier gibt&#8217;s Wissen pur!</title>
		<link>http://www.software-dev-blog.de/studenten-der-informatik-aufgepasst-hier-gibts-wissen-pur/11/2011/</link>
		<comments>http://www.software-dev-blog.de/studenten-der-informatik-aufgepasst-hier-gibts-wissen-pur/11/2011/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 14:09:27 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Lehre]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1854</guid>
		<description><![CDATA[Heute ging eine Pressemeldung an diverse Redaktionen, in der folgendes zu lesen steht: 18% mehr Erstsemester in der Informatik &#8211; Berufsaussichten weiterhin exzellent Im Studienjahr 2011 (Sommer- und Wintersemester 2011) haben sich laut Mitteilung des Statistischen Bundesamtes 48.400 Studierende für den Studienbereich Informatik eingeschrieben. Dies entspricht einer Steigerung von 18 % im Vergleich zum Vorjahreszeitraum. [...]]]></description>
			<content:encoded><![CDATA[<p>Heute ging <a href="http://www.gi.de/presse/pressemitteilungen-2011/pressemitteilung-vom-25-november-2011.html" target="_blank">eine Pressemeldung an diverse Redaktionen</a>, in der folgendes zu lesen steht:</p>
<blockquote><p><strong>18% mehr Erstsemester in der Informatik &#8211; Berufsaussichten weiterhin exzellent</strong></p>
<p>Im Studienjahr 2011 (Sommer- und Wintersemester 2011) haben sich laut Mitteilung des Statistischen Bundesamtes 48.400 Studierende für den Studienbereich Informatik eingeschrieben. Dies entspricht einer Steigerung von 18 % im Vergleich zum Vorjahreszeitraum.</p></blockquote>
<p>Diese Meldung stammt von der <a href="http://www.gi.de/" target="_blank">Gesellschaft für Informatik</a>, die verständlicherweise über diese Entwicklung sehr erfreut ist, denn:</p>
<blockquote><p>&#8220;Durch diesen Anstieg werden wir auch deutlich mehr Absolventinnen und Absolventen bekommen, die in Wirtschaft, Wissenschaft und Verwaltung dringend gebraucht werden. Denn nach wie vor ist der Bedarf an gut qualifizierten Informatikerinnen und Informatikern sehr hoch.&#8221;</p></blockquote>
<p>Das sagt GI-Präsident Stefan Jänichen höchstpersönlich, und der wird es ja wohl wissen. Dabei muss allerdings die Frage erlaubt sein, ob die Fachhochschulen und Universitäten dieses Landes auf solch einen Zustrom an Erstsemestlern auch richtig eingestellt sind. Und zwar in Sachen Ausstattung und Lehrinhalte. Zu ersterem können wir natürlich nichts beitragen, zu Punkt zwei aber schon.</p>
<p>Daher folgt an dieser Stelle unser ultimativer Erstsemester-Survival-Kit in Sachen Multicore-Programmierung. Auf dass die Software-Anwendungen der Zukunft auf Rechnersystemen mit 4, 6, 8 und mehr Prozessorkernen verteilt und superskalar laufen. Viel Spaß beim Schmökern!</p>
<p><strong>Grundwissen Multicore-Programmierung</strong></p>
<p><a title="Wie man sich die parallele Datenverarbeitung/ Programmierung vorstellen kann" href="http://www.software-dev-blog.de/wie-man-sich-die-parallele-datenverarbeitung-programmierung-vorstellen-kann/09/2011/">Wie man sich die parallele Datenverarbeitung/Programmierung vorstellen kann</a></p>
<p><a title="Von Single-Threading bis zur Multicore-Programmierung" href="http://www.software-dev-blog.de/von-single-threading-bis-zur-multicore-programmierung/12/2008/">Von Single-Threading bis zur Multicore-Programmierung</a></p>
<p><a title="In der Parallelprogrammierung steckt die Zukunft!" href="http://www.software-dev-blog.de/in-der-parallelprogrammierung-steckt-die-zukunft/01/2009/">In der Parallelprogrammierung steckt die Zukunft!</a></p>
<p><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 Antithesen zur Multicore-Programmierung</a></p>
<p><a title="OOP 2011: Stephen Blair-Chappell über Chancen und Grenzen der Parallel-Programmierung" href="http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/">Stephen Blair-Chappell über Chancen und Grenzen der Parallel-Programmierung</a></p>
<p><a title="Know-how: Von Deadlocks und Livelocks" href="http://www.software-dev-blog.de/know-how-von-deadlocks-und-livelocks/02/2011/">Know-how: Von Deadlocks und Live locks</a></p>
<p><a title="Know-How und Programmiertipps: Data Races" href="http://www.software-dev-blog.de/know-how-und-programmiertipps-data-races/02/2011/">Know-how und Programmiertipps: Data Races</a></p>
<p><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/">Multithreading-Konzepte: OpenMP, APIs und Intel TBB</a></p>
<p><strong>Tutorials &amp; Regeln</strong></p>
<p><a title="Workshops und Tutorials für Parallelprogrammierer" href="http://www.software-dev-blog.de/workshops-und-tutorials-fur-parallelprogrammierer/05/2009/">Workshops und Tutorials für Parallelprogrammierer</a></p>
<p><a title="Permanent Link to Beliebte Fehler bei der Parallelprogrammierung" href="http://www.software-dev-blog.de/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/" rel="bookmark">Beliebte Fehler bei der Parallelprogrammierung</a></p>
<p>Einsteiger-Kurs: So programmiere ich für Multicore-Systeme unter Microsoft . NET (<a href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">Teil 1</a>, <a href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/">Teil 2</a>, <a href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/">Teil 3</a>)</p>
<p>Workshop: Alles über .NET-Threads (<a title="Workshop: Alles über .NET-Threads – Teil 1" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Teil 1</a>, <a title="Workshop: Alles über .NET-Threads – Teil 2" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Teil 2</a>, <a title="Workshop: Alles über .NET-Threads – Teil 3" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/">Teil 3</a>, <a title="Workshop: Alles über .NET-Threads – Teil 4" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/">Teil 4</a>)</p>
<p><a title="Programmiermethoden: Daten- und Aufgabenparallelität" href="http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/">Programmiermethoden: Daten- und Aufgabenparallelität</a></p>
<p><a title="Vier Schritte zum optimierten Multicore-Quellcode" href="http://www.software-dev-blog.de/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/">Vier Schritte zum optimierten Multicore-Quellcode</a></p>
<p><a title="Fünf Multicore-Programmierregeln auf einen Blick" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">Fünf Multicore-Programmierregeln auf einen Blick</a></p>
<p><a title="Acht nützliche Tipps zum Parallelisieren" href="http://www.software-dev-blog.de/acht-nutzliche-tipps-zum-parallelisieren/09/2010/">Acht nützliche Tipps zum Parallelisieren</a><a title="Fünf Multicore-Programmierregeln auf einen Blick" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/"> </a></p>
<p><a title="Permanent Link to Mögliche Thread-Modi und deren Folgen" href="http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/" rel="bookmark">Mögliche Thread-Modi und deren Folgen</a></p>
<p><strong>OpenMP-Workshops</strong></p>
<p><a title="Permanent Link to Workshop: parallel Programmieren mit OpenMP" href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/" rel="bookmark">Workshop: parallel Programmieren mit OpenMP</a></p>
<p><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/">OpenMP: fünf Bedingungen für parallele Schleifen</a></p>
<p><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/">OpenMP: Schleifen anpassen für Multithreading-Ausführung</a></p>
<p><strong>Buchtipp</strong></p>
<p><a title="Buchtipp: Multicore-Programmierung lernen mit Intel" href="http://www.software-dev-blog.de/buchtipp-multicore-programmierung-lernen-mit-intel/12/2008/">Buchtipp: Multicore-Programmierung lernen mit Intel</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/studenten-der-informatik-aufgepasst-hier-gibts-wissen-pur/11/2011/&via=sw_devtwits&text=Studenten der Informatik, aufgepasst: hier gibt's Wissen pur!&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/studenten-der-informatik-aufgepasst-hier-gibts-wissen-pur/11/2011/&via=sw_devtwits&text=Studenten der Informatik, aufgepasst: hier gibt's Wissen pur!&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/studenten-der-informatik-aufgepasst-hier-gibts-wissen-pur/11/2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zwei kostenlose Webinare: So verbessere ich die Performance meiner Applikationen</title>
		<link>http://www.software-dev-blog.de/zwei-kostenlose-webinare-so-verbessere-ich-die-performance-meiner-applikationen/11/2011/</link>
		<comments>http://www.software-dev-blog.de/zwei-kostenlose-webinare-so-verbessere-ich-die-performance-meiner-applikationen/11/2011/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 14:21:06 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[VTune Amplifier XE 2011]]></category>
		<category><![CDATA[Webinar]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1844</guid>
		<description><![CDATA[Über das Optimierungstool Intel VTune Amplifier XE habe ich ja schon das ein oder andere Mal berichtet. Dazu passt ganz gut ein Eintrag auf software.intel.com, der auf eine zweiteilige Webinar-Reihe aufmerksam macht, die Intel interessierten Entwickler kostenlos zur Verfügung stellt. Hierzu müssen Sie sich einmal registrieren, um anschließend beide Online-Trainings in voller Länge konsumieren zu [...]]]></description>
			<content:encoded><![CDATA[<p>Über das Optimierungstool <strong>Intel VTune Amplifier XE</strong> habe ich ja schon <a title="Workshop: VTune Amplifier XE 2011 im Teamwork mit Intel OpenCL SDK 1.1 Beta" href="http://www.software-dev-blog.de/workshop-vtune-amplifier-xe-2011-im-teamwork-mit-intel-opencl-sdk-1-1-beta/06/2011/">das ein</a> oder <a title="Live von der GDC Europe 2011: Levent Akyil im Interview" href="http://www.software-dev-blog.de/live-von-der-gdc-europe-2011-levent-akyil-im-interview/08/2011/">andere Mal</a> berichtet. Dazu passt ganz gut ein Eintrag auf <a href="http://software.intel.com/" target="_blank">software.intel.com</a>, der auf eine zweiteilige Webinar-Reihe aufmerksam macht, die Intel interessierten Entwickler kostenlos zur Verfügung stellt. Hierzu müssen Sie sich einmal registrieren, um anschließend beide Online-Trainings in voller Länge konsumieren zu können.</p>
<p>Teil 1 der virtuellen Kurse beschäftigt sich vor allem mit der Frage, wie sich Anwendungen, die auf den aktuellen Prozessoren von Intel (Stichwort: <a title="Sandy Bridge: Schnellere Apps dank breiteren AVX-Registern" href="http://www.software-dev-blog.de/sandy-bridge-schnellere-apps-dank-breiteren-avx-registern/01/2011/">Sandy Bridge</a>) laufen, so optimiert werden können, damit sie noch besser und performanter auf dem Rechner ausgeführt werden. Hierzu bietet VTune Amplifier XE eine eigene Funktion, mit der sich die Anwendung analysieren und auf Hotspots und ähnliche Bremsklötze untersuchen lässt.</p>
<p>Teil 2 der Webinar-Reihe zeigt, welche Hemmschuhe in einer Anwendung vorkommen können und wie sie mit Hilfe von Sandy-Bridge-Funktionen wie <a title="Sandy Bridge, AVX und Core-CPUs: GCC 4.6 mag Intel" href="http://www.software-dev-blog.de/sandy-bridge-avx-und-core-cpus-gcc-4-6-mag-intel/03/2011/">AVX</a> behoben werden können. Natürlich lernen Sie auch, wie sich diese Funktionen optimal einsetzen lassen und weiter optimiert werden können.</p>
<p>Und wem das noch nicht genügt, dem möchte ich die zwei Videos ans Herz legen, die sich mit dem Thema Performance-Analyse ausführlich beschäftigen. Für das Abspielen der Videoclips müssen Sie sich übrigens nicht anmelden.</p>
<p>Alle Infos und den Anmeldelink finden Sie <a href="http://software.intel.com/en-us/articles/two-part-webinar-and-two-videos-posted-all-covering-sandy-bridge-performance-tuning/" target="_blank">auf der zugehörigen Webseite auf dem Intel Software Network</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/zwei-kostenlose-webinare-so-verbessere-ich-die-performance-meiner-applikationen/11/2011/&via=sw_devtwits&text=Zwei kostenlose Webinare: So verbessere ich die Performance meiner Applikationen&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/zwei-kostenlose-webinare-so-verbessere-ich-die-performance-meiner-applikationen/11/2011/&via=sw_devtwits&text=Zwei kostenlose Webinare: So verbessere ich die Performance meiner Applikationen&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/zwei-kostenlose-webinare-so-verbessere-ich-die-performance-meiner-applikationen/11/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-to: Parallel programmieren mit der Open-Source-Sprache Go</title>
		<link>http://www.software-dev-blog.de/how-to-parallel-programmieren-mit-der-open-source-sprache-go/07/2011/</link>
		<comments>http://www.software-dev-blog.de/how-to-parallel-programmieren-mit-der-open-source-sprache-go/07/2011/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 11:30:45 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Sprache]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1670</guid>
		<description><![CDATA[Mein gestriger Interviewpartner Anton Klotz hat mich darauf gebracht: Mit dem Open-Source-Projekt Go steht vor allem für C++-Programmierer eine Sprache zur Verfügung, mit der vieles leichter werden soll, vor allem das Programmieren von Nebenläufigkeiten, was angesichts von zunehmenden Prozessorkernen pro Maschine ein immer wichtigeres Thema wird. Alleine deshalb ist ein Blick auf Go für mich [...]]]></description>
			<content:encoded><![CDATA[<p>Mein gestriger <a title="Trend Report 2011: Anton Klotz gibt Antworten zu Tools, Programmiersprachen und mehr" href="http://www.software-dev-blog.de/trend-report-2011-anton-klotz-gibt-antworten-zu-tools-programmiersprachen-und-mehr/07/2011/">Interviewpartner Anton Klotz</a> hat mich darauf gebracht: Mit dem <a href="http://golang.org" target="_blank">Open-Source-Projekt Go</a> steht vor allem für C++-Programmierer eine Sprache zur Verfügung, mit der vieles leichter werden soll, vor allem das Programmieren von Nebenläufigkeiten, was angesichts von zunehmenden Prozessorkernen pro Maschine ein immer wichtigeres Thema wird. Alleine deshalb ist ein Blick auf Go für mich unbedingt lohnenswert.</p>
<p style="text-align: left;">Zunächst einmal muss man festhalten, dass es drei verschiedene Go-Compiler gibt: einen für AMD-Prozessoren, einen für die x86-Plattform von Intel und eine Variante für ARM-CPUs, die derzeit vor allem in Smartphones und Tablets verbaut werden. Die erstgenannten sind laut <a href="http://goloang.org" target="_blank">goloang.org</a> fertig und bieten sogar diverse Möglichkeiten zu automatisierten Code-Optimierung auf Registerbasis. Der ARM-Compiler ist offenkundig noch in einer frühen Beta-Phase, zumindest werden bis dato nur Linux-Binaries unterstützt, der Optimizer ist noch nicht fertig und Floating-Point-Berechnungen werden derzeit nur auf Basis der VFP-Unit durchgeführt.</p>
<p style="text-align: left;">Aus Sicht dieses Blogs ist natürlich das Konzept der Nebenläufigkeiten von ganz besonderem Interesse, das Go mit neuen Ansätzen optimal unterstützen will. Hierzu gehören folgenden Dinge:</p>
<ul>
<li><strong>&#8220;Share by Communication&#8221;:</strong> Im Gegensatz zu anderen Programmiersprachen, bei denen die meisten Probleme aus dem konkurrierenden Zugriff auf Daten resultieren, verfolgt Go einen  neuen Weg: Daten werden mithilfe von Kanälen &#8220;herumgereicht&#8221;, was dazu führt, dass jede Go-Routine immer nur auf genau einen Wert zugreift, nämlich den aktuell ermittelten. Um das in einem Satz zu verdeutlichen, haben die Macher von Go sich den Slogan &#8220;Do not communicate by sharing memory, instead share memory by communicating&#8221; ausgedacht.</li>
</ul>
<ul>
<li><strong>Go-Routinen:</strong> Diese Ansammlung von Funktionen laufen parallel zu anderen Go-Routinen im selben Adressraum ab. Zudem benötigt solch eine Routine nur wenig Speicher, da sie lediglich ein wenig Stack in Anspruch nimmt. Solch eine Funktion oder Methode wird mit dem Schlüsselwort <em><strong>go</strong></em> aufgerufen. Endet die Funktion oder Methode, wird auch die Go-Routine beendet.</li>
</ul>
<ul>
<li><strong>Channels (Kanäle):</strong> Kanäle sind Referenztypen und sorgen dafür, dass zwei oder mehrere Go-Routinen in einem definierten Zustand bleiben. Channels werden mit dem Befehl <em><strong>make</strong></em> erzeugt.</li>
</ul>
<ul>
<li><strong>Kanäle von Kanälen:</strong> Channels sind Werte &#8220;erster Klasse&#8221;, können also beliebig herumgereicht werden. Das erlaubt ein thread-sicheres, paralleles Verarbeiten mehrerer Kanäle, so genannter Channel Bundles. Der englische Fachbegriff hierfür nennt sich De-Multiplexing. Daraus entsteht ein quotiertes, paralleles, nicht-blockierendes RPC-System &#8211; und das ganz ohne Mutexe.</li>
</ul>
<ul>
<li><strong>Parallelisieren:</strong> Das asynchrone Berechnen eines Vektors ist eines der Anwendungsbeispiele von Go-Routinen mithilfe von Kanälen. Dabei werden die Elemente eines Vektors auf die Anzahl der vorhandenen Kerne verteilt, und das völlig unabhängig voneinander. Sobald sämtliche Vektorberechnungen durchgeführt worden sind, werden die zugeghörigen Kanäle gelöscht und das Ergbnis ermittelt.</li>
</ul>
<p style="text-align: left;">Wer Go mal ausprobieren möchte: auf golang.org steht <a href="http://golang.org/doc/install.html" target="_blank">eine genaue Installationsanleitung bereit</a>. Und ein Blick in die umfangreiche <a href="http://golang.org/doc/docs.html" target="_blank">Online-Dokumentation</a> kann sicherlich auch nicht schaden. Und besonders schick: einen sehr <a href="http://bitloeffel.de/DOC/golang/effective_go_de.html" target="_blank">übersichtlichen Programmierleitfaden gibt es sogar in Deutsch!</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/how-to-parallel-programmieren-mit-der-open-source-sprache-go/07/2011/&via=sw_devtwits&text=How-to: Parallel programmieren mit der Open-Source-Sprache Go&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/how-to-parallel-programmieren-mit-der-open-source-sprache-go/07/2011/&via=sw_devtwits&text=How-to: Parallel programmieren mit der Open-Source-Sprache Go&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/how-to-parallel-programmieren-mit-der-open-source-sprache-go/07/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Know-How und Programmiertipps: Data Races</title>
		<link>http://www.software-dev-blog.de/know-how-und-programmiertipps-data-races/02/2011/</link>
		<comments>http://www.software-dev-blog.de/know-how-und-programmiertipps-data-races/02/2011/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 10:10:55 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Intel Inspector XE 2011]]></category>
		<category><![CDATA[Know-how]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1490</guid>
		<description><![CDATA[Im Zuge meiner kleinen Serie zu den häufigsten Code-Pannen der Parallel-Programmierer habe ich bereits über Deadlocks und Livelocks geschrieben. Jetzt geht es um Data Races – ein sehr häufiges Programmierproblem, das zwar auch Programmhänger oder –abstürze verursacht, vor allem aber zu falschen Berechnungen führen kann, wodurch die eigene App dann im Zuge bestimmter Prozesse unberechenbar [...]]]></description>
			<content:encoded><![CDATA[<p>Im Zuge meiner kleinen Serie zu den häufigsten Code-Pannen der Parallel-Programmierer habe ich bereits über <a href="(http://www.software-dev-blog.de/know-how-von-deadlocks-und-livelocks/02/2011" target="_blank">Deadlocks und Livelocks</a> geschrieben. Jetzt geht es um Data Races – ein sehr häufiges Programmierproblem, das zwar auch Programmhänger oder –abstürze verursacht, vor allem aber zu falschen Berechnungen führen kann, wodurch die eigene App dann im Zuge bestimmter Prozesse unberechenbar reagiert.</p>
<p>Aber der Reihe nach: Data Races (auch: &#8220;Dataraces&#8221;) gehören zur Klasse der Race Conditions. Der Begriff „race“ deutet bereits an, dass es sich hierbei um einen Wettlauf handelt: Eine Gesamtprozess soll das Endergebnis zweier oder mehrerer Teilprozesse darstellen, wobei die Teilprozesse aufeinander aufbauen, fälschlicherweise aber parallel gestartet werden und somit zu einem falschen Resultat führen.</p>
<p>Eine kleine Analogie, die das verdeutlicht: <em>Bei einem Staffellauf übergibt Läufer 1 das Hölzchen an Läufer 2 und so fort. So ergibt sich eine funktionale Kette, wobei ein Läufer erst dann starten darf, wenn er den Stab vom heraneilenden Partner erhalten hat. Diese funktionale Kette würde unterbrochen, wenn Läufer 2 nicht wartet, sondern sich ein eigenes Hölzchen schnappt und – warum auch immer – vor dem vereinbarten Kommando losläuft. Dann würde Läufer 3 von 2 Teamkollegen und 2 Hölzern bedient. Das führt in der Leichtathletik zur Disqualifikation.</em></p>
<p>Nun etwas technischer: Bei Data Races beschreibt beispielsweise ein Thread einen Speicherbereich, während ein zweiter Thread auf einen überlappenden Bereich zugreift. Bislang war die Analyse dieser Fehler sehr aufwändig, weil die Auswirkungen nicht immer sofort sichtbar sind oder keine klaren Rückschlüsse auf einzelne Code-Phrasen zulassen.</p>
<p>Ist die Ursache aber gefunden, lässt sich die Panne über eine neue Anordnung  korrigieren: der erste Thread muss exklusiven Zugriff auf Ressourcen (etwa den Speicherbereich) erhalten und diesen Zugriff erst nach Abschluss seiner Aufgabe zugunsten des zweiten Threads lösen – also eine sequentielle Abfolge der Threads. Praktisch wird das meist über Semaphore erledigt. Semaphore sind Datenstrukturen, die – vereinfacht ausgedrückt – dazu dienen, bei der parallelen Ausführung die Threads in eine sinnvolle Reihenfolge zu bringen.</p>
<p>Das klingt kompliziert – und das ist es auch. Aber nur, wenn Sie auf den Einsatz des <a href="http://software.intel.com/en-us/articles/intel-inspector-xe/" target="_blank">Intel Inspector XE 2011</a> verzichten. Der kümmert sich selbstständig um das Fixing.  Zunächst aber prüft das Tool gewissenhaft die Threads und die Speicherbelegung. Dafür können Sie übrigens anhand der integrierten Tutorials vorgehen. Memoryleaks werden dabei sofort aufgespürt und im Quellcode lokalisiert. Das gilt auch für Data Races, die Sie in einem Zug gemeinsam mit Deadlocks ermitteln.</p>
<p>Wie einfach und hilfreich das mitunter in der Praxis ist, schildert dieses <a href="http://software.intel.com/en-us/videos/intel-inspector-xe-overview/" target="_blank">sehr gute Video mit Anwendungsbeispielen</a> aus der Parallelprogrammierung:</p>
<p><object id="v_3378_1659" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="313" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="v_3378_1659" /><param name="flashvars" value="file=http://software.intel.com/media/videos/e/1/6/9/6/0/0/e1696007be4eefb81b1a1d39ce48681b.flv&amp;image=http://software.intel.com/media/videos/e/1/6/9/6/0/0/e1696007be4eefb81b1a1d39ce48681b_player.jpg&amp;autostart=false&amp;bufferlength=5&amp;allowfullscreen=true&amp;plugins=http://software.intel.com/common/swf/listen&amp;title=Intel%C2%AE+Inspector+XE+Overview" /><param name="allowfullscreen" value="true" /><param name="src" value="http://software.intel.com/common/swf/mediaplayer.swf" /><param name="bgcolor" value="#FFFFFF" /><embed id="v_3378_1659" type="application/x-shockwave-flash" width="500" height="313" src="http://software.intel.com/common/swf/mediaplayer.swf" bgcolor="#FFFFFF" allowfullscreen="true" flashvars="file=http://software.intel.com/media/videos/e/1/6/9/6/0/0/e1696007be4eefb81b1a1d39ce48681b.flv&amp;image=http://software.intel.com/media/videos/e/1/6/9/6/0/0/e1696007be4eefb81b1a1d39ce48681b_player.jpg&amp;autostart=false&amp;bufferlength=5&amp;allowfullscreen=true&amp;plugins=http://software.intel.com/common/swf/listen&amp;title=Intel%C2%AE+Inspector+XE+Overview" name="v_3378_1659"></embed></object></p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/know-how-und-programmiertipps-data-races/02/2011/&via=sw_devtwits&text= Know-How und Programmiertipps: Data Races&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/know-how-und-programmiertipps-data-races/02/2011/&via=sw_devtwits&text= Know-How und Programmiertipps: Data Races&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/know-how-und-programmiertipps-data-races/02/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie Entwickler von neuen Sandy-Bridge-Registern und -Ops profitieren</title>
		<link>http://www.software-dev-blog.de/wie-entwickler-von-neuen-sandy-bridge-registern-und-ops-profitieren/02/2011/</link>
		<comments>http://www.software-dev-blog.de/wie-entwickler-von-neuen-sandy-bridge-registern-und-ops-profitieren/02/2011/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 10:39:32 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[AVX]]></category>
		<category><![CDATA[Sandy Bridge]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1486</guid>
		<description><![CDATA[Über die neuen Intel AVX-Register und -Operationen habe ich ja hier schon des öfteren berichtet. Heute soll es mal ganz konkret um Anwendungsbeispiele gehen und wie AVX dabei hilft, entsprechenden Sourcecode zu beschleunigen. Für weiterführende Informationen und Code-Beispiele habe ich ans Ende jedes Szenarios einen Link gepackt. Szenario I: Videokodierung/-dekodierung Bei der Kodierung und Dekodierung [...]]]></description>
			<content:encoded><![CDATA[<p>Über die neuen Intel AVX-Register und -Operationen habe ich ja hier schon <a href="http://www.software-dev-blog.de/oop_2011_avx-cloth/01/2011/">des öfteren</a> <a href="http://www.software-dev-blog.de/sandy-bridge-schnellere-apps-dank-breiteren-avx-registern/01/2011/">berichtet</a>. Heute soll es mal ganz konkret um Anwendungsbeispiele gehen und wie AVX dabei hilft, entsprechenden Sourcecode zu beschleunigen. Für weiterführende Informationen und Code-Beispiele habe ich ans Ende jedes Szenarios einen Link gepackt.</p>
<h4>Szenario I: Videokodierung/-dekodierung</h4>
<p>Bei der Kodierung und Dekodierung von Videodaten kommen vor allem zwei mathematische Funktionen häufig zum Einsatz, nämlich die Diskrete Kosinus-Transformation und die zugehörige Inverse Transformation. Hierfür steht eine eigene AVX-optimierte Funktion zur Verfügung, die im Vergleich zu der entsprechenden SSE-Floating-Point-Operation solch eine Transformation mit dem Faktor 1,78 schneller  berechnet. <a href="http://software.intel.com/en-us/articles/using-intel-advanced-vector-extensions-to-implement-an-inverse-discrete-cosine-transform/" target="_blank">Mehr Infos dazu</a></p>
<h4>Szenario II: Bildbearbeitung</h4>
<p>In der Bildbearbeitung sind vor allem Filter häufig angewandte Funktionen, und auch hier können AVX-basierte Operationen die Anwendung erheblich beschleunigen &#8211; und das ohne größere Veränderungen am Sourcecode. Beispiel hierfür ist der Gauß&#8217;sche Weichzeichner, der vor allem für das Entfernen von Bildrauschen verwendet wird. Da sich Pixel meist völlig unabhängig voneinander analysieren und manipulieren lassen, existiert hier ein großes Parallelisierungspotenzial auf AVX-Basis. Für den Gauß&#8217;schen Filter kommt übrigens OpenMP zum Einsatz, und die benötige Rechenzeit halbiert sich nahezu im Vergleich zu SSE-Operationen bei einem Bild der Größe 2048*2048. <a href="http://software.intel.com/en-us/articles/iir-gaussian-blur-filter-implementation-using-intel-advanced-vector-extensions/" target="_blank">Mehr Infos dazu.</a></p>
<h4>Szenario III: 3D-Anwendungen</h4>
<p>Häufig in 3D-Anwendungen vorkommende mathematische Operationen sind Matrizenberechnungen, die zur Darstellungen von Vektoren notwendig sind. Die wichtigsten Berechnungen hierbei sind die Addition (<em>mm256_add_ps</em>), die Multiplikation (<em>mm256_mul_ps</em>) und die Berechnung der Matrix-Determinanten, die ja rein mathematisch betrachtet eine Kombination aus Matrizen-Addition, -Multiplikation und -Subtraktion darstellt, also <em>mm256_add_ps()</em>, <em>mm256_mul_ps() </em>und <em>mm256_sub_ps()</em>. Die zur Verfügung stehenden AVX-Operationen beschleunigen die Berechnungen kleiner Matrizen um den Faktor 1,8 (Addition) bis 1,56 (Determinante). <a href="http://software.intel.com/en-us/articles/benefits-of-intel-avx-for-small-matrices/" target="_blank">Mehr Infos dazu</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/wie-entwickler-von-neuen-sandy-bridge-registern-und-ops-profitieren/02/2011/&via=sw_devtwits&text=Wie Entwickler von neuen Sandy-Bridge-Registern und -Ops profitieren&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/wie-entwickler-von-neuen-sandy-bridge-registern-und-ops-profitieren/02/2011/&via=sw_devtwits&text=Wie Entwickler von neuen Sandy-Bridge-Registern und -Ops profitieren&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/wie-entwickler-von-neuen-sandy-bridge-registern-und-ops-profitieren/02/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sandy Bridge: Grafik-Power und Power-Tools für Entwickler</title>
		<link>http://www.software-dev-blog.de/sandy-bridge-grafik-power-und-power-tools-fur-entwickler/01/2011/</link>
		<comments>http://www.software-dev-blog.de/sandy-bridge-grafik-power-und-power-tools-fur-entwickler/01/2011/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 08:02:59 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Visual Computing]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Sandy Bridge]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1458</guid>
		<description><![CDATA[Wie Ende der vergangenen Woche versprochen, folgt heute eine Übersicht der wichtigsten Grafikverbesserungen, die Intel mit Sandy Bridge einführt und ein paar wirklich gute Developer-Ressourcen und Code-Beispiele – denn in den USA haben einige Programmierer bereits losgelegt und konnten mit ihren Samples den Performance-Gewinn der neuen Prozessorgeneration für Spiele(r) eindrucksvoll unter Beweis stellen. Zunächst aber [...]]]></description>
			<content:encoded><![CDATA[<p>Wie <a href="http://www.software-dev-blog.de/wie-3d-spiele-von-sandy-bridge-profitieren/01/2011" target="_self">Ende der vergangenen Woche versprochen,</a> folgt heute eine Übersicht <a href="http://software.intel.com/en-us/articles/quick-reference-guide-to-intel-integrated-graphics/" target="_blank">der wichtigsten Grafikverbesserungen</a>, die Intel mit Sandy Bridge einführt und ein paar wirklich gute Developer-Ressourcen und Code-Beispiele – denn in den USA haben einige Programmierer bereits losgelegt und konnten mit ihren Samples den Performance-Gewinn der neuen Prozessorgeneration für Spiele(r) eindrucksvoll unter Beweis stellen.</p>
<p>Zunächst aber die Übersicht der wesentlichen Grafik- und Power-Technologien, die Sandy Bridge auf den Core-Chips bietet. Bislang habe ich diese Funktionen eher tröpfchenweise beschrieben, hier nun der Gesamtüberblick.</p>
<ul>
<li>Verbesserte Grafikleistung durch Integration von GPU und CPU auf einem einzigen Chip (Die). Per Intel Switchable Graphics können Notebook-Anwender bei sehr grafikintensiven Spielen wie FIFA 11 ohne Neustart des Computers auf die vorhandene diskrete Grafikkarte umschalten. Allerdings muss der jeweilige Rechner dieses Feature <a href="http://www.intel.com/support/graphics/sb/CS-031103.htm" target="_blank">explizit unterstützen</a>.</li>
</ul>
<ul>
<li><strong>Turbo Boost 2.0:</strong> Turbo Boost wurde von Intel für Sandy Bridge optimiert und beschleunigt serielle Anwendungen, indem sie die Taktfrequenz einzelner Kerne anhebt und damit die Geschwindigkeit um bis zu 75 Prozent steigert. Turbo Boost funktioniert auch bei der GPU und prüft automatisch, ob die Prozessorkerne oder die Grafik beschleunigt werden soll. Sie geht dabei auch bis zu 25 Sekunden lang über das TDP-Limit hinaus. So können einzelne oder alle CPU-Kerne kurzfristig um bis zu 700 MHz &#8220;übertaktet&#8221; werden.</li>
</ul>
<ul>
<li><strong>Gemeinsamer Last Level Cache:</strong> Die Grafik-Engine ist nun direkt an den Cache des Prozessors angebunden. Deswegen auch die neue Bezeichnung Last Level Cache statt L3-Cache. Der Cache steht sowohl den Kernen als auch der Grafikeinheit zur Verfügung. Die Grafikleistung profitiert dabei von einem 64-fach höheren Durchsatz als beim bisherigen Speicherzugriff.</li>
</ul>
<ul>
<li><strong>Intel QuickSync Video:</strong> Videos lassen sich deutlich schneller für mobile Geräte wie iPhone und iPad konvertieren. So zeigen Intel-interne Tests, dass mit QuickSync Video nur noch vier Minuten Konvertierungszeit für eine Minute Video anfallen. Das ist schneller als mit der schnellsten diskreten Grafikkarte, die derzeit erhältlich ist.</li>
</ul>
<ul>
<li><strong>Intel InTru 3D: </strong>Stereoskopische 3D-Blu-ray-Wiedergabe in Full HD 1080p-Auflösung über HDMI 1.4.</li>
</ul>
<ul>
<li><strong>Intel Clear-Video-HD:</strong> Qualität und Farbdarstellung bei der HD-Wiedergabe wurde nochmals deutlich verbessert.</li>
</ul>
<ul>
<li><a href="http://www.software-dev-blog.de/sandy-bridge-schnellere-apps-dank-breiteren-avx-registern/01/2011" target="_self">Advanced Vector Extensions (AVX) </a>: Neuer Befehlssatz für Video- und Bildbearbeitung, Gaming. 3D-Modellierung, wissenschaftliche Simulationen und Finanzanalysen. AVX beschleunigt die anfallenden Berechnungen mit einer Verdoppelung der Registerbreite von 128 auf 256 Bit. Hierbei wurde auf volle Komptabilität zu den bisherigen Befehlssätzen wie beispielsweise SSE4 geachtet.</li>
</ul>
<ul>
<li><strong>Intel HD Graphics 3000: </strong>Mehr 3D-Leistung für Highend-Games wie Shooter. Die dynamische Grafikfrequenz liegt bei maximal 1350 MHz. Unterstützt werden DirectX 10.1 und OpenGL 3.0.</li>
</ul>
<p>Und nun zu den Ressourcen, die Ihnen diese neuen Grafik-Technologien aus Entwicklersicht näher bringen, Code-Beispiele nennen und auch den einen oder anderen Insider-Tipp verraten:</p>
<ul>
<li><a href="http://software.intel.com/en-us/articles/intel-graphics-developers-guides/" target="_blank">Intel Integrated Graphics Performance Developer&#8217;s Guide für Intel HD Graphics:</a> Eine Leitfaden für Spiele-Entwickler, die ihren Code konsequent auf die neuen Funktionen von Sandy Bridge ausrichten möchten. Natürlich steht dabei Intel HD Graphics im Vordergrund. Es geht aber auch um den älteren Intel Graphics Media Accelerator mit Fokus auf das Thema Leistungsanalyse unter DirectX.</li>
</ul>
<ul>
<li><a href="http://software.intel.com/en-us/articles/avx-cloth/" target="_blank">AVX Cloth</a> ist ein Beispiel, das die Möglichkeiten der Vektorprogrammierung mit 256 Bit breiten Registern verdeutlicht. Dazu gibt es Screenshots, ein <a href="http://software.intel.com/en-us/videos/avx-cloth-developer-video/" target="_blank">Video</a> und natürlich den Source Code und die Binaries zum Download.</li>
</ul>
<ul>
<li><a href="http://software.intel.com/en-us/articles/onloaded-shadows/" target="_blank">Onloaded Shadows</a> ist eine Technik, mit der Shadow Maps asynchron auf der CPU berechnet werden. Erfahren Sie hier, wie Sie mit Hilfe von Cascades einen optimalen Lastenausgleich zwischen CPU und GPU herstellen.</li>
</ul>
<ul>
<li><a href="http://software.intel.com/en-us/articles/sample-tweaker-ocean-fog/" target="_blank">Sample Tweaker</a> beschreibt, wie die Grafikdemo <a href="http://software.intel.com/en-us/articles/ocean-fog-demo-page/" target="_blank">Ocean Fog</a> mit Hilfe von Intel Integrated Graphics optimiert wurde. Dabei konnte die vierfache Geschwindigkeit (von 40 FPS auf 160 FPS) gemessen werden, indem neue Technologien angewendet wurden, die beispielsweise die Texturgröße oder die Schärfe verringert haben – ohne nennenswerte Auswirkungen auf die Qualität.</li>
</ul>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/sandy-bridge-grafik-power-und-power-tools-fur-entwickler/01/2011/&via=sw_devtwits&text=Sandy Bridge: Grafik-Power und Power-Tools für Entwickler&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/sandy-bridge-grafik-power-und-power-tools-fur-entwickler/01/2011/&via=sw_devtwits&text=Sandy Bridge: Grafik-Power und Power-Tools für Entwickler&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/sandy-bridge-grafik-power-und-power-tools-fur-entwickler/01/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ausblick auf die CES, Sandy Bridge und zwei nützliche Tools</title>
		<link>http://www.software-dev-blog.de/ausblick-auf-die-ces-sandy-bridge-und-zwei-nutzliche-tools/01/2011/</link>
		<comments>http://www.software-dev-blog.de/ausblick-auf-die-ces-sandy-bridge-und-zwei-nutzliche-tools/01/2011/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 09:23:43 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Visual Computing]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Konferenz]]></category>
		<category><![CDATA[Nehalem]]></category>
		<category><![CDATA[Optimieren]]></category>
		<category><![CDATA[Preview]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1448</guid>
		<description><![CDATA[Keine Ahnung, wie viele Menschen Ihnen in den letzten Tagen „Ein gutes neues Jahr!“ gewünscht haben. Aber vermutlich waren es viele, und ganz sicher werden sie Recht behalten. Denn das Jahr 2011 wird für Parallel-Programmierer und Spiele-Entwickler Maßstäbe setzen! In wenigen Tagen wird Intel während der CES in Las Vegas die neue Prozessorgeneration Sandy Bridge [...]]]></description>
			<content:encoded><![CDATA[<p>Keine Ahnung, wie viele Menschen Ihnen in den letzten Tagen „Ein gutes neues Jahr!“ gewünscht haben. Aber vermutlich waren es viele, und ganz sicher werden sie Recht behalten. Denn das Jahr 2011 wird für Parallel-Programmierer und Spiele-Entwickler Maßstäbe setzen!</p>
<p>In wenigen Tagen wird Intel während der <a href="http://www.cesweb.org/" target="_blank">CES in Las Vegas</a> die <strong>neue Prozessorgeneration Sandy Bridge</strong> offiziell vorstellen. Vor Ort werden dann auch gleich ein paar Hardware-Hersteller erste Notebooks mit den neuen Recheneinheiten zeigen.</p>
<p>Die Prozessor-Architektur von Sandy Bridge wird vor allem in puncto Multimedia-Performance alle Vorgänger der Nehalem-Bauweise in den Schatten stellen. Sandy Bridge integriert den Grafikkern (GPU) in die CPU bei einer Strukturbreite von 32 Nanometern. Dank der integrierten Encoding-Einheit lassen sich Videos wesentlich schneller konvertieren als beispielsweise mit bekannten Core-i5-Prozessoren.</p>
<p>Die technologischen Neuerungen von Sandy Bridge und die daraus resultierenden, erweiterten Möglichkeiten für Parallel-Computing sind Anlass genug, dieses Blog wiederzubeleben. Ich werde Sie ab sofort regelmäßig mit News, technischem Background und Veranstaltungshinweisen versorgen, die Ihnen den Programmieralltag etwa erleichtern.</p>
<p>Zunächst aber darf ich Ihnen zwei neue, sehr nützlich Tools empfehlen, die Intel im Rahmen der Partnerprogramme veröffentlich hat und vor allem Entwickler von Media- und Videoanwendungen adressieren.</p>
<p>Das <a href="http://software.intel.com/en-us/articles/media/?CID=ISPP:106BL106ENG1363" target="_blank">Intel Media Software Development Kit in der Version 1.5</a> ist ein plattformübergreifendes SDK, das Ihnen hilft, auf einfache Weise leistungsstarke und schnelle Videoanwendungen zu entwickeln.  Das Tool-Paket bietet Ihnen drei Highlights:</p>
<ul>
<li>Codecs für Hardwarebeschleunigung: Sie greifen auf Video-Codecs zu, die für Intel Multicore-Prozessoren und Intel HD Graphics optimiert wurden und bestmögliche Performance bieten</li>
<li>Einheitliches API für unterschiedliche Plattformen: Weniger Code und weniger Komplexität durch ein universelles API, das viele PC-Plattformen unterstützt, darunter selbstverständlich auch die zukunftsträchtigen Intel Graphics- und Multicore-Architekturen.</li>
<li>Support und Add-Ons: Schneller optimale Ergebnisse erzielen dank nützlicher Features wie Video-Pre-Processing, Decodieren und Encodieren</li>
</ul>
<p>Sie können das <a href="http://software.intel.com/en-us/articles/media/?CID=ISPP:106BL106ENG1363" target="_blank">Media Software Development Kit kostenlos laden und installieren</a>. Sinnvoll ergänzt wird das SDK durch das <a href="http://swpartner.intel.com/Partner/Initiatives/SATCenter.aspx?Lang=ENG" target="_blank">Intel Media Checker Software Assessment Tool</a>. Zugegeben, eine grauenhafte Bezeichnung, aber das Tool ist überaus nützlich. Denn damit stellen Sie beispielsweise sicher, dass Sie das SDK korrekt in die Anwendungen einbinden. Zudem fungiert es als Tutorial, indem es die Funktionen und Technologien des SDK erläutert. Also für die ersten Schritte mit dem SDK sicherlich genau richtig. Und kostenlos ist es natürlich auch. Viel Erfolg damit!</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/ausblick-auf-die-ces-sandy-bridge-und-zwei-nutzliche-tools/01/2011/&via=sw_devtwits&text=Ausblick auf die CES, Sandy Bridge und zwei nützliche Tools&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/ausblick-auf-die-ces-sandy-bridge-und-zwei-nutzliche-tools/01/2011/&via=sw_devtwits&text=Ausblick auf die CES, Sandy Bridge und zwei nützliche Tools&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/ausblick-auf-die-ces-sandy-bridge-und-zwei-nutzliche-tools/01/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multicore-Guide, Teil 2 ist verfügbar</title>
		<link>http://www.software-dev-blog.de/multicore-guide-teil-2-ist-verfugbar/04/2010/</link>
		<comments>http://www.software-dev-blog.de/multicore-guide-teil-2-ist-verfugbar/04/2010/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 13:09:05 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Optimieren]]></category>
		<category><![CDATA[Referenz]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1365</guid>
		<description><![CDATA[Mitte März hatte ich über eine ausführliche Sammlung gebloggt, in der es sehr ausführlich um das Thema Multicore-Programmierung geht. Und jetzt habe ich dazu passend eine E-Mail des Intel-Service &#8220;Software Dispatch&#8221; erhalten. Diese Mail verweist nämlich auf den zweiten Teil des großen Multicore-Guides. Darin geht es auf gut 50 Seiten unter anderem um folgende Dinge: [...]]]></description>
			<content:encoded><![CDATA[<p>Mitte März hatte ich <a href="http://www.software-dev-blog.de/ausfuhrliche-ubersicht-zur-multicore-programmierung/03/2010/">über eine ausführliche Sammlung gebloggt</a>, in der es sehr ausführlich um das Thema Multicore-Programmierung geht. Und jetzt habe ich dazu passend eine E-Mail des Intel-Service &#8220;Software Dispatch&#8221; erhalten. Diese Mail verweist nämlich auf den zweiten Teil des großen Multicore-Guides. Darin geht es auf gut 50 Seiten unter anderem um folgende Dinge:</p>
<ul>
<li>das richtige Speicher-Management beim Threaden von Anwendungen</li>
</ul>
<p>und</p>
<ul>
<li>der richtige Einsatz der bestehenden Intel-Tools wie <a title="Intel Integrated Performance Primitives" href="http://www.software-dev-blog.de/parallel-bibliotheken-helfen-bei-der-software-entwicklung/02/2009/">Integrated Performance Primitives</a> und <a title="Parallel Inspector" href="http://www.software-dev-blog.de/multicore-turbo-fur-visual-studio-intel-parallel-studio/10/2008/">Parallel Inspector</a>, <a title="Parallel Amplifier" href="http://www.software-dev-blog.de/isc’09-intel-parallel-amplifier-im-detail/04/2009/">Parallel Amplifier</a> und <a title="Parallel Composer" href="http://www.software-dev-blog.de/serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/">Parallel Composer</a>.</li>
</ul>
<p>Toll an diesem Programmier-Leitfaden ist die sehr ausführlich Darstellung möglicher Szenarien und wie sich diese richtig behandeln lassen. Dazu gibt es eine Menge nützlicher Diagramme und Code-Beispiele.</p>
<p>Allerdings hat Intel vor den Download dieser digitalen Broschüre <a href="http://softwaredispatch.intel.com/m/p/int/isd/source_dreg.asp?email=" target="_blank">eine kleine Registrierung</a> gestellt, die aber nur aus einem Namen und einer E-Mail-Adresse besteht. Anschließend könnt ihr sogar auswählen, welche Themen und Broschüren euch besonders interessieren. Im Falle der Multithreading-Anleitungen solltet ihr &#8220;Intel Software Dispatch&#8221; anklicken. Viel Spaß beim Lesen!</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-guide-teil-2-ist-verfugbar/04/2010/&via=sw_devtwits&text=Multicore-Guide, Teil 2 ist 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/multicore-guide-teil-2-ist-verfugbar/04/2010/&via=sw_devtwits&text=Multicore-Guide, Teil 2 ist 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/multicore-guide-teil-2-ist-verfugbar/04/2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aus seriell mach parallel: Intel Parallel Advisor Lite</title>
		<link>http://www.software-dev-blog.de/aus-seriell-mach-parallel-intel-parallel-advisor-lite/03/2010/</link>
		<comments>http://www.software-dev-blog.de/aus-seriell-mach-parallel-intel-parallel-advisor-lite/03/2010/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 12:38:50 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Optimieren]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1336</guid>
		<description><![CDATA[Kollege Preiss von Intel hat mal wieder fleißig geschrieben, und rausgekommen ist ein gedruckter Beitrag in der Elektronik Industrie, den es aber natürlich auch als PDF zum kostenlosen Download gibt. Thema des Artikels: Intel Parallel Advisor Lite, ein ziemlich mächtiges Tool zum Konvertieren von seriellem in parallelen Code. Der Advisor Lite ist übrigens Teil der [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.software-dev-blog.de/gdc09-so-funktioniert-intel-parallel-studio/08/2009/">Kollege Preiss</a> von Intel hat <a href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">mal</a> <a href="http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/">wieder</a> fleißig geschrieben, und rausgekommen ist ein gedruckter Beitrag in der <em>Elektronik Industrie</em>, den es aber natürlich auch <a href="http://www.elektronik-industrie.de/ae/article/42006-Consulting-Entwicklungswerkzeug+für+parallele+Anwendungen?PHPSESSID=34d037602581dd4e999a6517b3f93fff">als PDF zum kostenlosen Download</a> gibt. Thema des Artikels: <a href="http://www.software-dev-blog.de/parallel-studio-das-leistet-der-parallel-advisor-lite/05/2009/">Intel Parallel Advisor Lite</a>, ein ziemlich mächtiges Tool zum Konvertieren von seriellem in parallelen Code. Der Advisor Lite ist übrigens Teil der Intel-Suite <a href="http://www.software-dev-blog.de/happy-birthday-parallel-studio/05/2009/">Parallel Studio</a>, ein Plug-In für Visual Studio 2005 und 2008.</p>
<p>In dem ausführlichen Beitrag wird gezeigt, wie das Intel-Tool dabei helfen kann, serielle Codeabschnitte zu parallelisieren. Ach ja: Das betrifft ausschließlich C++-Programmierer. Toll an Advisor Lite ist sein schrittweises Herantasten an den möglichen Multithread-Code: Anstatt alles auf einmal umzustellen, erlaubt das Tool ein sukzessives Optimieren des seriellen Quellcodes. Hierzu setzt es vorhandene Debugger-Tools ein, mit denen der parallelisierte Quellcode sofort getestet und mögliche Fehler identifiziert und eliminiert werden können. Dazu zählen unter anderem Data-Sharing-Probleme, die sich beim Synchronisieren von Threads ergeben können.</p>
<p>Interessant an Edmunds Artikel ist übrigens die Vorgehensweise des Advisor Lite:</p>
<ol>
<li>Leistungsengpässe (Hotspots) identifizieren</li>
<li>Annotationen in den seriellen Quellcode einfügen (eine Art von C-/C++-Makros)</li>
<li>die  annotierten Quellcodes verifizieren</li>
<li>parallele Datenzugriffe untersuchen</li>
<li>Datenkonflikte auflösen, die unter Schritt 4 aufgespürt wurden</li>
<li>Quellcodeänderungen testen</li>
</ol>
<p>Ach ja: Wer noch nicht wissen sollte, was Annotationen sind: Sogar hierzu hält Edmund die passenden Antworten parat. Also alles in allem eine wirklich gelungene Abhandlung in Sachen Parallel Advisor Lite. <a title="Hier gibt's den Artikel als PDF" href="http://www.elektronik-industrie.de/ae/article/42006-Consulting-Entwicklungswerkzeug+f%C3%BCr+parallele+Anwendungen?PHPSESSID=34d037602581dd4e999a6517b3f93fff" target="_blank">Und, worauf wartet ihr noch?</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/aus-seriell-mach-parallel-intel-parallel-advisor-lite/03/2010/&via=sw_devtwits&text=Aus seriell mach parallel: Intel Parallel Advisor Lite&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/aus-seriell-mach-parallel-intel-parallel-advisor-lite/03/2010/&via=sw_devtwits&text=Aus seriell mach parallel: Intel Parallel Advisor Lite&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/aus-seriell-mach-parallel-intel-parallel-advisor-lite/03/2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Videosessions: TechTalks mit Intel und Microsoft</title>
		<link>http://www.software-dev-blog.de/videosessions-techtalks-mit-intel-und-microsoft/07/2009/</link>
		<comments>http://www.software-dev-blog.de/videosessions-techtalks-mit-intel-und-microsoft/07/2009/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 15:54:41 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1106</guid>
		<description><![CDATA[Der Juni 2009 stand bei Intel und Microsoft ganz im Zeichen der parallelen Programmierung (woran sich im Juli natürlich nichts geändert hat). Daher fanden zu diversen Terminen in diversen Städten sogenannte TechTalks statt, die erfahrungsgemäß immer sehr gut besucht sind. Ich war auf der Veranstaltung in München und konnte mich selbst davon überzeugen: der Raum [...]]]></description>
			<content:encoded><![CDATA[<p>Der Juni 2009 stand bei Intel und Microsoft <a title="TechTalks mit Intel und Microsoft im Juni 2009" href="http://www.software-dev-blog.de/event-preview-parallel-tech-talk-und-gamecamp-in-munchen/06/2009/">ganz im Zeichen der parallelen Programmierung</a> (woran sich im Juli natürlich nichts geändert hat). Daher fanden zu diversen Terminen in diversen Städten sogenannte TechTalks statt, die erfahrungsgemäß immer sehr gut besucht sind.</p>
<p>Ich war auf der Veranstaltung in München und konnte mich selbst davon überzeugen: der Raum war proppenvoll, da das Thema wohl für viele sehr spannend ist. Der Bedarf nach mehr Wissen zum Thema Parallelprogrammierung ist sehr groß, und mindestens genauso groß sind die Lücken, die sich dazu bei vielen Entwicklern auftun.</p>
<p>Nun, diese Defizite konnten Intel und Microsoft hoffentlich ein wenig beheben. Und wer selbst nicht die Gelegenheit hatte, sich vor Ort ein eigenes Bild davon zu machen, was es mit der parallelen Programmierung auf sich hat, dem seien die <a title="Drei Videoclips zum Thema Parallels Programmieren" href="http://www.microsoft.com/germany/msdn/techtalk/videos/library.aspx?id=msdn_de_33301" target="_blank">drei Videoclips</a> empfohlen, die Microsoft online gestellt hat.</p>
<p>Allerdings sollte man sich viel Zeit nehmen, denn die Videokollektion umfasst mehr als drei Stunden Anschauungsmaterial zu diversen Themen:</p>
<ul>
<li>Warum wird Parallel Computing immer wichtiger?</li>
</ul>
<ul>
<li>Was genau verbirgt sich hinter <a title="Happy Birthday, Parallel Studio!" href="http://www.software-dev-blog.de/happy-birthday-parallel-studio/05/2009/">Parallel Studio</a>?</li>
</ul>
<ul>
<li>Was kommt alles auf Entwickler mit <a title="Interview: Was Visual Studio 2010 und .NET 4 alles können werden" href="http://www.software-dev-blog.de/interview-visual-studio-2010-und-seine-multicore-fahigkeiten/02/2009/">Visual Studio 2010 und .NET 4</a> zu?</li>
</ul>
<ul>
<li>Wer braucht <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>
<p>Deshalb: Popcorn und Coke bereitstellen, Füße hochlegen und Videos gucken. Und zwar welche der lehrreichen Sorte, Powerpoint-Folien inklusive.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/videosessions-techtalks-mit-intel-und-microsoft/07/2009/&via=sw_devtwits&text=Videosessions: TechTalks mit Intel und Microsoft&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/videosessions-techtalks-mit-intel-und-microsoft/07/2009/&via=sw_devtwits&text=Videosessions: TechTalks mit Intel und Microsoft&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/videosessions-techtalks-mit-intel-und-microsoft/07/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screencasts zur Parallelen Programmierung unter .NET 4</title>
		<link>http://www.software-dev-blog.de/screencasts-zur-parallelen-programmierung-unter-net-4/06/2009/</link>
		<comments>http://www.software-dev-blog.de/screencasts-zur-parallelen-programmierung-unter-net-4/06/2009/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 14:39:17 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1080</guid>
		<description><![CDATA[Auf Channel 9 habe ich gerade drei sehr interessante Screencasts entdeckt, die Dariusz Parys dort eingestellt hat. Anhand sehr anschaulicher Beispiele zeigt Dariusz folgende Dinge: Task Parallel Library: Tasks In diesem Screencast geht es vor allem um eine Kernaussage: Vergesst Threads und denkt ab sofort in Tasks, also in einer abstrahierten Form von Threads. Warum [...]]]></description>
			<content:encoded><![CDATA[<p>Auf <a title="Channel 9, das Videoiportal von MSDN" href="http://channel9.msdn.com/" target="_blank">Channel 9</a> habe ich gerade drei sehr interessante Screencasts entdeckt, die <a title=" Interview: Visual Studio 2010 und seine Multicore-Fähigkeiten " href="http://www.software-dev-blog.de/interview-visual-studio-2010-und-seine-multicore-fahigkeiten/02/2009/">Dariusz Parys</a> dort eingestellt hat. Anhand sehr anschaulicher Beispiele zeigt Dariusz folgende Dinge:</p>
<div class="title">
<p><strong><a id="ctl00_MainPlaceHolder_Starter_TitleLink" href="http://channel9.msdn.com/posts/Dariusz/Task-Parallel-Library-Tasks/">Task Parallel Library: Tasks</a></strong></p>
<p>In diesem Screencast geht es vor allem um eine Kernaussage: Vergesst Threads und denkt ab sofort in Tasks, also in einer abstrahierten Form von Threads. Warum das so ist und welche Mechanismen der Threadpool des .NET-4-Frameworks hierfür bereithält, lernt ihr in dem Sechsminüter.</p>
<div class="title">
<p><strong><a id="ctl00_MainPlaceHolder_Starter_TitleLink" href="http://channel9.msdn.com/posts/Dariusz/Task-Parallel-Library-Task-Continuations/">Task Parallel Library: Task Continuations</a></strong></p>
<p>Dieser Screencast behandelt die Frage, wie sich einzelne Aufgaben (Tasks) mithilfe der Task-Klasse verketten lassen, um weitere Ereignisse möglichst einfach zu parallelisieren. Dies geschieht mithilfe des Aufrufs <em><strong>task.ContinueWith()</strong></em>.</p>
<div class="title">
<p><strong><a id="ctl00_MainPlaceHolder_Starter_TitleLink" href="http://channel9.msdn.com/posts/Dariusz/Task-Parallel-Library-Exception-Handling/">Task Parallel Library: Exception Handling</a></strong></p>
<p>In diesem Screencast geht es um die Fehlerbehandlung innerhalb von Tasks. Hierzu gibt es die Möglichkeit, per <em><strong>AggregateException</strong></em> mögliche Fehler zur Laufzeit abzufangen.</p>
<p>Ihr seht also: drei gute Gründe, euch die Screencasts anzusehen. Viel Spaß dabei!</p></div>
</div>
</div>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/screencasts-zur-parallelen-programmierung-unter-net-4/06/2009/&via=sw_devtwits&text=Screencasts zur Parallelen Programmierung unter .NET 4&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/screencasts-zur-parallelen-programmierung-unter-net-4/06/2009/&via=sw_devtwits&text=Screencasts zur Parallelen Programmierung unter .NET 4&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/screencasts-zur-parallelen-programmierung-unter-net-4/06/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshops und Tutorials für Parallelprogrammierer</title>
		<link>http://www.software-dev-blog.de/workshops-und-tutorials-fur-parallelprogrammierer/05/2009/</link>
		<comments>http://www.software-dev-blog.de/workshops-und-tutorials-fur-parallelprogrammierer/05/2009/#comments</comments>
		<pubDate>Wed, 06 May 2009 09:50:01 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Inside]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1037</guid>
		<description><![CDATA[Was mir als Software-Dev-Blogger wirklich am Herzen liegt, ist ein möglichst hoher Nutzwert, den meine Blog-Beiträge bieten sollen. Daher haben sich im Laufe der letzten gut sechs Monate einige Workshops und Tutorials angesammelt, die zeigen, wie die parallele Programmierung vonstattengeht. Und damit diese Tipps und Tricks nicht in Vergessenheit geraten, folgt jetzt die ultimative Tutorial-Sammelliste: [...]]]></description>
			<content:encoded><![CDATA[<p>Was mir als Software-Dev-Blogger wirklich am Herzen liegt, ist ein möglichst hoher Nutzwert, den meine Blog-Beiträge bieten sollen. Daher haben sich im Laufe der letzten gut sechs Monate einige Workshops und Tutorials angesammelt, die zeigen, wie die parallele Programmierung vonstattengeht. Und damit diese Tipps und Tricks nicht in Vergessenheit geraten, folgt jetzt die ultimative Tutorial-Sammelliste:</p>
<p>&gt;&gt; Los ging es mit den bekannten <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/">Multithreading-Konzepten OpenMP, APIs und Intel Threading Building Blocks</a> und der Frage, welche der drei Methoden sich zum Threaden am besten eignet.</p>
<p>&gt;&gt; Dann folgten <a title="Fünf Multicore-Programmierregeln auf einen Blick " href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">fünf Multicore-Programmierregeln</a>, die zeigen sollen, mit welchen Anforderungen Programmierer und Software-Entwickler konfrontiert werden, wenn sie sequenziellen Code in parallele Anwendungen überführen wollen. Ich sage nur: Denke parallel!</p>
<p>&gt;&gt; Ein wichtiges, weil fundamentales Konzept der Multicore-Programmierung ist der Unterschied zwischen <a title="Programmiermethoden: Daten- und Aufgabenparallelität " href="http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/">Daten- und Aufgabenparallelität</a>. Diesen zu verstehen ist die erste Programmiererpflicht, wenn es darum geht, skalierbare Multithread-Anwendungen zu erstellen.</p>
<p>&gt;&gt; Wie viele Schritte muss man gehen, um aus seriellem Quellcode parallel ablaufenden zu machen? Genau vier. Rein abstrakt betrachtet zumindest. Auch hierfür habe ich den <a title="Vier Schritte zum optimierten Multicore-Quellcode " href="http://www.software-dev-blog.de/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/">passenden Workshop</a> parat, der die vier Stufen der Parallelprogrammierung genauer beleuchtet.</p>
<p>&gt;&gt; Was aber, wenn ich zwar weiß, wie ich parallel programmieren soll, ich aber keinen Schimmer davon habe, welche Stolperfallen dabei auf mich warten? Da heißt es dann meinen Beitrag lesen, <a title="Beliebte Fehler bei der Parallelprogrammierung" href="http://www.software-dev-blog.de/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/">welche Fehler bei der Parallelprogrammierung</a> der Entwicklergemeinde drohen und wie sich diese (die Fehler, nicht die Entwickler) umgehen lassen.</p>
<p><span id="more-1037"></span>&gt;&gt; Von OpenMP war hier zwar schon mal die Rede, aber nur ganz oberflächlich. Wie gut, dass der Kollege Preiss einen kompletten Artikel zu dem Thema verfasst hat, den ich freundlicherweise aufgreifen und in Teilen online stellen durfte. Das Ergebnis: der Workshop <a title="Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">&#8220;Parallel Programmieren mit OpenMP&#8221;</a>. Sehr anschaulich, sehr lehrreich, sehr beispielhaft.</p>
<p>&gt;&gt; Was ist eigentlich ein Threadmodus und welche Zustände kann dieser annehmen? Mit dieser Frage <a title="Mögliche Thread-Modi und deren Folgen" href="http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/">beschäftigt sich ein Workshop</a>, den ich Ende Februar veröffentlicht habe. Nur mal so vorab: Bereit, Wartend, Beendet.</p>
<p>&gt;&gt; Von der <a title="OOP 2009" href="http://www.software-dev-blog.de/multicore-programmierung-auf-der-oop-2009/01/2009/">OOP 2009</a> und dem <a title="Multicore-Programmierung im .NET-Umfeld" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">Vortrag Klaus Bodes von Microsoft</a> inspiriert, wagte ich mich Anfang März an einen Vierteiler, der den Titel &#8220;&#8221;Alles über .NET-Threads&#8221; trägt. Genauer gesagt: Unter .NET 4. Im ersten Teil geht es um das <a title="Das Erzeugen von Threads" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Erzeugen von Threads</a>, der zweite beschäftigt sich mit der <a title="Thread-Verwaltung unter .NET 4.0" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Thread-Verwaltung</a>, der dritte steht ganz im Zeichen von <a title="Threadpools" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/">Threadpools</a> und der vierte handelt vom <a title="Synchronisierung mehrerer Threads und atomare Aktionen" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/">Synchronisieren mehrerer Threads und atomarer Aktionen</a>.</p>
<p>Dann folgten Mitte April zwei weitere, detaillierte Workshops zum Thema OpenMP: <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/">fünf Bedingungen für parallele Schleifen</a> und <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/">Schleifen anpassen für Multithreading-Ausführung</a>. Beide Tutorials sind randvoll mit nützlichen Infos und praktischen Tipps. Eben ganz nach meinem Geschmack &#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/workshops-und-tutorials-fur-parallelprogrammierer/05/2009/&via=sw_devtwits&text=Workshops und Tutorials für Parallelprogrammierer&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/workshops-und-tutorials-fur-parallelprogrammierer/05/2009/&via=sw_devtwits&text=Workshops und Tutorials für Parallelprogrammierer&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/workshops-und-tutorials-fur-parallelprogrammierer/05/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: Alles über .NET-Threads &#8211; Teil 4</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 17:06:09 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=958</guid>
		<description><![CDATA[Eine neue Woche beginnt, und im selben Atemzug endet meine vierteilige Serie zum Thema .NET-Threads. So habe ich im ersten Kapitel über das Erzeugen von Threads geschrieben, im zweiten Teil mich über das Verwalten derselben ausgelassen, und am letzten Donnerstag war der ThreadPool und dessen Möglichkeiten dran. Und heute?! Nun, heute geht es um die [...]]]></description>
			<content:encoded><![CDATA[<p>Eine neue Woche beginnt, und im selben Atemzug endet meine vierteilige Serie zum Thema .NET-Threads. So habe ich <a title="Teil eins der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">im ersten Kapitel</a> über das Erzeugen von Threads geschrieben, <a title="Teil zwei der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">im zweiten Teil</a> mich über das Verwalten derselben ausgelassen, und am letzten Donnerstag war der <a title="Teil drei der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/">ThreadPool</a> und dessen Möglichkeiten dran. Und heute?! Nun, heute geht es um die Synchronisierung mehrerer Threads und atomare Aktionen.</p>
<p>Zunächst einmal kann man festhalten, dass die Thread-Synchronisierung im .NET-Framework ähnlich funktioniert wie im Win32- oder Pthreads-Umfeld. Es geht also um den gegenseitigen Ausschluss sowie um atomare Aktionen auf spezielle Variablen. Wie bei der von C# bekannten Methode <em><strong>lock</strong></em> wird ein Codeabschnitt mithilfe der geschweiften Klammern geblockt, sodass zu dieser Zeit nur ein einziger Thread darauf zugreifen kann. Hierfür bietet das .NET-Framework eine ähnliche Konstrukte:</p>
<p><em><strong>Monitor.Enter ( this )<br />
try<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230;. </span>shared_var = other_shared_var +1;<br />
<span style="color: #ffffff;">&#8230;&#8230;. </span>other_shared_var = 0;<br />
}<br />
finally<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230; </span> Monitor.Exit ( this )<br />
}</strong></em></p>
<p>Mit der Klasse <em><strong>Monitor</strong></em> wird der entsprechende Codeabschnitt blockiert. Mit <em><strong>Enter()</strong></em> wird der Abschnitt gesperrt und mit <em><strong>Exit()</strong></em> wieder freigegeben. Praktisch an Monitor ist auch dessen Möglichkeit, Datenstrukturen als Parameter zu übergeben.</p>
<p>Bei Monitor.Enter() geschehen übrigens zwei Dinge: Erstens wird eine Warteschlange eingerichtet, die auf diejenigen Threads verweist, die gesperrt werden sollen und eine zweite Queue mit Threads, die darüber informiert werden wollen, wenn eine Speere verfügbar ist. <em><strong>Monitor.Exit()</strong></em> sorgt dafür, dass der erste verfügbare Thread in Warteschlange #1 gesperrt wird.</p>
<p><span id="more-958"></span>Darüber hinaus hält die Klasse Monitor eine weitere Methode bereit: So lässt sich mit <em><strong>Monitor.Wait()</strong></em> die Sperre eines Threads auf einen anderen Thread übertragen, um die Sperre später wieder zurückzuverlangen. Ein Impuls benachrichtigt hierbei den ursprünglichen Thread darüber, dass die Sperre wieder aufgehoben wurde.</p>
<p>Neben den Monitor-Methoden lassen sich unter .NET auch Mutexe für das Sperren und Freigeben von Threads verwenden. Im Gegensatz zu der Monitor-Klasse werden Mutexe in Verbindung mit Handles eingesetzt und können zudem zudem für mehrere Sperren eingesetzt werden, die dann natürlich genauso oft wieder freigegeben werden.</p>
<p><em><strong>private static Mutex mutx = new Mutex();<br />
&#8230;</strong></em></p>
<p><em><strong>private static void UseResource()<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>//Warten, um in den Sperrcode einzutreten<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>mutx.WaitOne();</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Console.WriteLine( &#8221; im gesperrten Modus &#8220;);</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Thread.Sleep( 100 ); // 100 Millisekunden warten</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Console.WriteLine( &#8221; den gesperrten Modus wieder verlassen &#8220;);</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>// Mutex wieder freigeben<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>mutx.ReleaseMutex();</strong></em></p>
<p><em><strong>}</strong></em></p>
<p><strong>Atomare Aktionen</strong><br />
Unter atomaren Aktionen versteht man landläufig unteilbare Maschinenanweisungen, wie sie beispielsweise für Datenbankoperationen eingesetzt werden. Dabei ist es von essenzieller Wichtigkeit, dass mehrere dieser Teilschritte zurückgenommen werden können, falls der gesamte Schritt nicht beendet werden kann. Bei Threads verhält es sich ganz ähnlich: Variablen werden verändert und gleichzeitig geht beim Programmablauf etwas schief. Die Folge: Das System ist im schlimmsten Fall beschädigt oder Daten korrupt.</p>
<p>Um so etwas auszuschließen, hat Microsoft in das .NET-Framework die Klasse <strong><em>Interlock</em></strong> eingebaut, die drei wesentliche Methoden vorsieht: <em><strong>Decrement</strong></em>, <em><strong>Increment</strong></em> und <em><strong>Exchange</strong></em>. Diese sollten vor allem dann eingesetzt werden, wenn eine bestimmte Variable von mehreren Threads parallel genutzt wird:</p>
<p><em><strong>int intCounter = 0;<br />
&#8230;</strong></em></p>
<p><em><strong>Interlocked.Exchange( ref usingResource, 6 ); // Setze den Wert von intCounter auf 6</strong></em></p>
<p><em><strong>Interloced.Decrement( ref intCounter ); // Reduziere den Wert von intCounter auf 5</strong></em></p>
<p><em><strong>Interlocked.Increment( ref intCounter ); // Erhöhe den Wert von intCounter wieder auf 6</strong></em></p>
<p>Beachtenswert ist die Tatsache, dass mit Increment und Decrement nicht die Variable selbst, sondern nur der Verweis darauf verändert wird (da es sich dank des Zusatzes <em><strong>ref</strong></em> um eine Art Zeiger handelt). Und Exchange ändert nicht die Werte, sondern initialisiert lediglich einen Wert mit einem anderen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 4&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/workshop-alles-uber-net-threads-teil-4/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 4&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/workshop-alles-uber-net-threads-teil-4/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 3</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 14:03:42 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=957</guid>
		<description><![CDATA[Teil eins und Teil zwei meines Minispecials zum Thema .NET-Threads stehen bereits online, und heute folgt sehr chronologisch der dritte Abschnitt. Dieser handelt von den Thread-Pools, mit deren Hilfe eine größere Anzahl von notwendigen Threads mithilfe des .NET-Frameworks verwaltet werden können. Zunächst einmal sollte man sich klar machen, dass das Erzeugen und Verwalten von .NET-Threads [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Workshop: Alles über .NET-Threads - Teil 1" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Teil eins</a> und <a title="Workshop: Alles über .NET-Threads - Teil 2" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Teil zwei</a> meines Minispecials zum Thema .NET-Threads stehen bereits online, und heute folgt sehr chronologisch der dritte Abschnitt. Dieser handelt von den <strong>Thread-Pools</strong>, mit deren Hilfe eine größere Anzahl von notwendigen Threads mithilfe des .NET-Frameworks verwaltet werden können.</p>
<p>Zunächst einmal sollte man sich klar machen, dass das <a title="Das Erzeugen von Threads" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Erzeugen</a> und <a title="Das Verwalten von .NET-Threads" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Verwalten</a> von .NET-Threads mit einem immensen administrativen Aufwand verbunden ist: Lokaler Thread-Speicher muss angelegt und die Systemstrukturen für die Thread-Verwaltung müssen eingerichtet werden. Darüber hinaus nimmt die Komplexität des Quellcodes deutlich zu, sobald mehrere Threads mit Bordmitteln verwaltet werden sollen.</p>
<p>Aus diesem Grund hat Microsoft dem .NET-Framework ein Ressource spendiert, die sich <em><strong>ThreadPool</strong></em> nennt. Dabei wird zunächst eine bestimmte Anzahl von Threads generiert, außerdem wird eine Art Arbeitswarteschlange erstellt. Sobald eine auszuführende Aufgabe in diese Warteschlange befördert wird, wird ein Thread für diesen Task aktiviert und ihm die Aufgabe zugewiesen. Dies erledigt das .NET-Framework automatisch. Allerdings ist dabei zu beachten, dass der ThreadPool nur dann sinnvoll eingesetzt werden kann, wenn ein Programm aus mehreren Threads besteht, die immer wieder benötigt werden.</p>
<p><span id="more-957"></span>Der Pool wird mithilfe der Anweisung <em><strong>ThreadPool.QueueUserWorkItem (new WaitCallback ( DELEGAT ) )</strong></em> erzeugt, sobald die erste Aufgabe an die Warteschlange übergeben wird. Die Anzahl der im Pool erzeugbaren Threads ist unter .NET auf 25 pro Hardware-Prozessor begrenzt. Allerdings kann man mithilfe der Methoden <em><strong>GetMinThreads()</strong></em> und <em><strong>SetMinThreads()</strong></em> die minimale Anzahl von Threads abfragen bzw. erzwingen. Mit <em><strong>GetMaxThreads()</strong></em> lässt sich die maximale Anzahl von Threads bestimmen.</p>
<p>Mit den ThreadPools in .NET lassen sich aber nicht nur Aufgaben parallel ausführen, sondern auch asynchrones Warten erzwingen. So kann beispielsweise auf einen Datenanfrage innerhalb des Netzwerks reagiert werden. Hierfür ist eine sogenannte Callback-Funktion erforderlich, die beim Eintreten eines zu erwartenden Ereignisses aufgerufen wird. Eine dieser Funktionen nennt sich <em><strong>RegisterWaitForSingleObjekct()</strong></em>, die die Angabe einer maximalen Wartezeit erlaubt. Die Callback-Funktion wird aufgerufen, wenn das Ereignis eintritt oder die definierte Wartezeit abgelaufen ist.</p>
<p>Aber nicht nur einzelne Ereignisse können Threads starten, sondern auch eine ganze Reihe davon. Hierfür existieren die Methoden <em><strong>WaitHandle.WaitAll()</strong></em> und <em><strong>WaitHandle.WaitAny()</strong></em>, die ausgeführt werden, wenn alle Ereignisse oder irgendein Ereignis eintreten. Zudem lassen sich diese manuell mithilfe der Methode <em><strong>ManualResetEvent()</strong></em> zurücksetzen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 3&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/workshop-alles-uber-net-threads-teil-3/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 3&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/workshop-alles-uber-net-threads-teil-3/03/2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 2</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:10:53 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=956</guid>
		<description><![CDATA[Meine kleine .NET-Serie zum Thema Threads geht heute in die zweite Runde. Nachdem es gestern um das Erzeugen von Threads ging, handelt Teil zwei von der Thread-Verwaltung. Dabei unterscheidet man zwischen Beenden, Warten, Anhalten und Fortsetzen. Beenden von Threads: Dies geschieht am einfachsten, indem ein Thread ganz regulär während des Programmablaufs verlassen wird und die [...]]]></description>
			<content:encoded><![CDATA[<p>Meine kleine .NET-Serie zum Thema Threads geht heute in die zweite Runde. Nachdem es gestern um das <a title="Teil 1 der Miniserie &quot;Alles über .NET-Threads&quot; und deren Erzeugung" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Erzeugen von Threads</a> ging, handelt Teil zwei von der <strong>Thread-Verwaltung</strong>. Dabei unterscheidet man zwischen Beenden, Warten, Anhalten und Fortsetzen.</p>
<p><strong>Beenden von Threads:</strong> Dies geschieht am einfachsten, indem ein Thread ganz regulär während des Programmablaufs verlassen wird und die Anwendung wieder zum Masterthread zurückkehrt. Dies gibt der Common Language Runtime (CLR) die Möglichkeit, die notwendigen Aufräumarbeiten durchzuführen. Allerdings muss manchmal ein anderer als der gerade laufende Thread beendet werden. Daher hat Microsoft den .NET-Thread-APIs eine Methode spendiert, die sich <em><strong>Abort()</strong></em> nennt, mit deren Hilfe ein laufender Thread abgebrochen werden kann. Beim Aufruf von Abort() wird automatisch eine ThreadAbortException ausgelöst.</p>
<p>Der Aufruf von Abort() zieht übrigens eine Reihe verschiedener Dinge nach sich. Dazu gehört die Fähigkeit des Threads, den eigenen Abbruch zu vereiteln, indem er innerhalb des Exception-Handlers die Methode <em><strong>System.Threading.Thread.ResetAbort</strong></em> aufruft. Daneben besteht die Möglichkeit, innerhalb eines Codeblocks mithilfe von <em><strong>finally</strong></em> weiteren Quellcode ausführen zu lassen, was im ungünstigsten Fall eine beachtliche Verzögerung des Thread-Abbruchs nach sich zieht. Aus diesen beiden Gründen sollte man zur Laufzeit überprüfen, ob ein bestimmter Thread auch vollständig abgebrochen wurde. Hierfür steht die <em><strong>Join</strong></em>-Methode zur Verfügung.</p>
<p><span id="more-956"></span></p>
<p><strong>Auf einen Thread warten:</strong> Die parallele Ausführung mehrerer Threads innerhalb eines Programmes bringt es zwangsläufig mit sich, dass Threads immer wieder aufeinander warten müssen. Um dies zu erreichen, hat Microsoft dem .NET-Framework die Thread-Methode <em><strong>Join()</strong></em> verpasst, was ein Zusammenführen zweier Threads bedeutet. In der Konsequenz heißt das, dass ein Thread mit seiner Fortsetzung so lange wartet, bis ein vorhergehender Thread fertig ist. Da dies zu unliebsamen Nebeneffekten führen kann (Stichwort: Dead Lock), besteht die Möglichkeit, Join() einen Parameter zu übergeben, der einen Integerwert darstellt. Dieser Wert besagt, wie lange gewartet werden soll, bis der Vorgänger-Thread (voraussichtlich) beendet wird. Das Ergebnis von Join() ist ein boolscher Wert, der <em><strong>true</strong></em> (Thread beendet) oder <em><strong>false</strong></em> (Thread nicht beendet) annehmen kann.</p>
<p><strong>Threads anhalten und fortsetzen: </strong>Im Gegensatz zur Methode <em><strong>Sleep()</strong></em>, mit der ein Thread für eine festgelegte Zeitdauer angehalten und automatisch fortgesetzt wird, besteht eine weitere Möglichkeit, einen Thread auf unbestimmte Zeit zu stoppen und zu einem späteren Zeitpunkt wieder aufzunehmen. Die hierfür zuständigen Methoden nennen sich <em><strong>Suspend()</strong></em> und <em><strong>Resume()</strong></em>. Beiden Methoden kann kein Argument übergeben werden und beide liefern auch keinen Rückgabewert.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 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/workshop-alles-uber-net-threads-teil-2/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 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/workshop-alles-uber-net-threads-teil-2/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 1</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 15:41:12 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=955</guid>
		<description><![CDATA[Ende Januar, im Anschluss an die OOP 2009, habe ich hier eine kleine Miniserie mit dem Titel &#8220;Multicore-Programmierung im .NET-Umfeld&#8221; veröffentlicht. Was dabei ein wenig zu kurz kam sind die technischen Aspekte, die daraus resultieren. Wie beispielsweise Threads mithilfe des .NET-Frameworks erzeugt, verwaltet und synchronisiert werden. Und über die vorhandenen Thread-Pools habe ich ebenfalls zu [...]]]></description>
			<content:encoded><![CDATA[<p>Ende Januar, im Anschluss an die <a title=" Multicore-Programmierung auf der OOP 2009" href="http://www.software-dev-blog.de/multicore-programmierung-auf-der-oop-2009/01/2009/">OOP 2009</a>, habe ich hier <a title=" Multicore-Programmierung im .NET-Umfeld - Teil 1 " href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">eine kleine Miniserie</a> mit dem Titel &#8220;Multicore-Programmierung im .NET-Umfeld&#8221; veröffentlicht. Was dabei ein wenig zu kurz kam sind die technischen Aspekte, die daraus resultieren. Wie beispielsweise Threads mithilfe des .NET-Frameworks erzeugt, verwaltet und synchronisiert werden. Und über die vorhandenen Thread-Pools habe ich ebenfalls zu wenig erzählt.</p>
<p>Das alles werde ich ab heute in Form einer Miniserie mit der Überschrift &#8220;Alles über .NET Threads&#8221; nachholen. Der erste Teil beschäftigt sich mit dem Thema &#8220;Threads erzeugen&#8221;.</p>
<p>Da die .NET-APIs etwas &#8220;schlanker&#8221; sind als ihre Win32-Brüder und -Schwestern, gestaltet sich das Erzeugen eines .NET-Threads relativ einfach. Dies sieht wie folgt aus:</p>
<p><em><strong>using System.Threading;</strong></em></p>
<p><em><strong>[Definition von Variablen]</strong></em></p>
<p><em><strong>Thread t = new Thread( new ThreadStart( ThreadFunc ));</strong></em></p>
<p>Der Aufruf von <strong><em>ThreadStart()</em></strong> erzeugt einen neuen Thread. Der Parameter ist eine Delegat namens <em><strong>ThreadFunc</strong></em>. Übrigens: In C# ist ein Delegat identisch mit der Adresse einer Funktion in C. Der Thread endet dann an der Stelle, sobald ThreadFunc() endet. Doch damit nicht genug. Für eine fehlerfreie Ausführung des Threads muss weiterer Code implementiert werden:</p>
<p><em><strong>t.Start()</strong></em> &#8212; Dies startet den Thread unter .NET explizit (was z. B. unter Win32 nicht erforderlich ist).</p>
<p><em><strong>Thread.Sleep( 40 ) </strong></em>&#8212; Dies unterbricht den (seriellen) Hauptthread für die Dauer der Zeiteinheit in der Klammer, die in Millisekunden angegeben wird. Dies kann in der Praxis jedoch erheblich von der tatsächlich benötigten Zeit abweichen.</p>
<p><em><strong>[aufzurufende Funktion]</strong></em> &#8212; Diese Funktion wird parallel auf den vorhandenen Prozessorkernen ausgeführt.</p>
<p><em><strong>Thread.Sleep( 0 ) </strong>&#8212; </em>Dies beendet den parallelen Thread und reaktiviert den &#8220;schlafenden&#8221; Hauptthread.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 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/workshop-alles-uber-net-threads-teil-1/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 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/workshop-alles-uber-net-threads-teil-1/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mögliche Thread-Modi und deren Folgen</title>
		<link>http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/</link>
		<comments>http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 14:55:21 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=927</guid>
		<description><![CDATA[Multicore-Programmierung ist sicherlich kein einfaches Ding. Zu viel kann dabei passieren und schiefgehen, wenn man bestimmte Regeln nicht beachtet. Daher starten wir heute einen Mehrteiler, der sich mit den Details der Multicore-Programmierung beschäftigt. Im ersten Teil geht es um die fundamentale Frage, welche Zustände ein Thread während des Programmablaufs annehmen kann. Im ersten Schritt wird [...]]]></description>
			<content:encoded><![CDATA[<p>Multicore-Programmierung ist sicherlich kein einfaches Ding. Zu viel kann dabei passieren und schiefgehen, wenn man <a title="Fünf Multithread-Programmierregeln" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">bestimmte Regeln</a> nicht beachtet. Daher starten wir heute einen Mehrteiler, der sich mit den Details der Multicore-Programmierung beschäftigt. Im ersten Teil geht es um die fundamentale Frage, welche Zustände ein Thread während des Programmablaufs annehmen kann.</p>
<p>Im ersten Schritt wird beispielsweise vom Thread Manager ein Thread erzeugt und in den <strong>Bereit-Zustand</strong> versetzt (&#8220;ready&#8221;). Dort verharrt der Thread so lange, bis er eine Anweisung, eine Funktion oder ähnliches ausführen soll. Darum kümmern sich entsprechende Programmanweisungen wie zum Beispiel die Pragma-Methoden der <a title=" Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP-basierten Programmierung</a>.</p>
<p>Im zweiten Schritt kommt es zur <strong>Ausführung</strong> der entsprechenden Quellcodestelle. Währenddessen muss der betreffende Thread möglicherweise auf einen anderen Thread oder ein Datum eines parallel ablaufenden Threads warten. Dann begibt er sich in den <strong>Wartend-Modus</strong>, bis der benötigte Thread beendet ist oder dessen Ergebnis vorliegt. Anschließend wird der angehaltene Thread weiter ausgeführt oder wieder in den Bereit-Zustand versetzt, da der Thread zu einem späteren Zeitpunkt nochmals benötigt wird.</p>
<p><strong>Ach ja:</strong> Gerade dieser Wartend-Modus bereitet vielen Programmierern erhebliche Probleme, da hierbei <a title="Von Deadlocks und anderen überraschenden Laufzeitproblemen" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Dead Locks, Data Races</a> oder andere unvorhersehbare Ereignisse auftreten können. Wie gut, dass es hierfür Tools wie den <a title="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> oder <a title=" Parallel-Studio-Serie (3): mehr Infos zum Parallel Inspector " href="http://www.software-dev-blog.de/parallel-studio-serie-mehr-infos-zum-parallel-inspector/02/2009/">Parallel Inspector</a> gibt, die solche Schwachstellen aufspüren können.</p>
<p><span id="more-927"></span>Natürlich ist es auch möglich, dass ein Thread ausgeführt wird, ohne in den Wartend-Zustand versetzt zu werden. Dann stehen <strong>zwei Folgemodi</strong> zur Auswahl: <strong>Bereit </strong>oder<strong> Beendet</strong>. &#8220;Bereit&#8221; tritt immer dann ein, wenn der Thread nicht nur einmal, sondern mehrmals benötigt wird, was schon beim Programmdesign berücksichtigt werden muss. Dies kann beispielsweise eine Schleife sein, die mehrfach ausgeführt werden muss. In diesem Fall empfiehlt es sich, den zugehörigen Thread nicht zu beenden, sondern ihn wieder auf &#8220;Bereit&#8221; zu setzen, da das Erzeugen eines Threads relativ viel Rechenzeit und Verwaltungsaufwand bedeutet.</p>
<p>Sobald ein Thread nicht mehr benötigt wird, kann er natürlich auch <strong>beendet</strong> werden. Er wird dann aus dem Thread-Pool entfernt, alle Variablen werden gelöscht und der Thread steht nicht mehr zur Verfügung. Was aber nicht heißt, dass er zu einem späteren Zeitpunkt nicht wieder erzeugt werden kann.</p>
<p><strong>Übrigens:</strong> Zu Beginn einer parallelisierten Anwendung wird ein sogenannter Initial Thread initiert, der den sequeziellen Programmablauf steuert und der auch dafür zuständig ist, das Programm &#8220;am Leben zu erhalten&#8221;, während zur Laufzeit immer wieder neue, parallel ausfühbare Threads erzeugt werden. Sobald dieser Initialisierungsthread beendet wird, endet auch das komplette Programm.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/&via=sw_devtwits&text=Mögliche Thread-Modi und deren Folgen&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/moegliche-thread-modi-und-deren-folgen/02/2009/&via=sw_devtwits&text=Mögliche Thread-Modi und deren Folgen&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/moegliche-thread-modi-und-deren-folgen/02/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>Beliebte Fehler bei der Parallelprogrammierung</title>
		<link>http://www.software-dev-blog.de/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/</link>
		<comments>http://www.software-dev-blog.de/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 10:30:28 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=500</guid>
		<description><![CDATA[Parallelprogrammierung ist keine einfache Disziplin und birgt eine Menge Fehlerquellen. Das beginnt beim grundsätzlichen Design der Anwendung und endet bei falsch gesetzten &#8220;Locks&#8221;. Daher folgen an dieser Stelle die beliebtesten Fehler der Multicore-Programmierung. Und was man dagegen tun kann, erfahren Sie hier auch. Zunächst einmal helfen unsere fünf Multicore-Regeln, die wir Ende letzten Monats aufgestellt [...]]]></description>
			<content:encoded><![CDATA[<p>Parallelprogrammierung ist keine einfache Disziplin und birgt eine Menge Fehlerquellen. Das beginnt beim grundsätzlichen Design der Anwendung und endet bei falsch gesetzten &#8220;Locks&#8221;. Daher folgen an dieser Stelle die beliebtesten Fehler der Multicore-Programmierung. Und was man dagegen tun kann, erfahren Sie hier auch.</p>
<p>Zunächst einmal helfen unsere <a title=" Fünf Multicore-Programmierregeln auf einen Blick " href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">fünf Multicore-Regeln</a>, die wir Ende letzten Monats aufgestellt haben. Die wichtigste davon lautet beim Software-Design: Denke parallel! Denn nur so hält man am Schluss eine Anwendung in den Händen, die sich mithilfe der <a title=" Nützliche und kostenlose Entwickler-Tools " href="http://www.software-dev-blog.de/nutzliche-und-kostenlose-entwickler-tools/11/2008/">passenden Tools</a> bestmöglich parallelisieren lässt.</p>
<p>Eine beliebte Fehlerquelle ist ein <strong>Überangebot an Threads</strong>, vor allem dann, wenn Sie diese &#8220;manuell&#8221; programmieren, so wie im Falle von Pthreads. Daher sollte man durchaus sparsam mit dem Erstellen von Threads umgehen, denn nur eine ausgewogene Balance von parallelem und seriellem Quellcode bringt die erwünschten Leistungsschübe. Oder man bedient sich nützlicher Tools wie <a title="Mit Intel Threading Building Blocks parallel programmieren " href="http://www.software-dev-blog.de/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Intel TBB</a>, die Threads automatisch generieren.</p>
<p><span id="more-500"></span>Ebenfalls sehr wichtig ist die optimale Granularität der zum Einsatz kommenden <strong>Locks und Unlocks</strong>, denn jedes Sperren und Entsperren von parallelem Programmcode erfordert einen hohen Verwaltungsaufwand. Werden Locks zu lange ausgeführt, können sie andere Threads unnötig blockieren, was die Anwendung insgesamt ausbremst. Und auch die gemeinsam genutzten Speicherressourcen müssen bestmöglich aufeinander abgestimmt sein, denn ein übertriebener Synchronisierungsaufwand macht sich negativ bemerkbar.</p>
<p>Ein weiterer Hemmschuh parallel programmierter Software ist die <strong>schlechte Verteilung der notwendigen Tasks</strong> auf die vorhandenen Prozessorkerne beziehungsweise Threads. Denn nur wenn Sie diese optimal ausnutzen, indem Sie Leerlaufzeiten einzelner Cores vermeiden, skaliert die Anwendung auf einem Multicore-System in entsprechender Weise.</p>
<p>All diese Fehler können Sie übrigens von Anfang an vermeiden, indem Sie Tools wie den <a title=" Quellcode-Schwachstellen mit Intel VTune aufspüren " href="http://www.software-dev-blog.de/quellcode-schwachstellen-mit-intel-vtune-aufspuren/11/2008/">VTune Performance Analyzer </a>einsetzen, der Ihnen genau die Stellen zeigt, die man am besten parallelisieren kann. Aber auch das Laufzeitverhalten einer fertigen Anwendung kann mit VTune erforscht werden. Und wenn Sie dann mal ein parallel programmiertes Programm vorliegen haben, hilft der <a title=" Fehler im Multithread-Code aufspüren: Thread Checker " href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checker</a> dabei, mögliche Fehler aufzuspüren. Hierbei sind Dead Locks und Race Conditions eine häufig auftretende Fehlerquelle, die sich mithilfe des Tools lokalisieren 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/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/&via=sw_devtwits&text=Beliebte Fehler bei der Parallelprogrammierung&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/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/&via=sw_devtwits&text=Beliebte Fehler bei der Parallelprogrammierung&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/beliebte-fehler-bei-der-parallelprogrammierung/12/2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vier Schritte zum optimierten Multicore-Quellcode</title>
		<link>http://www.software-dev-blog.de/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/</link>
		<comments>http://www.software-dev-blog.de/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 16:31:59 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Optimieren]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=421</guid>
		<description><![CDATA[Wir haben uns hier ja schon mit den Regeln der parallelen Programmierung beschäftigt und sind auch der Frage nachgegangen, welche Tools hierfür zur Verfügung stehen. Heute geht es um die vier wesentlichen Schritte, die zur Erstellung des optimalen Multicore-Codes notwendig sind. 1. Untersuche! Und zwar den gesamt Quellcode auf potenzielle Parallelisierung hin. Hierfür eignen sich [...]]]></description>
			<content:encoded><![CDATA[<p>Wir haben uns hier ja schon mit den <a title="Fünf Regeln der Multicore-Programmierung" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">Regeln der parallelen Programmierung</a> beschäftigt und sind auch der Frage nachgegangen, <a title="Mit diesen Tools lassen sich Anwendungen multi-threaden" href="http://www.software-dev-blog.de/software-projekte-mit-intel-tools-optimieren/10/2008/">welche Tools</a> hierfür zur Verfügung stehen. Heute geht es um die vier wesentlichen Schritte, die zur Erstellung des optimalen Multicore-Codes notwendig sind.</p>
<p><strong>1. Untersuche!</strong> Und zwar den gesamt Quellcode auf potenzielle Parallelisierung hin. Hierfür eignen sich vor allem Schleifenkonstrukte, die beispielsweise eine große Menge an Daten berechnet, was oft simultan geschehen kann. Es geht aber auch um &#8220;Hotspots&#8221;, die es in jedem Programm gibt und die die Leistungsfähigkeit der Anwendung negativ beeinträchtigen können. Um diese Untersuchungen möglichst effizient durchzuführen, gibt es spezielle Tools wie den <a title="Mehr Infos zum VTune Performance Analyzer" href="http://www.software-dev-blog.de/quellcode-schwachstellen-mit-intel-vtune-aufspuren/11/2008/">VTune Performance Analyzer</a>, der genau für diese Aufgaben geschaffen worden ist.</p>
<p><strong>2. Kodiere! Und zwar parallel.</strong> Nachdem die passenden Programmstellen identifiziert worden sind, beginnt die eigentliche Arbeit, nämlich die des Kodierens. Packen Sie also all den parallelen Code in Ihr Programm, von dem Sie glauben, dass er Ihre Anwendung schneller macht, da sie von den vorhandenen Prozessorkernen profitiert. Und Sie können es sich dabei ein wenig leichter machen, indem Sie auf Tools zurückgreifen, die Ihnen mithilfe vorgefertigter Routinen und Bibliotheken dabei helfen. Dies können einfache Anweisungen <a title="Mehr Infos zu OpenMP und Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">paralleler Schleifenkonstrukte</a> sein, aber auch komplexe Funktionen für <a title="Unterstützung bei der Programmierung von Multimedia- und Wissenschaftsanwendungen mithilfe optimierter Bibliotheken" href="http://www.software-dev-blog.de/software-projekte-mit-multicore-bibliotheken-optimieren/12/2008/">Multimedia- oder Wissenschaftsanwendungen</a>.</p>
<p><span id="more-421"></span></p>
<p><strong>3. Debugge!</strong> Nachdem der Quellcode Ihrer Anwendung möglichst gut für die parallele Ausführung optimiert worden ist, steht noch eine Menge Debug-Arbeit auf dem Plan. Auch hierfür gibt es die passenden Tools, denn nur schwer auffindbare Fehler wie Dead Locks oder unvorhersehbare Race Conditions lassen sich mit einfachen Testmethoden gar nicht oder nur sehr aufwendig identifizieren. Ziehen Sie hierzu am besten die passenden Tools zu Rate wie den <a title="Schwachstellen im Multicore-Code aufspüren: Thread Checker" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checker</a>, der genannte Fehlerquellen aufdeckt und Ihnen genau sagt, welche Quelltextstellen kritisch bzw. fehleranfällig sind.</p>
<p><strong>4. Optimiere!</strong> Jetzt haben Sie es fast geschafft, aber noch können Sie sich nicht sicher sein, dass Ihre Multicore-Anwendung auch wirklich optimal läuft. Denn noch können einzelne Codeteile den gesamten Programmablauf ausbremsen, da beispielsweise die Speicherverwaltung nicht effizient erfolgt oder die Anwendung nicht richtig skaliert. Das bedeutet im schlimmsten Fall, dass Ihre Software zwar auf einem Dualcore-Rechner perfekt läuft, es auf einer <a title="Optimal skalierende Anwendungen müssen auf einem Quadcore-Prozessor wie dem Core i7 genauso gut laufen wie auf einer Dualcore-Maschine" href="http://www.software-dev-blog.de/mehr-multithread-leistung-mit-dem-intel-core-i7-prozessor/11/2008/">Quadcore-Maschine</a> aber permanent zu Wartezeiten kommt, da mehr Threads zur Laufzeit erzeugt werden als Prozessorkerne vorhanden sind. Auch für diese Zwecke gibt es die entsprechenden Tools: den schon erwähnte VTune Analyzer, aber auch den <a title="Mehr Infos zum Intel Thread Profiler" href="http://www.intel.com/cd/software/products/asmo-na/eng/threading/winthreadprofiler/286749.htm" target="_blank">Intel Thread Profiler</a>, der die Effizienz des parallelisierten Code grafisch darstellt und Ihnen so hilft, Schwachstellen schneller und leichter zu lokalisieren.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/&via=sw_devtwits&text=Vier Schritte zum optimierten Multicore-Quellcode&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/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/&via=sw_devtwits&text=Vier Schritte zum optimierten Multicore-Quellcode&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/vier-schritte-zum-optimierten-multicore-quellcode/12/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmiermethoden: Daten- und Aufgabenparallelität</title>
		<link>http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/</link>
		<comments>http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 15:57:55 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Background]]></category>
		<category><![CDATA[TBB]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=370</guid>
		<description><![CDATA[Bei der parallelen Programmierung unterscheidet man grundsätzlich zwischen drei Formen, die letztlich darüber entscheiden, welche Programmiermethoden man anwenden sollte. Die eine Form der parallelen Programmierung orientiert sich an den zu verarbeitenden Daten, die zur Laufzeit der Anwendung anfallen. Ein gutes Beispiel für die Datenparallelität ist das Rendern eines Bildes, das aus vielen tausend Bildpunkten besteht, [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der parallelen Programmierung unterscheidet man grundsätzlich zwischen drei Formen, die letztlich darüber entscheiden, welche Programmiermethoden man anwenden sollte.</p>
<p>Die eine Form der parallelen Programmierung orientiert sich an den zu verarbeitenden Daten, die zur Laufzeit der Anwendung anfallen. Ein gutes Beispiel für die <strong>Datenparallelität</strong> ist das Rendern eines Bildes, das aus vielen tausend Bildpunkten besteht, die sich unabhängig voneinander berechnen, zeichnen oder mit einem Filter versehen lassen.</p>
<p>Darin steckt also eine Menge an <a title="Fünf Regeln der Multicore-Programmierung" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">Multicore-Potenzial</a>, wofür sich der Einsatz von <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 oder Intel TBB</a> empfiehlt. Ein weiteres gutes Beispiel ist die Rechtschreibprüfung eines Textverarbeitungsprogramms. Hier können sämtliche Wörter simultan überprüft werden, da sie zueinander in keiner Abhängigkeit stehen.</p>
<p>Auf der anderen Seite existiert der <strong>Aufgabenparallelismus</strong>, der voneinander getrennte Aufgaben betrachtet, die sich vortrefflich parallel ausführen lassen. Ein gutes Beispiel hierfür ist Outlook, das aus unterschiedlichen Modulen besteht (Adressen, Kalender, E-Mail etc.), die sich grundsätzlich unabhängig voneinander ausführen lassen und damit auf separaten Prozessorkernen laufen können.</p>
<p><span id="more-370"></span>Probleme treten hier vor allem dann auf, wenn die unterschiedlichen Programmteile auf denselben Datenbestand zugreifen, was zu ungewollten, falschen oder nicht vorhersagbaren <a title="Datenkonflikte mit dem Intel Thread Checker aufspüren und vermeiden" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Datenkonflikten</a> führen kann. Gerade hier sind passende Tools wie die Intel Threading Building Blocks von großer Bedeutung, da diese zum einen Aufgaben in Threads verwandeln und sich zum anderen um die parallele Speicherverwaltung kümmern.</p>
<p>In der Praxis trifft man natürlich sehr häufig auf eine Mischform von Aufgaben- und Datenparallelismus, das so genannte <strong>Pipelining</strong>. Hierbei ist die Anwendung in viele unterschiedliche Aufgaben unterteilt, innerhalb derer Daten parallel verarbeitet werden können. Ein bekanntes Beispiel hierfür ist wieder die Bildbearbeitung: Ein Bild wird geöffnet, mit einem Filter versehen, in eine andere Auflösung skaliert und abschließend gespeichert.</p>
<p>In allen genannten Fällen werden jeweils viele tausend Pixel berechnet, und die Aufgaben können teilweise parallel, teilweise aber nur sequenziell ausgeführt werden. Außerdem ist die Gefahr von Datenkonflikten recht hoch. Gerade im Falle des Pipelining ist die Wahl der besten Programmiermethode von entscheidender Bedeutung. Denn in den allermeisten Fällen ist eine 100-Prozent-Parallelisierung von Software weder möglich noch sinnvoll.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/&via=sw_devtwits&text=Programmiermethoden: Daten- und Aufgabenparallelität&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/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/&via=sw_devtwits&text=Programmiermethoden: Daten- und Aufgabenparallelität&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/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fünf Multicore-Programmierregeln auf einen Blick</title>
		<link>http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/</link>
		<comments>http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 15:02:21 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[TBB]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=339</guid>
		<description><![CDATA[Oft hört man die Frage, was beim parallelen Programmieren alles zu beachten sei. Deshalb folgen an dieser Stelle die fünf wichtigsten Multicore-Regeln für angehende Parallel-Entwickler: Multicore-Regel Nummer 1: Denke parallel! Am allerbesten ist ein paralleles Konzept von Anfang an. Dies vermeidet ein nachträgliches Implementieren parallelen Quellcodes, wie das beispielsweise mit den Intel Threading Building Blocks [...]]]></description>
			<content:encoded><![CDATA[<p>Oft hört man die Frage, was beim parallelen Programmieren alles zu beachten sei. Deshalb folgen an dieser Stelle die fünf wichtigsten Multicore-Regeln für angehende Parallel-Entwickler:</p>
<p><span style="color: #000080;"><em><span><span>Multicore-Regel Nummer 1:</span></span></em></span> <strong>Denke parallel!</strong> Am allerbesten ist ein paralleles Konzept von Anfang an. Dies vermeidet ein nachträgliches Implementieren parallelen Quellcodes, wie das beispielsweise mit den <a title="Mehr Infos zu Intel TBB" href="http://www.software-dev-blog.de/multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">Intel Threading Building Blocks</a> möglich ist. Optimalerweise legen Sie sich eine Strategie zurecht, wie Sie Schritt für Schritt zu einer multicore-optimierten Anwendung kommen.</p>
<p><span style="color: #000080;"><em>Multicore-Regel Nummer 2:</em></span> <strong>Entwickle task-orientiert!</strong> Parallel programmierter Code skaliert am besten, wenn er nicht für eine bestimmte Zahl an Prozessoren programmiert wurde, sondern sich an der bestmöglichen Zahl an parallel ausführbaren Aufgaben orientiert. Denken Sie daher nicht in Threads, dass erledigen Tools wie die <a title="Intel TBB-Webseite" href="http://www.intel.com/cd/software/products/asmo-na/eng/threading/threadbuildblocks/294797.htm" target="_blank">Intel TBB</a> für Sie. Deren Scheduler verteilt die auszuführenden Aufgaben auf die vorhandenen Prozessorkerne. Und je mehr davon zur Verfügung stehen, desto paralleler läuft die Anwendung.</p>
<p><span style="color: #000080;"><em>Multicore-Regel Nummer 3:</em> </span><strong>Auf die Tools kommt es an!</strong> Parallele Threads auf Basis von POSIX oder Windows-APIs programmieren zu wollen, ist ein hartes Brot, denn Sie müssen sich selbst um die Parallelisierung des Quellcodes kümmern. Viel einfacher ist es, mit den richtigen Tools der Anwendung paralleles Leben einzuhauchen.</p>
<p><span id="more-339"></span>Sie entwickeln bevorzugt mathematisch-orientierte Software? Dann werfen Sie mal einen Blick auf die <a title="Infos zu der Intel MKL" href="http://www.intel.com/cd/software/products/asmo-na/eng/perflib/mkl/index.htm" target="_blank">Intel Math Kernel Library.</a> Sie programmieren MPEG-Encoder? Fein, dann kommen am ehesten die <a title="Intel IPP-Webseite" href="http://www3.intel.com/cd/software/products/asmo-na/eng/perflib/219780.htm" target="_blank">Integrated Performance Primitives</a> in Frage, die mithilfe der vorhandenen Funktionen das Parallelisieren von Multimediaanwendungen erleichtern. Und die Intel TBB habe ich ja bereits erwähnt, die dank ihrer eingebauten Multithread-Funktionen vor allem Schleifenkonstrukte mit wenigen Programmzeilen parallelisieren.</p>
<p><em><span style="color: #000080;">Multicore-Regel Nummer 4:</span> </em><strong>Multithread-Code muss sequenziell laufen!</strong> Das klingt zunächst einmal kontraproduktiv, stellt sich aber gerade beim Debuggen als großer Vorteil heraus, da die Fehlersuche im sequenziellen Quellcode wesentlich einfacher ist. Stellen Sie also sicher, dass Ihre Anwendung auf einem Thread fehlerfrei läuft. Wenn Sie dann beim Umstellen auf zwei, vier oder mehr Threads Fehler feststellen (zum Beispiel mithilfe des <a title="Intel Thread Checker" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checkers</a>), können Sie sich ziemlich sicher sein, dass im Parallel-Code etwas nicht stimmt. Übrigens: Ein vollständig parallelisiertes Programm ist keine gute Idee!</p>
<p><span style="color: #000080;"><em>Multicore-Regel Nummer 5:</em></span> <strong>Denke an die Speicherverwaltung!</strong> Die Zuweisung von benötigtem Speicher ist vor allem bei parallel ausführbaren Programmen eine echte Herausforderung, da je nach Anzahl der verfügbaren Prozessoren und der damit maximalen Anzahl von Threads der richtigen Speicherverwaltung zur Laufzeit eine enorm wichtige Bedeutung zukommt. Daher sollten Sie beim Entwickeln von Multithread-Code unbedingt auf einen skalierenden Memory Allocator setzen, der den notwendigen Speicher automatisch verwaltet. Die Intel TBB setzen solch einen dynamischen Speicherzuweiser ein &#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/funf-multicore-programmierregeln-auf-einen-blick/11/2008/&via=sw_devtwits&text=Fünf Multicore-Programmierregeln auf einen Blick&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/funf-multicore-programmierregeln-auf-einen-blick/11/2008/&via=sw_devtwits&text=Fünf Multicore-Programmierregeln auf einen Blick&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/funf-multicore-programmierregeln-auf-einen-blick/11/2008/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>
	</channel>
</rss>

