2010-06-01 13 views
35

Immagino che la domanda parli da sola. Sono interessato a fare calcoli seri, ma non sono un programmatore di mestiere. Posso mettere insieme abbastanza python per fare ciò che voglio. Ma posso scrivere un programma in python e far eseguire la GPU usando CUDA? O devo usare qualche mix di Python e C?Posso programmare Nvidia's CUDA usando solo Python o devo imparare C?

Gli esempi sulla pagina "pyCUDA" di Klockner (sp) avevano un mix di Python e C, quindi non sono sicuro di quale sia la risposta.

Se qualcuno vuole parlare di Opencl, sentitevi liberi. Ho sentito parlare di questo business CUDA solo un paio di settimane fa e non sapevo che potevi usare le tue schede video in questo modo.

+0

Suppongo che si possa avere una libreria Python che prende il codice scritto in un sottoinsieme di Python e lo compila in istruzioni PTX che possono essere inviate al driver con l'API CUDA. Alcuni degli approcci alla programmazione della GPU in Haskell adottano questo approccio. Non sono sicuro se sia stato ancora don in Python, anche se –

risposta

18

Credo che con PyCUDA i tuoi kernel computazionali debbano sempre essere scritti come "CUDA C Code". PyCUDA si occupa di molti libri altrimenti noiosi, ma non costruisce kernel CUDA computazionali dal codice Python.

+0

Infatti, anche se ci sono progetti interessanti che lo fanno; guarda la mia risposta ;) – dwf

+2

Usiamo PyCUDA al lavoro e otteniamo buoni risultati con esso. Il vantaggio di scrivere in chiaro CUDA C è che puoi ottenere aiuto e frammenti di altre persone senza doverti tradurre dal tuo codice Python specifico dell'API. –

8

pyopencl offre un'interessante alternativa a PyCUDA. È descritto come un "progetto gemello" per PyCUDA. È un completo wrapper attorno all'API di OpenCL.

Per quanto ho capito, OpenCL ha il vantaggio di funzionare su GPU oltre a Nvidia.

+0

OpenCL in teoria può essere eseguito anche su CPU supportate. Tuttavia, il supporto esterno all'hardware di Nvidia è piuttosto incompleto finora. – dwf

20

Si consiglia di dare un'occhiata a CUDAmat e Theano. Entrambi sono approcci per scrivere codice che viene eseguito sulla GPU senza dover conoscere molto sulla programmazione della GPU.

+0

+1, roba davvero buona! –

5

Ottime risposte già, ma un'altra opzione è Clyther. Ti permetterà di scrivere programmi OpenCL senza nemmeno usare C, compilando un sottoinsieme di Python in kernel OpenCL.

1

Esiste un buon set di base di costrutti matematici con i kernel di elaborazione già scritti a cui è possibile accedere tramite pyCUDA cumathmodule. Se vuoi fare cose più coinvolgenti o specifiche/personalizzate dovrai scrivere un tocco di C nella definizione del kernel, ma la cosa bella di pyCUDA è che farà il pesante C-lifting per te; fa un sacco di meta-programmazione sul back-end in modo da non doversi preoccupare della seria programmazione in C, solo dei piccoli pezzi. Uno degli esempi è una mappa/Riduzione del kernel per calcolare il prodotto scalare:

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

I piccoli frammenti di codice all'interno di ciascuno di questi argomenti sono linee C, ma in realtà scrive il programma per voi. il ReductionKernel è un tipo di kernel personalizzato per le funzioni di tipo map/reducish, ma ci sono diversi tipi. La parte degli esempi del pyCUDA ufficiale documentation va più nel dettaglio.

Buona fortuna!

4

Una libreria promettente è Copperhead (alternative link), non vi resta che decorare la funzione che si desidera essere gestito dalla GPU (e allora si può optare-in/opt-out per vedere che cosa è meglio tra CPU e GPU per quella funzione)

+0

L'approccio del decoratore ha molto senso. +1 per suggerirlo. – Vangel

0

Scikits CUDA package potrebbe essere un'opzione migliore, purché non richieda alcuna conoscenza di basso livello o codice C per qualsiasi operazione che possa essere rappresentata come manipolazione di array numpy.

0

Mi stavo chiedendo la stessa cosa e ho effettuato alcune ricerche. Ho trovato l'articolo collegato di seguito che sembra rispondere alla tua domanda. Tuttavia, l'hai chiesto nel 2014 e l'articolo di Nvidia non ha una data.

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

Il filmato passa attraverso la messa a punto, un primo esempio e, molto importante, profiliing. Tuttavia, non so se è possibile implementare tutti i soliti schemi generali di calcolo. Penserei che puoi perché, per quanto ho potuto, non ci sono limiti in NumPy.

Problemi correlati