2013-05-09 7 views
6

Ich lerne über Parallelisierung und in einer Übung bin ich ein paar Algorithmen gegeben, die ich in der Leistung verbessern sollte. Einer von ihnen ist ein Fibonacci-Sequenz-Generator:parallelisieren Fibonacci-Sequenz-Generator

array[0] = 0; 
array[1] = 1; 
for (q = 2; q < MAX; q++) { 
    array[q] = array[q−1] + array[q−2]; 
} 

Mein Verdacht ist, dass dies nicht (durch Parallelisierung) optimiert werden, da jede Zahl auf den beiden vorhergehenden Zahlen abhängt (und damit indirekt auf alle vorhergehenden Zahlen). Wie könnte dies parallelisiert werden?

+0

Was haben Sie bisher in der Klasse zu tun? – devnull

+0

Fibonacci ist eine schlechte Wahl für die Parallelisierung, glaube ich. Überprüfen Sie dies: http://trigonakis.com/blog/2011/02/27/parallelizing-simple-algorithms-fibonacci/ –

+0

Sofern Sie benachbarte Fibonacci-Zahlen nicht rechtzeitig bestimmen können, ist es unwahrscheinlich, dass Sie es parallelisieren können . – devnull

Antwort

11

wird die Fibonacci-Folge nur durch seine ersten beiden Elemente bestimmt wird; in der Tat könnte man es parallelisieren irgendwie, obwohl hässlich:

F(n + 2) = F(n + 1) + F(n) 
F(n + 3) = F(n + 1) + F(n + 2) = F(n + 1) * 2 + F(n) 
F(n + 4) = F(n + 2) + F(n + 3) = F(n + 1) * 3 + F(n) * 2 
F(n + 5) = F(n + 3) + F(n + 4) = F(n + 1) * 5 + F(n) * 3 
F(n + 6) = F(n + 4) + F(n + 5) = F(n + 1) * 8 + F(n) * 5 

Hoffentlich jetzt können Sie sehen, dass:

F(n + k) = F(n + 1) * F(K) + F(n) * F(k - 1) 

So nach der ersten k Zahlen Berechnen Sie diese Beziehung verwenden könnte zu berechnen Die nächsten k Elemente in der Sequenz werden parallelisiert.

Sie könnten auch die direkte Formel für Fibonacci-Zahlen verwenden, um sie parallel zu berechnen, aber das ist irgendwie zu uncool (könnte auch für Lernzwecke zu einfach sein, dass es dienen könnte).

2

Eine Anzahl 'n' ist eine Zahl Fibanocci wenn entweder (5N^2 bis 4) oder (5 N^2 + 4) ein perfektes Quadrat ist.

http://en.wikipedia.org/wiki/Fibonacci_number

eine große Anzahl Gegeben, so können Sie die nächsten beiden Fib nums mit diesem Algorithmus finden und mit zusätzlich dann weiter ab.

Auf diese Weise könnte man das Problem, wie zwischen (0 bis N/2) aufzuteilen und dann (N/2 + 1 bis N), und es in parallelen Threads laufen.

5

Der beste Weg zu nähern, es

2-dimensionale Matrixform von Fibonacci verwenden

enter image description here

Jetzt können Sie leicht erweitern. Einfache Matrixmultiplikationskonzepte werden es tun.

oder Sie können mit anderen mathematischen Weg gehen, wie

enter image description here