2012-09-16 38 views
7

Xin lỗi nếu câu hỏi có vẻ ngu ngốc. Tôi chỉ mơ hồ nhận thức được vấn đề liên kết dữ liệu và chưa bao giờ thực hiện bất kỳ chương trình 64 bit nào. Tôi đang làm việc trên một số mã x86 32-bit ngay bây giờ. Nó thường xuyên truy cập một mảng int. Đôi khi một số nguyên 32 bit được đọc. Đôi khi hai hoặc nhiều hơn được đọc. Tại một số điểm tôi muốn làm cho mã 64-bit. Những gì tôi không chắc là liệu tôi có nên khai báo mảng int này là int hoặc long int. Tôi thà giữ chiều rộng của số nguyên như nhau, vì vậy tôi không phải lo lắng về sự khác biệt. Tôi lo lắng rằng việc đọc/ghi một địa chỉ không phù hợp với từ tự nhiên có thể chậm.Có thể truy cập hình phạt hiệu suất một mảng các số nguyên 32 bit trong x86-64 không?

+1

Nếu bạn muốn số nguyên cố định chiều rộng cố gắng: 'int32_t' trong' ' – Mysticial

+0

' int' là kiểu tự nhiên cho kiến ​​trúc. Trừ khi bạn có một lý do tốt để sử dụng một loại khác nhau, không. –

+0

@PeteBecker Không phải vậy. 'int' vẫn chỉ 32 bit trên hầu hết các hệ thống hiện nay. – Mysticial

Trả lời

7

Hình phạt không chính xác chỉ xảy ra khi tải hoặc lưu trữ vượt qua ranh giới căn chỉnh. Ranh giới là thường là nhỏ hơn:

  • Kích thước từ tự nhiên của phần cứng. (32 bit hoặc 64 bit *)
  • Kích thước của kiểu dữ liệu.

Nếu bạn đang tải từ 4 byte lên kiến ​​trúc 64 bit (8 byte). Nó không cần phải được liên kết 8 byte. Nó chỉ cần được liên kết 4 byte.

Tương tự như vậy, nếu bạn đang tải một char 1 byte trên bất kỳ máy nào, nó không cần phải được căn chỉnh chút nào.

* Lưu ý rằng véc tơ SIMD có thể ngụ ý kích thước từ tự nhiên lớn hơn. Ví dụ, SSE 16 byte vẫn yêu cầu căn chỉnh 16 byte trên cả x86 và x64. (Trừ tải lệch rõ ràng/cửa hàng)


Vì vậy, trong ngắn hạn, không có bạn không phải lo lắng về dữ liệu liên kết. Ngôn ngữ và trình biên dịch cố gắng khá khó khăn để ngăn bạn không phải lo lắng về nó.

Vì vậy, chỉ cần gắn bó với bất kỳ kiểu dữ liệu nào có ý nghĩa nhất đối với bạn.

1

Có rất nhiều thông tin tốt có sẵn ở đây: Performance 32 bit vs. 64 bit arithmetic

Thậm chí nhiều hơn thông tin https://superuser.com/questions/56540/32-bit-vs-64-bit-systems, nơi mà các câu trả lời khẳng định đã nhìn thấy điều tồi tệ nhất làm chậm ở mức 5% (từ một góc độ ứng dụng, chứ không phải hoạt động cá nhân).

Câu trả lời ngắn gọn là không, bạn sẽ không thực hiện lần truy cập hiệu suất.

3

CPU 64-bit x86 vẫn được tối ưu hóa rất nhiều để thao tác hiệu quả các giá trị 32 bit. Ngay cả trên các hệ điều hành 64 bit, việc truy cập các giá trị 32 bit cũng nhanh nhất khi truy cập các giá trị 64 bit. Trong thực tế, nó sẽ thực sự nhanh hơn vì ít dung lượng bộ nhớ đệm và băng thông bộ nhớ được tiêu thụ.

1

Bất cứ khi nào bạn truy cập vào bất kỳ vị trí bộ nhớ nào, toàn bộ dòng bộ nhớ cache được đọc vào bộ đệm L1 và mọi truy cập sau đó vào bất kỳ thứ gì trong dòng đó càng nhanh càng tốt. Trừ khi truy cập 32-bit của bạn đi qua một đường bộ nhớ cache (mà nó sẽ không nếu nó trên một sự liên kết 32-bit) nó sẽ nhanh như truy cập 64-bit.

+0

Không hoàn toàn. Truy cập 1 giá trị sẽ giống nhau. Nếu bạn truy cập * một giá trị 32 bit khác nằm trong cùng một dòng bộ nhớ cache, nó sẽ xuất hiện ở đó - bạn thậm chí còn nói điều này với "tiếp theo ...". Việc sử dụng kích thước dữ liệu nhỏ hơn thường thân thiện với bộ nhớ cache hơn do tải nhiều phần tử dữ liệu hơn cho mỗi dòng bộ nhớ cache. – phkahler

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