2009-09-12 8 views
35

Microsoft cung cấp chức năng InterlockedCompareExchange để thực hiện các phép so sánh và hoán đổi nguyên tử. Ngoài ra còn có một số _InterlockedCompareExchangenội tại.cho các lệnh x86 nguyên tử

Trên x86, chúng được thực hiện bằng cách sử dụng lệnh cmpxchg.

Tuy nhiên, đọc qua tài liệu về ba cách tiếp cận này, chúng dường như không đồng ý về các yêu cầu căn chỉnh.

của reference manual Intel nói gì về sự liên kết (khác so với kiểm tra nếu liên kết được kích hoạt và một tham chiếu bộ nhớ unaligned được thực hiện, một ngoại lệ được tạo ra)

Tôi cũng nhìn lên lock tiền tố, trong đó đặc biệt khẳng định rằng

Tính toàn vẹn của tiền tố LOCK là không bị ảnh hưởng bởi sự liên kết của trường bộ nhớ.

(tôi nhấn mạnh)

Vì vậy, Intel dường như nói thẳng đó là không thích hợp. Các hoạt động sẽ là nguyên tử không có vấn đề gì.

Các tài liệu nội tại _InterlockedCompareExchange cũng không nói gì về sự liên kết, tuy nhiên InterlockedCompareExchangechức năng khẳng định rằng

Các thông số cho chức năng này phải được xếp trên một ranh giới 32-bit; nếu không, hàm sẽ hoạt động không thể đoán trước trên các hệ thống x86 đa xử lý và bất kỳ hệ thống không phải x86 nào.

Vì vậy, điều gì mang lại? Yêu cầu căn chỉnh cho InterlockedCompareExchange chỉ để đảm bảo chức năng sẽ hoạt động ngay cả trên CPU trước 486, nơi lệnh cmpxchg không khả dụng? Điều đó dường như có khả năng dựa trên thông tin trên, nhưng tôi muốn chắc chắn trước khi tôi dựa vào nó. :)

Hoặc căn chỉnh theo yêu cầu của ISA để đảm bảo tính nguyên tử và tôi chỉ đang tìm những địa điểm sai trong sách hướng dẫn tham khảo của Intel?

Trả lời

9

PDF you are quoting from là từ năm 1999 và R CLE RÀNG đã lỗi thời.

up-to-date Intel documentation, cụ thể là Volume-3A kể một câu chuyện khác.

Ví dụ, trên bộ xử lý Core-i7, bạn PHẢI phải đảm bảo dữ liệu của bạn không vượt quá các dòng bộ nhớ cache, nếu không thao tác KHÔNG được đảm bảo là nguyên tử.

On Khối lượng 3A, lập trình hệ thống, Đối với x86/x64 Intel nêu rõ:

8.1.1 Đảm bảo hoạt động nguyên tử

Bộ xử lý Intel486 (và bộ vi xử lý mới hơn từ) đảm bảo rằng sau cơ bản hoạt động bộ nhớ sẽ luôn luôn được thực hiện nguyên tử:

  • Reading hoặc viết một byte
  • Re ading hoặc viết một chữ xếp trên một ranh giới 16-bit
  • Reading hoặc viết một doubleword xếp trên một ranh giới 32-bit

Bộ xử lý Pentium (và bộ vi xử lý mới hơn từ) đảm bảo rằng hoạt động bộ nhớ bổ sung sau đây sẽ luôn luôn được thực hiện nguyên tử:

  • Reading hoặc viết một quadword xếp trên một ranh giới 64-bit
  • 16-bit truy cập đến các địa điểm bộ nhớ uncached phù hợp trong một chiếc xe buýt dữ liệu 32-bit

Các bộ xử lý gia đình P6 (và bộ vi xử lý mới hơn từ) đảm bảo rằng các thêm hoạt động bộ nhớ sau sẽ luôn luôn được thực hiện nguyên tử:

  • Unaligned 16-, 32- và 64-bit truy cập để cache bộ nhớ phù hợp trong một bộ nhớ cache dòng

