2010-05-17 49 views

Trả lời

27

Một đối tượng đó là "8 byte liên kết" được lưu trữ tại một địa chỉ bộ nhớ đó là một bội số của 8.

Nhiều CPU sẽ chỉ tải một số kiểu dữ liệu từ các địa điểm liên kết; trên các CPU khác truy cập như vậy chỉ là nhanh hơn. Ngoài ra còn có một số lý do khác có thể cho việc sử dụng liên kết bộ nhớ - mà không thấy mã khó để nói lý do tại sao.


Truy cập được sắp xếp nhanh hơn vì bus ngoài không rộng một byte - thường rộng 4 hoặc 8 byte (hoặc thậm chí rộng hơn). Điều này có nghĩa là CPU không lấy một byte đơn tại một thời điểm - nó lấy 4 hoặc 8 byte bắt đầu từ địa chỉ được yêu cầu. Kết quả là, 2 hoặc 3 bit quan trọng nhất của địa chỉ bộ nhớ không thực sự được gửi bởi CPU - bộ nhớ ngoài chỉ có thể được đọc hoặc ghi tại các địa chỉ là bội số của chiều rộng bus. Nếu bạn yêu cầu một byte tại địa chỉ "9", CPU sẽ thực sự yêu cầu bộ nhớ cho khối byte bắt đầu tại địa chỉ 8, và tải một byte thứ hai vào thanh ghi của bạn (loại bỏ những người khác).

Điều này ngụ ý rằng quyền truy cập không đúng có thể yêu cầu hai lần đọc từ bộ nhớ: Nếu bạn yêu cầu 8 byte bắt đầu tại địa chỉ 9, CPU phải tìm nạp 8 byte bắt đầu tại địa chỉ 8 cũng như 8 byte bắt đầu tại địa chỉ 16, sau đó loại bỏ các byte bạn muốn. Mặt khác, nếu bạn yêu cầu 8 byte bắt đầu tại địa chỉ 8, thì chỉ cần tìm nạp một lần. Một số CPU thậm chí sẽ không thực hiện tải trọng không chính xác như vậy - chúng sẽ chỉ đơn giản là tăng một ngoại lệ (hoặc thậm chí âm thầm tải dữ liệu sai!).

+1

ý nghĩa, nếu vị trí đầu tiên là 0x0000 thì vị trí thứ hai sẽ là 0x0008 .. ưu điểm của loại 8 byte được liên kết này là gì? –

4

"X byte căn chỉnh" nghĩa là địa chỉ cơ sở dữ liệu của bạn phải là bội số của X. Nó có thể được sử dụng để sử dụng một số phần cứng đặc biệt như DMA trong một số phần cứng đặc biệt, để truy cập nhanh hơn bằng cpu, v.v. ...

Đây là trường hợp của Bộ xử lý ô, nơi dữ liệu phải được căn chỉnh 16 byte để sao chép vào/từ bộ xử lý.

+0

ok. nhưng cách thực thi trở nên nhanh hơn khi nó là x byte của liên kết? Do tính toán địa chỉ bộ nhớ hoặc một số thứ khác dễ dàng hơn? Cũng có sự liên kết nào cho các chức năng không? /Kanu__ –

+0

Vâng, nó phụ thuộc vào kiến ​​trúc của bạn. Ví dụ, nếu bạn có kiến ​​trúc 32 bit và bộ nhớ của bạn có thể được truy cập chỉ bằng 4 byte cho một địa chỉ nhiều 4 (4byte liên kết), sẽ hiệu quả hơn để phù hợp với dữ liệu 4byte của bạn (ví dụ: số nguyên) trong đó . Nó sẽ cho phép bạn truy cập nó trong một bộ nhớ đọc thay vì hai nếu nó không được căn chỉnh. (Chú ý: Trường hợp này là giả thiết) – Phong

+0

