2016-02-08 9 views
8

Tôi đang tính toán float s từ nhiều chủ đề và lưu trữ các kết quả trong phạm vi không chồng chéo của cùng vector<float> như sau:Đang gọi std :: sao chép từ nhiều chủ đề cho các phạm vi khác nhau của cùng một véc tơ an toàn?

Trước khi chạy bất kỳ chủ đề tôi được cấp phát trước nó bằng cách sử vector::reserve.

Trong mỗi chủ đề một thread-cụ thể vector kết quả được tính toán và sau đó sao chép vào container mục tiêu như thế này:

vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex; 
std::copy(localVector.begin(), localVector.end(), destination); 

Đây có phải là một thực hành an toàn không?

+8

'std :: vector :: reserve' sẽ không làm, bạn cần phải thực sự' thay đổi kích thước() '- nếu không bạn sẽ được viết vượt ra ngoài' cuối() 'thực tế của vectơ. – mindriot

+0

Để thêm vào nhận xét @mindriot: Nếu loại bạn đang lưu trữ không có hàm tạo mặc định, bạn có thể sử dụng thứ gì đó như 'boost :: optional' thay cho loại của bạn trực tiếp. Điều này sẽ có thêm lợi ích mà bạn có thể nói nếu một cái gì đó thất bại mà không cần phải tạo ra một trong những đối tượng 'chưa thực sự' mà không hoàn toàn tự xây dựng. Đó là những sự ghê tởm. –

Trả lời

7

Đầu tiên vector::reserve không thực sự tạo bất kỳ thành phần nào. Nó chỉ thiết lập dung lượng của vector. Nếu bạn cần các yếu tố ở đó, bạn cần vector::resize hoặc chỉ cần tạo vectơ theo kích thước cần thiết.

Thứ hai, quy tắc của ngón tay cái là nếu bạn có một đối tượng được chia sẻ giữa các chủ đề và ít nhất một trong số chúng là một nhà văn bạn cần đồng bộ hóa. Vì trong trường hợp này, "đối tượng" là phạm vi của trình lặp và chúng không chồng lên nhau, bạn không quan tâm đến vấn đề này. Miễn là kích thước vectơ không thay đổi thì bạn sẽ không sao.

Một vấn đề bạn có thể có với điều này là chia sẻ sai. Nếu cùng một dòng bộ nhớ cache chứa các biến mà các luồng khác nhau đang sử dụng thì các dòng bộ nhớ cache đó phải được đồng bộ lại mỗi lần một biến trong dòng được cập nhật. Điều này có thể làm chậm hiệu suất của mã khá một chút.

+0

Điểm tốt về bộ nhớ cache. Tôi tự hỏi nếu bất kỳ container khác sẽ phù hợp tốt hơn ở đây, nhưng đoán rằng ngay cả với điều này bộ nhớ cache, vector là một trong những nhanh nhất. –

+0

@piotrsmaron vectơ thường là lựa chọn tốt hơn. Miễn là phạm vi của các trình vòng lặp lớn hơn một dòng bộ nhớ cache thì việc chia sẻ sai không phải là một vấn đề. Tôi chỉ đề cập đến nó như là một cạm bẫy tiềm năng và tôi đã nhìn thấy nó trên phạm vi nhỏ. – NathanOliver

+0

@jaggedSpire Không sao cả. Cảm ơn bạn đã xem xét ngữ pháp. – NathanOliver

2

Nếu vector đã cố định kích thước (và nó có vẻ như nó có từ câu hỏi của bạn), và phạm vi không chồng chéo, sau đó:

  1. vector sẽ không được phân bổ lại
  2. chủ đề khác nhau sẽ không truy cập cùng một bộ nhớ

vì vậy tôi không thấy bất kỳ cuộc đua dữ liệu nào tại đây. (Nhưng theo nhận xét đầu tiên cho câu hỏi của bạn, bạn phải đảm bảo, rằng vectơ có kích thước cố định này khi nó được sử dụng). Bạn cũng có thể xem phần "Số liệu dữ liệu" cho std :: copy: http://www.cplusplus.com/reference/algorithm/copy/

+0

Trừ khi nó là 'vector ' –

+0

Có, đó là chính xác. Bởi vector tôi có nghĩa là vector , tác giả của câu hỏi đã được hỏi về, nhưng cảm ơn cho thẳng này ra. –

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