2015-01-15 4 views
1

Вот пример из http://caffe.berkeleyvision.org/tutorial/net_layer_blob.htmlпример Caffe Deep Learning Library

Я бы потерял. Что я должен делать из этого примера?

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

Этот фрагмент кода, чтобы объяснить особенность класса 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. 
Смежные вопросы