Подтвердить что ты не робот

Определите размер слова моего процессора

Как определить размер слова моего процессора? Если я правильно понял, что int должно быть правильным одним словом? Я не уверен, что я прав.

Итак, нужно ли просто печатать sizeof(int), чтобы определить размер слова моего процессора?

4b9b3361

Ответ 1

Ваше предположение о sizeof (int) неверно; см. this.

Поскольку вы должны знать процессор, ОС и компилятор во время компиляции, размер слова может быть выведен с использованием предопределенных макросов архитектуры архитектуры/ОС/компилятора предоставленный компилятором.

Однако, хотя на более простых и самых RISC-процессорах размер слова, ширина шины, размер регистра и организация памяти часто всегда одно значение, это может быть неверным для более сложных архитектур CISC и DSP с различными размерами для регистров с плавающей запятой, аккумуляторов, ширину шины, ширину кеша, регистры общего назначения и т.д.

Конечно, он задает вопрос, почему вам, возможно, нужно это знать? Как правило, вы должны использовать тип, соответствующий приложению, и доверять компилятору, чтобы обеспечить любую оптимизацию. Если оптимизация - это то, что, по вашему мнению, вам нужна эта информация, тогда вам, вероятно, будет лучше использовать C99 'fast' types. Если вам нужно оптимизировать определенный алгоритм, реализовать его для нескольких типов и профилировать его.

Ответ 2

int должно быть одним словом правильно?

Как я понимаю, это зависит от модели размера данных. Для объяснения для UNIX Systems 64-разрядная и нейтральность размера данных. Например, 32-разрядная версия Linux - это ILP32, а 64-разрядная версия Linux - LP64. Я не уверен в различии между системами и версиями Windows, кроме того, я считаю, что все 32-битные оконные системы - это ILP32.

Как определить размер слова моего процессора?

Это зависит. Какую версию стандарта C вы принимаете. На каких платформах мы говорим. Является ли это определение компиляции или времени выполнения, которое вы пытаетесь сделать.

Заголовочный файл C <limits.h> может определять WORD_BIT и/или __WORDSIZE.

Ответ 3

sizeof (int) не всегда является "словом" вашего процессора. Самый важный вопрос здесь: почему вы хотите знать размер слова.... пытаетесь ли вы выполнить некоторую оптимизацию по времени выполнения и ЦП?

Если говорить о Windows с процессорами Intel, номинальный размер слова будет либо 32, либо 64 бит, и вы можете легко понять это:

  • если ваша программа скомпилирована для 32-бит, тогда номинальный размер слова составляет 32 бита.
  • если вы скомпилировали 64-битную программу, тогда номинальный размер слова - 64 бит.

Этот ответ звучит банально, но верно для первого порядка. Но есть некоторые важные тонкости. Несмотря на то, что регистры x86 на современном процессоре Intel или AMD имеют ширину 64 бит; вы можете (легко) использовать 32-разрядную ширину в 32-битных программах, даже если вы можете работать с 64-разрядной операционной системой. Это будет справедливо и для Linux и OSX.

Кроме того, на большинстве современных процессоров ширина шины данных шире, чем стандартные регистры ALU (EAX, EBX, ECX и т.д.). Ширина этой шины может варьироваться, некоторые системы имеют 128-битные или даже 192-битные шины.

Если вас беспокоит производительность, вам также необходимо понять, как работают кеширование данных L1 и L2. Обратите внимание: некоторые современные процессоры имеют кэш L3. Кэши, включая блок, называемый буфером записи

Ответ 4

Создайте программу, которая много раз выполняет какую-либо операцию целочисленного типа, например целочисленную версию алгоритма SAXPY. Запустите его для разных размеров слова, от 8 до 64 бит (т.е. От char до long long).

Измерьте время, которое каждая версия проводит при запуске алгоритма. Если есть одна конкретная версия, которая значительно меньше остальных, размер слова, используемый для этой версии, вероятно, является родным размером слова вашего компьютера. С другой стороны, если есть несколько версий, которые имеют более или менее одинаковое время, возьмите ту, которая имеет больший размер слова.

Обратите внимание, что даже с помощью этой методики вы можете получить ложные данные: ваш тест, скомпилированный с использованием Turbo C и работающий на процессоре 80386 через DOS, сообщит, что размер слова составляет 16 бит, только потому, что компилятор не использует 32 -битные регистры для выполнения целочисленной арифметики, но вызовы для внутренних функций, которые выполняют 32-битную версию каждой арифметической операции.

Ответ 5

Короче: нет хорошего пути. Первоначальной идеей данных данных C было то, что int был бы самым быстрым (родным) целым типом, длинным самым большим и т.д.

Затем появились операционные системы, созданные на одном процессоре, и затем были перенесены на разные процессоры, размер родного слова которых был другим. Чтобы поддерживать совместимость с исходным кодом, некоторые из ОС сломались с этим определением и сохранили типы данных по старым размерам и добавили новые, нестандартные.

Тем не менее, в зависимости от того, что вам действительно нужно, вы можете найти некоторые полезные типы данных в stdint.h или специфичных для компилятора или специфичных для платформы макросах для различных целей.

Ответ 6

Использовать во время компиляции: sizeof(void*)

Ответ 7

Что может быть причиной того, что размер процессора не имеет значения.

Размер процессора - это сумма, на которую может работать Артемический логический блок (ALU) одного ядра ЦП в один момент времени. Процессорные модули ALU будут загружаться в реестр Accumulator в любое время. Таким образом, размер процессора в битах - это размер регистра Accumulator в битах.

Вы можете найти размер аккумулятора из листа данных процессора или написать небольшую программу на языке ассемблера.

Обратите внимание, что эффективный используемый размер регистра Accumulator может меняться в некоторых процессорах (например, ARM) на основе режима работы (режимы Thumb и ARM). Это означает, что размер процессора также изменится в зависимости от режима для этих процессоров.

Во многих архитектурах часто используется размер виртуального адресного указателя и целочисленный размер, такой же, как размер аккумулятора. Только использовать Accumulator Register в разных процессорных операциях, но это не сложно.

Ответ 8

Многие думают о памяти как о массиве байтов. Но процессор имеет другой взгляд на это. Что касается детализации памяти. В зависимости от архитектуры, степень детализации памяти будет 2, 4, 8, 16 или даже 32 байта. Детализация памяти и выравнивание адресов оказывают большое влияние на производительность, стабильность и корректность программного обеспечения. Рассмотрим гранулярность 4 байта и невыровненный доступ к памяти для чтения в 4 байта. В этом случае каждое чтение, 75%, если адрес увеличивается на один байт, требует еще две инструкции чтения плюс две операции сдвига и, наконец, побитовую инструкцию для конечного результата, который снижает производительность. Дальнейшие атомарные операции могут быть затронуты, поскольку они должны быть неделимыми. Другими побочными эффектами будут кэши, протоколы синхронизации, трафик внутренней шины ЦП, буфер записи ЦП, и вы догадаетесь, что еще. Практический тест может быть выполнен на кольцевом буфере, чтобы увидеть, как могут отличаться результаты. Процессоры разных производителей, основанные на модели, имеют разные регистры, которые будут использоваться в общих и специфических операциях. Например, современные процессоры имеют расширения с 128-битными регистрами. Таким образом, размер слова касается не только типа операции, но и степени детализации памяти. Размер слова и выравнивание адреса - звери, о которых нужно позаботиться. На рынке есть несколько процессоров, которые не заботятся о выравнивании адресов и просто игнорируют их, если таковые имеются. И угадайте, что происходит?