2010-02-20 35 views
26

Làm cách nào để xác định kích thước từ của CPU? Nếu tôi hiểu chính xác thì int phải là một từ đúng không? Tôi không chắc liệu tôi có đúng không.Xác định cỡ chữ của bộ xử lý của tôi

Vì vậy, chỉ cần in sizeof(int) là đủ để xác định kích thước từ của bộ xử lý của tôi?

+0

Hệ điều hành cụ thể hoặc nền tảng chéo? –

+0

lưu ý rằng 'sizeof' trả về một số ký tự và tiêu chuẩn chỉ xác định ** ít nhất ** 8 bit trên mỗi ký tự. –

+0

sizeof (int) hoạt động cho mọi nền tảng tôi đã làm việc. – kenny

Trả lời

7

sizeof (int) không phải lúc nào cũng là kích thước "từ" của CPU của bạn. Câu hỏi quan trọng nhất ở đây là lý do tại sao bạn muốn biết kích thước từ .... bạn có đang cố gắng thực hiện một số loại tối ưu hóa thời gian chạy và CPU cụ thể không?

Điều đó đang được nói, trên Windows với bộ xử lý Intel, kích thước từ danh nghĩa sẽ là một trong hai 32 hoặc 64 bit, và bạn có thể dễ dàng hình dung này ra:

  • nếu chương trình của bạn được biên dịch cho 32-bit, sau đó kích thước từ danh nghĩa là 32-bit
  • nếu bạn đã biên dịch chương trình 64 bit thì kích thước từ danh nghĩa là 64 bit.

Câu trả lời này nghe có vẻ đúng, nhưng đúng với thứ tự đầu tiên. Nhưng có một số tinh tế quan trọng. Mặc dù đăng ký x86 trên bộ vi xử lý Intel hoặc AMD hiện đại có chiều rộng 64 bit; bạn chỉ có thể (dễ dàng) sử dụng độ rộng 32 bit của chúng trong các chương trình 32 bit - mặc dù bạn có thể đang chạy hệ điều hành 64 bit. Điều này cũng đúng trên Linux và OSX.

Hơn nữa, trên hầu hết các CPU hiện đại, chiều rộng bus dữ liệu lớn hơn các thanh ghi ALU chuẩn (EAX, EBX, ECX, v.v.). Chiều rộng của bus này có thể thay đổi, một số hệ thống có 128 bit, hoặc thậm chí 192 bit bus rộng.

Nếu bạn lo ngại về hiệu suất, bạn cũng cần phải hiểu cách bộ đệm dữ liệu L1 và L2 hoạt động. Lưu ý rằng một số CPU hiện đại có bộ đệm L3. Bộ đệm bao gồm một đơn vị có tên là Bộ đệm ghi

+0

không phải là sizeof (int) được thực hiện tại thời gian biên dịch, có nghĩa là kích thước của nó được biên dịch cho, không phải kích thước của máy tính đang chạy nó? – FryGuy

+0

có - đó là chính xác. – Foredecker

+0

Mã 32 bit x86 theo nghĩa đen không thể sử dụng thanh ghi 64 bit chiều rộng đầy đủ. Không có tiền tố kích cỡ toán tử hay gì cả. Ngoài ra, bạn có chắc chắn về các đường dẫn dữ liệu rộng 192 bit trong bất kỳ CPU nào không? Điều đó nghe có vẻ như chiều rộng bus bộ nhớ trong GPU. Intel đã đi từ 128b đường dẫn từ L1 đến đơn vị thực hiện đến 256b (trong Haswell, phát hành năm sau khi câu trả lời này được viết). –

8

một int phải là một từ đúng?

Tôi hiểu điều đó phụ thuộc vào mô hình kích thước dữ liệu. Để có giải thích cho UNIX Systems, 64-bit and Data Size Neutrality. Ví dụ Linux 32 bit là ILP32 và Linux 64 bit là LP64. Tôi không chắc chắn về sự khác biệt giữa các hệ thống Window và các phiên bản, ngoài việc tôi tin rằng tất cả các hệ thống cửa sổ 32-bit là ILP32.

Làm cách nào để xác định kích thước từ của CPU?

Điều đó tùy thuộc. Bạn đang giả định phiên bản tiêu chuẩn C nào. Chúng ta đang nói về những nền tảng nào. Đây có phải là quyết định biên dịch hay chạy thời gian mà bạn đang cố gắng thực hiện hay không.

Tệp tiêu đề C <limits.h> có thể định nghĩa WORD_BIT và/hoặc __WORDSIZE.

+0

