2015-02-25 14 views
8
// 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 
//1 
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 

Tại sao hai dòng cuối sao chép dữ liệu? Không phải GPU và CPU có cả nội dung cập nhật không?Khi nào thì Caffe tạo bản sao của dữ liệu?

http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html

Trả lời

9

.gpu_data.cpu_data được sử dụng trong trường hợp là data chỉ được sử dụng như là đầu vào và sẽ không được sửa đổi bởi các thuật toán. .mutable_* được sử dụng khi dữ liệu được cập nhật trong khi chạy thuật toán.

Bất cứ khi nào dữ liệu được gọi, nó sẽ kiểm tra xem câu lệnh trước đó có phải là một cuộc gọi hàm mutable_* và quá sử dụng cùng một bộ xử lý (gpu hoặc cpu) hay không. Nếu nó đang sử dụng cùng một bộ xử lý, dữ liệu không cần phải được sao chép. Nếu nó đang sử dụng bộ xử lý khác, có khả năng dữ liệu có thể đã được cập nhật trong cuộc gọi .mutable_* trước đó và do đó cần có bản sao dữ liệu.

Sửa 1 Bất cứ khi nào các hướng dẫn trước đây là 'có thể thay đổi, dữ liệu sao chép phải được thực hiện trước khi hướng dẫn hiện hành NẾU các hướng dẫn hiện nay là trên một bộ xử lý khác nhau.

Trong trường hợp khác, việc sao chép dữ liệu diễn ra ngoại trừ điều kiện ban đầu đặc biệt, tức là; khi không có dữ liệu nào có mặt trong bộ nhớ GPU và do đó một bản sao của dữ liệu sẽ diễn ra trước cuộc gọi * _gpu_data().

+0

Chỉ để đảm bảo rằng tôi đang theo dõi bạn: dữ liệu được sao chép nếu cuộc gọi trước đó để lấy dữ liệu là (a) trên cùng một bộ xử lý và (b) có thể thay đổi được? Nếu vậy, những gì về (1) [xem câu hỏi cập nhật]. Tại sao bar = blob.mutable_cpu_data(); (cuộc gọi sau (1)) không sao chép dữ liệu? – user678392

+3

Đã cập nhật câu trả lời để làm cho câu trả lời rõ ràng hơn. Cuộc gọi sau (1) không được sao chép vì (1) không phải là một lệnh có thể thay đổi, có nghĩa là dữ liệu sẽ không được cập nhật và do đó nó sẽ giống nhau trong cả cpu và gpu –

Các vấn đề liên quan