2012-02-21 7 views
7

Recentemente ho usato molto la spinta. Ho notato che per usare la spinta, si deve sempre copiare i dati dalla memoria della CPU alla memoria gpu.
Vediamo il seguente esempio:c'è un modo migliore e più veloce per copiare dalla memoria della CPU alla GPU usando la spinta?

int foo(int *foo) 
{ 
    host_vector<int> m(foo, foo+ 100000); 
    device_vector<int> s = m; 
} 

Io non sono molto sicuro di come funziona il costruttore host_vector, ma sembra come se fossi la copia dei dati iniziali, provenienti da *foo, due volte - una volta per il host_vector quando è inizializzato e un'altra volta quando viene inizializzato device_vector. C'è un modo migliore di copiare da cpu a gpu senza fare una copia di dati intermedia? So che posso usare device_ptr come wrapper, ma questo non risolve il problema.
grazie!

risposta

14

Uno dei costruttori di device_vector accetta un intervallo di elementi specificati da due iteratori. E 'abbastanza intelligente da capire il puntatore grezzo nel tuo esempio, in modo da poter costruire una device_vector direttamente ed evitare la temporanea host_vector:

void my_function_taking_host_ptr(int *raw_ptr, size_t n) 
{ 
    // device_vector assumes raw_ptrs point to system memory 
    thrust::device_vector<int> vec(raw_ptr, raw_ptr + n); 

    ... 
} 

Se il puntatore prime punti alla memoria CUDA, introdurre un device_ptr:

void my_function_taking_cuda_ptr(int *raw_ptr, size_t n) 
{ 
    // wrap raw_ptr before passing to device_vector 
    thrust::device_ptr<int> d_ptr(raw_ptr); 

    thrust::device_vector<int> vec(d_ptr, d_ptr + n); 

    ... 
} 

L'utilizzo di device_ptr non assegna alcuna memoria; codifica semplicemente la posizione del puntatore nel sistema di tipi.

+0

l'argomento size_t n specifica il numero di elementi nel vettore e non deve essere nel nome del tipo size_t, size_t di solito specifica la lunghezza dei dati in byte. – TripleS

Problemi correlati