2015-02-25 12 views
8
// Assuming that data are on the CPU initially, and we have a blob. 
const Dtype* foo; 
Dtype* bar; 
foo = blob.gpu_data(); // data copied cpu->gpu. 
foo = blob.cpu_data(); // no data copied since both have up-to-date contents. 
bar = blob.mutable_gpu_data(); // no data copied. 
// ... some operations ... 
bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU. 
foo = blob.cpu_data(); // data copied gpu->cpu, since the gpu side has modified the data 
foo = blob.gpu_data(); // no data copied since both have up-to-date contents 
//1 
bar = blob.mutable_cpu_data(); // still no data copied. 
bar = blob.mutable_gpu_data(); // data copied cpu->gpu. 
bar = blob.mutable_cpu_data(); // data copied gpu->cpu 

Perché le ultime due righe copiano i dati? La GPU e la CPU non hanno entrambi i contenuti aggiornati?Quando Caffe esegue le copie dei dati?

http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html

risposta

9

.gpu_data e .cpu_data sono utilizzati in casi erano il data venga utilizzata solo in ingresso e non sarà modificato dall'algoritmo. .mutable_* viene utilizzato quando i dati vengono aggiornati durante l'esecuzione dell'algoritmo.

Ogni volta che viene richiamato un dato, esso verifica se l'istruzione precedente era una chiamata di funzione mutable_* e anche quello che utilizza lo stesso processore (gpu o cpu). Se sta utilizzando lo stesso processore, i dati non devono essere copiati. Se sta utilizzando l'altro processore, è possibile che i dati siano stati aggiornati nella precedente chiamata .mutable_* e che quindi sia necessaria una copia dei dati.

Modifica 1 Ogni volta che la precedente istruzione è 'mutabile', copia dei dati deve essere fatto prima che l'istruzione corrente se l'istruzione corrente è su un processore diverso.

In nessun altro caso la copia dei dati avviene tranne una condizione iniziale speciale, vale a dire; quando nessun dato era presente nella memoria della GPU e quindi una copia dei dati avverrà prima della chiamata * _gpu_data().

+0

Solo per essere sicuro di seguirti: i dati vengono copiati se la precedente chiamata per ottenere dati era (a) sullo stesso processore e (b) era modificabile? In tal caso, che dire di (1) [vedi domanda aggiornata]. Perché bar = blob.mutable_cpu_data(); (la chiamata dopo (1)) non copia i dati? – user678392

+3

Aveva aggiornato la risposta per renderlo più chiaro. La chiamata dopo (1) non viene copiata perché (1) non era un'istruzione mutabile, il che significa che i dati non verranno aggiornati e quindi sarà lo stesso sia in cpu che in gpu –

Problemi correlati