2

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.
4

1 に答える 1

2

このスニペットは、CPU <-> GPU メモリ転送の詳細からユーザーを保護する Caffe の Blob クラスの機能を説明するためのものです。

コード内のコメントについて詳しく説明する私の試み:

Blob オブジェクトが既に宣言され、データが取り込まれていることを前提としています。データが何を表しているかは関係ありません。このスニペットには、Blob オブジェクトの実際の宣言とその初期化がありません。

// Assuming that data are on the CPU initially, and we have a blob.
const Dtype* foo;
Dtype* bar;

ブロブに入力されるデータは 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 = 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.
于 2015-07-14T12:54:43.357 に答える