2010-04-30 14 views
6

Mi sto interrogando sulla libreria CuBLAS di NVIDIA. Qualcuno ha esperienza con esso? Ad esempio, se scrivo un programma C utilizzando BLAS, sarò in grado di sostituire le chiamate a BLAS con le chiamate a cuBLAS? O ancora meglio implementare un meccanismo che consente all'utente di scegliere in fase di runtime?BLAS e CUBLAS

Che dire se utilizzo la libreria BLAS fornita da Boost con C++?

risposta

1

CUBLAS non avvolge BLAS. CUBLAS accede anche alle matrici in un ordinamento colonna-principale, come alcuni codici Fortran e BLAS.

Sono più abituato a scrivere codice in C, anche per CUDA. Un codice scritto con CBLAS (che è un involucro C di BLAS) può essere facilmente modificato in un codice CUDA. Attenzione che i codici Fortran che usano BLAS sono molto diversi dai codici C/C++ che usano CBLAS. Fortran e BLAS normalmente memorizzano matrici o doppi array nell'ordine delle colonne, ma C/C++ normalmente gestisce l'ordinamento di riga principale. Normalmente gestire questo problema crei salvare le matrici in un array 1D, e utilizzare #define per scrivere un macro accesso Toa l'elemento i, j della matrice come:

/* define macro to access Aij in the row-wise array A[M*N] */ 
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M */ 
/* define macro to access Aij in the col-wise array A[M*N] */ 
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

CBLAS biblioteca ha un pozzo organizzare parametri e convenzioni (variabili const enum) per assegnare a ciascuna funzione l'ordinamento della matrice. Attenzione che anche la memorizzazione delle matrici varia, una matrice a righe non è memorizzata come una matrice a colonne.

Non penso che ci siano dei meccanismi per consentire all'utente di scegliere tra l'utilizzo di BLAS o CUBLAS, senza scrivere il codice due volte. CUBLAS ha anche sulla maggior parte delle chiamate di funzione una variabile "handle" che non appare su BLAS. Ho pensato di #define per cambiare il nome ad ogni chiamata di funzione, ma questo potrebbe non funzionare.

0

Ho effettuato il porting del codice BLAS a CUBLAS. La libreria BLAS che uso è ATLAS, quindi quello che dico può essere corretto solo fino alla scelta della libreria BLAS.

ATLAS BLAS richiede di specificare se si sta utilizzando l'ordine principale della colonna o l'ordinamento principale della riga e ho scelto l'ordinamento principale della colonna poiché utilizzavo CLAPACK che utilizza l'ordinamento principale della colonna. LAPACKE d'altra parte userebbe l'ordinamento di fila principale. CUBLAS è l'ordinamento principale della colonna. Potrebbe essere necessario regolare di conseguenza.

Anche se l'ordinamento non è un problema, il porting su CUBLAS non è stato affatto un calo nella sostituzione. Il problema più grande è che devi spostare i dati dentro e fuori dallo spazio di memoria della GPU. Quella memoria è impostata usando cudaMalloc() e rilasciata con cudaFree() che agisce come ci si aspetterebbe. Sposti i dati nella memoria della GPU usando cudaMemcpy(). Il tempo per farlo sarà un fattore determinante su cui vale la pena passare dalla CPU alla GPU.

Una volta fatto, le chiamate sono abbastanza simili. CblasNoTrans diventa CUBLAS_OP_N e CblasTrans diventa CUBLAS_OP_T. Se la libreria BLAS (come fa ATLAS) consente di passare scalari in base al valore, è necessario convertirlo per passare per riferimento (come è normale per FORTRAN).

Dato questo, qualsiasi switch che consente una scelta di CPU/GPU si troverà più facilmente a un livello superiore rispetto alla funzione BLAS. Nel mio caso ho le varianti CPU e GPU dell'algoritmo e le ho scelte ad un livello più alto a seconda delle dimensioni del problema.

5

La risposta di janneb non è corretta, cublAS è non un sostitutivo di sostituzione per una CPU BLAS. Presuppone che i dati siano già presenti sul dispositivo e che le firme delle funzioni abbiano un parametro aggiuntivo per tenere traccia di un contesto di cuBLAS.

Tuttavia, in arrivo CUDA 6.0 è una nuova libreria denominata NVBLAS che fornisce esattamente questa funzionalità "drop-in". Intercetta le chiamate BLAS Level3 (GEMM, TRSV, ecc.) E le invia automaticamente alla GPU, affiancando efficacemente il trasferimento PCIE con il calcolo su GPU.

Ci sono alcune informazioni qui: https://developer.nvidia.com/cublasxt e CUDA 6.0 è disponibile per gli sviluppatori registrati CUDA oggi.

I documenti completi saranno online quando CUDA 6.0 verrà rilasciato al pubblico.