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() 调用之前复制数据。
// 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() 调用之前复制数据。