2009-06-28 25 views
11

Bộ vi xử lý 32 bit của Intel như Pentium có bus dữ liệu rộng 64 bit và do đó lấy 8 byte cho mỗi lần truy cập. Dựa trên điều này, tôi giả sử rằng các địa chỉ vật lý mà các bộ xử lý này phát ra trên bus địa chỉ luôn là bội số của 8.Sắp xếp bộ nhớ trên bộ xử lý Intel 32 bit

Thứ nhất, kết luận này có đúng không?

Thứ hai, nếu đúng, thì bạn nên căn chỉnh các thành viên cấu trúc dữ liệu trên ranh giới 8 byte. Nhưng tôi đã nhìn thấy những người sử dụng một liên kết 4-byte thay vì trên các bộ vi xử lý.

Làm cách nào để chúng được chứng minh khi làm như vậy?

+1

Tôi không biết câu hỏi này có ý nghĩa gì, nhưng tôi tò mò về cách điều này liên quan đến lập trình và điều này có thể ảnh hưởng đến tôi như thế nào. Tôi có thể đọc phần giới thiệu cơ bản về công cụ loại cấp thấp này ở đâu? –

+4

Xem "Mọi lập trình viên nên biết gì về bộ nhớ": http://people.redhat.com/drepper/cpumemory.pdf – Crashworks

+1

Làm thế nào để yo uget từ "yêu cầu đọc luôn là bội số của 8" để "dữ liệu của bạn nên luôn luôn bắt đầu một ranh giới 8-byte "? Tôi không thấy kết nối logic giữa chúng. Chừng nào dữ liệu không * vượt qua * ranh giới 8 byte, chúng ta tốt, phải không? – jalf

Trả lời

14

Quy tắc chung của ngón tay cái (ngay từ Hướng dẫn tối ưu hóa nội dung và AMD) là mọi loại dữ liệu phải được căn chỉnh theo kích thước riêng của nó. An int32 phải được căn chỉnh trên ranh giới 32 bit, một int64 trên ranh giới 64 bit, v.v. Một char sẽ chỉ vừa vặn ở mọi nơi.

Một quy tắc khác là, tất nhiên "trình biên dịch đã được thông báo về yêu cầu căn chỉnh". Bạn không cần phải lo lắng về nó bởi vì trình biên dịch biết để thêm các padding và offsets đúng để cho phép truy cập dữ liệu hiệu quả.

Ngoại lệ duy nhất là khi làm việc với hướng dẫn SIMD, nơi bạn phải tự đảm bảo căn chỉnh trên hầu hết các trình biên dịch.

Thứ hai, nếu đúng, thì phải căn chỉnh thành viên cấu trúc dữ liệu trên ranh giới 8 byte. Nhưng tôi đã thấy những người sử dụng liên kết 4 byte thay vì trên các bộ vi xử lý này.

Tôi không thấy điều đó tạo nên sự khác biệt như thế nào. CPU có thể đơn giản phát hành đọc cho khối 64 bit có chứa 4 byte đó. Điều đó có nghĩa là nó nhận được 4 byte phụ trước khi dữ liệu được yêu cầu hoặc sau đó. Nhưng trong cả hai trường hợp, nó chỉ mất một lần đọc. Việc căn chỉnh 32 bit dữ liệu 32 bit đảm bảo rằng nó sẽ không vượt qua ranh giới 64 bit.

+0

Không nếu 4 byte nằm ngang một đoạn 64 bit sang phần tiếp theo. –

+0

điều đó sẽ xảy ra như thế nào nếu nó được căn chỉnh trên ranh giới 4 byte? – jalf

+5

Tôi không thể tin rằng tôi đã bỏ lỡ lý do đơn giản này. Tại sao phải lãng phí 4 byte thừa trong liên kết 8 byte khi bạn đạt được hiệu suất tương tự với 4 byte? Cảm ơn Jalf. Bạn có ý nghĩa hoàn hảo. –

