2012-04-13 33 views
6

Khi các biến khác nhau nằm trong cùng một dòng bộ nhớ cache, bạn có thể trải nghiệm False Sharing, có nghĩa là ngay cả khi hai luồng khác nhau (chạy trên các lõi khác nhau) đang truy cập hai biến khác nhau, nếu hai biến đó nằm trong cùng một dòng bộ nhớ cache, bạn sẽ có hiệu suất truy cập, vì mỗi lần kết hợp bộ nhớ cache sẽ được kích hoạt.Chia sẻ sai và biến nguyên tử

Bây giờ hãy nói rằng các biến đó là biến nguyên tử (Theo nguyên tử tôi ngụ ý các biến giới thiệu hàng rào bộ nhớ, chẳng hạn như atomic<t> của C++), sẽ chia sẻ sai sự cố ở đó hoặc không quan trọng nếu các biến nguyên tử nằm trong cùng một bộ nhớ cache dòng hay không, như được cho là họ sẽ giới thiệu kết hợp bộ nhớ cache anyway. Nói cách khác, sẽ đặt các biến nguyên tử trong cùng một dòng bộ nhớ cache làm cho ứng dụng chậm hơn không đặt chúng trong cùng một dòng bộ nhớ cache?

Trả lời

5

Làm rõ: đối với các hậu quả tiêu cực, ít nhất một số truy cập vào các biến "được chia sẻ sai" phải được ghi. Nếu viết là hiếm, tác động hiệu suất của chia sẻ sai là khá không đáng kể; càng có nhiều dòng (và vì vậy dòng bộ nhớ cache làm mất hiệu lực tin nhắn) hiệu suất tồi tệ hơn.

Ngay cả với nguyên tử, chia sẻ dòng bộ nhớ cache (sai hoặc đúng) vẫn là vấn đề. Hãy tìm một số bằng chứng ở đây: http://www.1024cores.net/home/lock-free-algorithms/first-things-first. Vì vậy, câu trả lời là - có, việc đặt các biến nguyên tử được sử dụng bởi các luồng khác nhau vào cùng một dòng bộ nhớ cache có thể làm cho ứng dụng chậm hơn so với việc đặt chúng thành hai dòng khác nhau. Tuy nhiên, tôi nghĩ rằng nó sẽ hầu như không được chú ý, trừ khi ứng dụng dành một phần đáng kể thời gian cập nhật các biến nguyên tử này.

0

sẽ đặt các biến nguyên tử trong cùng một dòng bộ nhớ cache làm cho ứng dụng chậm hơn không đặt chúng trong cùng một dòng bộ nhớ cache?

False chia sẻ của các biến "nguyên tử" thể dẫn đến vấn đề hiệu suất (hay không sẽ dẫn đến vấn đề như vậy phụ thuộc vào rất nhiều thứ).

Giả sử bạn có hai lõi, AB và mỗi hoạt động theo biến riêng của nó. Hãy gọi các biến này lần lượt là ab.

Aa trong bộ nhớ cache và Bb trong bộ nhớ cache.

Hãy xem xét điều gì sẽ xảy ra khi số gia tăng Aa.

  • nếu ab chia sẻ một dòng bộ nhớ cache,B 's bản sao của b sẽ bị vô hiệu, và truy cập tiếp theo của nó để b sẽ phải chịu một cache.
  • nếu ab không chia sẻ một dòng bộ nhớ cache, không có tác động đối với B như xa như bản cache của b là có liên quan.

Điều này xảy ra bất kể ab là "nguyên tử" hay không.

0

Nếu bạn sử dụng các biến nguyên tử với yêu cầu nhất quán mạnh nhất, một hàng rào bộ nhớ đầy đủ, tác động của chia sẻ sai có thể sẽ không đáng chú ý.Để truy cập như vậy hiệu suất của một hoạt động nguyên tử cơ bản bị giới hạn bởi độ trễ truy cập bộ nhớ. Vì vậy, mọi thứ đang chậm dù sao đi nữa, tôi không nghĩ rằng họ sẽ nhận được chậm hơn nhiều trong sự hiện diện của chia sẻ sai.

Nếu bạn có các thứ tự bộ nhớ ít xâm nhập khác, hiệu suất của bản thân nguyên tử có thể ít hơn và do đó tác động của việc chia sẻ sai có thể là đáng kể.

Tổng cộng, trước tiên tôi sẽ xem xét hiệu suất của hoạt động nguyên tử trước khi lo lắng về việc chia sẻ sai cho các hoạt động đó.

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