Truy vào bộ nhớ cache được chia trên dòng bộ nhớ cache và ranh giới trang không đảm bảo được nguyên tử bị CPU Intel Core 2 Duo, Intel® Atom ™, Intel Core Duo, Pentium M, Pentium 4, bộ xử lý Intel Xeon, P6, Pentium và Intel486. Bộ vi xử lý Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, và P6 cung cấp tín hiệu điều khiển bus cho phép bộ nhớ ngoài hệ thống phụ giúp phân tách truy cập nguyên tử; Tuy nhiên, dữ liệu trung lập truy cập sẽ nghiêm trọng ảnh hưởng đến hiệu suất của bộ vi xử lý và nên tránh

+1

Văn bản tôi trích dẫn ở trên IS từ sách hướng dẫn của Intel và nó nêu rõ các yêu cầu căn chỉnh khác nhau cho mỗi gia đình bộ vi xử lý. Có lẽ tôi đã sử dụng các từ ngữ khác nhau để thể hiện rằng thông tin Intel CẬP NHẬT rất rõ ràng, tôi đoán rằng những gì bạn nhận được để đọc một .pdf từ năm 1999. – damageboy

+7

-1: Bạn đã nhận được phần sai từ sổ tay phải. Các hoạt động bộ nhớ cơ bản và các hoạt động nguyên tử bị khóa là những thứ khác nhau. –

+3

@damageboy -1: Khi MackieMesser nói đúng, báo giá của bạn nói về * hoạt động bộ nhớ cơ bản * và không * hoạt động nguyên tử *, tức là hoạt động được đặt trước bằng 'LOCK', đó là những gì OP hỏi, như' LOCK' được sử dụng trong trường hợp hoạt động x86 nguyên tử. –

5

Xem this SO question: liên kết tự nhiên là quan trọng đối với hiệu suất và được yêu cầu trên kiến ​​trúc x64 (vì vậy nó không chỉ là hệ thống PRE-x86, mà cả POST-x86 nữa - x64 có thể vẫn là một trường hợp thích hợp nhưng nó ngày càng phổ biến sau tất cả ;-); đó có thể là lý do tại sao Microsoft tài liệu theo yêu cầu (khó tìm tài liệu về việc liệu MS đã quyết định FORCE vấn đề căn chỉnh hay không bằng cách bật kiểm tra căn chỉnh - điều đó có thể thay đổi tùy theo phiên bản Windows; tự do ép buộc nó trong một số phiên bản của Windows ngay cả khi họ không ép buộc người khác).

+1

Cảm ơn. Và bah, tất nhiên ai đó đã hỏi điều này trước đây. Tôi không nên ngạc nhiên ...: p Giới thiệu về x64, nó có yêu cầu căn chỉnh cho * tất cả * hướng dẫn nguyên tử, ngay cả những lệnh không yêu cầu ở chế độ 32 bit không? Không phải là tôi không tin bạn, nhưng có vẻ hơi ngạc nhiên nếu họ phá vỡ khả năng tương thích ngược như thế. Có một nguồn cho điều đó? – jalf

+1

Tôi không có thông tin về các vấn đề liên kết của x64 ngoại trừ Microsoft (xem thêm http://forum.winimage.com/viewtopic.php?t=137 cho các cuộc thảo luận và con trỏ khác về liên kết x64, ngoài nguyên tử). BTW, khả năng tương thích ngược? x64 là kiến ​​trúc mới (các chip chạy nó cũng chạy x86 cho mã 32 bit cũ) nên không có "ngược" - mã máy chạy trong x64 (thay vì chế độ cũ x86) phải được viết/biên dịch/tạo đặc biệt cho nó, không phải cho x86! -) –

+1

Liên kết đó dường như nói rằng sự liên kết chỉ là * bắt buộc * trên Itanium, chứ không phải x64, đó là điều tôi mong đợi. Nó rõ ràng vẫn còn có một tác động lớn đến hiệu năng, nhưng nó sẽ là lẻ nếu x64 đột nhiên yêu cầu căn chỉnh cho các lệnh không yêu cầu nó trong x86. Và đừng bận tâm đến tính tương thích ngược. Đó là nửa não, và một nửa không liên quan đến câu hỏi. Thay đổi chủ yếu bao gồm thêm hướng dẫn mới và thêm một byte tiền tố tùy chọn khác để cho phép bạn chỉ định một trong các thanh ghi mới) – jalf

