Eine Parallelisierung der schnellen FourierTransformation auf SO(3) A Parallelization of the Fast Fourier Transform on SO(3) Bachelorarbeit Im Rahmen des Studiengangs Informatik Vorgelegt von Denis-Michael Lux Ausgegeben und betreut von Prof. Dr. Jürgen Prestin der Universität zu Lübeck mit Unterstützung von Christian Wülker, M.Sc. Lübeck, den 06. Oktober 2015 Selbstständigkeitserklärung Der Verfasser versichert an Eides statt, dass er die vorliegende Arbeit selbständig, ohne fremde Hilfe und ohne Benutzung anderer als der angegebenen Hilfsmittel angefertigt hat. Die aus fremden Quellen (einschließlich elektronischer Quellen) direkt oder indirekt übernommenen Gedanken sind ausnahmslos als solche kenntlich gemacht. Die Arbeit ist in gleicher oder ähnlicher Form oder auszugsweise im Rahmen einer anderen Prüfung noch nicht vorgelegt worden. Ort/Datum Unterschrift des Verfassers Inhaltsverzeichnis Einleitung 1 1 Mathematische Theorie 3 1.1 Rotationsgruppe SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Wigner-D-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Diskrete Fourier-Transformation auf SO(3) (DSOFT) und diskrete inverse Transformation (iDSOFT) . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 Schnelle Fourier-Transformation auf SO(3) (SOFFT) und schnelle inverse Transformation (iSOFFT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Implementierung und Parallelisierung 10 13 2.1 Sequentielle SOFFT und iSOFFT . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Open Multi-Processing (OpenMP) . . . . . . . . . . . . . . . . . . . . . . . 16 2.3 Entwurf paralleler Algorithmen mittels Forster-Methodik . . . . . . . . . . 17 2.4 Parallelisierung der SOFFT/iSOFFT mittels Forster-Methodik und OpenMP 19 2.5 Analyse der Parallelisierung . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 Numerische Beispiele 33 3.1 Benchmark zu Speedup, Effizienz und Rechengenauigkeit . . . . . . . . . . 33 3.2 Ergebnisse der Benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4 Diskussion und Schlussfolgerung 41 Abkürzungsverzeichnis 45 Algorithmenverzeichnis 47 Abbildungsverzeichnis 49 Literaturverzeichnis 51 Zusammenfassung In dieser Arbeit wird eine Parallelisierung der schnellen Fourier-Transformation auf der Rotationsgruppe SO(3) (SOFFT) und ihrer Inversen (iSOFFT) entworfen, implementiert und in der Theorie und Praxis analysiert. Zu diesem Zweck werden zunächst die mathematischen Grundlagen dieser Algorithmen vorgestellt. Anschließend wird eine sequentielle Implementierung der SOFFT und iSOFFT präsentiert und besprochen. Für den Entwurf und die Umsetzung der Parallelisierung dieser sequentiellen Implementierung wird die Forster-Methodik und der OpenMP-Standard verwendet. Die Arbeitsoptimalität der entstandenen Parallelisierung wird daraufhin nachgewiesen. Abschließend wird die Praxistauglichkeit der parallelisierten SOFFT und iSOFFT anhand dreier Benchmarks demonstriert. Abstract In this work, a parallelization of the fast Fourier transform on the rotation group SO(3) (SOFFT) and its inverse (iSOFFT) is designed, implemented, and analyzed in theory and practice. For this purpose, the underlying mathematical theory of these algorithms is introduced first. Subsequently, a sequential implementation of the SOFFT and iSOFFT is presented and discussed. For the design and implementation of the parallelization of the sequential implementation, the Forster methodology and the OpenMP standard are used. The work optimality of the resulting parallelization is then proven. Finally the applicability of the parallelized SOFFT and iSOFFT in practice is demonstrated by means of three benchmarks. 1 Einleitung In vielen wissenschaftlichen Anwendungen und Problemen spielen Rotationen im Anschauungsraum R3 eine wichtige Rolle. Bei der Technik des sogenannten fast rotational matchings [Kovacs und Wriggers, 2002] wird beispielsweise versucht, diejenige Rotation zu bestimmen, unter der ein gegebenes Objekt möglichst gut mit einem weiteren Objekt übereinstimmt. Die Bedeutung des Begriffs der Übereinstimmung zweier Objekte ergibt sich dabei in der Regel aus dem speziellen Kontext. Betrachtet man zum Beispiel gegeneinander rotierte dreidimensionale Bilddatensätze zweier medizinischer Bildgebungsmodalitäten, stellt sich oft die Frage, wie ähnlich sich diese Bilder sind. Bei der Bildregistrierung kann versucht werden, diese Ähnlichkeit durch Rotationen eines der beiden Bilder zu vergrößern [Modersitzki, 2009, Abschnitte 1.1 und 4.4]. Ein anderes Beispiel findet sich im Bereich der Molekularbiologie. Hier ist es oft das Ziel, den Überlapp der Elektronendichtefunktionen zweier gegebener Makromoleküle zu maximieren. Die Bestimmung des maximalen Überlapps kann dann dazu genutzt werden, die Ähnlichkeit der beiden Makromoleküle zu beurteilen. Dadurch ist es möglich, Rückschlüsse auf Übereinstimmungen in den Eigenschaften und Funktionen dieser Moleküle zu ziehen. Dieses Vorgehen bildet den ersten Schritt beim sogenannten virtual drug screening [Ritchie, 2011, Abschnitt 1.1.7]. Die von Kostelec und Rockmore [2008] vorgestellte schnelle Fourier-Transformation auf der Rotationsgruppe SO(3) (SOFFT) und ihre Inverse (iSOFFT) bilden heute einen festen Bestandteil in vielen auf dem fast rotational matching basierenden Verfahren (siehe zum Beispiel [Bülow und Birk, 2011a,b, Slabaugh et al., 2008]). Dies ist auch darauf zurückzuführen, dass für viele Anwendungsbereiche die Praxistauglichkeit der SOFFT und iSOFFT in [Kostelec und Rockmore, 2008] bereits nachgewiesen wurde. Bis heute wurde eine Parallelisierung dieser Algorithmen allerdings noch nicht vorgenommen, beziehungsweise noch nicht vorgestellt. Eine solche Parallelisierung der SOFFT und iSOFFT zu entwerfen, umzusetzen und die Praxistauglichkeit der daraus resultierenden Implementierung nachzuweisen, ist das Ziel dieser Arbeit. Der Inhalt ist wie folgt gegliedert. Zu Beginn werden in Kapitel 1 die mathematischen Grundlagen der Rotationsgruppe und der darauf definierten Fourier-Transformation vorgestellt. Daraus wird dann die SOFFT und die iSOFFT abgeleitet. Im Anschluss daran wird in Kapitel 2 zunächst eine sequentielle Implementierung dieser beiden Algorithmen präsentiert. Nach einer kurzen Einführung in die C-, C++- und Fortran-Spracherweiterung OpenMP und die sogenannte Forster-Methodik wird eine Parallelisierung der sequentiellen Implementierung entworfen und umgesetzt. In dem darauffolgenden Theorie-Abschnitt wird die Arbeitsoptimalität dieser Parallelisierung nachgewiesen. In Kapitel 3 werden dann drei Benchmarks vorgestellt, anhand derer im abschließenden Kapitel 4 der praktische Nutzen der par- 2 Einleitung allelisierten Implementierung gezeigt wird. Außerdem werden Ansatzpunkte für mögliche Weiterentwicklungen genannt. * * * * * Einen ganz besonderen Dank möchte ich meinem Betreuer Prof. Dr. Jürgen Prestin entgegenbringen, für seine Mühe, sich diese Arbeit durchgelesen und mit vielen hilfreichen Kommentaren versehen zu haben. Ein weiterer besonderer Dank gebührt Christian Wülker für die vielen Kommentare und oft (sehr) langen Arbeitstage des Korrekturlesens der einzelnen Kapitel, sowie der zahlreichen Gesprächen über das entsprechend Thema. Ohne die vielen Kommentare meiner Betreuer würde die Arbeit heute anders aussehen. Auch meiner Familie sei für die Unterstützung in meinem Studium gedankt. Des Weiteren danke ich meinen Kommilitonen für zahlreiche anregende und aufschlussreiche Diskussionen. In diesem Zusammenhang möchte ich Thomas Buddenkotte für die vielen Gespräche zu seiner Mathematica-Implementierung der SOFFT und iSOFFT danken, sowie Christoph Schulz für den Hinweis auf diese Thematik als mögliche Bachelorarbeit. 3 1 Mathematische Theorie In diesem Kapitel wird die schnelle Fourier-Transformation und schnelle inverse FourierTransformation auf der Rotationsgruppe eingeführt. Dazu wird in Abschnitt 1.1 zunächst die Rotationsgruppe definiert und beschrieben. In Abschnitt 1.2 wird dann der Vektorraum der Funktionen, welche von der Rotationsgruppe in die komplexen Zahlen abbilden, betrachtet. Von besonderem Interesse sind in diesem Kontext die sogenannten Wigner-D-Funktionen und die von diesen Funktionen aufgespannten Untervektorräume. Die betrachteten Untervektorräume sind stets endlichdimensional und besitzen ein Skalarprodukt, bezüglich dessen die Wigner-D-Funktionen eine Orthonormalbasis darstellen. Dies erlaubt es, in Abschnitt 1.3 mittels eines geeigneten Abtasttheorems eine diskrete Fourier-Transformation und die dazugehörige diskrete inverse Fourier-Transformation auf diesen Untervektorräumen zu definieren. In Abschnitt 1.4 wird aus diesen Transformationen abschließend die entsprechende schnelle Fourier-Transformation und schnelle inverse Fourier-Transformation abgeleitet. 1.1 Rotationsgruppe SO(3) Definition 1.1 ([Fischer, 2008, S. 4]). Eine Menge G zusammen mit einer Verknüpfung : G × G → G, (a, b) → a b, bezeichnet als (G, ), heißt Gruppe, wenn folgendes gilt: • Die Verknüpfung is assoziativ, d.h. (a b) c = a (b c) für alle a, b, c ∈ G. • Es existiert genau ein eindeutig bestimmtes 1 ∈ G mit 1 a = a 1 = a für alle a ∈ G (1 heißt neutrales Element von G). • Zu jedem a ∈ G gibt es ein eindeutig bestimmtes a−1 ∈ G mit a−1 a = a a−1 = 1 (a−1 heißt Inverses von a). Anmerkung. Erfüllt eine Gruppe G zu den bereits genannten Bedingungen zusätzlich die Bedingung der Kommutativität, d.h. ab=ba für alle a, b ∈ G, so wird G auch abelsch genannt. 4 Mathematische Theorie Definition 1.2 ([Fischer, 2008, S. 13]). Die orthogonale Gruppe im dreidimensionalen reellen Raum O(3) ist definiert als die Menge aller orthogonalen reellen 3×3-Matrizen mit Determinante +1 oder -1, d.h. O(3) := R ∈ R3×3 | RT R = 1 , wobei 1 die 3×3-Identitätsmatrix und die Verknüpfung die Matrix-Multiplikation bezeichnet. Das neutrale Element von O(3) ist die Identitätsmatrix 1 und das inverse Element für ein beliebiges Element R ∈ O(3) ist R−1 = RT . Definition 1.3 ([Fischer, 2008, S. 23]). Die spezielle orthogonale Gruppe im dreidimensionalen reellen Raum oder auch Rotationsgruppe SO(3) ist definiert als die Menge aller reellen 3×3-Matrizen mit Determinante +1, d.h. SO(3) := R ∈ R3×3 | RT R = 1, det(R) = 1 ⊂ O(3). Die Verknüpfung beschreibt die Matrix-Multiplikation, das neutrale Element von SO(3) ist die 3×3-Identitätsmatrix 1 und das inverse Element zu einem beliebigem Element R ∈ SO(3) ist R−1 = RT . Anmerkung. Aus Sicht der linearen Algebra beschreibt jedes Element R ∈ SO(3) eine Rotation um den Ursprung des dreidimensionalen reellen Raums R3 . Daher bezeichnet im Folgenden eine Rotation stets ein Element R ∈ SO(3). Darüber hinaus erfüllt die Gruppe SO(3) nicht die Bedingung der Kommutativität und ist somit keine abelsche Gruppe. Definition 1.4 ([Edmonds, 1996, S. 53]). Die elementaren Rotationsmatrizen Rx (α), Ry (α) und Rz (α) sind für einen beliebigen Winkel α ∈ R im Bogenmaß definiert als: 1 0 0 Rx (α) := 0 cos α − sin α, 0 sin α cos α Ry (α) := cos α 0 sin α 0 , − sin α 0 cos α 0 1 cos α − sin α 0 Rz (α) := sin α cos α 0, 0 0 1 wobei Rx (α) eine Rotation um die x-Achse, Ry (α) eine Rotation um die y-Achse und Rz (α) eine Rotation um die z-Achse repräsentiert. Wigner-D-Funktionen 5 Satz 1.5 ([Kostelec und Rockmore, 2008, S. 156]). Für jede Rotation R ∈ SO(3) existiert eine eindeutige Eulerwinkelzerlegung im Sinne der folgenden sukzessiven Anwendung von Rotationen: R = R(α, β, γ) = Rz (α)Ry (β)Rz (γ), mit 0 ≤ α, γ < 2π und 0 ≤ β ≤ π (vgl. Definition 1.4). 1.2 Wigner-D-Funktionen In diesem Abschnitt werden spezielle Funktionen betrachtet, welche von der Definitionsmenge SO(3) in die Zielmenge C der komplexen Zahlen abbilden. Diese Funktionen sind also von der Form f : SO(3) → C. In Abschnitt 1.1, Satz 1.5, wurde mittels der Eulerwinkelzerlegung bereits ein Koordinatensystem definiert, in welchem mit solchen Funktionen gearbeitet werden kann. Über dem Körper C ist das Tripel ({f : SO(3) → C}, +, 0) ein Vektorraum. Von besonderem Interesse sind im Folgenden die Wigner-D-Funktionen, welche eine Teilmenge der Funktionen f : SO(3) → C bilden. Um diese zu definieren, folgt zunächst die Definition der Wigner-dFunktionen, mit deren Hilfe dann die Wigner-D-Funktionen definiert werden. Definition 1.6 ([Kostelec und Rockmore, 2008, S. 156]). Die Wigner-d-Funktionen sind mit (α,β) Hilfe der Jacobi-Polynome Pn m, m0 : [−1, 1] → R [Edmonds, 1996, S. 57ff.] für l ∈ N0 und = −l, . . . , l definiert als s dlm,m0 (β) := ξm,m0 (2l + 1)s!(s + u + v)! 2(s + u)!(s + v)! β u β v (u,v) sin cos Ps (cos β), 2 2 mit 0 ≤ β ≤ π, wobei u := |m − m0 |, v := |m + m0 |, s := l − (u + v)/2 und ξm,m0 1 := (−1)m0 −m wenn m0 ≥ m, wenn m0 < m gilt. Definition 1.7 ([Kostelec und Rockmore, 2008, S. 155]). Die Wigner-D-Funktionen sind mittels der Wigner-d-Funktionen definiert als l Dm,m 0 (α, β, γ) := 1 −imα l 0 e dm,m0 (β)e−im γ , 2π mit l ∈ N0 und |m|, |m0 | ≤ l. 0 ≤ β ≤ π, 0 ≤ α, γ < 2π, 6 Mathematische Theorie l 0 Für die Wigner-D-Funktionen gilt {Dm,m 0 | l ∈ N0 , |m|, |m | ≤ l} ⊂ {f : SO(3) → C}, d.h. diese Funktionen bilden von der Rotationsgruppe in die komplexen Zahlen ab und können daher in dem in Satz 1.5 für diese Funktionen definierten Koordinatensystem verwendet werden. Nun wird mittels der Wigner-D-Funktionen ein Untervektorraum von {f : SO(3) → C} erzeugt. Definition 1.8. Die lineare Hülle der Menge aller Wigner-D-Funktionen bis zu einem gegebenen Grad B spannt über dem Körper C einen Vektorraum HB auf, welcher definiert ist als n o l 0 HB := span Dm,m 0 l < B, |m|, |m | ≤ l . Die Menge HB ist per Definition ein Untervektorraum von {f : SO(3) → C}. Es stellt sich heraus, dass die Wigner-D-Funktionen bis zum Grad B eine Orthonormalbasis (ONB) von HB bilden. Um dies zu begründen, wird der Begriff der Länge und des Winkels für diese Funktionen und somit ein Skalarprodukt der Form h·, ·i : HB × HB → C und die dazugehörige Norm k · k = p h·, ·i benötigt. Ein solches Skalarprodukt ist wie folgt definiert. Definition 1.9 ([Kostelec und Rockmore, 2008, S. 148]). Es seien f, g ∈ HB zwei beliebige Funktionen. Das Skalarprodukt dieser beiden Funktionen ist definiert als Z2π Zπ Z2π (1) hf, gi := f (α, β, γ)g(α, β, γ) sin β dγ dβ dα, 0 0 0 wobei g das komplex Konjugierte von g bezeichnet. Der Vektorraum HB ist zusammen mit dem in Definition 1.9 definierten Skalarprodukt ein Prähilbertraum. Weiterhin erfüllen die Wigner-D-Funktionen folgende Orthonormalitätsrelation. l Satz 1.10 ([Kostelec und Rockmore, 2008, S. 149]). Die Menge der Funktionen {Dm,m 0 | l < B, |m|, |m0 | ≤ l} bildet ein System von orthonormalen Funktionen bezüglich des Skalarproduktes (1), d.h. (2) D E l1 l2 Dm , D = δl1 ,l2 δm1 ,m2 δm01 ,m02 0 0 m2 ,m 1 ,m 1 2 für l1 , l2 < B ∈ N und |m1 |, |m01 | ≤ l1 sowie |m2 |, |m02 | ≤ l2 , wobei δ das Kronecker-DeltaSymbol bezeichnet. Wigner-D-Funktionen 7 Somit bilden die Wigner-D-Funktionen bis zum Grad B eine ONB für HB . Diese Eigenschaft ist wichtig, da die Orthonormalität dieser Funktion es nun ermöglicht, die eindeutige Fourier-Darstellung einer Funktion f ∈ HB zu bestimmen, indem die Skalarprodukte der l 0 Funktion f mit den Elementen der Basis {Dm,m 0 | l < B, |m|, |m | ≤ l}, die sogenannten Fourier-Koeffizienten von f , berechnet werden (siehe auch Abschnitt 1.3). Abschließend werden zusätzliche Eigenschaften der Wigner-d-Funktionen genannt. Die Jacobi-Polynome gehören zu den Orthogonalpolynomen. Eine Eigenschaft, welche diese Orthogonalpolynome besitzen, ist, dass jedes Orthogonalpolynom eine Drei-Term-Rekursion erfüllt. Da die Wigner-d-Funktionen die Jacobi-Polynome als Faktor enthalten (vgl. Definition 1.6), erfüllen auch diese Funktionen eine Drei-Term-Rekursion. Satz 1.11 ([Kostelec und Rockmore, 2008, S. 157]). Die Wigner-d-Funktionen erfüllen die Drei-Term-Rekursion dl+1 m,m0 (β) mm0 =p cos β − dlm,m0 (β) l(l + 1) ((l + 1)2 − m2 )((l + 1)2 − m02 ) (l + 1)(2l + 1) p (l + 1) (l2 − m2 )(l2 − m02 ) − p dl−1 m,m0 (β) 2 2 2 02 l ((l + 1) − m )((l + 1) − m ) für l > 1, |m|, |m0 | ≤ l, wobei die folgenden Basisfälle die Rekursion initialisieren: dll,m (β) dl−l,m (β) dlm,l (β) dlm,−l (β) s (2l + 1)(2l)! 2(l + m)!(l − m)! β l+m β l−m cos − sin , 2 2 s (2l + 1)(2l)! 2(l + m)!(l − m)! β l−m β l+m cos sin , 2 2 s (2l + 1)(2l)! 2(l + m)!(l − m)! β l+m β l−m cos sin , 2 2 s (2l + 1)(2l)! 2(l + m)!(l − m)! β l−m β l+m cos − sin . 2 2 = = = = Zusätzlich weisen diese Funktionen auch besondere Symmetrieeigenschaften auf [Edmonds, 1996, S. 59f.]. Diese Symmetrien sind gegeben durch 0 dlm,m0 (β) = (−1)m−m dl−m,−m0 (β) m−m0 = (−1) 0 dlm0 ,m (β) = (−1)l−m dl−m,m0 (π − β) (3) 8 Mathematische Theorie = (−1)l+m dlm,−m0 (π − β) 0 = (−1)l−m dl−m0 ,m (π − β) = (−1)l+m dlm0 ,−m (π − β) = dl−m0 ,−m (β) für l ∈ N0 und |m|, |m0 | ≤ l. 1.3 Diskrete Fourier-Transformation auf SO(3) (DSOFT) und diskrete inverse Transformation (iDSOFT) Es sei B ∈ N gegeben. Der in Abschnitt 1.2 definierte Vektorraum HB und das dazugehörige Skalarprodukt h·, ·i ermöglichen es nun, für Funktionen h ∈ HB eine eindeutige FourierDarstellung anzugeben, welche durch (4) h= B−1 X l l X X l ĥlm,m0 Dm,m 0 l=0 m=−l m0 =−l gegeben ist [Koecher, 1997, S. 159]. Die Menge {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} sind die Fourier-Koeffizienten der Funktion h. Unter Nutzung der Eigenschaften des Skalarprodukts und der Orthonormalität der Wigner-D-Funktionen folgt sofort D E l h, Dm,m = 0 *B−1 j j X X X + j l ĥjk,k0 Dk,k 0 , Dm,m0 j=0 k=−j k0 =−j (5) = B−1 X j j X X D E j l ĥjk,k0 Dk,k = ĥlm,m0 0 , Dm,m0 j=0 k=−j k0 =−j für l < B, |m|, |m0 | ≤ l. In (5) wird die Orthonormalität der Wigner-D-Funktionen gel 0 nutzt, wodurch das Skalarprodukt einer Funktion aus {Dm,m 0 | l < B, |m|, |m | ≤ l} mit sich selbst 1 und 0 sonst ergibt. Das heißt, es wird mittels des Skalarproduktes von h und den Wigner-D-Funktionen, welche eine ONB des HB sind, eine Zerlegung der Funktion h bestimmt, sodass die Linearkombination der durch die entsprechenden Fourier-Koeffizienten skalierten Wigner-D-Funktionen die Funktion h erzeugt. Aus der Orthornormalitätsrelation (2) folgt für alle l ≥ B, |m|, |m0 | ≤ l, sofort ĥlm,m0 = 0. Diskrete Fourier-Transformation auf SO(3) (DSOFT) und diskrete inverse 9 Transformation (iDSOFT) Daher nennt man Funktionen h ∈ HB auch bandbegrenzt mit der Bandbegrenzung B (vgl. [Kostelec und Rockmore, 2008, S. 151]). Aus (1) und (5) folgt nun: Folgerung 1.12 (vgl. [Kostelec und Rockmore, 2008, S. 149]). Es sei h ∈ HB . Dann sind die Fourier-Koeffizienten {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} gegeben durch ĥlm,m0 Z2π Zπ Z2π = 0 0 l h(α, β, γ)Dm,m 0 (α, β, γ) sin β dγ dβ dα 0 für l < B, |m|, |m0 | ≤ l. Die bijektive Abbildung von h nach {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} wird im Folgenden als Fourier-Transformation auf SO(3) (SOFT) bzw. in Rückrichtung als inverse Fourier-Transformation auf SO(3) (iSOFT) bezeichnet. Um die Integrale aus Folgerung 1.12 mittels eines Computers zu berechnen, müssen diese durch endliche Summen ersetzt, d.h. diskretisiert werden. Daher muss die Funktion h auf einem endlichen Gitter abgetastet werden. Im Bezug auf Folgerung 1.12 bedeutet dies, dass die endlichen Summen, welche die Integrale ersetzen, die Form X X X l 0 0 0 w(α0 , β 0 , γ 0 )h(α0 , β 0 , γ 0 )Dm,m 0 (α , β , γ ), α0 ∈Xα β 0 ∈Xβ γ 0 ∈Xγ haben, wobei w eine Gewichtungsfunktion ist und X = Xα × Xβ × Xγ ⊂ SO(3) ein dreidimensionales Gitter bezeichnet, bei dem Xα , Xβ , Xγ die Abtastpunkte im Gitter entlang der α- bzw. β-, bzw. γ-Achse sind (vgl. Satz 1.5). Für Funktionen h ∈ HB kann nun eine Gewichtungsfunktion w mit einem Gitter X für die exakte Berechnung der Fourier-Koeffizienten von h definiert werden. Entlang der α-, βund γ-Achse wird die Funktion h in äquidistanten Schritten abgetastet: Definition 1.13 ([Kostelec und Rockmore, 2008, S. 151]). Es sei h ∈ HB . Dann ist die Menge der Abtastpunkte des Gitters X = XB definiert als XB := 2πj1 π(2k + 1) 2πj2 R , , = 2B 4B 2B Rz 2πj1 π(2k + 1) 2πj2 Ry Rz 2B 4B 2B 0 ≤ j1 , j2 , k < 2B ⊂ SO(3) (vgl. Satz 1.4 und 1.5). Die zu XB zugehörige Gewichtungsfunktion w = wB kann nun wie folgt definiert werden: 10 Mathematische Theorie Definition 1.14 ([Kostelec und Rockmore, 2008, S. 151]). Die Gewichtungsfunktion wB ist definiert als 2 w(R(j1 , k, j2 )) = wB (k) := sin B π(2k + 1) 4B B−1 X j=0 1 sin 2j + 1 π(2j + 1)(2k + 1) 4B für R(j1 , k, j2 ) ∈ XB . Diese Teile können nun zusammengesetzt werden, um die Fourier-Koeffizienten {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} aus Folgerung 1.12 mittels endlicher Summen exakt zu bestimmen. Theorem 1.15 ([Kostelec und Rockmore, 2008, S. 151]). Es sei h ∈ HB . Dann können die Fourier-Koeffizienten {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} mittels ĥlm,m0 (6) = π 2 2B−1 X 2B−1 X 2B−1 X B j1 =0 j2 =0 k=0 2πj1 π(2k + 1) 2πj2 wB (k) h , , 2B 4B 2B × l Dm,m 0 2πj1 π(2k + 1) 2πj2 , , 2B 4B 2B für l < B, |m|, |m0 | ≤ l, berechnet werden. Die Berechnung der Fourier-Koeffizienten mittels der endlichen Summen in Theorem 1.15 wird im Folgenden als diskrete Fourier-Transformation auf SO(3) (DSOFT) bezeichnet. Die Rekonstruktion der Funktion h an den entsprechenden Stützstellen aus den Fourier-Koeffizienten {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} mittels (4) wird dementsprechend als inverse diskrete Fourier-Transformation auf SO(3) (iDSOFT) bezeichnet. 1.4 Schnelle Fourier-Transformation auf SO(3) (SOFFT) und schnelle inverse Transformation (iSOFFT) Im Folgenden sei wieder B ∈ N gegeben. Eine mit B bandbegrenzte Funktion h ∈ HB besitzt B(4B 2 −1)/3 Fourier-Koeffizienten [Kostelec und Rockmore, 2008, S. 164]. Die drei Summen in (6) benötigen O(B 3 ) Operationen um einen dieser Koeffizienten zu berechnen. Setzt man diese Teile zusammen, so benötigt man bei einer naiven Berechnung der FourierKoeffizienten mittels der DSOFT insgesamt O(B 6 ) Operationen. Durch Umsortieren der Summanden kann die Anzahl der benötigten Operationen verringert werden. Diese Technik wird in [Kostelec und Rockmore, 2008, S. 152] als Separation der Variablen bezeichnet. Zunächst werden dabei die Wigner-D-Funktionen durch ihre Darstellung von Exponential-Termen und der Wigner-d-Funktion ersetzt (vgl. Definition 1.7). Schnelle Fourier-Transformation auf SO(3) (SOFFT) und schnelle inverse 11 Transformation (iSOFFT) Anschließend wird die Reihenfolge der Summanden verändert. Gleichung (6) hat dann die Form: ĥlm,m0 2B−1 2B−1 2B−1 π X π(2k + 1) X im0 2πj2 X im 2πj1 l 2B = w (k)d e e 2B 0 B m,m (2B)2 4B j2 =0 k=0 j1 =0 2πj1 π(2k + 1) 2πj2 ×h , , , 2B 4B 2B mit l < B, |m|, |m0 | ≤ l. Eine vereinfachte Darstellung dieser Summen ist wie folgt gegeben: 2B−1 1 X 2πj1 π(2k + 1) 2πj2 im 2πj1 S1 (k, m, j2 ) := h , , e 2B , 2B 2B 4B 2B |m| < B (7) j1 =0 2B−1 1 X 0 2πj2 S2 (k, m, m ) := S1 (k, m, j2 )eim 2B , 2B 0 |m|, |m0 | < B (8) j2 =0 ĥlm,m0 = π 2B−1 X wB (k)dlm,m0 k=0 π(2k + 1) S2 (k, m, m0 ), |m|, |m0 | ≤ l < B. (9) 4B Die Summen S1 und S2 können nun für festes k und j2 , bzw. festes k und m, mit jeweils O(B log B) Operationen mittels einer schnellen Fourier-Transformation (FFT) berechnet werden [Cormen et al., 2009, S. 901]. Durch zweifache Anwendung der inversen schnellen Fourier-Transformation (iFFT) kann aus den Summen S2 die Funktion h an den entsprechenden Stützstellen mit O(B log B) Operationen rekonstruiert werden [Cormen et al., 2009, S. 913]. Die Berechnung der Summen (9) wird wie folgt bezeichnet. Definition 1.16 ([Kostelec und Rockmore, 2008, S. 153]). Für gegebene Ordnungen m und m0 mit |m|, |m0 | < B ist die diskrete Wigner-d-Transformation (DWT) definiert als die Berechnung von [v̂m,m0 ]l := π 2B−1 X wB (k)dlm,m0 k=0 π(2k + 1) [v]k 4B (10) 0 für max{|m|, |m0 |} ≤ l < B, wobei v̂ ∈ C2B−max{|m|,|m |} der transformierte Vektor des Eingangsvektors v ∈ C2B ist. Für gegebene m und m0 benötigt die DWT O(B 2 ) Operationen zur Berechnung aller ĥlm,m0 , l = max{|m|, |m0 |}, . . . , B − 1. Zusammen mit den oben genannten FFTs ergibt dies nun eine Anzahl von insgesamt O(B 4 ) Operationen für die Berechnung aller {ĥlm,m0 | 12 Mathematische Theorie l < B, |m|, |m0 | ≤ l}. Im Folgenden wird diese Methode zur Berechnung der FourierKoeffizienten als schnelle Fourier-Transformation auf SO(3) (SOFFT) bezeichnet. Sind die Ordnungen m und m0 gegeben, so lässt sich (9) auch als Matrix-Vektor-Produkt einer Matrix Wm,m0 ·G, welche die benötigten gewichteten Wigner-d-Funktionswerte enthält, und einem Datenvektor v schreiben. Satz 1.17 ([Kostelec und Rockmore, 2008, S. 153]). Es seien m und m0 mit |m|, |m0 | < B gegeben, Wm,m0 eine Matrix, welche die Funktionswerte der Wigner-d-Funktionen enthält: π(2k + 1) 0 Wm,m0 := djm,m0 cos ∈ R(B−max{|m|,|m |})×2B , j = max{|m|,|m0 |},...,B−1 4B k = 0,...,2B−1 G eine Diagonalmatrix, auf deren Diagonale die Werte der Gewichtungsfunktion wB stehen: G := diag(wB (0), . . . , wB (2B − 1)) ∈ R2B×2B und v ∈ C2B ein gegebener Eingangsvektor. Dann ist der transformierte Vektor v̂m,m0 ∈ 0 CB−max{|m|,|m |} der DWT gegeben durch das Matrix-Vektor-Produkt v̂ = W · G · v. Der rekonstruierte Eingangsvektor v eines gegebenen transformierten Vektors v̂m,m0 ist dann gegeben durch die inverse diskrete Wigner-d-Transformation (iDWT) als das Matrix-VektorProdukt v = W T · v̂. Bei der Berechnung der SOFFT enthält der Vektor v̂ die Fourier-Koeffizienten {ĥlm,m0 | l = max{|m|, |m0 |}, . . . , B − 1} der Funktion h, (11) max{|m|,|m0 |}+1 max{|m|,|m0 |} T B−2 v̂ = ĥB−1 , ĥ , . . . , ĥ , ĥ , 0 0 0 0 m,m m,m m,m m,m für gegebene Ordnungen m, m0 mit |m|, |m0 | < B. Mittels der iDWT und der iFFT (siehe oben) kann die Funktion h an den entsprechenden Stützstellen aus den Fourier-Koeffizienten {ĥlm,m0 | l < B, |m|, |m0 | ≤ l} ebenfalls in O(B 4 ) Operationen rekonstruiert werden. Dieses Verfahren wird im Folgenden als inverse schnelle Fourier-Transformation auf SO(3) (iSOFFT) bezeichnet. 13 2 Implementierung und Parallelisierung In diesem Kapitel wird die C++-Implementierung der SOFFT und iSOFFT vorgestellt. Dazu werden in Abschnitt 2.1 die implementierten Algorithmen zunächst in Form von Pseudocode dargestellt und zur mathematischen Theorie in Zusammenhang gebracht. Abschnitt 2.2 gibt eine kurze Einführung in Open Multi-Processing (OpenMP), eine Spracherweiterung der Programmiersprachen C, C++ und Fortran zur Parallelisierung von sequentiell implementierten Algorithmen. Anschließend wird in Abschnitt 2.3 die Forster-Methodik eingeführt. Die in Abschnitt 2.2 beschriebenen Konzepte werden dann zusammen mit der ForsterMethodik in Abschnitt 2.4 genutzt, um eine Parallelisierung der Implementierung aus Abschnitt 2.1 vorzunehmen. Abschließend wird in Abschnitt 2.5 die Zeitkomplexität und der Arbeitsaufwand untersucht und die Optimalität der Parallelisierung nachgewiesen. 2.1 Sequentielle SOFFT und iSOFFT Die sequentielle SOFFT sowie die sequentielle iSOFFT sind in Form von Pseudocode als Algorithmus 2.1 bzw. 2.2 dargestellt. Ein Algorithmus wird dann als sequentiell bezeichnet, wenn die Anweisungen, aus welchen sich dieser Algorithmus zusammensetzt, in der vorgegebenen Reihenfolge nacheinander (in einer Sequenz) ausgeführt werden. Es seien nun B ∈ N und h ∈ HB gegeben. Zunächst wird eine genaue Beschreibung der Datentypen gegeben, welche bei der Implementierung der SOFFT/iSOFFT und der Darstellung als Pseudocode verwendet wurden. Mit Hilfe der Abtastpunkte aus Definition 1.13 wird ein Gitter XB definiert, auf welchem die Funktion h abgetastet wird. Dieses Gitter bildet einen geometrischen Würfel, welcher in jeder der drei Dimensionen (α, β, γ) jeweils 2B Abtastpunkte enthält. Im folgenden Pseudocode enthält das dreidimensionale Datenarray G die Funktionswerte von h über dem Gitter XB . Da bei der Implementierung die Ebenen senkrecht zur β-Achse und die Vektoren entlang der β-Achse in G benötigt werden, wird durch die Notation Gk die k-te Ebene senkrecht zur β-Achse und durch Gα0 ,γ 0 der Vektor entlang der β-Achse an der Stelle α0 in α-Richtung und γ 0 in γ-Richtung bezeichnet. Die Notation G(n) bedeutet, dass G ein leeres dreidimensionales Array der Größe n×n×n ist. Neben dem Datenarray G gibt es noch eine weitere Datenstruktur ĥ, in der die Fourier-Koeffizienten von h gespeichert werden. Nun wird der Algorithmus 2.1 genauer untersucht. Entsprechend (7), (8) und (9) erfolgt die Berechnung der Fourier-Koeffizienten durch die SOFFT mehrstufig. Zunächst werden in den Zeilen 10 bis 12 die Summen (7) und (8) für alle k = 0, . . . , 2B − 1 gemäß (9) berechnet. Das heißt, alle Ebenen Gk senkrecht zur β-Achse werden nacheinander in α- und γ-Richtung mittels der FFT transformiert. Die Indizes auf der α- und γ-Achse in G entsprechen nun den 14 Implementierung und Parallelisierung 1 /* 2 * Parameter: 3 * in G - Das Datenarray mit Funktionswerten einer Funktion 4 * in B - Bandbreite 5 * out ĥ - Das Datenarray mit den Fourier-Koeffizienten von 6 */ h ∈ HB h 7 function ĥ = SOFFT(G(2B), B) { β -Achse γ -Achse 8 // Transformiere jede Ebene Gk der 9 // und anschließend entlang der 10 α-Achse for k = 0, . . . , 2B-1 seq do { Transformiere Gk mittels FFT in 11 12 in G mittels FFT entlang der α-Richtung und anschließend in γ -Richtung. } 13 14 // Berechnung der Fourier-Koeffizienten für 15 Berechne aus G0,0 mittels der DWT 16 ĥl0,0 l = 0, . . . , B-1 17 für 18 in ĥ. m = m0 = 0 und speichere diese mit den bereits berechneten Fourier-Koeffizienten 19 20 for m = 1, . . . , B-1 seq do { // Berechne alle Fourier-Koeffizienten, bei welchen eine der Ordnungen gleich 0 ist, 21 22 // oder bei welchen der Betrag beider Ordnungen gleich ist. 23 Berechne aus Gm,0 , G0,m , G−m,0 , G0,−m , Gm,m , G−m,−m , Gm,−m , G−m,m 24 mittels der DWT jeweils 25 26 ĥlm,0 , ĥl0,m , ĥl−m,0 , ĥl0,−m , ĥlm,m , ĥl−m,−m , ĥlm,−m , ĥl−m,m l = m, . . . , B-1 und speichere diese mit den bereits 27 für 28 zienten in ĥ. berechneten Fourier-Koeffi- 29 0 for m = 30 1, . . . , m { 31 // Berechne übrige Fourier-Koeffizienten 32 Berechne aus Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 33 mittels der DWT jeweils 34 35 ĥlm,m0 , ĥlm0 ,m , ĥl−m,−m0 , ĥl−m0 ,−m , ĥlm0 ,−m , ĥlm,−m0 , ĥl−m0 ,m , ĥl−m,m0 l = max{|m|, |m0 |}, . . . , B-1 und speichere diese mit den bereits 36 für 37 Fourier-Koeffizienten in ĥ. } 38 39 berechneten } 40 } Algorithmus 2.1: Sequentielle SOFFT Ordnungen m und m0 . Die Ordnung m stellt den Index in α-Richtung und die Ordnung m0 den Index in γ-Richtung dar. Anschließend wird aus G jeweils ein Vektor Gm,m0 entnommen und mittels der DWT (10) wie in Satz 1.17 beschrieben in einen Vektor transformiert, welcher wie in (11) die Fourier-Koeffizienten von h enthält. Ist eine der beiden Ordnungen m oder m0 negativ, so wird jeweils von 2B − 1 rückwärts gezählt. Sequentielle SOFFT und iSOFFT 15 1 /* 2 * Parameter: 3 * in B - Bandbreite 4 * in ĥ - Das Datenarray mit den Fourier-Koeffizienten einer Funktion 5 * out G - Das Datenarray mit Funktionswerten der Funktion 6 */ h ∈ HB h 7 function G = ISOFFT(ĥ, B) { 8 // Ein leeres Datenarray für die Funktionswerte von 9 G = G(2B) h erstellen 10 11 // Berechnung des Datenvektors für 12 l Berechne aus ĥ0,0 , l = 0, . . . , B-1, m = m0 = 0 mittels iDWT den Datenvektor G0,0 . 13 14 for m = 1, . . . , B-1 seq do { 15 // Berechne alle Datenvektoren Gm,m0 , bei welchen eine der Ordnungen 16 // 0 ist, oder bei denen der Betrag beider Ordnungen gleich ist. 17 Berechne aus l l l l l l l m, m0 gleich l ĥm,0 , ĥ0,m , ĥ−m,0 , ĥ0,−m , ĥm,m , ĥ−m,−m , ĥm,−m , ĥ−m,m , 18 l = m, . . . , B-1, mittels iDWT die entsprechenden Datenvektoren Gm,0 , G0,m , G−m,0 , G0,−m , Gm,m , G−m,−m , Gm,−m , G−m,m . 19 20 21 0 for m = 1, . . . , m { 22 23 // Berechne übrige Datenvektoren Gm,m0 24 Berechne aus l l l l l l 0 l l = max{|m|, |m |}, . . . , B-1, mittels iDWT die entsprechenden Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 . 26 27 Datenvektoren } 28 29 l ĥm,m0 , ĥm0 ,m , ĥ−m,−m0 , ĥ−m0 ,−m , ĥm0 ,−m , ĥm,−m0 , ĥ−m0 ,m , ĥ−m,m0 , 25 } 30 31 // Transformiere jeder Ebene Gk der 32 // anschließend entlang der 33 for k = 0, . . . , 2B-1 seq do { Transformiere Gk mittels iFFT in 34 35 β -Achse in G mittels iFFT entlang der α-Achse und γ -Achse α-Richtung und anschließend in γ -Richtung. } 36 } Algorithmus 2.2: Sequentielle iSOFFT Zur Berechnung der Fourier-Koeffizienten von h werden die Symmetrien der Wigner-dFunktionen (3) genutzt, um die Anzahl der Auswertungen der Wigner-d-Funktionen in der Implementierung zu reduzieren. Dazu laufen die For-Schleifen der Zeilen 20 und 30 jeweils nur die positiven Wertebereiche von m und m0 ab. Die For-Schleife in Zeile 20 berechnet zunächst alle Fourier-Koeffizienten, bei denen eine der beiden Ordnungen m und m0 gleich 0 ist, oder bei denen der Betrag beider Ordnungen gleich ist. Direkt im Anschluss werden in der For-Schleife der Zeile 30 die übrigen Fourier-Koeffizienten berechnet, bis auf diejenigen mit den Ordnungen m = m0 = 0. Aus praktischen Gründen werden diese FourierKoeffizienten in Zeile 15 separat berechnet. 16 Implementierung und Parallelisierung Die iSOFFT kann direkt aus der SOFFT abgeleitet werden und ist in Form von Pseudocode als Algorithmus 2.2 dargestellt. Die DWT wird durch die in Satz 1.17 beschriebene iDWT und die FFT durch die iFFT ersetzt. Zusätzlich wird die Reihenfolge aller Transformationen umgekehrt. Das heißt, es werden aus ĥ in den Zeilen 14 bis 29 zunächst die Fourier- Koeffizienten von h entnommen und mittels der iDWT die entsprechenden FFT-transformierten Funktionswerte von h in den Ebenen Gk berechnet. Anschließend werden in den Zeilen 33 bis 35 mittels der iFFT entlang der α- und anschließend entlang der γ-Achse in den Ebenen Gk die ursprünglichen Funktionswerte von h in G rekonstruiert. Um die FFT bzw. iFFT aus [Cormen et al., 2009, S. 901 bzw. S. 913] zu verwenden, wird stets eine Zweierpotenz als Anzahl der Stützstellen benötigt. Dies impliziert insbesondere, dass die Fourier-Koeffizienten einer Funktion h nur dann berechnet werden können, wenn die Bandbreite B dieser Funktion ebenfalls eine Zweierpotenz ist. Um diese Einschränkung aufzuheben, wurde in der Implementierung auf die FFTW-Library [Frigo und Johnson, 2012] zurückgegriffen. Die FFTW-Library stellt eine FFT-Version mit einer Zeitkomplexität von O(n log n) für eine beliebige Anzahl n von Stützstellen zur Verfügung [Frigo und Johnson, 2012, S. 1]. 2.2 Open Multi-Processing (OpenMP) OpenMP ist eine Spracherweiterung der Programmiersprachen C, C++ und Fortran, mittels welcher Codefragmente vom Compiler parallelisiert werden können [Quinn, 2003, S. 404]. Der Programmierer hat die Möglichkeit, mit Hilfe von Präprozessoranweisungen die entsprechend zu parallelisierenden Codefragmente zu markieren. Die Parallelisierung erfolgt im Gegensatz zu anderen Programmierschnittstellen auf Ebene von Schleifen, während die Parallelisierung durch beispielsweise das Message Passing Interface (MPI) [Quinn, 2003, S. 95] auf Prozessebene erfolgt, wodurch die Berechnungen ganzer Prozesse mittels Nachrichtenaustausch gesteuert werden müssen. Das heißt, jedes parallele Codefragment wird in einem eigenen Prozess gekapselt und ausgeführt. Sofern ein Prozess Daten eines anderen Prozesses benötigt, so wird ein Nachrichtenaustausch zwischen diesen Prozessen durchgeführt. Das Konzept, welches OpenMP zugrunde liegt, wird als das Fork-Join-Modell bezeichnet [Cormen et al., 2009]. Dabei wird ein Programm über den gesamten Ausführungszeitraum betrachtet. Zu jedem Zeitpunkt der Ausführung kann sich die Anzahl der parallel auszuführenden Aktivitäten ändern. Abbildung 2.3 zeigt eine graphische Darstellung dieses Modells. Ein Programm startet in einem Master-Thread und wird sequentiell abgearbeitet, bis ein Fork eingeleitet wird. Eine vorher festgelegte Anzahl von Threads, das so genannte Team, wird erstellt, und jeder Thread erhält ein Arbeitspaket, welches er bearbeitet. Sobald ein Thread mit seiner Arbeit fertig ist, erhält er entweder ein weiteres Arbeitspaket, oder verschmilzt mit dem Master-Thread (Join), sofern keine weiteren Arbeitspakete berechnet werden müssen. Entwurf paralleler Algorithmen mittels Forster-Methodik Sequentieller Teil Start Erster paralleler Teil Zweiter paralleler Teil Innerhalb eines parallelen Pfades finden die Operationen stets sequentiell statt. Es gibt keinen Fork in einem Fork. Ein neuer Fork kann nur nach einem Join aller Teammitglieder erfolgen. Rechenoperation (int a = b + 4;) 17 Ende Abbildung 2.3: Beispiel der Parallelisierung eines Programmablaufs, dargestellt als Fork-Join-Modell. Die Knoten stellen einzelne Berechnungen innerhalb des Programmablaufs dar. Der Pfad, welcher durch die dicken Pfeile gebildet wird, stellt den Master-Thread dar. Parallele Codesegmente werden dort eingeleitet, wo sich der Master-Thread in mehrere Ausführungspfade aufgliedert (Fork) und endet dort, wo sich alle diese Pfade wieder mit dem Master-Thread vereinigt haben (Join). Jeder Pfad eines Forks stellt die sequentielle Berechnung eines Threads dar. Ein Arbeitspaket besteht aus einer Reihe von Berechnungen, welche sequentiell abgearbeitet werden. Der Master-Thread wartet solange mit weiteren Berechnungen, bis alle Threads des Teams ihre Arbeit erledigt haben. Eine Kommunikation zwischen den Threads ist nur durch geteilte Speicherbereiche möglich, weshalb dieses Parallelisierungskonzept nur auf SharedMemory-Architekturen genutzt werden kann. In Shared-Memory-Architekturen verwenden alle Prozessoren denselben Speicher. 2.3 Entwurf paralleler Algorithmen mittels Forster-Methodik Bevor eine Parallelisierung der in Abschnitt 2.1 vorgestellten Algorithmen vorgenommen wird, ist es nötig, einen parallelen Algorithmenentwurf anzufertigen. Zu diesem Zweck wird die so genannte PCAM-Methodik, die in der Literatur häufig auch Forster-Methodik (nach ihrem Erfinder Ian Forster) genannt wird, verwendet. Diese Entwurfsmethodik gliedert sich in die vier Phasen Partitioning, Communication, Agglomeration und Mapping, welche entsprechend ihrer Reihenfolge durchlaufen werden (siehe Abbildung 2.4). Der so entstandene parallele Algorithmus sollte in der Praxis mit einer geringeren Laufzeit berechnet werden können als sein sequentielles Gegenstück. Aufgrund der Eigenschaften eines Mehrprozessorsystems kann dies allerdings nicht bei allen Algorithmen gewährleistet werden. Die genauen Gründe werden später genannt (siehe auch Kapitel 4). Bevor eine detaillierte Beschreibung der einzelnen Phasen erfolgt, wird zunächst der Begriff des Overheads erklärt. Definition 2.1 ([JáJá, 1992, Quinn, 2003, Roosta, 2000]). Die einzelnen, sequentiell arbeitenden Rechenwerke eines Parallelrechners werden im Folgenden als Einheiten bezeichnet. Einheiten müssen bei der Berechnung paralleler Algorithmen explizit oder implizit miteinander kommunizieren. Diese Kommunikation kostet zusätzliche Zeit, die der entsprechende 18 Implementierung und Parallelisierung sequentielle Algorithmus zur Berechnung des ihm zugrunde liegenden Problems nicht benötigt. Die zusätzlich benötigte Zeit, welche durch Kommunikation und zusätzliche Berechnungen anfällt, wird daher als Overhead bezeichnet. Das Ziel einer guten Parallelisierung besteht darin, diesen Overhead so gering wie möglich zu halten. Zu diesem Zweck wurde die Forster-Methodik entwickelt. Die erste der vier Phasen wird als Partitioning bezeichnet. In dieser Phase wird versucht, so viele Daten und Berechnungen wie möglich zu finden, die sich parallelisieren lassen. Diese Daten und Berechnungen werden dabei in kleine Arbeitspakete partitioniert. In OpenMP kann die gewünschte Partitionierung durch die Präprozessoranweisungen #pragma omp par- allel for und #pragma omp parallel sections [The OpenMP Architecture Review Board, 2013, S. 96ff.] angezeigt werden. Im Anschluss an die Partitioning-Phase erfolgt die Communication-Phase. Nach der Identifizierung der Arbeitspakete für ein gegebenes Problem muss eine entsprechende Kommunikation zum Datenaustausch zwischen den Threads, die diese Arbeitspakete bearbeiten, bestimmt werden. Ein direkter Nachrichtenaustausch zwischen Threads ist im OpenMP-Standard nicht vorgesehen, sodass die einzige Möglichkeit der Kommunikation in der Nutzung von geteilten Variablen (shared variables) besteht. Die Direktiven private, lastprivate shared, private, first- und threadprivate [The OpenMP Architecture Review Board, 2013, S. 44ff.] ermöglichen es dem Compiler, Hinweise darauf zu geben, dass zwischen Threads über die angegebenen Variablen kommuniziert wird. Nachdem die Kommunikationswege zwischen den Arbeitspaketen bestimmt wurden, erfolgt die Agglomeration (Ballung). Hier werden mehrere kleinere Arbeitspakete zu größeren Paketen zusammengefasst, um den Verwaltungsaufwand zur Bearbeitung der Arbeitspakete zu verringern. Je besser die Agglomeration von Arbeitspaketen ist, desto geringer ist der Kommunikationsaufwand der größeren Pakete nach der Ballung. Die geringere explizite Kommunikation reduziert den Overhead, was wiederum zu einer geringeren Laufzeit des parallelisierten Algorithmus führt. Bei einer guten Agglomeration sind die resultierenden Pakete ähnlich groß. In OpenMP können dem Compiler Hinweise zur Agglomeration z.B. mittels der Direktiven if (n > 100) oder num_threads(8) [The OpenMP Architecture Review Board, 2013, S. 48] gegeben werden. Eine weitere Möglichkeit, die Agglomeration einer Implementierung zu steuern, besteht darin, kleinere Schleifen sequentiell zu berechnen, oder die Reihenfolge von Schleifen zu ändern, sodass agglomerierte Arbeitspakete direkt nacheinander abgearbeitet werden. Die letzte Phase des parallelen Entwurfs ist das Mapping. Bei der Ausführung des Programms werden die agglomerierten Arbeitspakete freien Einheiten zugeordnet. Optimalerweise sollten alle Einheiten zu jedem Zeitpunkt gleichmäßig ausgelastet sein. Die Umsetzung des Mappings erfolgt in OpenMP z.B. mittels der Anweisung schedule mit den Parametern dyna- Parallelisierung der SOFFT/iSOFFT mittels Forster-Methodik und OpenMP 19 Nebenläufigkeit und Skalierbarkeit Communication ng tioni Parti Problem Agglomeration Mapping Lokalität und Performanz Abbildung 2.4: Schematische Darstellung der PCAM-Methodik nach [Quinn, 2003, S. 65]. Beginnend mit einem Problem wird zunächst eine Partitionierung der Problemstellung in kleinere Arbeitspakete vorgenommen. Im Anschluss wird eine Kommunikation zum Datenaustausch zwischen den Arbeitspaketen definiert. Im vorletzten Schritt werden die verbundenen Arbeitspakete zu größeren Arbeitspaketen geballt, sodass im letzten Schritt mittels des Mappings diese geballten Arbeitspakete auf die Recheneinheiten verteilt werden können. mic, static, guided, auto und runtime [The OpenMP Architecture Review Board, 2013, S. 55ff.]. Während in den Phasen Partitioning und Communication das Hauptaugenmerk darauf liegt, möglichst viel Parallelität im gegebenen Problem zu erkennen, liegt der Fokus der letzten beiden Phasen, Agglomeration und Mapping, darauf, die theoretischen Überlegungen an die gegebenen Betriebsmittel anzupassen. Unter Betriebsmitteln versteht man in diesem Kontext das System, auf welchem der Algorithmus ausgeführt werden soll. Je besser die Partitionierung ist und je weniger explizite Kommunikation notwendig ist, desto besser lässt sich ein Problem parallelisieren und skalieren. In den Phasen der Agglomeration und des Mappings kann durch geschickte Ballung der Arbeitspakete und der optimalen Ausnutzung der vorhandenen freien Einheiten dafür gesorgt werden, dass sich die Kommunikation zwischen Paketen reduziert und sich die Laufzeit des parallelisierten Algorithmus verbessert. Gelingt es beispielsweise, alle kleinen Arbeitspakete, die bei Berechnungen Abhängigkeiten zueinander haben (bei denen die bearbeitenden Threads miteinander kommunizieren müssen), in ein großes Paket zu ballen, so muss nicht mehr explizit kommuniziert werden. Dies wird auch als Lokalität bezeichnet. 2.4 Parallelisierung der SOFFT/iSOFFT mittels Forster-Methodik und OpenMP Alle Erläuterungen dieses Abschnitts beziehen sich auf die SOFFT aus Algorithmus 2.1 bzw. iSOFFT aus Algorithmus 2.2. Gemäß Forster-Methodik wird in der Partitioning-Phase mit 20 Implementierung und Parallelisierung m0 1 B−1 1 Thread 1 mit i = 1, . . . , (B − 2)/n − 1 Thread 2 mit i = (B − 2)/n, . . . , 2(B − 2)/n − 1 m .. . 2 Thread n mit i = (B − 2) /n, . . . , (B − 1)(B − 2)/n − 1 B−1 Abbildung 2.5: Schematische Darstellung der Parallelisierung der äußeren For-Schleife in Algorithmus 2.1, Zeile 20. Der hellblau hinterlegte Bereich markiert die durch beide For-Schleifen abgedeckten Indizes. Die roten Markierungen in m0 -Richtung gliedert die Wertebereiche des Index m in gleichmäßige Bereiche. Jeder Thread erhält bei Beginn der Berechnung einen dieser Bereiche und arbeitet alle Indizes m und m0 innerhalb dieses Bereichs ab. Sofern dieser Thread mit seiner Arbeit fertig ist und noch unbearbeitete Bereiche vorhanden sind, erhält er einen weiteren Bereich, welchen er abarbeitet. Die rot markierten Indexpaarungen auf der Diagonalen sind bereits berechnete Indizes. m0 1 B−1 1 0 T1 : Thread 1 mit j = 1, . . . , m /n − 1 0 0 T2 : Thread 2 mit j = m /n, . . . , 2m /n − 1 . . . m 0 0 Tn : Thread n mit j = (B − 2)m /n, . . . , (B − 1)m /n − 1 B−1 … T1 T2 Tn Abbildung 2.6: Schematische Darstellung der Parallelisierung der inneren For-Schleife in Zeile 30 aus Algorithmus 2.1. Der hellblau hinterlegte Bereich markiert die durch beide For-Schleifen abgedeckten Indizes. Die roten Markierungen in m-Richtung gliedert die Wertebereiche des Index m0 in gleichmäßige Bereiche. Jeder Thread erhält bei Beginn der Berechnung einen dieser Bereiche und arbeitet alle Indizes m und m0 innerhalb dieses Bereichs ab. Sofern dieser Thread mit seiner Arbeit fertig ist und noch unbearbeitete Bereiche vorhanden sind, erhält er einen weiteren Bereich, welchen er abarbeiten kann. Die rot markierten Indexpaarungen auf der Diagonalen sind bereits berechnete Indizes. dem Entwurf einer Parallelisierung begonnen. Da OpenMP, wie bereits in Abschnitt 2.2 erklärt, auf Ebene von For-Schleifen parallelisiert, müssen eben diese im Algorithmus zunächst identifiziert werden. Neben den For-Schleifen in den Zeilen 20 und 30 besteht die Möglichkeit, die DWT, welche durch ein Matrix-Vektor-Produkt beschrieben wird, nebenläufig zu berechnen. Bei der Parallelisierung wurde die DWT aus praktischen Gründen nicht berücksichtigt. Die Gründe dafür werden in Kapitel 4 erläutert. Somit fällt die Entscheidung darauf, die Berechnungen der For-Schleifen in den Zeilen 20 und 30 parallel auszuführen. Um dies Parallelisierung der SOFFT/iSOFFT mittels Forster-Methodik und OpenMP 21 zu bewerkstelligen, werden nun zwei naheliegende Parallelisierungsansätze vorgestellt. Beide dieser Parallelisierungsstrategien weisen Schwachstellen auf, die im späteren Verlauf durch eine Kombination beider Ansätze beseitigt werden. Da in OpenMP keine Hinweise für eine Parallelisierung in einem parallel ausgeführten Codesegment gegeben werden können ( Es ” gibt keinen Fork in einem Fork“, siehe Abbildung 2.3), muss somit eine Entscheidung getroffen werden, welche der beiden For-Schleifen parallelisiert werden soll. Die erste Strategie besteht darin, die äußere For-Schleife (Algorithmus 2.1, Zeile 20) zu parallelisieren. Dies bedeutet, es wird ein Team von Threads initialisiert, auf welches der Indexwertebereich von m gleichmäßig aufgeteilt wird. Die Anweisungen innerhalb der ForSchleife werden für die entsprechenden Indizes sequentiell berechnet. Schematisch entspricht dies Abbildung 2.5. Es ist gut zu sehen, dass der entsprechend hellblau markierte Workload pro Thread unregelmäßig verteilt ist. Die resultierende Parallelisierung kann daher die entsprechende Partitionierung nicht effizient ausnutzen. Die zweite Strategie verfolgt den Ansatz, die innere For-Schleife (Algorithmus 2.1, Zeile 30) zu parallelisieren. Schematisch entspricht dies Abbildung 2.6. Zu sehen ist, dass nun jeder Thread pro Iteration der äußeren For-Schleife gleichmäßig mit Arbeit versorgt wird, wodurch das Problem des vorherigen Ansatzes gelöst wäre. Diese Strategie hat allerdings einen Nachteil. Durch die Parallelisierung der inneren For-Schleife werden die Berechnungen der äußeren For-Schleife bei der Parallelisierung nicht berücksichtigt. Auch hier ist die Partitionierung gröber als möglich. Es wird also eine feinere Partitionierung benötigt, welche dem Compiler mehr Spielraum beim Scheduling der Arbeitspakete einräumt. Da ohne eine explizite Änderung am Algorithmus diese Möglichkeit nicht besteht, wird dazu zunächst eine Umformung des Algorithmus 2.1 vorgenommen. Dieser enthält nach der Umformung keine verschachtelten ForSchleifen mehr, wodurch die Arbeitspakete der Partitionierung wesentlich kleiner sind. Um dies zu erreichen, wird im Folgenden ein geometrischer Lösungsansatz verfolgt, mittels welchem die äußere For-Schleife umgeformt wird. Die dreieckige Form des Indexwertebereichs in den Abbildungen 2.5 und 2.6 indiziert in Algorithmus 2.1 eine direkte Abhängigkeit des Index m0 der For-Schleife in Zeile 30 zum Index m der For-Schleife in Zeile 20. Um diese Abhängigkeit aufzulösen, wird die For-Schleife in drei Schritten umgeformt. Zunächst wird die For-Schleife aus Algorithmus 2.1, Zeile 20 in zwei For-Schleifen aufgeteilt. Die entsprechende Änderung ist in Algorithmus 2.7, Zeile 20 bzw. Zeile 31 zu sehen. Die For-Schleife in Zeile 20 enthält nun die Berechnungen für die Fourier-Koeffizienten, welche vorher in den Zeilen 23 bis 28 in Algorithmus 2.1 berechnet wurden, und die For-Schleife in Zeile 31 die innere For-Schleife aus Algorithmus 2.1, Zeile 30. Im zweiten Schritt wird die Abhängigkeit zwischen den For-Schleifen der Zeilen 31 und 32 in Algorithmus 2.7 aufgelöst. Zu diesem Zweck wird die dreieckige Form des Indexwerte- 22 Implementierung und Parallelisierung 19 for m = 1, . . . , B-1 seq do { 20 21 // Berechne alle Fourier-Koeffizienten, bei welchen eine der Ordnungen gleich 0 ist, 22 // oder bei welchen der Betrag beider Ordnungen gleich ist. 23 Berechne aus Gm,0 , G0,m , G−m,0 , G0,−m , Gm,m , G−m,−m , Gm,−m , G−m,m 24 mittels der DWT jeweils 25 26 ĥlm,0 , ĥl0,m , ĥl−m,0 , ĥl0,−m , ĥlm,m , ĥl−m,−m , ĥlm,−m , ĥl−m,m l = m, . . . , B-1 und speichere diese mit den bereits 27 für 28 zienten in ĥ. berechneten Fourier-Koeffi- } 29 30 for m = 1, . . . , B-1 seq do { 31 0 for m = 32 1, . . . , m { 33 // Berechne übrige Fourier-Koeffizienten 34 Berechne aus Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 35 mittels der DWT jeweils 36 37 ĥlm,m0 , ĥlm0 ,m , ĥl−m,−m0 , ĥl−m0 ,−m , ĥlm0 ,−m , ĥlm,−m0 , ĥl−m0 ,m , ĥl−m,m0 l = max{|m|, |m0 |}, . . . , B-1 und speichere diese mit den bereits 38 für 39 Fourier-Koeffizienten in ĥ. berechneten } 40 } 41 42 } Algorithmus 2.7: Die letzten 24 Zeilen der ersten Umformung von Algorithmus 2.1. Die Zeilen 1 bis 19 sind identisch zu denen in Algorithmus 2.1. Die äußere For-Schleife aus Algorithmus 2.1, Zeile 20 wurde in zwei For-Schleifen aufgeteilt, sodass die neue For-Schleife in Zeile 20 die Berechnungen der FourierKoeffizienten enthält und die zweite For-Schleife in Zeile 31 den Index m für die innere For-Schleife in Zeile 32 zur Verfügung stellt. bereichs in eine rechteckige Form überführt. Dies bedeutet, dass die For-Schleifen nach der Transformation unabhängig voneinander sind. Die geometrische Veranschaulichung dieser Überlegung aus Abbildung 2.8 spiegelt das Vorgehen wider. Der Anschaulichkeit halber wird hierbei die Bandbreite B als ungerade angenommen. Andernfalls sind leichte Anpassungen nötig. Wird der Wertebereich von m in den Abbildungen 2.5 und 2.6 halbiert, so ist leicht zu sehen, dass der untere Teil des gefärbten dreieckigen Wertebereichs der For-Schleifen-Indizes genau der ungefärbten Fläche in der oberen Hälfte des Quadrates entspricht. Daraus lässt sich ableiten, dass die Anzahl der Indexpaarungen von m und m0 im hellblau gefärbten Bereich genau so groß ist wie die Anzahl der Paarungen aller Werte der oberen Hälfte des gesamten Vierecks. Daher ist es möglich, zwei neue voneinander unabhängige Indizes i und j auf die voneinander abhängigen Indizes m und m0 abzubilden. Für die Indizes i und j gilt nun i = 1, . . . , d(B − 1)/2e, j = 1, . . . , B − 1. Mit Hilfe entsprechender Fallunterscheidungen können nun aus allen i und j alle gültigen Paarungen von Werten für m und m0 rekonstruiert werden. Die Umformung ist in Algorithmus 2.9 dargestellt. Parallelisierung der SOFFT/iSOFFT mittels Forster-Methodik und OpenMP 23 3 j = 1, . . . , B − 1 m 1 3 B−1 i = 1, . . . , 2 B−1 2 1 1 B−1 m0 2 B−1 1 B−1 2 −1 2 Abbildung 2.8: Geometrischer Ansatz der For-Schleifen-Optimierung. Die Punkte stellen die jeweiligen Kombinationen der Indizes m und m0 dar. 1 Der dreieckige Indexwertebereich wird zunächst in m-Richtung halbiert. 2 Anschließend wird der Wertebereich der unteren Quadrathälfte um beide Achsen gedreht. 3 Der gespiegelte Bereich füllt nun den leeren Bereich in der oberen Quadrathälfte aus. Der rechteckige Bereich, der die obere Quadrathälfte widerspiegelt, kann mittels zweier unabhängiger Indizes i und j mit entsprechenden For-Schleifen abgelaufen werden. Die rot markierten Indexpaarungen auf der Diagonalen sind bereits berechnete Indizes und werden durch eine Indexverschiebung in m0 -Richtung übersprungen. In einem letzten Umformungsschritt werden nun die verschachtelten For-Schleifen mit den Indizes i und j durch eine einzelne For-Schleife ersetzt. Dazu wird die exakte Anzahl der Indexpaarungen für m und m0 benötigt. Aus der dreieckigen Form in den Abbildungen 2.5 und 2.6 lässt sich ableiten, dass die Anzahl der Indizes die Summe der ersten B − 2 Zahlen bildet. Somit kann ein Index k = 0, . . . , (B − 1)(B − 2)/2 − 1 auf die benötigten Indizes i und j und damit auch auf m und m0 abgebildet werden. Die Werte für i und j können nun mittels einer einfachen Division bzw. des dazugehörigen Teilerrests ermittelt werden. Algorithmus 2.10 auf Seite 26 stellt den vollständig umgeformten Algorithmus dar. Da nun ausschließlich einfache For-Schleifen vorhanden sind (Algorithmus 2.10 Zeilen 10, 21 und 33), können diese parallel berechnet werden. Somit ist die Partitionierung abgeschlossen. Die Größe der entstandenen Arbeitspakete entspricht einer Indexpaarung bzw. im Fall der ForSchleife aus Zeile 10 einer Vektorlänge von Gm,m0 und ist daher nahezu minimal. Im Anschluss an die Partitioning-Phase folgt nun die Communication-Phase. Die DWT benötigt außer den Ordnungen m und m0 , welche als jeweilige Indexpaarung in den Arbeitspaketen enthalten sind, keine weiteren Daten der anderen Berechnungen. Es ist folglich keine 24 Implementierung und Parallelisierung 30 for i = 31 1, . . . , d(B-1)/2e seq do { for j = 1, . . . , B-1 seq do { 32 33 // rekonstruiere 34 if (j > i) { 35 m = B - i 36 m = B - j m und m0 0 } else { 37 38 m = i + 1 39 m = j 0 40 } 41 // Berechne übrige Fourier-Koeffizienten 42 Berechne aus Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 43 mittels der DWT jeweils 44 45 ĥlm,m0 , ĥlm0 ,m , ĥl−m,−m0 , ĥl−m0 ,−m , ĥlm0 ,−m , ĥlm,−m0 , ĥl−m0 ,m , ĥl−m,m0 l = max{|m|, |m0 |}, . . . , B-1 und speichere diese mit den bereits 46 für 47 Fourier-Koeffizienten in ĥ. berechneten } 48 } 49 50 } Algorithmus 2.9: Die letzten 21 Zeilen der zweiten Umformung von Algorithmus 2.1. Die Zeilen 1 bis 30 sind identisch zu denen in Algorithmus 2.7. Die beiden For-Schleifen in den Zeilen 31 und 32 aus Algorithmus 2.7 wurden durch zwei unabhängige For-Schleifen ersetzt. Im Schleifenrumpf werden vor der Berechnung der Fourier-Koeffizienten die Indizes m und m0 rekonstruiert. explizite Kommunikation nötig. Die Datenstrukturen ĥ und G sind geteilte Datenstrukturen. In der späteren Implementierung erfolgt der Zugriff durch die entsprechenden Einheiten exklusiv, d.h. jede Einheit liest und schreibt ausschließlich in eigenen Bereichen innerhalb dieser Datenstrukturen. Es gibt also keine Überschneidung dieser Bereiche zwischen den Einheiten und somit ist auch hier keine Kommunikation nötig. Algorithmen dieser Art werden als exclusive read exclusive write (EREW) bezeichnet [JáJá, 1992, S. 15]. Die vorletzte Phase des Entwurfs ist die Agglomeration-Phase. Da OpenMP für die Parallelisierung verwendet wird, besteht die einzige Möglichkeit der Agglomeration darin, die Parallelisierung erst ab einer bestimmten Problemgröße vorzunehmen. Weitere Erläuterungen dazu folgen in Kapitel 4. Zuletzt erfolgt die Mapping-Phase. Da die Arbeitspakete sehr klein sind, wird mit Hilfe von OpenMP jede Iteration der For-Schleifen aus Algorithmus 2.10 in den Zeilen 10, 21 und 33 nebenläufig berechnet. Zusätzlich dazu wird dem Compiler ein dynamisches Scheduling angezeigt. Dazu wird die OpenMP-Direktive schedule(dynamic) [The OpenMP Architecture Review Board, 2013, S. 57] genutzt. Der parallele Algorithmus skaliert mit variierender Problemgröße und Anzahl der vorhandenen Einheiten sehr gut. Der Grund dafür ist die nahezu minimale Größe der Arbeitspakete und die nicht notwendige explizite Kommunikation. Die geringe Kommunikation führt Analyse der Parallelisierung 25 wiederum zu einer hohen Lokalität der Daten. Die feine Granularität der Partitionierung in Arbeitspakete macht es dem Compiler darüber hinaus sehr einfach, ein gutes Scheduling für die Bearbeitung dieser Arbeitspakete zu finden. Wie in Abschnitt 2.1 beschrieben, kann die iSOFFT direkt aus der SOFFT abgeleitet werden, indem die DWTs durch iDWTs und FFTs durch iFFTs ersetzt werden und die Reihenfolge der For-Schleifen umgekehrt wird. Dies trifft ebenfalls auf die parallelisierte SOFFT zu. Somit folgt aus Algorithmus 2.10 direkt die parallelisierte iSOFFT, dargestellt in Algorithmus 2.11 auf Seite 27. Die Eigenschaften dieses Algorithmus bezüglich Nebenläufigkeit, Skalierbarkeit, Lokalität und Performanz sind identisch zu denen der parallelisierten SOFFT. 2.5 Analyse der Parallelisierung Um die Parallelisierung aus Abschnitt 2.4 zu analysieren, werden im Folgenden die Begriffe des Speedup, der Effizienz, der Laufzeit und der Optimalität paralleler Algorithmen eingeführt. Im Anschluss daran wird die Güte der Parallelisierung mit Hilfe einiger dieser Maße bewertet. Der Speedup und die Effizienz werden in Kapitel 4 genutzt. Definition 2.2 ([JáJá, 1992, Quinn, 2003, Roosta, 2000]). Die Rechenzeit eines parallelen Algorithmus A bei einer Eingabe x und genau p Einheiten wird mit TpA (x) bezeichnet. Die Rechenzeit TpA (n) bezeichnet die maximale Rechenzeit von A über allen Eingaben x der Länge n. Da die genaue Anzahl der später verwendeten Einheiten häufig nicht bekannt ist, werden Algorithmen in der Theorie unter der Annahme, eine unbegrenzte Anzahl von Einheiten sei verfügbar, analysiert. Stehen für die Berechnung eines parallelen Algorithmus unbegrenzt viele Einheiten zur Verfügung, so kann die Zeitkomplexität dieses Algorithmus nicht schlechter sein, als die Berechnung mit einer vorher festgelegten Anzahl von Einheiten. Definition 2.3 ([JáJá, 1992, Quinn, 2003, Roosta, 2000]). Die Rechenzeit eines parallelen Algorithmus A, der beliebig viele Einheiten verwenden darf, wird mit A T∞ (n) := inf TpA (n) p∈N bezeichnet. Neben der parallelen Rechenzeit eines Algorithmus für ein gegebenes Problem wird im Folgenden die sequentielle Rechenzeit dieses Algorithmus als Maßstab genutzt. Definition 2.4 ([JáJá, 1992]). Die Zeitkomplexität des schnellsten (in der Regel unbekannten) sequentiellen Algorithmus A zur Lösung eines Problems mit Eingaben der Länge n wird im Folgenden mit T A,∗ (n) bezeichnet. 26 Implementierung und Parallelisierung 1 /* 2 * Parameter: 3 * in G - Das Datenarray mit Funktionswerten einer Funktion 4 * in B - Bandbreite 5 * out ĥ - Das Datenarray mit den Fourier-Koeffizienten von 6 */ h ∈ HB h 7 function ĥ = SOFFT(G(2B), B) { β -Achse γ -Achse 8 // Transformiere jede Ebene Gk der 9 // und anschließend entlang der 10 α-Achse for k = 0, . . . , 2B-1 par do { Transformiere Gk mittels FFT in 11 12 in G mittels FFT entlang der α-Richtung und anschließend in γ -Richtung. } 13 14 // Berechnung der Fourier-Koeffizienten für 15 Berechne aus G0,0 mittels der DWT 16 ĥl0,0 l = 0, . . . , B-1 17 für 18 in ĥ. m = m0 = 0 und speichere diese mit den bereits berechneten Fourier-Koeffizienten 19 20 // Berechnung der Fourier-Koeffizienten mit $m=0$, $m'=0$ oder 21 for m = 1, . . . , B-1 par do { |m| = |m0 | // Berechne alle Fourier-Koeffizienten, bei welchen eine der Ordnungen gleich 0 ist, 22 23 // oder bei welchen der Betrag beider Ordnungen gleich ist. 24 Berechne aus Gm,0 , G0,m , G−m,0 , G0,−m , Gm,m , G−m,−m , Gm,−m , G−m,m 25 mittels der DWT jeweils 26 27 ĥlm,0 , ĥl0,m , ĥl−m,0 , ĥl0,−m , ĥlm,m , ĥl−m,−m , ĥlm,−m , ĥl−m,m l = m, . . . , B-1 und speichere diese mit den bereits 28 für 29 zienten in ĥ. 30 berechneten Fourier-Koeffi- } 31 32 // Berechnung aller übrigen Fourier-Koeffizienten 33 for k = 0, . . . , (B-1)(B-2)/2-1 par do { m und m0 34 // Rekonstruiere 35 if (k % (B-1) + 1 > k / (B-1) + 1) { 36 m = B - k / (B-1) + 1 37 m = B - k % (B-1) + 1 0 } else { 38 39 m = k / (B-1) + 2 40 m = k % (B-1) + 1 0 41 } 42 // Berechne übrige Fourier-Koeffizienten 43 Berechne aus Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 44 mittels der DWT jeweils 45 46 ĥlm,m0 , ĥlm0 ,m , ĥl−m,−m0 , ĥl−m0 ,−m , ĥlm0 ,−m , ĥlm,−m0 , ĥl−m0 ,m , ĥl−m,m0 l = max{|m|, |m0 |}, . . . , B-1 und speichere diese mit den bereits 47 für 48 Fourier-Koeffizienten in ĥ. 49 } 50 } Algorithmus 2.10: Parallelisierte SOFFT berechneten Analyse der Parallelisierung 1 /* 2 * Parameter: 3 * in 4 * in ĥ - Das Datenarray mit den Fourier-Koeffizienten einer Funktion 5 * out G - Das Datenarray mit Funktionswerten der Funktion 6 */ B - Bandbreite h ∈ HB h 7 function G = ISOFFT(ĥ, B) { 8 // Ein leeres Datenarray für die Funktionswerte von 9 G = G(2B) h erstellen 10 11 // Berechnung des Datenvektors für 12 l Berechne aus ĥ0,0 , l = 0, . . . , B-1, m = m0 = 0 mittels iDWT den Datenvektor G0,0 . 13 14 // Berechnung der Fourier-Koeffizienten mit $m=0$, $m'=0$ oder $|m|=|m'|$ 15 for m = 1, . . . , B-1 par do { 16 // Berechne alle Datenvektoren Gm,m0 , bei welchen eine der Ordnungen 17 // 0 ist, oder bei denen der Betrag beider Ordnungen gleich ist. 18 Berechne aus l l l l l l gleich l ĥm,0 , ĥ0,m , ĥ−m,0 , ĥ0,−m , ĥm,m , ĥ−m,−m , ĥm,−m , ĥ−m,m , 19 l = m, . . . , B-1, mittels iDWT die entsprechenden Datenvektoren Gm,0 , G0,m , G−m,0 , G0,−m , Gm,m , G−m,−m , Gm,−m , G−m,m . 20 21 22 l m, m0 } 23 24 // Berechnung aller übrigen Fourier-Koeffizienten 25 for k = 0, . . . , (B-1)(B-2)/2-1 par do { m und m0 26 // Rekonstruiere 27 if (k % (B-1) + 1 > k / (B-1) + 1) { 28 m = B - k / (B-1) + 1 29 m = B - k % (B-1) + 1 0 } else { 30 31 m = k / (B-1) + 2 32 m = k % (B-1) + 1 0 33 } 34 // Berechne übrige Datenvektoren Gm,m0 35 Berechne aus l l l l l l l 0 l = max{|m|, |m |}, . . . , B-1, mittels iDWT die entsprechenden Gm,m0 , Gm0 ,m , G−m,−m0 , G−m0 ,−m , Gm0 ,−m , Gm,−m0 , G−m0 ,m , G−m,m0 . 37 38 39 l ĥm,m0 , ĥm0 ,m , ĥ−m,−m0 , ĥ−m0 ,−m , ĥm0 ,−m , ĥm,−m0 , ĥ−m0 ,m , ĥ−m,m0 , 36 Datenvektoren } 40 41 // Transformiere jeder Ebene Gk der 42 // anschließend entlang der 43 for k = 0, . . . , 2B-1 par do { Transformiere Gk mittels iFFT in 44 45 β -Achse in G mittels iFFT entlang der α-Achse γ -Achse α-Richtung und anschließend in } 46 } Algorithmus 2.11: Parallelisierte iSOFFT γ -Richtung. und 27 28 Implementierung und Parallelisierung Wie bereits in [Kostelec und Rockmore, 2008, S. 153] beschrieben, besteht die Möglichkeit, die DWT mittels einer schnellen diskreten Polynom-Transformation [Driscoll et al., 1997] mit einer Zeitkomplexität von O(B log2 B) zu berechnen. Ersetzt man in der SOFFT die DWT durch diese schnelle diskrete Polynom-Transformation, so sinkt die Zeitkomplexität des gesamten Algorithmus von O(B 4 ) auf O(B 3 log2 B). Somit hat diese modifizierte SOFFT die kleinste bekannte Zeitkomplexität zur Berechnung der Fourier-Koeffizienten von Funktionen f ∈ HB . Da sich die Parallelisierung allerdings auf den in Abschnitt 1.4 beschriebenen SOFFT bzw. iSOFFT Algorithmus bezieht, wird im Folgenden T SOFFT,∗ (8B 3 ) ∈ O(B 4 ) für die sequentielle SOFFT/iSOFFT angenommen. Beachte, dass in diesem Kontext die Eingabewörter eine Länge von 2B · 2B · 2B = 8B 3 haben. Definition 2.5 ([JáJá, 1992]). Die Arbeit W A (x) eines parallelen Algorithmus A bei einer Eingabe x ergibt sich aus der Summe der Anzahl von (unbegrenzt verfügbaren) Einheiten, welche in jedem Zeitschritt tatsächlich arbeiten. Analog zu der Zeitkomplexität TpA (n) ist die Arbeit W A (n) die maximale Arbeit über allen Eingaben x der Länge n. Um die Güte eines parallelen Algorithmus zu bewerten, werden neben der Zeitkomplexität und der Arbeit dieses Algorithmus die Maße des Speedup und der Effizienz benötigt. Die folgenden Definitionen dieser Maße basieren auf den Definitionen in [JáJá, 1992, Quinn, 2003, Roosta, 2000]. Definition 2.6. Der Speedup SpA (n) eines parallelen Algorithmus A ist definiert als SpA (n) := T A,∗ (n) , TpA (n) wobei n die Länge der Eingaben bezeichnet. Definition 2.7. Die Effizienz EpA (n) eines parallelen Algorithmus A ist definiert als EpA (n) := SpA (n) , p wobei n die Länge der Eingaben bezeichnet. Damit später gezeigt werden kann, dass die Parallelisierung der SOFFT und somit auch der iSOFFT aus Abschnitt 2.4 optimal ist, wird nun der Begriff der Optimalität für parallele Algorithmen definiert. Definition 2.8 ([JáJá, 1992, S. 32]). Ein paralleler Algorithmus A heißt optimal, falls für ihn W A ∈ Θ T A,∗ Analyse der Parallelisierung 29 gilt, wobei Θ(f ) := O(f ) ∩ Ω(f ) mit O(f ) := { g | ∃k > 0 ∃n0 ∈ N ∀n ≥ n0 : g(n) ≤ k · f (n) }, Ω(f ) := { g | ∃k > 0 ∃n0 ∈ N ∀n ≥ n0 : g(n) ≥ k · f (n) } bezeichnet (f und g sind hierbei zwei Laufzeitfunktionen). Anders als bei sequentiellen Algorithmen spielt die Zeitkomplexität TpA in Definition 2.8 keine Rolle beim Begriff der Optimalität. Im Sequentiellen gilt ein Algorithmus erst dann als optimal, wenn die Zeitkomplexität eine untere Schranke für das gegebene Problem ist. In [JáJá, 1992] werden zwei Arten der Optimalität definiert. Um Missverständnisse durch Nutzung des Optimalitätsbegriffs zu vermeiden, wird die Optimalität aus Definition 2.8 auch als Arbeitsoptimalität bezeichnet. Die Arbeit W SOFFT eines parallelen Algorithmus A für ein gegebenes Problem entspricht der Anzahl der Operationen, die alle Einheiten zusammen bei Berechnung von A benötigen. Die Anzahl der Berechnungsschritte zur Lösung desselben Problems mit Hilfe des schnellsten sequentiellen Algorithmus entspricht der Zeitkomplexität T A,∗ . Folglich wird unter Berücksichtigung von Definition 2.8 der parallele Algorithmus A als arbeitsoptimal bezeichnet, wenn die Anzahl der benötigten Berechnungsschritte des parallelen Algorithmus A identisch zu denen der schnellsten bekannten sequentiellen Implementierung ist. Nun kann die parallelisierte SOFFT bzw. iSOFFT mit Hilfe dieser Maße analysiert werden. Zunächst wird T SOFFT (8B 3 ) ∈ O(B 4 ) überprüft, wobei T SOFFT die Laufzeitfunktion der sequentiellen SOFFT bezeichnet. Die Korrektheit des Algorithmus muss nicht explizit gezeigt werden, da diese sich aus der Korrektheit der mathematischen Definition ergibt. In Algorithmus 2.1, Zeilen 10 bis 12 werden 2B ·4B FFTs berechnet. Der geometrische Würfel, welcher durch G dargestellt wird, enthält 2B zur β-Achse senkrechte Ebenen. Jede diese Ebenen enthält jeweils 2B Werte in α- und γ-Richtung. Die entsprechende Ebene wird wie in Abschnitt 2.1 beschrieben jeweils entlang der α- und γ-Achse mittels der FFT transformiert. Die Zeitkomplexität der FFT entlang der genannten Achsen beträgt O(2B log(2B)) Somit ergibt sich für diesen Abschnitt eine Zeitkomplexität von 2 · 2B · 2B · O(2B log(2B)) = O(16B 3 log(2B)) = O(B 3 log B). In Algorithmus 2.1, Zeilen 23 bis 28 werden (B − 2) · 8 DWTs berechnet. Anschließend werden die berechneten Fourier-Koeffizienten in ĥ gespeichert. Eine DWT ist das Produkt einer Matrix und eines Vektors. Da die Wigner-d-Matrix Wm,m0 , welche für die Transformation genutzt wird, die Größe (B − max{|m|, |m0 |}) × 2B hat, ist diese für die Parameter m = m0 = 0 mit B × 2B am größten. Daher wird für die Laufzeitanalyse aller 30 Implementierung und Parallelisierung DWTs die Matrix mit einer Größe von B × 2B abgeschätzt, wodurch eine Zeitkomplexität von O(2B 2 ) = O(B 2 ) für eine DWT entsteht. Das Speichern der Fourier-Koeffizienten kann mit einer linearen Zeitkomplexität in O(B) durchgeführt werden, da der FourierKoeffizienten-Vektor gemäß (11) für m = m0 = 0 genau B Werte enthält. Somit ergibt sich für die Zeilen 23 bis 28 eine Zeitkomplexität von (B − 1) · (8 · O(B 2 ) + 8 · O(B)) = (B − 1) · O(B 2 ) = O(B 3 ). In Algorithmus 2.1, Zeilen 32 bis 37 werden 8·(B −2)(B −1)/2 DWTs berechnet. Anschließend werden die berechneten Fourier-Koeffizienten in ĥ gespeichert. Somit ist die Zeitkomplexität dieser Berechnungen 1 1 (B − 2)(B − 1) · (8 · O(B 2 ) + 8 · O(B)) = (B − 2)(B − 1) · O(B 2 ) = O(B 4 ). 2 2 Um die Zeitkomplexität des gesamten Algorithmus 2.1 zu bestimmen, wird nun die Summe der Komplexitäten aller For-Schleifen zu der Zeitkomplexität der einzelnen DWT in Zeile 15 addiert. Dies ergibt nun eine Zeitkomplexität von T SOFFT,∗ (8B 3 ) ∈ O(B 4 ) + O(B 3 log B) + O(B 3 ) + O(B 2 ) = O(B 4 ). Die berechnete Zeitkomplexität stimmt damit mit der in [Kostelec und Rockmore, 2008] beschriebenen Komplexität überein und wird im Folgenden benutzt, um die Arbeitsoptimalität von Algorithmus 2.10 nachzuweisen. Für die Zeitkomplexität T iSOFFT der iSOFFT gilt nun T SOFFT = T iSOFFT , da wie bereits in Abschnitt 2.1 beschrieben die FFTs durch iFFTs und die DWTs durch iDWTs ersetzt werden und im Anschluss die Reihenfolge der For-Schleifen umgekehrt wird. Bei einer iDWT wird die Wigner-d-Matrix transponiert, daher ist die Zeitkomplexität identisch zu der einer DWT. Die Zeitkomplexität der iFFT entspricht der der FFT. Im nächsten Schritt wird die Zeitkomplexität von Algorithmus 2.10 bestimmt. Die Gesamtlaufzeit setzt sich wieder aus der Zeitkomplexität der drei For-Schleifen, sowie der Berechnung der Koeffizienten für m = m0 = 0 in Zeile 15 zusammen. In Algorithmus 2.10, Zeilen 10 bis 12 werden alle Iteration der For-Schleife von 2B Einheiten gleichzeitig berechnet. Da zunächst eine der Achsen in α-Richtung oder γ-Richtung mittels der FFT transformiert wird und im Anschluss die andere Achse, werden insgesamt nur zwei Zeitschritte pro Iteration für die komplette Transformation der Ebene Gk benötigt. Analyse der Parallelisierung 31 Da jede Ebene Gk , d.h. jede Iteration der For-Schleife, simultan berechnet wird, ergibt dies eine Zeitkomplexität von 2 · O(2B log(2B)) = O(B log B). In Algorithmus 2.10, Zeilen 21 bis 30 werden alle B − 2 Iterationen parallel berechnet. Die Zeitkomplexität um ein Matrix-Vektor-Produkt parallel zu berechnen beträgt O(log n) [JáJá, 1992, S. 12]. In der Implementierung wurde auf eine Parallelisierung des Matrix-VektorProdukts verzichtet. Die Gründe dafür werden in Kapitel 3 genannt. Das Speichern der Fourier-Koeffizienten in ĥ kann mit B Einheiten in einem Zeitschritt erfolgen. Somit ergibt sich für diese For-Schleife eine Laufzeit von 8 · O(log B) + 8 = O(log B). In Algorithmus 2.10, Zeilen 33 bis 49 werden alle (B − 2)(B − 1)/2 Iterationen der ForSchleife parallel berechnet. Analog zur vorherigen For-Schleife werden dort acht DWTs berechnet. Im Anschluss daran werden die B Fourier-Koeffizienten in ĥ von B Einheiten in einem Zeitschritt gespeichert. Dies resultiert ebenfalls in einer Zeitkomplexität von 8 · O(log B) + 8 = O(log B). Insgesamt ergibt dies also zusammen mit der DWT in Algorithmus 2.10 Zeile 15 eine Zeitkomplexität von SOFFT T∞ (8B 3 ) ∈ O(B log B) + 2 · O(log B) + O(log B) = O(B log B). SOFFT Somit gilt T∞ (8B 3 ) ∈ O(B log B). Die ermittelte Zeitkomplexität entspricht der einer sequentiellen FFT. Sofern ein entsprechender paralleler Algorithmus für die FFT verwendet wird, kann die Zeitkomplexität für die parallele SOFFT auf O(log B) bei gleichbleibender Arbeit reduziert werden [JáJá, 1992, S. 384, Theorem 8.5]. In der Implementierung wurde allerdings auf Funktionen aus der FFTWLibrary zurückgegriffen. Diese Library stellt nebenläufige Funktionen zur Berechnung der FFT zur Verfügung. Die Dokumentation liefert allerdings keine Hinweise zur parallelen Zeitkomplexität dieser Algorithmen, sodass für die obere Schranke die Zeitkomplexität einer sequentiellen FFT genutzt wurde. Zuletzt wird gezeigt, dass die parallele SOFFT aus Algorithmus 2.10 arbeitsoptimal ist. Theorem 2.9. Die parallelisierte SOFFT sowie die parallelisierte iSOFFT aus Algorithmus 2.10 bzw. Algorithmus 2.11 sind mit einer Arbeit von W SOFFT (8B 3 ) ∈ O(B 4 ) arbeitsoptimal. 32 Implementierung und Parallelisierung Beweis. Analog zur Laufzeit der parallelen SOFFT wird die Arbeit W SOFFT bestimmt, indem die Arbeit der drei For-Schleifen aus Algorithmus 2.10, Zeilen 10, 21 und 33 sowie die Arbeit für die Berechnung der Fourier-Koeffizienten m = m0 = 0 in Zeile 15 aufsummiert wird. Die For-Schleife in Zeile 10 durchläuft B Iterationen, in denen jeweils 2B Einheiten parallel in zwei Zeitschritten die FFT entlang der α- und γ-Achsen berechnen. Dies ergibt eine Arbeit von B · 2B = 4B 2 = O(B 2 ). In der For-Schleife aus Zeile 21 werden für die Berechnung eines Matrix-Vektor-Produkts in logarithmischer Zeit B 2 Einheiten benötigt. Dies ergibt somit eine Arbeit von O(B 2 ) für eine DWT. Die For-Schleife benötigt B − 1 Iterationen, welche von B − 1 Einheiten parallel berechnet werden. Für das Speichern der resultierenden Fourier-Koeffizienten werden nochmals B Einheiten benötigt. Insgesamt ergibt sich für diese For-Schleife also eine Arbeit von (B − 1)(8 · O(B 2 ) + O(B)) = (B − 1) · O(B 2 ) = O(B 3 ). Für die letze For-Schleife in Zeile 33 werden nun (B −1)(B −2)/2 Iterationen von verschiedenen Einheiten parallel berechnet. Die Arbeit der DWTs und das Speichern der FourierKoeffizienten beträgt weiterhin O(B 2 ) bzw. O(B). Dies führt zu einer Arbeit von 1 1 (B − 1)(B − 2)(8 · O(B 2 ) + O(B)) = (B 2 − 3B + 2) · O(B 2 ) = O(B 4 ). 2 2 Zuletzt muss noch die Summe über die Arbeit der einzelnen Teile sowie die der DWT für die Ordnungen m = m0 = 0 in Zeile 15 gebildet werden: W SOFFT (B) ∈ O(B 4 ) + O(B 3 ) + 2 · O(B 2 ) = O(B 4 ). Es gilt somit W SOFFT (8B 3 ) ∈ O(B 4 ). Da W SOFFT ∈ Θ(T SOFFT,∗ ) mit T SOFFT,∗ ∈ O(B 4 ) gilt, ist dieser Algorithmus optimal. Wie bereits bei der Analyse der Zeitkomplexität beschrieben, ist die Zeit bzw. die Arbeit der SOFFT identisch zu der Zeit bzw. der Arbeit der iSOFFT. Die Arbeitsoptimalität der SOFFT impliziert somit die Arbeitsoptimalität der iSOFFT. 33 3 Numerische Beispiele Die in Kapitel 2 vorgestellte Parallelisierung der SOFFT und iSOFFT wird nun mit Hilfe von verschiedenen Benchmarks getestet. Zu diesem Zweck werden im Folgenden drei Benchmarks präsentiert. Zunächst wird ein Benchmark zur Analyse des Speedup der parallelisierten SOFFT bzw. iSOFFT vorgestellt. Anschließend wird ein Benchmark zur Analyse der Effizienz und zuletzt ein Benchmark zur Rechengenauigkeit der DWT aus Kapitel 1, Abschnitt 1.4, Satz 1.17 beschrieben. Abschließend werden in Abschnitt 3.2 die Ergebnisse dieser Benchmarks dargestellt. 3.1 Benchmark zu Speedup, Effizienz und Rechengenauigkeit Der Speedup-Benchmark misst den Speedup der parallelisierten SOFFT und iSOFFT (vgl. Definition 2.6). Dazu misst der Benchmark die entsprechenden Rechenzeiten und berechnet daraus den Speedup. Benchmark 3.1 zeigt den Messvorgang. Bei der Ausführung dieses Benchmarks werden die Bandbreiten 16, 32, 64 und 128 durchlaufen. Zuerst werden dabei alle benötigten Datenstrukturen erzeugt. Das heißt, für den Messvorgang wird ein Gitter G sowie die Datenstruktur ĥ angelegt. Für jede der Bandbreiten B wird zunächst eine Menge an zufälligen Fourier-Koeffizienten gleichverteilt auf [−1, 1] × [−i, i] generiert. Der Pseudozufallszahlengenerator, welcher für diesen und alle weiteren Benchmarks verwendet wird, ist der Mersenne-Twister MT19937 [Matsumoto und Nishimura, 1998]. Aus der Menge der generierten Fourier-Koeffizienten werden zunächst mit Hilfe der iSOFFT im Gitter G die Funktionswerte der entsprechenden Funktion h ∈ HB rekonstruiert. Im Anschluss daran werden fünf sequentielle SOFFT durchgeführt, wobei die mittlere Laufzeit T SOFFT,∗ bestimmt wird und als Referenz für die Berechnung des Speedup gespeichert wird. Dann wird mit Hilfe eines For-Schleifen-Index p die Anzahl der zu verwendenden Einheiten für die parallele SOFFT gesteuert. Für jede Kombination aus Bandbreite B und Anzahl p an Einheiten wird nun jeweils fünf Mal der SOFFT-Algorithmus ausgeführt. Danach wird der Mittelwert der Laufzeit dieser fünf Durchgänge gebildet. Mit Hilfe der durchschnittlichen Laufzeit der parallelen SOFFT und T SOFFT,∗ kann nun der Speedup SpA (B) berechnet werden. Um die Messungen für die iSOFFT durchzuführen, wird dieser Benchmark umformuliert (siehe Benchmark 3.2). Genau wie beim Speedup-Benchmark für die SOFFT werden beim Benchmark für die iSOFFT zunächst die benötigten Datenstrukturen instanziiert. Daraufhin wird für die aktuelle Bandbreite B ∈ {16, 32, 64, 128} eine Menge an zufälligen FourierKoeffizienten generiert. Aus diesen Fourier-Koeffizienten werden mittels einer sequentiellen iSOFFT die Funktionswerte der entsprechenden Funktion h ∈ HB in G rekonstru- iert. Die mittlere Laufzeit T iSOFFT,∗ für die sequentielle iSOFT wird aus fünf Durchgängen 34 Numerische Beispiele (1) Erzeuge gleichverteilte Fourier-Koeffizienten ĥ aus [−1, 1] × [−i, i] für h ∈ HB . (2) Rekonstruiere h in G aus ĥ mittels iSOFFT. (3) Führe jeweils 5 sequentielle SOFFTs durch und bestimme die durchschnittliche Berechnungsdauer T SOFFT,∗ . (4) Führe jeweils 5 parallele SOFFTs durch und bestimme die durchschnittliche Berechnungsdauer TpSOFFT . (5) Wiederhole Schritt (4) für alle möglichen Anzahlen p an Einheiten, beginnend bei 2 und endend bei der maximal möglichen Anzahl. (6) Berechne für jede Anzahl p an Einheiten den dazugehörigen Speedup SpSOFFT (B) (vgl. Definition 2.6). (7) Wiederhole Schritt (1) bis (6) für alle Bandbreiten B ∈ {16, 32, 64, 128}. Benchmark 3.1: Benchmark zur Messung des Speedups. Die Messungen dieses Benchmarks beziehen sich auf die parallelisierte SOFFT aus Algorithmus 2.10. (1) Erzeuge gleichverteilte Fourier-Koeffizienten ĥ aus [−1, 1] × [−i, i] für h ∈ HB . (2) Führe jeweils 5 sequentielle iSOFFTs durch und bestimme die durchschnittliche Berechnungsdauer T iSOFFT,∗ . (3) Führe jeweils 5 parallele iSOFFTs durch und bestimme die durchschnittliche Berechnungsdauer TpiSOFFT . (4) Wiederhole Schritt (3) für alle möglichen Anzahlen p an Einheiten, beginnend bei 2 und endend bei der maximal möglichen Anzahl. (5) Berechne für jede Anzahl p an Einheiten den dazugehörigen Speedup SpiSOFFT (B). (6) Wiederhole Schritt (1) bis (5) für alle Bandbreiten B ∈ {16, 32, 64, 128}. Benchmark 3.2: Benchmark zur Messung des Speedups. Die Messungen dieses Benchmarks beziehen sich auf die parallelisierte iSOFFT aus Algorithmus 2.11. der sequentiellen iSOFFT bestimmt. Anschließend wird mittels einer Schleife und einem dazugehörigen Index p die Anzahl der Einheiten beginnend bei 2 bis zur maximal möglichen Anzahl durchlaufen. Analog zum Speedup-Benchmark für die SOFFT wird für jede Paarung der Anzahl p an Einheiten und der aktuellen Bandbreite B fünf Mal der parallele iSOFFT-Algorithmus ausgeführt. Nach den fünf Durchläufen wird die durchschnittliche Berechnungsdauer der parallelen iSOFFT ermittelt. Mit Hilfe der durchschnittlichen Berechnungsdauer der parallelisierten iSOFFT und T iSOFFT,∗ wird der Speedup SpA (B) berechnet. Als nächstes wird der Effizienz-Benchmark zur Messung der Effizienz der Parallelisierung von SOFFT und iSOFFT, dargestellt in den Benchmarks 3.3 und 3.4, vorgestellt. Es werden wie beim Speedup-Benchmark Messungen für die Bandbreiten 16, 32, 64 und 128 durchgeführt. Für jede dieser Bandbreiten werden zuerst die nötigen Datenstrukturen instanziiert. Anschließend werden gleichverteilte Fourier-Koeffizienten aus der Menge [−1, 1]×[−i, i] er- Benchmark zu Speedup, Effizienz und Rechengenauigkeit 35 (1) Erzeuge gleichverteilte Fourier-Koeffizienten ĥ aus [−1, 1] × [−i, i] für h ∈ HB . (2) Rekonstruiere h in G aus ĥ mittels iSOFFT. (3) Führe fünf sequentielle SOFFTs durch und ermittle die Zeit T SOFFT,∗ . (4) Führe jeweils 5 parallele SOFFTs durch und bestimme die durchschnittliche Berechnungsdauer TpSOFFT . (5) Wiederhole Schritt (4) für alle möglichen Anzahlen p an Einheiten, beginnend bei 2 und endend bei der maximal möglichen Anzahl. (6) Berechne für jede Anzahl p an Einheiten die dazugehörige Effizienz EpSOFFT (B) (vgl. Definition 2.7). (7) Wiederhole Schritt (1) bis (6) für alle Bandbreiten B ∈ {16, 32, 64, 128}. Benchmark 3.3: Benchmark zur Messung der Effizienz. Die Messungen dieses Benchmarks beziehen sich auf die parallelisierte SOFFT aus Algorithmus 2.10. (1) Erzeuge gleichverteilte Fourier-Koeffizienten ĥ aus [−1, 1] × [−i, i] für h ∈ HB . (2) Führe fünf sequentielle iSOFFTs durch und ermittle die Zeit T iSOFFT,∗ . (3) Führe jeweils 5 parallele iSOFFTs durch und berechne die durchschnittliche Berechnungsdauer TpiSOFFT . (4) Wiederhole Schritt (3) für alle möglichen Anzahlen p an Einheiten, beginnend bei 2 und endend bei der maximal möglichen. (5) Berechne für jede Anzahl p an Einheiten die dazugehörige Effizienz EpiSOFFT (B). (6) Wiederhole Schritt (1) bis (5) für alle Bandbreiten B ∈ {16, 32, 64, 128}. Benchmark 3.4: Benchmark zur Messung der Effizienz. Die Messungen dieses Benchmarks beziehen sich auf die parallelisierte iSOFFT aus Algorithmus 2.11. zeugt. Aus diesen Fourier-Koeffizienten werden mittels des iSOFFT-Algorithmus die Funktionswerte von h über dem Gitter G rekonstruiert. Mittels der rekonstruierten Funktions- werte wird im Anschluss daran fünf mal die sequentielle SOFFT ausgeführt und die mittlere Ausführungszeit T SOFFT,∗ bestimmt. Danach wird mittels einer For-Schleife und dem dazugehörigen Schleifen-Index p die Anzahl der möglichen Einheiten für die parallelisierte SOFFT durchlaufen. Innerhalb dieser Schleife werden nun fünf Messungen der Rechenzeit TpSOFFT (B), welche die parallelisierte SOFFT für jedes mögliche p und die aktuelle Bandbreite B ∈ {16, 32, 64, 128} benötigt, durchgeführt. Dabei wird auch hier eine Variable genutzt, welche die Summe der Ausführungszeiten enthält. Nachdem die fünf Messungen vorgenommen wurden, wird die durchschnittliche Ausführungszeit bestimmt. Abschließend wird die Effizienz EpA (B) gemäß Definition 2.7 berechnet. Der Benchmark der iSOFFT ist bis auf wenige Änderungen identisch zu dem der SOFFT. Zuerst werden die benötigten Datenstrukturen erzeugt. In Anschluss daran werden gleichverteilte Fourier-Koeffizienten aus der Menge [−1, 1] × [−i, i] generiert. Diese Fourier-Koeffizienten werden nun wieder genutzt, um mit- 36 Numerische Beispiele (1) Erzeuge Gewichtsmatrix G und Wigner-d-Matrix Wm,m0 für gegebenes B, m und m0 . (2) Erzeuge gleichverteilte Fourier-Koeffizienten v̂ für h ∈ HB (vgl. (11)). T (3) Rekonstruiere Datenvektor s aus v̂ mittels iDWT durch s = Wm,m 0 · v̂. (4) Berechne ĝ mittels DWT durch ĝ = Wm,m0 · G · s. (5) Berechne Differenzvektor d = ĝ − v̂. (6) Berechne den absoluten Fehler ∆d und relativen Fehler δd . (7) Führe die Schritte (2) bis (6) 1.000 mal durch und berechne den mittleren absoluten Fehler ∆d und den mittleren relativen Fehler δd . (8) Führe Schritt (7) für die Bandbreiten 16, 32, 64, 128 und die Ordnungen m = m0 = 0, m = B/2 mit m0 = 0, m = m0 = B/2 durch. Benchmark 3.5: Benchmark zur Messung der Rechengenauigkeit der DWT aus Satz 1.17. tels der sequentiellen iSOFFT die Funktionswerte der entsprechenden Funktion h über dem Gitter G zu rekonstruieren. Die mittlere Zeit T iSOFFT,∗ wird durch fünf sequentiellen SOFFTs bestimmt. Danach wird wieder mittels einer Schleife und einem Index p jede mögliche Anzahl an Einheiten durchlaufen. In jeder Iteration werden fünf Messungen der Rechenzeit des parallelisierten iSOFFT-Algorithmus für die aktuelle Bandbreite B durchgeführt. Es wird anschließend der Mittelwert der Rechenzeit über diese Durchläufe gebildet. Daraus wird dann die Effizienz EpA (B) berechnet. Abschließend wird der Genauigkeits-Benchmark zur Messung der Genauigkeit der DWT aus Satz 1.17 vorgestellt (siehe Benchmark 3.5). Dieser Benchmark misst den Rechenfehler, welcher auftritt, nachdem ein Datenvektor durch die DWT in Fourier-Koeffizienten und anschließend durch eine iDWT wieder in den ursprünglichen Datenvektor transformiert wurde. Die Messungen erfolgen für vorgegebene Ordnungen m und m0 und Bandbreiten 16, 32, 64 und 128. Zunächst wird für die aktuelle Bandbreite B die Gewichtsmatrix G aufgestellt. Anschließend wird die Wigner-d-Matrix Wm,m0 erstellt. Diese Wigner-d-Matrix wird mit der Gewichtsmatrix gewichtet. Zudem wird eine Kopie der ungewichteten Wigner-dMatrix für die iDWT transponiert. Anschließend wird für jede Bandbreite jeweils 1.000 mal ein Vektor v̂ mit zufälligen Fourier-Koeffizienten (vgl. (11)) zuerst in einen Datenvektor und anschließend zurück in einen Fourier-Koeffizienten-Vektor transformiert. Jedes mal wird die Differenz des ursprünglichen Fourier-Koeffizienten-Vektors und des rekonstruierten Fourier-Koeffizienten-Vektors berechnet. Aus diesem Differenzvektor d wird der absolute Fehler ∆d durch die euklidische Norm ∆d := kdk2 = q [d]21 + [d]22 + · · · + [d]2B−max{|m|,|m0 |}−1 des Differenzvektors berechnet. Neben dem absoluten Fehler ∆d wird auch der relative Fehler δd berechnet. Der relative Fehler berechnet sich aus der euklidischen Norm des Differen- Ergebnisse der Benchmarks 37 zenvektors d geteilt durch die euklidische Norm des ursprünglichen Fourier-KoeffizientenVektors, q [d]21 + [d]22 + · · · + [d]2B−max{|m|,|m0 |}−1 ∆d δd := =q . 2 + · · · + [v̂]2 kv̂k2 [v̂]2 + [v̂ ] 0 1 2 B−max{|m|,|m |}−1 Diese Fehler werden über alle 1.000 Iterationen gemittelt und durch ∆d als δd gespeichert. 3.2 Ergebnisse der Benchmarks In diesem Abschnitt sind die Ergebnisse der im vorherigen Abschnitt vorgestellten Benchmarks dargestellt. Diese Ergebnisse wurden mit einer Intel Core i7-4470 Quad-Core CPU mit einer Taktung von 3,4 GHz erzeugt (siehe auch [The Intel Corporation, 2015]). Mittels Hyperthreading kann diese CPU Berechnungen mit acht Einheiten simultan durchführen. Der benutzte Rechner verfügt über 8 GB Hauptspeicher. Das System wurde mit der Linux Distribution Ubuntu mit der Version 14.03.3 LTS (64 Bit) betrieben. Zum Kompilieren wurde der g++-Compiler mit der Versionsnummer 4.8 und OpenMP-Unterstützung verwendet, sowie der C++-Standard 11 mit der Optimierungsstufe 3 [The GCC-Team, 2015]. In allen Benchmarks wurde die sequentielle DWT und iDWT verwendet. Darüber hinaus wurde die SOFFT und iSOFFT erst ab einer Bandbreite von B = 20 parallel ausgeführt. Die Gründe dafür werden in Kapitel 4 näher erläutert. Abbildung 3.6 zeigt die Ergebnisse des Speedup-Benchmarks. Entlang der x-Achse sind die 8 8 7 7 6 6 Speedup Speedup Anzahl der Einheiten aufgetragen. Entlang y-Achse sind die zugehörigen Speedup-Werte 5 4 5 4 3 3 2 2 1 1 1 2 3 4 5 Einheiten 6 7 8 1 2 3 4 5 6 7 8 Einheiten Abbildung 3.6: Ergebnisse des Speedup-Benchmarks. Im linken Diagramm sind die Ergebnisse der SOFFT und im rechten Diagramm die Ergebnisse der iSOFFT zu sehen. Die orangene Kurve ( ) stellt den Speedup für die Bandbreite 16 dar. Die weiteren Kurven stellen den Speedup für die Bandbreite 32 ( ), die Bandbreite 64 ( ) und die Bandbreite 128 ( ) dar. Die schwarz gepunktet Linie zeigt den optimalen Speedup. Numerische Beispiele 1 1 0.8 0.8 0.6 0.6 Effizienz Effizienz 38 0.4 0.4 0.2 0.2 0 0 1 2 3 4 5 6 7 8 1 2 3 Einheiten 4 5 6 7 8 Einheiten Abbildung 3.7: Ergebnisse des Effizienz-Benchmarks. Im linken Diagramm ist die Effizienz der SOFFT zu sehen. Analog zeigt das rechte Diagramm die Effizienz der iSOFFT. Die orangene Kurve ( ) stellt die Effizienz für die Bandbreite 16 dar. Die weiteren Kurven stellen die Effizienz für die Bandbreite 32 ( ), die Bandbreite 64 ( ) und die Bandbreite 128 ( ) dar. Die schwarz gepunktete Linie zeigt die optimale Effizienz. 3 Laufzeit in Sekunden Laufzeit in Sekunden 3 2 1 0 2 1 0 1 20 40 60 80 100 120 140 1 20 40 Bandbreite 60 80 100 120 140 Bandbreite Abbildung 3.8: Die Laufzeit der sequentiellen und parallelen SOFFT und iSOFFT für die Bandbegrenzung B = 128. Im linken Diagramm ist die Laufzeit der SOFFT zu sehen. Das rechte Diagramm zeigt die Laufzeit der iSOFFT. Die rote Kurve stellt die Laufzeit der jeweiligen sequentiellen Version dar. Die blaue Kurve entspricht der Laufzeit der jeweiligen parallelisierten Version. Die Anzahl der für die parallele SOFFT/iSOFFT verwendeten Einheiten beträgt 8. eingetragen. Die schwarz gepunktete Linie stellt den optimalen Speedup eines parallelen Algorithmus dar. Die farbigen Kurven sind die Speedup-Kurven der SOFFT bzw. iSOFFT für die verschiedenen Bandbreiten. Abbildung 3.7 zeigt die Ergebnisse des Benchmarks zur Messung der Effizienz aus Abschnitt 3.1. Die schwarz gepunktete Linie stellt die optimale Effizienz eines parallelen Algorithmus dar. Die farbigen Kurven entsprechen der Effizienz der SOFFT bzw. iSOFFT für die verschiedenen Bandbreiten in Abhängigkeit von der Anzahl an Einheiten. Ergebnisse der Benchmarks B 16 32 64 128 256 512 1024 m = m0 = 0 m = B/2, m0 = 0 m = m0 = B/2 1.074883e − 14 2.201229e − 15 5.445416e − 15 3.304344e − 15 9.580270e − 15 2.375766e − 15 4.127737e − 14 7.338601e − 15 9.812105e − 15 8.944644e − 15 2.254168e − 15 2.981478e − 15 1.420379e − 13 1.677987e − 14 1.769254e − 14 2.176345e − 14 3.636223e − 15 3.849183e − 15 1.507377e − 13 4.969292e − 14 1.214394e − 13 1.632391e − 14 7.603809e − 15 1.861255e − 14 1.414312e − 12 1.367662e − 13 5.971587e − 13 1.081417e − 13 1.480205e − 14 6.473145e − 14 2.567475e − 12 3.908177e − 13 1.184365e − 12 1.389016e − 13 2.991182e − 14 9.075483e − 14 1.714953e − 11 1.100623e − 12 1.260088e − 08 6.564408e − 13 5.960425e − 14 6.827068e − 10 39 Tabelle 3.9: Rechengenauigkeit der DWT und iDWT, gemessen durch den in Abschnitt 3.1 beschriebenen Genauigkeits-Benchmark. Für jede Bandbreite gibt es zwei Zeilen, von denen die obere den relativen Fehler und die untere den absoluten Fehler enthält. In Abbildung 3.8 sind die Laufzeiten der sequentiellen SOFFT und iSOFFT im Vergleich zur jeweiligen parallelisierten Version mit acht Einheiten zu sehen. Die roten Kurven stellen dabei die Laufzeit der sequentiellen SOFFT/iSOFFT dar und die blauen Kurven die Laufzeit der parallelisierten SOFFT/iSOFFT mit acht Einheiten. Tabelle 3.9 zeigt abschließend die durch den Genauigkeits-Benchmark erzeugten Fehlerwerte für die DWT und iDWT. In der Tabelle sind die relativen und absoluten Fehler aufgeführt, welche für die jeweiligen Zweierpotenzen der Bandbreite mittels Hin- und Rücktransformation durch DWT bzw. iDWT erzeugt wurden. 41 4 Diskussion und Schlussfolgerung In diesem Kapitel wird auf die Messwerte aus Kapitel 3, Abschnitt 3.2 eingegangen, welche durch die entsprechenden Benchmarks aus Abschnitt 3.1 erzeugt wurden. Insbesondere werden die Messwerte in Hinblick auf die Anwendbarkeit der parallelisierten SOFFT/iSOFFT in der Praxis interpretiert. Im Anschluss daran wird ein Ausblick auf mögliche Weiterentwicklungen der vorgestellten Algorithmen gegeben. Die farbigen Kurven in Abbildung 3.6 stellen die Speedup-Werte der parallelisierten SOFFT/ iSOFFT für die Bandbreiten 16, 32, 64 und 128 dar. Zusätzlich dazu ist der optimale Speedup schwarz gepunktet eingezeichnet. Ist ein Algorithmus perfekt parallelisiert, so beträgt die Laufzeit dieses Algorithmus für p Einheiten Tp (n) = T ∗ (n)/p, wodurch der Speedup dann Sp (n) = T ∗ (n) T ∗ (n) p = T ∗ (n) · p =p T ∗ (n) beträgt. Angenommen, ein sequentieller Algorithmus benötigt zum Lösen eines Problems mit einer Einheit eine Rechenzeit von T ∈ N. Dann erwartet man dementsprechend, dass bei einer Nutzung von T Einheiten die Rechenzeit von T auf 1 sinkt, denn T Einheiten sind in der Theorie T mal schneller als eine Einheit. Dies ergäbe also einen Speedup von T . In der Praxis ist ein solcher Speedup jedoch nicht erreichbar. Es gibt zahlreiche Einflussfaktoren, welche auf realen Systemen die perfekten Vorraussetzungen der Theorie stören. Bei Mehrprozessorsystemen müssen Einheiten z.B. miteinander kommunizieren. Der Master-Thread wartet, wie in Kapitel 2, Abschnitt 2.2 erklärt, solange mit weiteren Berechnungen, bis alle anderen Threads aus seinem Team wieder mit ihm vereinigt sind. Um zu wissen, ob noch andere Threads seines Teams arbeiten, muss er folglich mit diesen kommunizieren. Ein anderes Problem besteht darin, dass eine Einheit nicht ausschließlich die Daten aus dem Arbeitsspeicher lädt, welche für die aktuellen Operationen benötigt werden. Um Rechenzeit zu sparen, werden stattdessen ganze Speicherbereiche in den internen Speicher der Einheit, den sogenannten Cache geladen. Die Einheit ist in der Lage, auf diesen Speicher sehr viel schneller zuzugreifen, als auf den Arbeitsspeicher. Arbeiten allerdings mehrere Einheiten mit denselben Daten und laden Speicherbereiche mit einer großen Überschneidung zu den Speicherbereichen der anderen Einheiten in den Cache, müssen während der Berechnung die Caches synchronisiert werden. Der Grund hierfür liegt darin, dass Einheiten bei parallelen Berechnungen in gleichen Speicherbereichen eventuell mit nicht aktuellen Daten arbeiten. Diese und andere Faktoren reduzieren den in der Praxis maximal erreichbaren Speedup. Der gemessene Speedup in Abbildung 3.6 weist für eine geringe Anzahl an Einheiten ein stärkeres Wachstum auf, als bei einer größeren Anzahl an verwendeten Einheiten. Es ist also anzunehmen, dass der Speedup bei wachsender Zahl an Einheiten ab einem gewissen Punkt 42 Diskussion und Schlussfolgerung nicht mehr steigt. Dies ist ein natürliches Phänomen, da der Overhead mit zunehmender Anzahl an Einheiten zwangsläufig größer werden muss. Ein weiterer Grund ist, dass nicht der ganze Algorithmus parallelisiert wurde. Aufgrund der verhältnismäßig kleinen Bandbreiten benötigt beispielsweise die parallele Ausführung der DWT eine längere Laufzeit als die sequentielle Ausführung. Bei steigender Anzahl an Einheiten spielen ab einem gewissen Zeitpunkt ausschließlich die Laufzeit des sequentiellen Anteils der SOFFT/iSOFFT und der Overhead eine Rolle. Der Overhead kann sich allerdings bereits früher bemerkbar machen. Für kleine Bandbreiten z.B. hat die sequentielle SOFFT/iSOFFT eine geringere Laufzeit als die parallele. Daher wurde in dieser Arbeit die SOFFT/iSOFFT erst ab der Bandbreite B = 20 parallel ausgeführt. Die Ergebnisse des Effizienz-Benchmarks in Abbildung 3.7 bestätigen die Ergebnisse des Speedup-Benchmarks. Mit Hilfe der Effizienz kann eine Aussage darüber getroffen werden, um wie viel schneller die Durchführung eines Algorithmus ist, wenn mehr als eine Einheit verwendet wird. Eine Effizienz von 1 für p Einheiten sagt aus, dass die Berechnungen mit p Einheiten p mal schneller sind. Die optimale Effizienz beträgt dementsprechend 1. In Abbildung 3.7 ist zu sehen, dass in dieser Arbeit beispielsweise für die Bandbreite B = 128 und die Anzahl von p = 8 Einheiten eine Effizienz von ca. 0.4 erreicht wurde. Dieser Wert impliziert, dass die parallele Ausführung der SOFFT/iSOFFT hier um etwa den Faktor 3 schneller ist als die sequentielle. Dies lässt sich anhand von Abbildung 3.8 gut nachvollziehen. An dieser Stelle ist noch zu bemerken, dass in dieser Arbeit die DWT stets sequentiell durchgeführt wurde, da sich dies trotz schlechterer Zeitkomplexität für alle verwendeten Bandbreiten als vorteilhaft gegenüber der parallelen Ausführung erwiesen hat. Zuletzt werden die Ergebnisse des Benchmarks für die Genauigkeit der DWT und iDWT betrachtet. Die DWT bildet zusammen mit der FFT die Grundlage der SOFFT. Da die Rechengenauigkeit der FFT gut untersucht ist [Frigo und Johnson, 2012], ist der Benchmark zur Messung des Transformations-Fehlers der DWT sehr wichtig. Vergleicht man die Werte in Tabelle 3.5 mit den entsprechenden Werten in [Kostelec und Rockmore, 2008] (dort wurde ein sehr ähnlicher Test durchgeführt), so fällt auf, dass die DWT und iDWT dieser Arbeit präziser arbeiten und dementsprechend geringere Fehler erzeugen. Selbst bei einer Bandbreite von 256 ist der absolute Fehler nicht eindeutig von der Maschinenungenauigkeit zu unterscheiden. Erst ab einer Bandbreite von 1024 entstehen größere Fehler. Diese Bandbreiten und größere Bandbreiten sind zum jetzigen Zeitpunkt allerdings nicht praxisrelevant, weshalb dieser Verlust an Präzision von keiner großen Bedeutung ist. Insgesamt zeigen die Ergebnisse der Benchmarks, dass die Parallelisierung die sequentielle SOFFT und iSOFFT signifikant beschleunigt. Die in den vorherigen Kapiteln beschriebenen Überlegungen und die daraus resultierende Parallelisierung der SOFFT und iSOFFT haben somit einen praktischen Nutzen. Um weitere Verbesserungen der Laufzeit und somit des 43 Speedups und der Effizienz zu erzielen, besteht wie in Kapitel 2 bereits erwähnt die Möglichkeit, die DWT und iDWT durch eine schnelle diskrete Polynom-Transformation zu ersetzen. Durch diese Modifikation ergibt sich in der Theorie eine bessere Zeitkomplexität. Allerdings steht hier die Untersuchung der Stabilität dieser modifizierten SOFFT und iSOFFT noch aus. Eine weitere interessante Frage ist, inwieweit sich die in dieser Arbeit vorgestellte Parallelisierungsstrategie auch auf die SOFFT und iSOFFT mit nicht-äquidistanten Stützstellen aus [Potts et al., 2009] übertragen lässt. 45 Abkürzungsverzeichnis DSOFT diskrete Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 DWT diskrete Wigner-d-Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 EREW exclusive read exclusive write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 FFT schnelle Fourier-Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 iDSOFT inverse diskrete Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . 10 iDWT inverse diskrete Wigner-d-Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 iFFT inverse schnelle Fourier-Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 iSOFFT inverse schnelle Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . 12 iSOFT inverse Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 MPI Message Passing Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 OpenMP Open Multi-Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ONB Orthonormalbasis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 O(3) orthogonale Gruppe im dreidimensionalen reellen Raum . . . . . . . . . . . . . . . . . . . . . . . . . . 4 SOFFT schnelle Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 SOFT Fourier-Transformation auf SO(3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 SO(3) spezielle orthogonale Gruppe im dreidimensionalen reellen Raum / Rotationsgruppe 4 47 Algorithmenverzeichnis 2.1 Sequentielle SOFFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2 Sequentielle iSOFFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.7 Erster Umformungsschritt der SOFFT für die Parallelisierung . . . . . . . . 22 2.9 Zweiter Umformungsschritt der SOFFT für die Parallelisierung . . . . . . . 24 2.10 Parallelisierte SOFFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.11 Parallelisierte iSOFFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 49 Abbildungsverzeichnis 2.3 Beispiel einer Parallelisierung dargestellt als Fork-Join-Modell . . . . . . . . 17 2.4 Graphische Darstellung der Forster-Methodik . . . . . . . . . . . . . . . . . 19 2.5 Parallelisierung der äußeren For-Schleife . . . . . . . . . . . . . . . . . . . 20 2.6 Parallelisierung der inneren For-Schleife . . . . . . . . . . . . . . . . . . . . 20 2.8 Geometrischer Lösungsansatz der For-Schleifen-Optimierung . . . . . . . . 23 3.1 Benchmark zu Messung des Speedups (SOFFT) . . . . . . . . . . . . . . . . 34 3.2 Benchmark zur Messung des Speedups (iSOFFT) . . . . . . . . . . . . . . . 34 3.3 Benchmark zur Messung der Effizienz (SOFFT) . . . . . . . . . . . . . . . . 35 3.4 Benchmark zur Messung der Effizienz (iSOFFT) . . . . . . . . . . . . . . . 35 3.5 Benchmark zur Messung der Rechengenauigkeit der DWT aus Satz 1.17. . . 36 3.6 Ergebnisse des Speedup Benchmarks . . . . . . . . . . . . . . . . . . . . . . 37 3.7 Ergebnisse des Effizienz-Benchmarks . . . . . . . . . . . . . . . . . . . . . 38 3.8 Laufzeit der sequentiellen/parallelisierten SOFFT/iSOFFT . . . . . . . . . . 38 3.9 Rechengenauigkeit der DWT . . . . . . . . . . . . . . . . . . . . . . . . . . 39 51 Literaturverzeichnis Bülow, H. und Birk, A. (2011a). Spectral registration of noisy sonar data for underwater 3D mapping. Auton. Robots, 30(3):307–331. Bülow, H. und Birk, A. (2011b). Spectral registration of volume data for 6-DOF spatial transformations plus scale. In Proc. IEEE ICRA 2011, pages 3078–3083, Shanghai, China. Cormen, T. H., Leiserson, C. E., Rivest, R. L., und Stein, C. (2009). Introduction to Algorithms, Third Edition. The MIT Press, Cambridge, MA, USA. Driscoll, J. R., Healy, D. M., und Rockmore, D. N. (1997). Fast Discrete Polynomial Transforms with Applications to Data Analysis for Distance Transitive Graphs. SIAM J. Comput., 26(4):1066–1099. Edmonds, A. R. (1996). Angular Momentum in Quantum Mechanics. Princeton University Press, Princeton, NJ, USA. Fischer, G. (2008). Lehrbuch der Algebra: mit lebendigen Beispielen, ausführlichen Erläuterungen und zahlreichen Bildern. Vieweg Verlag, Wiesbaden. Frigo, M. und Johnson, S. G. (2012). http://www.fftw.org/fftw3.pdf. [Online; Zugriff am 12. September 2015]. JáJá, J. (1992). An Introduction to Parallel Algorithms. Addison Wesley Longman Publishing Co., Inc., Redwood City, CA, USA. Koecher, M. (1997). Lineare Algebra und analytische Geometrie. Springer-Verlag Berlin Heidelberg, Berlin, Heidelberg. Kostelec, P. J. und Rockmore, D. N. (2008). FFTs on the Rotation Group. J. Fourier Anal. Appl., 14(2):145–179. Kovacs, J. A. und Wriggers, W. (2002). Fast rotational matching. Acta Cryst., D58:1282–1286. Matsumoto, M. und Nishimura, T. (1998). Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator. ACM Trans. Model. Comput. Simul., 8(1):3–30. Modersitzki, J. (2009). FAIR: Flexible Algorithms for Image Registration. Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, USA. Potts, D., Prestin, J., und Vollrath, A. (2009). A fast algorithm for nonequispaced Fourier transforms on the rotation group. Numer. Algorithms, 52(3):355–384. Quinn, M. J. (2003). Parallel Programming in C with MPI and OpenMP. The McGraw-Hill Companies, Inc., New York, NY, USA. 52 Literaturverzeichnis Ritchie, D. W. (2011). High Performance Algorithms for Molecular Shape Recognition. Scientific Memoir, Université Henri Poincaré. Roosta, S. H. (2000). Parallel Processing and Parallel Algorithms. Springer-Verlag New York, Inc., New York, NY, USA. Slabaugh, G., Fang, T., McBagonluri, F., Zouhar, A., Melkisetoglu, R., Xie, H., und Ünal, G. (2008). 3-D shape modeling for hearing aid design. IEEE Signal Process. Mag., 25(5):98–102. The GCC-Team (2015). Optimize-Options. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html# [Online, Zugriff am 01. Oktober 2015]. The Intel Corporation (2015). http://ark.intel.com/de/products/75122/Intel-Core-i7- 4770-Processor-8M-Cache-up-to-3_90-GHz. [Online; Zugriff am 12. September 2015]. The OpenMP Architecture Review Board (2013). OpenMP4.0.0.pdf. http://www.openmp.org/mp-documents/ [Online; Zugriff am 12. September 2015].
© Copyright 2024 ExpyDoc