// 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
Tại sao hai dòng cuối sao chép dữ liệu? Không phải GPU và CPU có cả nội dung cập nhật không?Khi nào thì Caffe tạo bản sao của dữ liệu?
http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
Chỉ để đảm bảo rằng tôi đang theo dõi bạn: dữ liệu được sao chép nếu cuộc gọi trước đó để lấy dữ liệu là (a) trên cùng một bộ xử lý và (b) có thể thay đổi được? Nếu vậy, những gì về (1) [xem câu hỏi cập nhật]. Tại sao bar = blob.mutable_cpu_data(); (cuộc gọi sau (1)) không sao chép dữ liệu? – user678392
Đã cập nhật câu trả lời để làm cho câu trả lời rõ ràng hơn. Cuộc gọi sau (1) không được sao chép vì (1) không phải là một lệnh có thể thay đổi, có nghĩa là dữ liệu sẽ không được cập nhật và do đó nó sẽ giống nhau trong cả cpu và gpu –