6

xe buýt Physical là 64bit rộng ... bội số của 8 -> vâng

TUY NHIÊN, có hai yếu tố hơn để xem xét:

  1. Một số tập lệnh x86 là byte giải quyết. Một số là 32bit phù hợp (đó là lý do tại sao bạn có 4 byte điều). Nhưng không có (lõi) hướng dẫn được 64bits liên kết. CPU có thể xử lý truy cập dữ liệu lệch.
  2. Nếu bạn quan tâm đến hiệu suất, bạn nên suy nghĩ về dòng bộ nhớ cache, không phải bộ nhớ chính. Các dòng bộ nhớ cache rộng hơn nhiều.
+0

Tôi không hiểu. Bạn đồng ý rằng các nhà chế biến như vùng Pentium chỉ có bội số 8 trên xe buýt địa chỉ. Sau đó, bạn nói 4-byte liên kết là okay. Vâng, hãy xem xét địa chỉ 0x000044444. Mặc dù nó được liên kết 4 byte, bộ vi xử lý sẽ không bao giờ phát ra địa chỉ này trên dòng địa chỉ vì nó không phải là bội số của 8. Do đó, tìm nạp bộ nhớ tại địa chỉ này sẽ yêu cầu hai lần tìm nạp. Làm thế nào là sau đó 4-byte căn chỉnh hợp lý? –

+2

Tại sao nó yêu cầu hai lần nạp? Nó sẽ chỉ yêu cầu tất cả dữ liệu từ 0x000044440 đến 0x000044447 và vì chúng tôi quan tâm đến 0x000044444-0x000044447, vấn đề là gì? – jalf

+0

Tại sao nói về sự liên kết hướng dẫn, điều đó không có ý nghĩa. Hướng dẫn đệm vào một số ranh giới với NOP không đạt được gì. –

0

Để truy cập ngẫu nhiên và miễn là dữ liệu không được căn lề (ví dụ: vượt ranh giới), tôi không nghĩ rằng nó quan trọng nhiều; địa chỉ chính xác và bù đắp trong dữ liệu có thể được tìm thấy với một cấu trúc AND đơn giản trong phần cứng. Nó được làm chậm khi một truy cập đọc là không đủ để có được một giá trị. Đó cũng là lý do tại sao các trình biên dịch thường đặt các giá trị nhỏ (byte, vv) với nhau bởi vì chúng không phải ở một mức bù cụ thể; quần short nên ở ngay cả địa chỉ, 32 bit trên địa chỉ 4 byte và 64 bit trên địa chỉ 8 byte.

Lưu ý rằng nếu bạn có bộ nhớ đệm truy cập dữ liệu tuyến tính và không bắt buộc, mọi thứ sẽ khác nhau.

2

Chúng được biện minh khi làm như vậy vì thay đổi thành liên kết 8 byte sẽ tạo thành thay đổi ABI và cải thiện hiệu suất cận biên không đáng để gây ra sự cố.

Như người khác đã nói, vấn đề về bộ nhớ cache. Tất cả các truy cập trên bus bộ nhớ thực tế là về các dòng bộ nhớ cache (64 byte trên x86, IIRC). Xem tài liệu "Mọi lập trình viên cần biết gì về bộ nhớ" đã được đề cập. Vì vậy, lưu lượng bộ nhớ thực tế là 64 byte liên kết.

1

Xe buýt 64 bit mà bạn tham chiếu để cấp dữ liệu cho bộ đệm. Là một CPU, luôn đọc và ghi toàn bộ các dòng bộ nhớ cache. Kích thước của một dòng bộ nhớ cache luôn luôn là bội số của 8, và địa chỉ vật lý của nó thực sự là liên kết tại 8 byte bù đắp.

Chuyển bộ nhớ cache để đăng ký không sử dụng dữ liệu bên ngoài, do đó chiều rộng của xe buýt đó không liên quan.

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