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

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

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

10 ответов

Ваше предположение о sizeof(int) не соответствует действительности; увидеть это

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

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

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

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

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

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

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

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

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. Кэши, в том числе блок под названием "Буфер записи"

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

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

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

«Кроме того, размер типа long в C равен размеру слова , тогда как размер типа int иногда меньше, чем размер слова. Например, Alpha имеет размер слова 64 бита. Следовательно, регистры , указатели и длинный тип имеют длину 64 бита ".

источник: http://books.msspace.net/mirrorbooks/kerneldevelopment/0672327201/ch19lev1sec2.html

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

      #include <stdio.h>

int main ()

{

    long l;
    
    short s = (8 * sizeof(l));
    
    printf("Word size of this machine is %hi bits\n", s);
    
    return 0;
}

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

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

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

Как указывали другие, как вы заинтересованы в вычислении этого значения? Есть много переменных.

sizeof(число)!= sizeof(слово). размер байта, слова, двойного слова и т. д. никогда не менялся с момента их создания, по крайней мере, ради совместимости API в мире API Windows. Несмотря на то, что размер слова процессора является естественным размером, с которым может работать инструкция. Например, в msvc / cpp / c# sizeof(int) составляет четыре байта. Даже в 64-битном режиме компиляции. Msvc / cpp имеет __int64, а C # имеет Int64 / UInt64(не совместимый с CLS) ValueType. В Win32 API также есть определения типов для WORD DWORD и QWORD, которые никогда не менялись с двух, четырех и восьми байтов соответственно. А также UINT / INT_PTR в Win32 и UIntPtr / IntPtr в C #, которые гарантированно должны быть достаточно большими для представления адреса памяти и ссылочного типа соответственно. AFAIK, и я могу ошибаться, если арка все еще существует, я не думаю, что кто-то должен иметь дело и не должен,Ближайшие / дальние указатели больше существуют, поэтому, если вы используете c / cpp / c#, sizeof (void *) и Unsafe.SizeOf {IntPtr} () будет достаточно, чтобы определить ваш максимальный размер "слова", я бы подумал, что в совместимом кроссплатформенный способ, и если кто-то может это исправить, сделайте это! Кроме того, размеры внутренних типов в c / cpp расплывчаты в определении размера.

Размеры типов данных C - Википедия

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

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

Размер процессора - это количество даты, с которой Arthematic Logic Unit(ALU) One CPU Core может работать в один момент времени. ALU процессорных ядер будет в любое время включен в реестр аккумуляторов. Итак, размер процессора в битах - это размер регистра накопителя в битах.

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

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

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

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

Другие вопросы по тегам