2015-06-17 22 views
6

Sono un principiante che usa le routine di LAPACK, quindi non le conosco profondamente e voglio usarle in cicli paralleli (openmp).Le sequenze di routine LAPACK sono sicure?

Io uso Ubuntu 14.04LTS e LAPACK è stato installato utilizzando il mio gestore pacchetti. La versione installata è:

liblapack3 3.5.0-2ubuntu1  Library of linear algebra routines 3 - shared version 

La libreria BLAS associato è:

libblas3 1.2.20110419-7 

Quindi, la mia prima domanda è abbastanza semplice: posso usare qualsiasi subroutine o la funzione del LAPACK in un ciclo parallelizzata usando OpenMP ?. Id est, sono thread safe ?.

Un'altra domanda è: Posso usare qualsiasi subroutine o funzione del LAPACK nella mia subroutine pura ?, id est, in una subroutine codificata da me e definita come pura.

Se la risposta a queste domande sono "non con tutte le procedure LAPACK ma con alcuni di loro", quindi, posso farlo con le seguenti subroutine ?:

  • dgetrs
  • dgetrf
  • dgetri
  • dgecon

E un'ultima domanda: fare le procedure LAPACK utilizzano tutti i miei core ?, id est, sono già p arallel ?.

risposta

8

La libreria LAPACK dovrebbe essere thread-safe. Non supporta più thread, quindi non utilizza (tutti) i core del tuo sistema. In realtà esiste una dichiarazione specifica che tutte le subroutine di LAPACK sono thread-safe dal v3.3.

D'altro canto, LAPACK è progettato per utilizzare estensivamente subroutine di libreria BLAS. Il BLAS di base non utilizza alcun thread neanche. Tuttavia esistono diverse implementazioni di BLAS popolari (ATLAS, OpenBLAS, MKL) che hanno versioni con thread della maggior parte delle subroutine BLAS. Se la tua libreria LAPACK usa una delle librerie BLAS di cui sopra, è abbastanza probabile che le loro subroutine inizino i loro thread. Naturalmente, nelle librerie precedenti, l'utente può controllare il numero di thread utilizzati. Puoi consultare la loro documentazione per scoprire come.

Quindi è necessario verificare quale implementazione della libreria BLAS si utilizza per avere una visione chiara dell'utilizzo del thread di LAPACK.

Per quanto riguarda l'utilizzo all'interno di funzioni pure, desidero notare che sia BLAS che LAPACK stampano specifici messaggi di errore sullo schermo (stdout o stderr). Questi messaggi di solito si riferivano a un falso utilizzo della subroutine e non a errori matematici. Ad esempio se si tenta di invertire una matrice a dimensione zero. Se riesci a proteggerlo, probabilmente puoi dire che è puro.

+1

E posso vedere che non posso usarli in una funzione _pure_. Ricevo il seguente errore: 'Errore: la chiamata di subroutine a 'dgetrs' a (1) non è PURE' –

+0

Per riferimento: MKL fornisce interfacce per le subroutine Fortran 95 https://software.intel.com/en-us/node/468.670 – astrojuanlu