2012-12-23 9 views
6

Ich versuche Fitted Value Iteration (FVI) in Python durchzuführen (einschließlich approximieren einer 5-dimensionalen Funktion mit stückweise lineare Interpolation).scipy.interpolate.griddata Äquivalent in CUDA

scipy.interpolate.griddata funktioniert perfekt dafür. Allerdings muss ich die Interpolationsroutine mehrere tausend Mal aufrufen (da FVI ein MC-basierter Algorithmus ist).

Also im Grunde ist die Menge der Punkte, wo die Funktion bekannt ist, statisch (und groß - sagen 32k), aber die Punkte, die ich approximieren muss (die kleine Störungen des ursprünglichen Satzes sind) ist sehr groß (32k x 5000) sagen).

Gibt es eine Implementierung dessen, was scipy.interpolate.griddata tut, das auf CUDA portiert wurde? Oder gibt es eine Möglichkeit, die Berechnung irgendwie zu beschleunigen?

Danke.

Antwort

1

Für stückweise lineare Interpolation, die docs sagen, dass scipy.interpolate.griddata die Methoden der scipy.interpolate.LinearNDInterpolator verwendet, die wiederum qhull verwendet eine Delaunay tesellation der Eingangspunkte zu tun, führt dann Standard baryzentrische Interpolation, wobei für jeden Punkt, den Sie haben Bestimmen Sie, in welchem ​​Hypertrahedron jeder Punkt ist, dann verwenden Sie seine barycentric coordinates als Interpolationsgewichte für die Hypertextraphon Knotenwerte.

Die Tesellation ist wahrscheinlich schwer zu parallelisieren, aber Sie können auf die CPU-Version mit scipy.spatial.Delaunay zugreifen. Die anderen beiden Schritte sind leicht parallelisierbar, obwohl ich keine frei verfügbare Implementierung kenne.

Wenn sich Ihre bekannten Funktionspunkte in einem regelmäßigen Raster befinden, ist die beschriebene Methode here in CUDA besonders einfach zu implementieren, und ich habe mit tatsächlichen Implementierungen davon gearbeitet, obwohl sie nicht öffentlich verfügbar sind.

So bin ich Angst, dass Sie die meiste Arbeit selbst tun ...

+0

Hallo, ja gehen zu müssen - ich habe schließlich tun die meiste Arbeit selbst enden. Ich habe die Implementierung von find_simplex in scipy.spatial.Delauny untersucht und festgestellt, dass die Grundidee für genügend viele Punkte leicht parallelisiert werden kann. Ich führe also grundsätzlich zwei Schleifen aus - eine, um den Simplex für jedes MC-Sample zu finden (und zu speichern), und einen, um den gespeicherten Simplex nachzuschlagen und seine baryzentrischen Koordinaten für die Interpolation zu berechnen. Es ist durch Videospeicher begrenzt, aber es ist sehr schnell. – user1726633