Этот фрагмент кода, чтобы объяснить особенность класса Blob Caffe в экранирующей пользователя от деталей CPU < -> передачи памяти GPU.
Моя попытка разработки на комментарии в коде:
Предполагается, что вы уже объявлен объект Blob и заполняется данными. То, что данные представляют, не имеет значения. Фактическое объявление объекта Blob и его инициализация отсутствуют в этом фрагменте.
// Assuming that data are on the CPU initially, and we have a blob.
const Dtype* foo;
Dtype* bar;
Поскольку данные, заполняющие blob, находятся в памяти процессора, использование его на графическом процессоре требует передачи.
foo = blob.gpu_data(); // data copied cpu->gpu.
Но если вы получаете копирование, что одни и те же данные в другое место в памяти процессора, объект Blob не придется выполнять дорогостоящие операции копирования, необходимые для 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.