2012-06-05 16 views
17

Ich fange an, CUDA zu lernen, und ich denke, die Berechnung langer Ziffern von Pi wäre ein schönes, einleitendes Projekt.Schneller Algorithmus Pi parallel zu berechnen

Ich habe bereits die einfache Monte-Carlo-Methode implementiert, die leicht parallelisiert werden kann. Ich lasse jeden Faden zufällig Punkte auf dem Einheitsquadrat erzeugen, finde heraus, wie viele innerhalb des Einheitskreises liegen, und ordne die Ergebnisse mit einer Reduktionsoperation zusammen.

Aber das ist sicherlich nicht der schnellste Algorithmus zur Berechnung der Konstante. Vorher, als ich diese Übung auf einer Single-Thread-CPU gemacht habe, habe ich Machin-like formulae verwendet, um die Berechnung für eine viel schnellere Konvergenz durchzuführen. Für Interessierte bedeutet dies, dass pi als die Summe der arctangences ausgedrückt wird und Taylor-Reihen verwendet werden, um den Ausdruck zu bewerten.

Ein Beispiel für eine solche Formel:

enter image description here

Leider fand ich, dass Tausende von GPU-Threads, um diese Technik zu parallelisieren ist nicht einfach. Das Problem besteht darin, dass die Mehrzahl der Operationen einfach Hochpräzisions-Mathematik durchführt, im Gegensatz zu Gleitkommaoperationen an langen Datenvektoren.

Also frage ich mich, Was ist die effizienteste Möglichkeit, beliebig lange Ziffern von Pi auf einer GPU zu berechnen?

+0

Haben Sie sich das angesehen: https://sites.google.com/a/nirmauni.ac.in/cudacodes/ongoing-projects/automatic-conversion-of-source-code-for-c-to -cuda-c/konvertierte-programme/berechne-wert-von-pi –

+0

Ich glaube nicht, dass man willkürliche Präzisionsberechnungen macht. – tskuzzy

+2

@JamesBlack: der Code, den Sie verknüpft haben, ist völliger Unsinn.Es scheint eine unglaublich naive automatische Übersetzung eines seriellen Teils von C-Code in einen seriellen Teil von GPU-Code zu sein, wo viele Threads die identischen ersten 1000 Elemente der Reihenentwicklung berechnen. Buchstäblich 99,99% der durch den Code durchgeführten Berechnung sind redundant. – talonmies

Antwort

12

sollten Sie verwenden die Bailey–Borwein–Plouffe formula

Warum? Zuallererst benötigen Sie einen Algorithmus, der aufgeteilt werden kann. Das erste, was mir in den Sinn kam, ist eine Darstellung von Pi als unendliche Summe. Dann berechnet jeder Prozessor nur einen Begriff, und Sie summieren sie alle am Ende.

Dann ist es vorzuziehen, dass jeder Prozessor Werte mit kleiner Genauigkeit manipuliert, im Gegensatz zu sehr genauen. Wenn Sie beispielsweise eine Milliarde Dezimalstellen verwenden möchten und einige der verwendeten Ausdrücke here verwenden, wie z. B. die Chudnovsky algorithm, muss jeder Ihrer Prozessoren eine Milliarden lange Zahl manipulieren. Das ist einfach nicht die geeignete Methode für eine GPU.

Also, alles in allem, die BBP Formel wird es Ihnen ermöglichen, die Ziffern von pi getrennt zu berechnen (der Algorithmus ist sehr cool), und mit "Low Precision" Prozessoren! Lesen Sie den „BBP digit-Extraktionsalgorithmus für π“

Vorteile des BBP-Algorithmus zur Berechnung von π Dieser Algorithmus berechnet π ohne benutzerdefinierte Datentypen zu erfordern Tausende oder sogar Millionen von Stellen mit. Die Methode berechnet die n-te Ziffer ohne Berechnung der ersten n - 1 Ziffern und kann kleine, effiziente Datentypen verwenden. Der Algorithmus ist der schnellste Weg zur Berechnung der n-ten Ziffer (oder einiger Ziffern in einer Nachbarschaft des n-ten), aber π-Rechenalgorithmen, die große Datentypen verwenden, bleiben schneller, wenn alle Ziffern von 1 bis n berechnet werden sollen.

+1

So verstehe ich die Idee, dass Sie alle Ziffern, die Sie wollen (peinlich) parallel berechnen. Aber das ist keine Garantie, dass dieser Algorithmus * effizient * ist; jeder Prozessor/GPU könnte Informationen berechnen, die andere teilen könnten. Vielleicht ist dieser Algorithmus effizient und Sie haben uns einfach nicht gesagt, wie. Wenn nicht, sollten Sie einen ineffizienten Algorithmus nicht parallelisieren, nur weil Sie es können. (Vielleicht wäre ein nützlicheres Maß Ziffern/Transistor oder Ziffern/Watt produziert). –

+1

Nun, es ist ein "anständiger" Algorithmus. Es ist nicht das beste (Aufzeichnungen werden von anderen Algorithmen gehalten), aber es ist immer noch anständig. Und lasst uns auch daran denken, dass OP keine Rekorde brechen will, aber "Ich fange an, CUDA zu lernen und ich denke, dass die Berechnung langer Ziffern von Pi ein nettes, einleitendes Projekt sein würde." – Fezvez

+0

Dann ist es ein schönes Schema zum Ausprobieren. (Ich habe Leute gesehen, die versuchen, parallele Programme in Python zu machen, was ein Interpreter ist. Wie bitte?) –

Verwandte Themen