2015-07-01 14 views
5

Ho installato il runtime CUDA e la versione 7.0 dei driver sulla mia workstation (Ubuntu 14.04, 2x Intel XEON e5 + 4x Tesla k20m). Ho usato il seguente programma per verificare se la mia installazione funziona:Perché il mio programma "Hello world" richiede quasi 10 anni?

#include <stdio.h> 

__global__ void helloFromGPU() 
{ 
    printf("Hello World from GPU!\n"); 
} 

int main(int argc, char **argv) 
{ 
    printf("Hello World from CPU!\n"); 

    helloFromGPU<<<1, 1>>>(); 

    printf("Hello World from CPU! Again!\n"); 

    cudaDeviceSynchronize(); 

    printf("Hello World from CPU! Yet again!\n"); 
    return 0; 
} 

ottengo l'uscita corretta, ma c'è voluto un importo enourmus di tempo:

$ nvcc hello.cu -O2 
$ time ./hello > /dev/null 

real 0m8.897s 
user 0m0.004s 
sys  0m1.017s` 

Se rimuovo tutto il codice dispositivo l'esecuzione complessiva richiede 0.001 s. Quindi perché il mio programma semplice impiega quasi 10 secondi?

+0

quale tempo si ottiene se si esegue 'ciao' su una GPU? per esempio. 'CUDA_VISIBLE_DEVICES = 0 volta./Ciao'? –

+0

Penso che cudaDevicesynchronize() stia prendendo tempo –

+0

questo non modifica il tempo impiegato. È circa 9 secondi – chris

risposta

6

L'apparente tempo di esecuzione lento del tuo esempio è dovuto al costo fisso di base dell'impostazione del contesto della GPU.

Poiché si esegue su una piattaforma che supporta l'indirizzamento unificato, il runtime CUDA deve mappare 64 GB di RAM host e 4 x 5120 MB dalle GPU in un singolo spazio di indirizzi virtuali e registrarlo con il kernel Linux.

Ci sono molte chiamate API del kernel necessarie per farlo e non è veloce. Direi che è la fonte principale delle prestazioni lente che stai osservando. Dovresti considerare questo come un costo di avviamento fisso che deve essere ammortizzato nel corso della vita della tua applicazione. Nelle applicazioni del mondo reale, un avvio di 10 secondi è banale e non ha alcuna importanza reale. In un esempio di ciao mondo, non lo è.

+0

Grazie per la risposta. È possibile disattivare questa mappatura a scopo di test? – chris

+0

@chris: potresti provare a utilizzare 'CUDA_VISIBLE_DEVICES' per ridurre lo spazio degli indirizzi GPU da includere in una singola GPU. Questo potrebbe aiutare. Non so come disabilitare la mappatura UVA dell'host. – talonmies

+0

Puoi anche provare a impostare "modalità persistenza" sulle GPU. Usa il comando 'nvidia-smi', usa' nvidia-smi --help' o usa la pagina man per conoscere nvidia-smi. Può essere d'aiuto un po ', tuttavia penso che la parte del leone sia dovuta a ciò che i talonmie hanno descritto. –