2012-08-09 19 views
17

Voglio essere in grado di programmare più thread con gnu ottave in modo che utilizzi più processori.Ottieni GNU Octave per lavorare con un processore multicore. (Multithreading)

ho installato GNU Octave su Fedora 17 Linux e ha fatto la seguente:

yum install octave 

che ha installato sul mio computer l'ultima versione di ottava, 3.6.2. Funziona alla grande, tuttavia quando si moltiplicano due enormi matrici insieme si impantana l'unica CPU utilizzata dall'ottava. Sarebbe bello se la moltiplicazione della matrice utilizzasse tutti i core, poiché in questo caso la CPU è ovviamente il collo di bottiglia.

Può ottave utilizzare completamente processori multi-core ed eseguire su più thread? C'è una biblioteca o una bandiera del tempo di compilazione per questo?

+0

Simile alla risposta di Eric, è possibile compilare Octave con le librerie di Math Kernel di Intel per ottenere l'utilizzo di più thread. MKL è gratuito per uso non commerciale. http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – KevinC

risposta

24

Soluzione

ottava sé è un'applicazione single-thread che gira su un core. È possibile ottenere ottava per utilizzare alcune librerie come ATLAS che utilizzano più core. Quindi, mentre Octave utilizza solo un core, quando si verifica un'operazione pesante, l'ottava chiama le funzioni in ATLAS che utilizzano molte CPU.

Sono stato in grado di farlo. Prima compila "ATLAS" dal codice sorgente e rendilo disponibile al tuo sistema in modo che l'ottava possa trovarlo e utilizzare quelle funzioni di libreria. ATLAS si sintonizza sul tuo sistema e sul numero di core. Quando si installa l'ottava dal sorgente e si specifica ATLAS, esso viene utilizzato, quindi quando l'ottava esegue un'operazione pesante come un'enorme moltiplicazione di matrice, ATLAS decide quante CPU utilizzare.

Non sono riuscito a farlo funzionare per Fedora, ma su Gentoo ho potuto farlo funzionare.

Ho usato questi due link: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

Ho eseguito il seguente nucleo ottava prima e dopo ATLAS installazione:

tic 
bigMatrixA = rand(3000000,80); 
bigMatrixB = rand(80,30); 
bigMatrixC = bigMatrixA * bigMatrixB; 
toc 
disp("done"); 

La moltiplicazione matrice va molto più veloce utilizzando più processori, che era 3 volte più veloce rispetto a prima con single core:

Without Atlas: Elapsed time is 3.22819 seconds. 
With Atlas: Elapsed time is 0.529 seconds. 

I tre librerie sto usando che accelerare le cose sono blas-atlas, cblas-atlas, lapack-atlas.

Se l'ottava può utilizzare queste al posto delle librerie blas predefinite e lapack, quindi utilizzerà multi core.

Non è semplice e richiede un po 'di programmazione per ottenere l'ottava da compilare da sorgente con ATLAS.

Drabacks ad usare Atlas:

Questo software Atlas utilizza un sacco di spese generali di dividere il programma dell'ottava in più thread. Certo, va molto più veloce se tutto quello che stai facendo è un'enorme moltiplicazione di matrici, ma la maggior parte dei comandi non può essere multi-thread con l'atlante.Se estrarre ogni bit di potenza di elaborazione/velocità dai tuoi core è la massima priorità, allora avrai molta più fortuna semplicemente scrivendo il tuo programma da eseguire in parallelo con se stesso. (Dividi il tuo programma in 8 programmi equivalenti che funzionano su 1/8 del problema ed eseguili tutti contemporaneamente, quando tutti sono pronti, riassembla i risultati).

Atlas aiuta un singolo programma di ottava filettato a comportarsi un po 'più come un'app multi-thread ma non è un proiettile argentato. Atlas non renderà il tuo programma Octave a thread singolo il tuo core processor da 2,4,6,8. Noterai un aumento delle prestazioni, ma la spinta ti lascerà alla ricerca di un modo migliore per utilizzare tutto il processore. La risposta è scrivere il tuo programma per correre in parallelo con se stesso, e questo richiede molta abilità di programmazione.

Suggerimento

Metti la tua energia in vettorizzazione le operazioni più pesanti e distribuendo il processo su n discussioni funzionamento simultaneo. Se si sta aspettando troppo a lungo per l'esecuzione di un processo, molto probabilmente il frutto in sospensione più basso per accelerarlo utilizza un algoritmo o una struttura dati più efficiente.

+0

Per l'approccio "dividi il tuo programma in thread separati", un BLAS ottimizzato è ancora desiderabile, ma * singolo * filettato. Come in questa [sezione openBLAS] (http://wiki.octave.org/Octave_and_separate_toolchain). Poi vedi gli esempi in http://wiki.octave.org/Parallel_package – ederag

6

Su Octave-Forge sono due pacchetti occupano di calcolo parallelo:

È anche possibile generare sottoprocessi utilizzando la funzione fork().

2

Come suggerito da Eric, ho provato a utilizzare ATLAS e ha migliorato le mie prestazioni 3x (nell'applicazione di apprendimento NN, il costo principale è la moltiplicazione della matrice). Sorprendentemente sembrava ancora di usare solo un core. Dopo ulteriori ricerche mi sono imbattuto in OpenBLAS e ho iniziato a utilizzare più core fuori dalla scatola e ho migliorato ulteriormente le prestazioni 2 volte (avevo solo 2 core però). Se vuoi spremere di più puoi anche provare a usare MKL, ma è pesante sullo spazio del disco a causa delle dipendenze.

Stavo usando Arch Linux con i pacchetti community/atlas-lapack-base e aur/openblas-lapack. L'installazione di ciascuno di essi ha cambiato quella predefinita utilizzata in Octave.

Ecco un benchmark comparativo con queste librerie: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/

Problemi correlati