Определите размер слова моего процессора - PullRequest
27 голосов
/ 20 февраля 2010

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

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

Ответы [ 8 ]

21 голосов
/ 20 февраля 2010

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

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

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

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

8 голосов
/ 20 февраля 2010

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

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

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

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

Файл заголовка C <limits.h> может определять WORD_BIT и / или __WORDSIZE.

7 голосов
/ 20 февраля 2010

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

3 голосов
/ 27 января 2014

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

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

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

1 голос
/ 09 января 2017

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

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

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

0 голосов
/ 15 апреля 2019

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

0 голосов
/ 27 января 2014

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

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

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

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

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

0 голосов
/ 29 июля 2012

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

...