Caffe 何时复制数据?

When does Caffe make copies of the data?

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

为什么最后两行复制数据? GPU和CPU不是都有最新内容吗?

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

.gpu_data.cpu_data 用于 data 仅用作输入且不会被算法修改的情况。 .mutable_* 在数据本身更新时使用 运行 算法。

每当调用数据时,它都会检查前一个语句是否是一个 mutable_* 函数调用,并且是否也使用相同的处理器(gpu 或 cpu)。如果它使用相同的处理器,则不需要复制数据。如果它正在使用其他处理器,则数据可能已在之前的 .mutable_* 调用中更新,因此需要数据副本。

编辑 1 每当前一条指令是 'mutable' 时,如果当前指令在不同的处理器上,则数据复制将在当前指令之前完成。

除了特殊的初始条件外,在其他情况下不会发生数据复制,即;当 GPU 内存中根本没有数据时,因此将在 *_gpu_data() 调用之前复制数据。