// 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
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
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 –