3

API lồng vào nhau của Microsoft cũng được áp dụng cho ia64 (trong khi vẫn tồn tại). Không có tiền tố khóa trên ia64, chỉ có các lệnh cmpxchg.acq và cmpxchg.rel (hoặc fetchadd và các thú tương tự khác), và tất cả các liên kết bắt buộc nếu tôi nhớ chính xác.

+0

ia86 vẫn còn tồn tại và Windows vẫn chạy trên nó, theo như tôi biết. Dù sao, câu hỏi của tôi đã được cụ thể về x86. :) – jalf

+2

re: ia64. Tôi khá chắc chắn Windows ngừng vận chuyển một hệ điều hành cho ia64 sau khi intel phát hành phiên bản amd64 của họ (x86-64), và không có vista cũng không phải win7 cho ia64. Bây giờ chỉ có các phiên bản x86 và x86-64 của hệ điều hành. Theo như tôi lo ngại rằng có hiệu quả giết chết ia64 (trừ khi bạn tính HPUX IPF). re: lồng vào nhau và x86. Đó là hồi ức của tôi rằng chúng tôi lần đầu tiên bắt đầu nhìn thấy các API liên khóa khi microsoft phát hành phiên bản ia64 của SDK nền tảng. Nếu đó là chính xác, nó có khả năng sẽ giải thích tại sao tài liệu liên khóa không dựa vào ngữ nghĩa tiền tố LOCK của x86. –

+0

Cửa sổ IA64 đã tồn tại tới Server 2008 R2, được phát hành ngay trước khi nhận xét trước đó được đăng. –

10

x86 không không đòi hỏi sự liên kết cho các hướng dẫn cmpxchg. Tuy nhiên, liên kết được đề xuất cho hiệu suất. Điều này sẽ không ngạc nhiên, khả năng tương thích ngược có nghĩa là phần mềm được viết bằng sách hướng dẫn từ 14 năm trước sẽ vẫn chạy trên các bộ vi xử lý ngày nay.

Tại sao chính xác Microsoft yêu cầu căn chỉnh không rõ ràng từ tài liệu của họ. Nó có thể là để thực hiện hoặc hỗ trợ kiến ​​trúc RISC hoặc cả hai.

Intel® 64 và IA-32 Kiến trúc phát triển phần mềm của tay
Tập 3 (3A): Hệ thống Lập trình Hướng dẫn
tháng 1 năm 2013

8.1.2.2 Phần mềm điều khiển Bus Khóa

Để buộc một cách rõ ràng các ngữ nghĩa LOCK, phần mềm có thể sử dụng tiền tố LOCK với các hướng dẫn sau khi chúng được sử dụng để sửa đổi vị trí bộ nhớ. [...]

• Hướng dẫn trao đổi (XADD, CMPXCHG và CMPXCHG8B).
• Tiền tố LOCK được tự động giả định cho lệnh XCHG.
• [...]

[...] Tính toàn vẹn của khóa xe buýt không bị ảnh hưởng bởi căn chỉnh của trường bộ nhớ . Các ngữ nghĩa LOCK được theo sau cho nhiều chu kỳ xe buýt khi cần thiết để cập nhật toàn bộ toán hạng. Tuy nhiên, khuyên bạn nên rằng các truy cập bị khóa được căn chỉnh trên ranh giới tự nhiên của chúng để có hiệu suất hệ thống tốt hơn :

• Bất kỳ ranh giới nào cho truy cập 8 bit (bị khóa hoặc theo cách khác).
• Ranh giới 16 bit cho các truy cập từ bị khóa.
• Ranh giới 32 bit cho các truy cập từ khóa bị khóa.
• Ranh giới 64 bit cho các truy cập từ khóa đã khóa.