2010-06-01 5 views
35

Ich denke, die Frage spricht für sich. Ich interessiere mich für einige ernsthafte Berechnungen, bin aber kein Programmierer von Beruf. Ich kann genug Python aneinanderreihen, um fertig zu werden, was ich will. Aber kann ich ein Programm in Python schreiben und die GPU mit CUDA ausführen lassen? Oder muss ich eine Mischung aus Python und C verwenden?Kann ich Nvidias CUDA nur mit Python programmieren oder muss ich C lernen?

Die Beispiele auf klockners (sp) "pyCUDA" -Webseite hatten eine Mischung aus Python und C, also bin ich mir nicht sicher, was die Antwort ist.

Wenn jemand über Opencl glocken möchte, fühlen Sie sich frei. Ich habe erst vor ein paar Wochen von diesem CUDA-Geschäft gehört und wusste nicht, dass Sie Ihre Videokarten so verwenden könnten.

+0

Ich nehme an, Sie könnten eine Python-Bibliothek haben, die Code in einer Teilmenge von Python erstellt und in PTX-Anweisungen kompiliert, die mit der CUDA-API an den Treiber gesendet werden können. Einige Ansätze zur GPU-Programmierung in Haskell verfolgen diesen Ansatz. Nicht sicher, ob es schon in Python war, obwohl –

Antwort

18

Ich glaube, dass Ihre Rechenkerne mit PyCUDA immer als "CUDA C-Code" geschrieben werden müssen. PyCUDA kümmert sich um eine ansonsten langwierige Buchhaltung, baut aber keine CUDA-Kernel aus Python-Code.

+0

In der Tat, obwohl es interessante Projekte gibt, die tun; Sieh meine Antwort. ;) – dwf

+2

Wir verwenden PyCUDA bei der Arbeit und erzielen gute Ergebnisse damit. Der Vorteil beim Schreiben von CUDA C besteht darin, dass Sie Hilfe und Snippets von anderen Personen erhalten können, ohne von Ihrem API-spezifischen Python-Code zu übersetzen. –

8

pyopencl bietet eine interessante Alternative zu PyCUDA. Es wird als "Schwesterprojekt" zu PyCUDA beschrieben. Es ist ein vollständiger Wrapper um OpenCL-API.

Soweit ich verstehe, hat OpenCL den Vorteil, auf GPUs jenseits von Nvidia zu laufen.

+0

OpenCL kann theoretisch auch auf unterstützten CPUs ausgeführt werden. Allerdings ist die Unterstützung außerhalb von Nvidias Hardware bisher eher halbherzig. – dwf

20

Sie sollten sich CUDAmat und Theano ansehen. Beides sind Ansätze zum Schreiben von Code, der auf der GPU ausgeführt wird, ohne wirklich viel über die GPU-Programmierung wissen zu müssen.

+0

+1, ordentliches Zeug in der Tat! –

5

Große Antworten bereits, aber eine andere Option ist Clyther. Sie können OpenCL-Programme schreiben, ohne C zu verwenden, indem Sie eine Untergruppe von Python in OpenCL-Kernel kompilieren.

1

Es gibt eine gute, grundlegende Reihe von mathematischen Konstrukten mit bereits geschriebenen Rechenkernels, auf die über pyCUDAs cumathmodule zugegriffen werden kann. Wenn Sie mehr involvierte oder spezifische/benutzerdefinierte Sachen machen wollen, müssen Sie einen Touch von C in die Kernel-Definition schreiben, aber das Schöne an pyCUDA ist, dass es das schwere C-Lifting für Sie erledigen wird; Es macht eine Menge Meta-Programmierung auf dem Back-End, so dass Sie sich nicht um ernsthafte C-Programmierung sorgen müssen, nur die kleinen Teile. Einer der angeführten Beispiele ist eine Map/Reduce-Kernel des Punktprodukts zu berechnen:

dot_krnl = ReductionKernel(np.float32, neutral="0", reduce_expr="a+b", map_expr="x[i]*y[i]", arguments="float *x, float *y")

Die kleinen Code-Schnipsel innerhalb jedes dieser Argumente der C-Linie, aber es schreibt eigentlich das Programm für Sie. Der ReductionKernel ist ein angepasster Kernel-Typ für Karten-/Reduzierungsfunktionen, aber es gibt verschiedene Arten. Der Beispielteil des offiziellen pyCUDA documentation geht näher auf.

Viel Glück!

4

Eine vielversprechende Bibliothek ist Copperhead (alternative link), man muss nur die Funktion dekoriert, die Sie von der GPU ausgeführt werden sollen (und dann können Sie Opt-in/Opt-out, es zu sehen, was zwischen CPU oder gpu am besten für diese Funktion)

+0

Der Decorator Ansatz ist sehr sinnvoll. +1 für das Vorschlagen. – Vangel

0

Scikits CUDA package könnte eine bessere Option sein, vorausgesetzt, dass es keine Low-Level-Kenntnisse oder C-Code für jede Operation erfordert, die als numpy Array-Manipulation dargestellt werden kann.

0

Ich fragte mich das gleiche und führte ein paar Suchanfragen durch. Ich habe den unten verlinkten Artikel gefunden, der Ihre Frage zu beantworten scheint. Sie haben das jedoch 2014 gefragt und der Nvidia-Artikel hat kein Datum.

https://developer.nvidia.com/how-to-cuda-python

Das Video geht durch das eingerichtet, ein erstes Beispiel und, ganz wichtig, profiliing. Ich weiß jedoch nicht, ob Sie alle üblichen allgemeinen Rechenmuster implementieren können. Ich würde denken, dass du das kannst, denn soweit ich kann, gibt es in NumPy keine Einschränkungen.