Những điều này được xác định bởi trình biên dịch và không có mối quan hệ trực tiếp với kích thước thực tế (chiều rộng) của kích thước từ của CPU. Nói cách khác, những điều này được xác định bởi nhà phát triển trình biên dịch, không được xác định bởi các đặc tính vật lý của chính CPU. – Foredecker

+0

Chẳng hạn như môi trường trình biên dịch chéo, đúng. Tôi nên làm rõ rằng nếu ai đó muốn viết mã nhận thức được kích thước từ của máy chủ * target * của họ, họ có thể sử dụng một cái gì đó trong tệp tiêu đề limits.h. – mctylr

+1

Điều này tất nhiên là dành cho môi trường đích, không phải là _capabilities_ của CPU mục tiêu. Chẳng hạn như bất kỳ mô hình cuối x86 nào từ Intel hoặc AMD, có khả năng được sử dụng như bộ xử lý 32 hoặc 64 bit. Tùy thuộc vào hệ điều hành đang chạy CPU có thể được sử dụng như một bộ vi xử lý 32 hoặc 64-bit. Trong chế độ 32 bit, thanh ghi không thể truy cập dưới dạng đăng ký _word_ 64-bit (8 byte), mặc dù CPU có thanh ghi 64 bit. – mctylr

20

Giả định của bạn về sizeof (int) là không đúng sự thật; xem this.

Vì bạn phải biết bộ xử lý, hệ điều hành và trình biên dịch tại thời gian biên dịch, kích thước từ có thể được suy ra bằng cách sử dụng định sẵn architecture/OS/compiler macros do trình biên dịch cung cấp.Tuy nhiên, trong khi trên các bộ xử lý đơn giản và hầu hết RISC, kích thước từ, chiều rộng bus, kích thước đăng ký và tổ chức bộ nhớ thường là một giá trị, điều này có thể không đúng với kiến ​​trúc CISC và DSP phức tạp với các kích cỡ khác nhau cho thanh ghi dấu phẩy động, ắc quy, chiều rộng xe buýt, chiều rộng bộ nhớ cache, sổ đăng ký mục đích chung, v.v.

Tất nhiên nó đặt ra câu hỏi tại sao bạn có thể cần biết điều này? Nói chung, bạn sẽ sử dụng loại thích hợp cho ứng dụng và tin tưởng trình biên dịch để cung cấp bất kỳ tối ưu hóa nào. Nếu tối ưu hóa là những gì bạn nghĩ rằng bạn cần thông tin này, thì có thể bạn nên sử dụng số C99 'fast' types. Nếu bạn cần tối ưu hóa một thuật toán cụ thể, hãy triển khai nó cho một số loại và cấu hình nó.

+2

Tôi đã sửa các liên kết bị hỏng/không chính xác nếu có ai đó nhầm lẫn trước đây! – Clifford

+1

Trên x86-64 Linux, 'int_fast16_t' và' int_fast32_t' đều là 'int64_t', có lẽ không phải là lựa chọn lý tưởng. 32 bit là nhanh nhất đối với một số trường hợp và tạo mã nhỏ hơn (ít tiền tố REX hơn). Nếu bạn đã từng lưu trữ chúng trong bộ nhớ, đặc biệt là. trong một mảng, bạn chắc chắn không muốn một loại 64bit sử dụng bộ nhớ cache gấp đôi. –

+1

@PeterCordes: Đồng ý - các từ 'nói chung' và 'có thể' được sử dụng khá thận trọng trong câu trả lời. Như với bất kỳ 'tối ưu hóa tay' nào cần được kiểm tra và so sánh với giải pháp đơn giản. Quá xấu OP không chọn để làm rõ nhu cầu của anh ta để biết, hoặc yêu cầu X cho câu hỏi Y này. – Clifford

0

Để sử dụng tại thời gian biên dịch: sizeof(void*)

+7

Điều này là không chính xác trên các nền tảng như 360 và PS3 là 64 bit, nhưng con trỏ là 32-bit (ABI quirk để tiết kiệm không gian). – Maister

+0

Điều đó sẽ cung cấp cho kích thước của một con trỏ, đó là một cái gì đó khác nhau – Soren

0

gì mỗi thể là lý do cho biết kích thước của bộ vi xử lý nó không quan trọng.

Kích thước của bộ xử lý là số ngày mà Đơn vị Logic Logic (ALU) của một lõi CPU có thể hoạt động tại một thời điểm duy nhất. ALU của CPU Cores sẽ xuất hiện trên Accumulator Register bất cứ lúc nào. Vì vậy, Kích thước của một CPU theo bit là kích thước của Accumulator Register theo bit.

