Caffe深度学习库示例

时间:2015-01-15 20:27:34

标签: deep-learning caffe

这是一个例子 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.

1 个答案:

答案 0 :(得分:2)

这个片段是为了解释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.