// 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
答案 0 :(得分:9)
.gpu_data
仅用作输入且不会被算法修改,则使用 .cpu_data
和data
。在运行算法时数据本身得到更新时使用.mutable_*
。
每当调用数据时,它都会检查前一个语句是否为mutable_*
函数调用,并且也使用相同的处理器(gpu或cpu)。如果使用相同的处理器,则无需复制数据。如果它正在使用其他处理器,则有可能在之前的.mutable_*
调用中更新了数据,因此需要进行数据复制。
修改1 只要前一条指令是“可变的”,就要在当前指令IF之前完成数据复制,如果当前指令在不同的处理器上。
在任何其他情况下,除了特殊的初始条件外,都会发生数据复制,即;当GPU内存中根本没有数据时,因此在* _gpu_data()调用之前会发送数据副本。