Nói chung trình biên dịch của bạn làm tất cả các tối ưu hóa, vì vậy bạn không phải quản lý nó. Trong một số trường hợp RẤT cụ thể, bạn có thể cần phải xác định nó cho mình (ví dụ: bộ xử lý Cell, hoặc phần cứng dự án của bạn). Nếu bạn đang làm việc trên kiến ​​trúc truyền thống, bạn thực sự không cần phải làm điều đó. – Phong

8

Căn chỉnh bộ nhớ quan trọng đối với hiệu suất theo các cách khác nhau. Nó có một lý do liên quan đến phần cứng. Kể từ những năm 80 có sự khác biệt về thời gian truy cập giữa CPU và bộ nhớ. Tốc độ của bộ vi xử lý đang tăng nhanh hơn tốc độ của bộ nhớ. Sự khác biệt này ngày càng trở nên lớn hơn theo thời gian (để đưa ra một ví dụ: trên Apple II CPU là 1,023 MHz, bộ nhớ gấp 2 lần tần số đó, 1 chu trình cho CPU, 1 chu trình cho video. vào khoảng 3GHz trên CPU, với bộ nhớ chỉ ở mức 400MHz). Một giải pháp cho vấn đề của bộ nhớ luôn chậm, là truy cập nó trên các busses bao giờ rộng hơn, thay vì truy cập 1 byte tại một thời điểm, CPU sẽ đọc một từ rộng 64 bit từ bộ nhớ. Điều này có nghĩa là ngay cả khi bạn đọc 1 byte từ bộ nhớ, bus sẽ cung cấp toàn bộ 64 bit (từ 8 byte). Bộ nhớ sẽ có các đơn vị 8 byte tại địa chỉ 0, 8, 16, 24, 32, 40 vv. Một bội số của 8. Nếu bạn truy cập, ví dụ một từ 8 byte tại địa chỉ 4, phần cứng sẽ phải đọc từ tại địa chỉ 0, mặt nạ 4 byte cao của từ đó, sau đó đọc từ tại địa chỉ 8, mặt nạ phần thấp của từ đó, kết hợp nó với nửa đầu và đưa nó vào thanh ghi. Như bạn có thể thấy một hoạt động khá phức tạp (do đó chậm). Đây là lý do đầu tiên người ta thích truy cập bộ nhớ liên kết. Tôi sẽ đưa ra một lý do khác trong 2 giờ.

+0

Cảm ơn. Tốt nhất. Tôi đang chờ lý do thứ hai của bạn. –

+0

Xin lỗi, quên điều đó. Không có lý do thứ hai. Tại thời điểm này tôi đã viết rằng, tôi nghĩ về mảng và kích thước của các yếu tố của mảng, mà không phải là nghiêm chỉnh về sự liên kết. Nhưng kích thước là quyền hạn của 2, có lợi thế là dễ dàng tính toán. Một số CPU thậm chí có chế độ địa chỉ mà làm cho phép nhân bằng 2, 4 hoặc 8 trực tiếp mà không bị phạt (ví dụ x86 và 68020). Nhưng như đã nói, nó không có nhiều việc phải làm với sự sắp xếp. –

+0

chính xác. Cảm ơn bạn về thông tin. /renjith_g –

0

nếu dữ liệu bộ nhớ được liên kết 8 byte, điều đó có nghĩa là:
sizeof(the_data) % 8 == 0.
nói chung trong ngôn ngữ C, nếu cấu trúc được đề xuất là 8 byte được căn chỉnh, kích thước của nó phải là phép nhân của 8, và nếu không, cần phải đệm theo cách thủ công hoặc bằng trình biên dịch.một số trình biên dịch cung cấp các chỉ thị để tạo cấu trúc được liên kết với n byte, cho VC, nó là #prgama pack(8) và đối với gcc, nó là __attribute__((aligned(8))).

+0

Vì vậy, giả sử người dùng đang làm việc với SSE (128 bit) trên dữ liệu Điểm nổi (Đơn). Tuy nhiên, chiều dài dữ liệu là 38. Quá trình nhân dữ liệu theo một hằng số. Nhà phát triển nên làm gì để xử lý việc này? – Royi