这里是一个例子 http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
我有点迷失了。我应该从这个例子中推断出什么?
// 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
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.
最佳答案
此代码片段旨在解释 Caffe 的 Blob 类的一项功能,该功能使用户免受 CPU<->GPU 内存传输的详细信息的影响。
我尝试详细说明代码中的注释:
它假设您已经声明了 Blob 对象并填充了数据。数据代表什么并不重要。此代码片段中缺少 Blob 对象的实际声明及其初始化。
// Assuming that data are on the CPU initially, and we have a blob.
const Dtype* foo;
Dtype* bar;
由于填充 blob 的数据驻留在 CPU 内存中,因此在 GPU 设备上使用它需要进行传输。
foo = blob.gpu_data(); // data copied cpu->gpu.
但是,如果您要将相同的数据复制到 CPU 内存上的其他位置,则 Blob 对象将不必执行 CPU<->GPU 传输所需的昂贵复制操作。
foo = blob.cpu_data(); // no data copied since both have up-to-date contents.
使用驻留在 GPU 内存中的数据初始化“bar”对象。它已经复制过一次了。无需重复昂贵的复制操作。
bar = blob.mutable_gpu_data(); // no data copied.
// ... some operations ...
bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU.
Blob 类会跟踪 CPU 和 CPU 副本是否相同,或者是否被修改,需要更新副本才能保持它们相同。
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
现在我们只是来回查看什么会触发副本,然后会依靠数据的缓存副本。
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.
关于deep-learning - Caffe 深度学习库示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972386/