2011-12-26 9 views
10

In generale, Mathematica può automaticamente (senza scrivere codice specifico per questo) l'hardware della GPU e/o parallelizzare le operazioni integrate su più core?Una scheda grafica migliore o più core renderebbero Mathematica più veloce?

Ad esempio, per disegnare un singolo grafico ad alta intensità di CPU o risolvere un'equazione molto intensiva della CPU, l'aggiornamento dell'hardware grafico potrebbe accelerare? L'aggiornamento a una CPU con più core accelererebbe le cose? (Capisco che più core significano poter risolvere più equazioni in parallelo ma sono curioso del caso a equazione singola)

Solo cercando di capire come Mathematica sfrutta l'hardware.

+1

Immagino che dipenda dall'operazione e se utilizzi la GPU e in che modo. Oserei dire che * le operazioni composte * più * non utilizzano la GPU, poiché la programmazione della GPU è significativamente diversa dalla programmazione della CPU. Ad esempio, una FFT si adatta bene a un modello di GPU, ma un insieme di equazioni che non possono essere affrontate tramite l'algebra lineare è probabilmente una storia completamente diversa. –

+0

Suppongo che mi stia chiedendo se le funzioni incorporate di Mathematica utilizzano la GPU ... – nicolaskruchten

+0

Hai dichiarato/implicito che lo fa .. manca una parola? :) I moduli/opuscoli di Mathematica sarebbero i luoghi per scoprirlo: sicuramente non qui, a meno che la domanda riguardasse la scrittura di tali operazioni. –

risposta

11

Non direi che Mathematica esegue automaticamente il calcolo della GPU o della CPU Paralell, almeno in generale. Dato che devi fare qualcosa con i kernel di Paraels, allora dovresti inizializzare più kernel e/o caricare CUDALink o OpenCLLink e usare specifiche funzionalità di Mathematica per sfruttare il potenziale di CPU e/o GPU.

Ad esempio, non ho una scheda grafica molto potente (NVIDIA GeForce 9400 GT) ma possiamo testare come funziona CUDALink. In primo luogo devo caricare CUDALink:

Needs["CUDALink`"] 

ho intenzione di testare la moltiplicazione di grandi matrici. Scelgo una matrice casuale 5000 x 5000 di numeri reali nella gamma (-1,1):

M = RandomReal[{-1,1}, {5000, 5000}];

Ora possiamo controllare i tempi di calcolo senza supporto GPU

In[4]:= AbsoluteTiming[ Dot[M,M]; ] 

    Out[4]= {26.3780000, Null} 

e con il supporto GPU

In[5]:= AbsoluteTiming[ CUDADot[M, M]; ] 

Out[5]= {6.6090000, Null} 

In questo caso abbiamo ottenuto un aumento delle prestazioni all'incirca del fattore 4, utilizzando CUDADot invece di Dot.

Modifica

Per aggiungere un esempio di accelerazione CPU parallelo (su una macchina dual-core) scelgo tutti i numeri primi nella gamma [2^300, 2^300 +10^6]. Prima senza parallelizzazione:

In[139]:= AbsoluteTiming[ Select[ Range[ 2^300, 2^300 + 10^6], PrimeQ ]; ] 

Out[139]= {121.0860000, Null} 

durante l'utilizzo Parallelize[expr], che valuta espr utilizzando parallelizzazione automatica

In[141]:= AbsoluteTiming[ Parallelize[ Select[ Range[ 2^300, 2^300 + 10^6], PrimeQ ] ]; ] 

Out[141]= {63.8650000, Null} 

Come ci si potrebbe aspettare che abbiamo quasi due volte più veloce di valutazione.

7

Generalmente no, una GPU più veloce non accelera il normale Calcoli matematici.

È necessario utilizzare le funzioni supportate da Cuda/OpenCL per utilizzare la GPU. È possibile ottenere una panoramica delle opzioni e alcuni esempi del loro uso qui: CUDA and OpenCL Support.

4

non posso commentare molto su come Mathematica utilizza la GPU (come non ho mai avuto la possibilità di provare), ma non credo lo fa di default (i.e without you writing code specifically to exploit the GPU)

Aggiunta di più core aiuterà se parallelizzi esplicitamente i tuoi calcoli (see Parallelize and related functions).

Se non si parallelizza esplicitamente, credo che ci siano ancora alcuni calcoli numerici che sfruttano più core. Non sono sicuro di quale, ma so che alcune funzioni correlate algebra lineare (LinearSolve, Det, ecc.) Utilizzano più core per impostazione predefinita.

+0

So che alcune delle operazioni di elaborazione delle immagini utilizzeranno anche più core per impostazione predefinita. –

+0

Anche la risoluzione di un autosistema (denso o spargolo) utilizza molti core automaticamente – acl

+0

@acl Ho provato 'Eigenvalues' su una CPU dual core, ma ha usato solo un core. Forse 'Eigensystem' non fa 'Eigenvalues' (non sarebbe insolito)? Non posso testare adesso. – Szabolcs