5

momento ho un parallelo per ciclo simile a questo:modo più semplice per utilizzare GPU parallelo per ciclo

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; 
parallel_for (1, 100, 1, [&](int i){ 
    int var4; 
    int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; 
    /* ...nested for loops */ 
     for (var4=0; var4<16; var4++) { 
      if (values[var4] != testValues[var4]) break; 
     } 
    /* ...end nested loops */ 
} 

ho ottimizzato più possibile al punto che l'unica cosa che posso fare è aggiungere più risorse.

Sono interessato a utilizzare la GPU per aiutare a elaborare l'attività in parallelo. Ho letto che compiti simili in modo imbarazzante come questo possono fare uso di una moderna GPU in modo abbastanza efficace.

Utilizzo di qualsiasi lingua, qual è il modo più semplice di utilizzare la GPU per un ciclo parallelo semplice come questo?

Non so nulla di architetture GPU o codice GPU nativo.

+0

Se il tuo compito è un compito di calcolo numerico di qualche tipo, o se puoi ri-lanciarlo come un problema basato su matrice matematica, allora potresti usare MATLAB. I nuovi MATLAB supportano sia parallel-for ('parfor' da Parallel Computing Toolbox) sia matrix math su Nvidia CUDA GPUs. Entrambe sono relativamente indolori e richiedono solo modeste modifiche al codice MATLAB esistente. –

+0

Potrebbe essere utile qualche altra informazione su ciò che stai cercando di fare realmente.Ricorda che il trasferimento dei dati dalla CPU alla GPU comporta un sovraccarico significativo, quindi il calcolo della GPU fornisce un aumento delle prestazioni solo se stai facendo un sacco di lavoro computazionale per unità di dati di input. Calcolare il quadrato di ciascun numero in un vettore non è un buon uso di GPGPU (quasi nessun lavoro per unità di dati); calcolare la FFT di un vettore è un buon uso (un sacco di lavoro su piccoli dati). –

+0

Ho diversi loop nidificati, nel ciclo più interno sto usando gli indici di loop per calcolare 16 valori e confrontarli con l'array testValues ​​[]. Non dovrebbe esserci alcun accesso significativo alla memoria. Inoltre sto usando una scheda AMD/ATI (6850). – Flash

risposta

2

come ha detto Li-aung Yip nei commenti, il modo più semplice di utilizzare una GPU è con qualcosa come Matlab che supporta le operazioni dell'array e automaticamente (più o meno) sposta quelle nella GPU. ma per farlo funzionare è necessario riscrivere il codice come pura operazione basata su matrice.

in caso contrario, la maggior parte dell'uso della GPU richiede ancora la codifica in CUDA o OpenCL (è necessario utilizzare OpenCL con una scheda AMD). anche se utilizzi un wrapper per la tua lingua preferita, il codice effettivo che gira sulla GPU viene ancora scritto in OpenCL (che sembra vagamente come C). e quindi questo richiede una buona dose di apprendimento/sforzo. puoi iniziare scaricando OpenCL da AMD e leggendo i documenti ...

entrambe queste opzioni richiedono l'apprendimento di nuove idee, sospetto. quello che vuoi veramente, penso, è un linguaggio di alto livello, ma con un aspetto tradizionale rivolto alla gpu. sfortunatamente, non sembrano esistere molto, ancora. l'unico esempio che riesco a pensare è theano - potresti provarlo. anche lì, hai ancora bisogno di imparare python/numpy, e non sono sicuro di quanto sia solida l'implementazione di theano, ma potrebbe essere la via meno dolorosa in avanti (in quanto consente un approccio "tradizionale" - l'uso delle matrici è in molti modi più facile, ma alcune persone sembrano trovarlo molto difficile da afferrare concettualmente).

ps non è chiaro per me che una gpu aiuterà il tuo problema, btw.

+0

Ho deciso di usare OpenCL - la curva di apprendimento non è poi così male. Ho trovato più facile che lottare con le librerie che tentano di convertire il codice esistente - i pochi wrapper che sono riuscito a trovare hanno fallito abbastanza rapidamente e hanno richiesto comunque le tecniche di programmazione della GPU. Matlab sembra supportare CUDA solo al momento, sfortunatamente. – Flash

+0

ok, bello. stai chiamando da c? ho scoperto che pyopencl era più facile di c - si continua a programmare la parte opencl allo stesso modo, ma c'è meno lavoro nella preparazione dei dati da inviare. ma poi sono più abituato a Python che c ... –

0

Si potrebbe voler esaminare OpenACC che abilita il parallelismo tramite direttive. È possibile effettuare il porting dei codici (C/C++/Fortran) su sistemi eterogenei mantenendo un codice sorgente che funziona ancora bene su un sistema omogeneo. Dai uno sguardo a questa introduzione video. OpenACC non è la programmazione GPU, ma esprime il parallelismo nel codice, che può essere utile per ottenere miglioramenti delle prestazioni senza troppa conoscenza in linguaggi di basso livello come CUDA o OpenCL. OpenACC è disponibile in compilatori commerciali di PGI, Cray e CAPS (PGI offre ai nuovi utenti una prova gratuita di 30 giorni).

Problemi correlati