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

4

1 回答 1

9

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

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

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

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

于 2015-03-02T11:08:33.943 回答