Tác động của ngữ nghĩa di chuyển C ++ 11 trong bối cảnh điện toán khoa học là gì?


10

C ++ 11 giới thiệu ngữ nghĩa di chuyển, ví dụ, có thể cải thiện hiệu suất mã trong các tình huống trong đó C ++ 03 sẽ cần thực hiện xây dựng bản sao hoặc gán bản sao. Bài viết này báo cáo rằng mã sau trải nghiệm tăng tốc 5x khi được biên dịch với C + 11:

vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
    vector<int> x(1000);
    V.push_back(x);
}

Tác động của ngữ nghĩa di chuyển C ++ 11 trong bối cảnh điện toán khoa học là gì?

Tôi quan tâm đến câu hỏi này nói chung nhưng cụ thể hơn, tôi cũng quan tâm đến ngữ nghĩa di chuyển cho các mã Phần tử hữu hạn được viết bằng các thư viện boost. Tôi đã thử nghiệm một số mã C ++ 03 của riêng mình bằng cách sử dụng phiên bản boost 1.47.0 (vì ghi chú phát hành tăng đề cập đến ngữ nghĩa di chuyển được giới thiệu trong 1.48.0) và tăng phiên bản 1.53.0, nhưng tôi không nhận thấy nhiều cải thiện. Tôi đoán bất kỳ khoản tiết kiệm nào từ việc không phải thực hiện xây dựng bản sao cho boost::numeric::ublas::vector/ matrixboost::functionkhông đáng chú ý vì việc giải các ma trận hệ thống tạo thành phần lớn khối lượng công việc.

Chỉnh sửa: Trên thực tế, có vẻ như ngữ nghĩa di chuyển chỉ được triển khai cho boost::function(xem ghi chú phát hành phiên bản 1.52.0 ). Không có đề cập đến ngữ nghĩa di chuyển trong boost::numeric, tôi đã lấy các nguồn để đảm bảo và dường như không có tài liệu tham khảo giá trị.


1
Như bạn lưu ý trong phần cuối của câu hỏi, trừ khi bạn đã lược tả mã của mình và thấy rất nhiều sự sao chép đang diễn ra, bạn không thể cải thiện đáng kể hiệu suất của mình bằng cách sử dụng ngữ nghĩa di chuyển.
Bill Barth

Câu trả lời:


10

Tôi nghĩ rằng trong thực tế tác động là hạn chế và sẽ bị hạn chế.

Lý do tại sao nó được giới hạn ngay bây giờ là các gói phần tử hữu hạn lớn là cẩn thận để viết mã đó là di động, và vì vậy họ chưa sử dụng C ++ cấu trúc 11 ngôn ngữ trong mã của riêng mình.

Tất nhiên, họ sẽ được hưởng lợi từ mã như mã bạn hiển thị ở đâu, ngay cả khi không phải thay đổi mã nguồn, bạn được hưởng lợi từ thư viện hỗ trợ trình biên dịch được cải tiến như libstdc ++ cho GCC. Điều đó nói rằng, những người trong ngành điện toán khoa học nhận thức khá rõ về chi phí sao chép và vì vậy, đối với các đối tượng có vấn đề, họ chỉ đơn giản là không sao chép - họ tạo ra tại chỗ hoặc họ tạo ra các bản sao nông hoặc họ sử dụng chung con trỏ, hoặc nhiều kỹ thuật khác có sẵn để tránh chi phí sao chép. Nói cách khác, tình huống mà ngữ nghĩa di chuyển được phát minh không thực sự xảy ra rất thường xuyên trong các mã khoa học "thực sự".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.