Bạn có thể tìm kích thước của bộ tích lũy từ bảng dữ liệu của bộ xử lý hoặc bằng cách viết chương trình ngôn ngữ lắp ráp nhỏ.

Lưu ý rằng kích thước có thể sử dụng hiệu quả của Accumulator Register có thể thay đổi ở một số bộ xử lý (như ARM) dựa trên phương thức hoạt động (chế độ Thumb và ARM). Điều đó có nghĩa là kích thước của bộ vi xử lý cũng sẽ thay đổi dựa trên chế độ cho bộ vi xử lý đó.

Thông thường trong nhiều kiến ​​trúc có kích thước con trỏ địa chỉ ảo và kích thước số nguyên giống như kích thước bộ tích lũy. Nó chỉ là để tận dụng lợi thế của Accumulator đăng ký trong hoạt động xử lý khác nhau nhưng nó không phải là một quy tắc cứng.

3

Tạo chương trình thực hiện một số loại hoạt động số nguyên nhiều lần, như phiên bản số nguyên của thuật toán SAXPY. Chạy cho các kích thước từ khác nhau, từ 8 đến 64 bit (ví dụ: từ char đến long long).

Đo thời gian mỗi phiên bản chi tiêu trong khi chạy thuật toán. Nếu có một phiên bản cụ thể kéo dài ít hơn đáng kể so với các phiên bản khác, kích thước từ được sử dụng cho phiên bản đó có thể là kích thước từ gốc của máy tính của bạn. Nói cách khác, nếu có nhiều phiên bản kéo dài nhiều hơn hoặc ít hơn cùng một lúc, hãy chọn một phiên bản có kích thước chữ lớn hơn. Lưu ý rằng ngay cả với kỹ thuật này, bạn có thể lấy dữ liệu sai: điểm chuẩn của bạn, được biên dịch bằng Turbo C và chạy trên bộ xử lý 80386 thông qua DOS sẽ báo cáo kích thước từ là 16 bit, chỉ vì trình biên dịch không sử dụng Các thanh ghi 32 bit để thực hiện số học số nguyên, nhưng các cuộc gọi đến các hàm nội bộ thực hiện phiên bản 32 bit của mỗi phép toán số học.

+0

Tôi không thể nghĩ về một trường hợp sử dụng mà bất cứ ai muốn xác định kích thước từ bộ xử lý tại thời gian chạy thông qua phương pháp này. Bộ xử lý được cố định vì vậy điều này nên được xác định tại thời gian biên dịch hoặc sử dụng một phương pháp cụ thể nền tảng/hệ điều hành nếu thời gian chạy là bắt buộc. –

+0

Kiểm tra thời gian biên dịch được giới hạn đối với việc sử dụng toán tử sizeof và các giá trị tương tự, tạo ra kích thước tính bằng byte cho một số loại dữ liệu, không cần thiết giống với kích thước từ gốc. Phương pháp (empiric) này không cần hỗ trợ nền tảng/hệ điều hành cụ thể. Ir chuyển tiếp trên cơ sở các hoạt động số nguyên sử dụng kích thước từ gốc được thực thi nhanh hơn. Bộ vi xử lý 32 bit có thể sử dụng dữ liệu 8, 16, 32 và 64 bit, và sẽ chi tiêu cùng thời gian cho dữ liệu 8, 16 và 32 bit, nhưng các phép toán số học sẽ cần nhiều chu kỳ hơn để thực hiện cùng một công việc cho các hoạt động 64 bit , vì vậy người ta có thể kết luận rằng kích thước từ gốc là 32 bit –

+0

Tôi không nghĩ rằng có một trường hợp sử dụng để xác định theo kinh nghiệm kích thước từ. Nền tảng thường cung cấp định nghĩa macro để sử dụng tại thời gian biên dịch. –

0

Tóm lại: Không có cách nào tốt. Ý tưởng ban đầu đằng sau các kiểu dữ liệu C là int sẽ là kiểu số nguyên nhanh nhất, dài nhất là

Sau đó, các hệ điều hành có nguồn gốc trên một CPU và sau đó được chuyển đến các CPU khác nhau. là khác nhau. Để duy trì tính tương thích của mã nguồn, một số hệ điều hành đã phá vỡ với định nghĩa đó và giữ các kiểu dữ liệu ở kích thước cũ của chúng và thêm vào các kiểu mới, không chuẩn.

Điều đó nói rằng, tùy thuộc vào những gì bạn thực sự cần, bạn có thể tìm thấy một số loại dữ liệu hữu ích trong stdint.h hoặc macro dành riêng cho trình biên dịch hoặc nền tảng cụ thể cho các mục đích khác nhau.

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