Caffe中文社区给的官网译本说到:
数据既可存储在CPU上,也可以存储在GPU上,因此有两种数据访问方式:
静态方式,不改变数值;动态方式,改变数值。
SysncedMem类同步CPU和GPU上的数值,最小化传送数据。
我对示例给了一个完整注释,用以理解blob何时会复制数据:
const Dtype* cpu_data() const;
Dtype* mutable_cpu_data();const Dtype* foo;
Dtype* bar;
//assume init data equal to 0, and every update add 1
//value operation CPU GPU
foo = blob.gpu_data(); //0 copy data CPU -> GPU 0 0
foo = blob.cpu_data(); //0 get a copy from CPU 0 0
bar = blob.mutable_gpu_data(); //1 GPU update 0 1
// ... some operation ...
bar = blob.mutable_gpu_data(); //2 GPU update 0 2
foo = blob.cpu_data(); //2 copy data GPU -> CPU 2 2
foo = blob.gpu_data(); //2 get a copy from GPU 2 2
bar = blob.mutable_cpu_data(); //3 CPU update 3 2
bar = blob.mutable_gpu_data(); //4 copy data CPU -> GPU 3 4
bar = blob.mutable_cpu_data(); //5 copy data GPU -> CPU 5 4
我推测SysncedMem里面有标记位来表示CPU和GPU的更新情况。