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.