LINUX.ORG.RU

Машинное слово и его размер

 , ,


0

2

Пытаюсь понять, что такое машинное слово.

Это вроде как размер регистра в процессоре. У каждой архитектуры он разный, например x86-64 он 64 бита.

Т.е. если я пишу int a = 123; - эти данные помещаются в регистр, размером 64 бита и не больше. Так?

И больше ничего о машинном слове знать не нужно? Просьба дополнить или поправить. (меня оно интересует в контексте С++)



Последнее исправление: lvmuser (всего исправлений: 1)

И больше ничего о машинном слове знать не нужно?

О нём вообще ничего знать не надо, это рудимент из времён царя Гороха.

no-such-file ★★★★★
()

На мейнстриме int 32 бита даже на x86_64.

ox55ff ★★★★★
()

О нём вообще ничего знать не надо, это рудимент из времён царя Гороха.

Поддерживаю. Есть конкретика, как-то размер регистра, размер указателя, размер инта, всё это разные и не особо связанные вещи.

Т.е. если я пишу int a = 123; - эти данные помещаются в регистр, размером 64 бита и не больше. Так?

Эти данные могут помещаться:

  • в память, размером sizeof(int), и да - на 64битной платформе он может быть меньше 64 бит - скорее всего будет 32 бита
  • в регистры, и тут у компилятора широкий простор - в общем случае он может положить данные в регистр соответствующего размера, в регистр большего размера, в несколько регистров (например 128битное число в пару 64битных регистров), или несколько значений в один регистр (SIMD)
  • могут вообще никуда не помещаться - выражение может посчитаться на этапе компиляции и никакие из исходных значений вообще не попадут в скомпилированный код
slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

Это естественный для архитектуры размер данных. Меньшие данные могут дополняться нулями, а большие биться на части.

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

xaizek ★★★★★
()
Ответ на: комментарий от no-such-file

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

anonymous
()
Ответ на: комментарий от anonymous

Рудимент, потому что хорошо разделять разрядность адреса и разрядность данных и использовать эту терминологию, а не оперировать древнючим термином.

Pavval ★★★★★
()

Для языков программирования слово - это 2 байта. Со времён когда процессоры были 16-ти битными. Другие значения «слова» актуальны только с точки зрения железа.

saahriktu ★★★★★
()
Ответ на: комментарий от anonymous

сам ты рудимент

В каком-то смысле да. Я помню времена, когда этот термин был в ходу. Сейчас он бесполезен.

no-such-file ★★★★★
()

Машинное слово само по себе имеет ограниченное значения для характеризации архитектуры. Сейчас используют такое понятие как «модель данных». Она может быть, например, ILP32, ILP64, LP64, LLP64. Смотри «64-bit data models» на https://en.wikipedia.org/wiki/64-bit_computing.

rupert ★★★★★
()

И больше ничего о машинном слове знать не нужно?

Имеет смысл знать, что размер int зависит от реализации и почти всегда равен 32, а размер size_t соответствует разрядности машинного слова.

pinus_nigra
()
Ответ на: комментарий от pinus_nigra

о, вот это уже полезно!

я знаю, что массивы рекомендуется обходить с size_t

gcc показывает sizeof(size_t) = 8

8 байт * 8 бит = 64 бита.

lvmuser
() автор топика

Главное не размер, а умение пользоваться.

Николай

anonymous
()

Машинное слово - это количество информации, которое может быть обработано за одну инструкцию.

Это может относиться к процессору (сколько процессор может обработать за одну инструкцию), или к памяти (сколько может быть переслано за одну операцию чтения/записи), или к другим компонентам.

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

Получается, что с практической точки зрения (то есть как учитывать при написании программ), слово - это оптимальный размер информации для одной операции, при котором обеспечивается максимальное быстродействие.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

это количество информации, которое может быть обработано за одну инструкцию

только вот есть такая штука как simd

anonymous
()

давным-давно следующие три величины всегда совпадали, и это называлось машинным словом

  • размер регистра процессора
  • размер указателя
  • выравнивание в памяти (напр, ты не можешь загрузить регистр из памяти по нечётному адресу)

а сейчас всё расползлось, и эти три величины не обязаны совпадать

Egor_
()
Ответ на: комментарий от lvmuser

я знаю, что массивы рекомендуется обходить с size_t

Массивы нужно обходить с size_t потому что тип индекса массива - size_t, это связано с корректностью кода, а не с быстродействием.

slovazap ★★★★★
()
Ответ на: комментарий от Egor_

Это когда такое было? Это же очень машинно-зависимые вещи.

Даже если взять S/360 из 1960-х, то там регистры 32-битные, адреса 24-битные, выравнивание инструкций на полуслово. Адресация только через базовый регистр + 12-битовое смещение.

Или 36-битные регистры в PDP-10 с 18-битовыми адресами.

bigbit ★★★★★
()
Ответ на: комментарий от pinus_nigra

а размер size_t соответствует разрядности машинного слова размеру указателя.

Починил. Термин «машинное слово» в современных архитектурах не используется или используется от балды как вздумалось конкретному автору документации. Часто это просто синоним uint16_t.

X512 ★★★★★
()
Ответ на: комментарий от Kroz

Это отдельный класс инструкций.

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

X512 ★★★★★
()
Ответ на: комментарий от X512

SIMD работают с массивами. Мы говорим про инструкции, которые работают с не-массивами.

И я уверен, что даже в случае SIMD, наилучшую производительность можно получить если работать с объемами данных размером кратным размеру слова, и/или со структурами выровненными по размеру слова.

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

современные процессоры уже давно проектируют совсем по другому.

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

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Egor_

Так это просто единичный процессор, в котором это совпало.

Как я уже приводил в примерах выше, в других процессорах, которые были до PDP-11, это правило не соблюдалось.

bigbit ★★★★★
()
Ответ на: комментарий от Kroz

кто «мы»? где говорилось, про что можно говорить, а про что нельзя? откуда ты это выдумал?

anonymous
()
Ответ на: комментарий от Kroz

sse/avx/avx152 выравнивают на 16/32/64 БАЙТ соответственно, иксперд

anonymous
()

Тут в треде дурачков собралось целый вагон и каждый несёт бред в меру своей некомпетентности. Слушай сюда, машинное слово, было есть и будет тем понятием что обозначает какое максимальное целое число может обработать процессор исключая расширенные инструкции sse/mmx и прочее. Это и есть машинное слово, оно должно умещать размер любого указателя, оно определяет какова будет кеш линия чтения процессора. Есть в общем только 4 архитектуры 8/16/32/64. Всё. Ещё более проще машинное слово это размер шины данных к универсальному ALU процессора.

  • Оно больше или совпадает размеру указателя (максимального адреса)

  • Оно равно максимальному целому число которое можно явно передать процессору

То что можно на машине где слово 64 передать 128битное число не щитово это уже костыли как и avx/mmx/sse это всё надстройки и расширения. Они могут меняется, а вот база не может.

Так что машинное слово как было так и есть, это мера адресации, максимальная и фиксированная для данной машины.

Хотя есть исключения, 64 битный проц который на деле 32 битный где в микрокоде и декодировщике одно 64 битное слово делится на два 32, а при записи обратно сибирается в 64. Кэш линия у таких камней 32 байта. Это мутанты, на деле слово у них 4 байта, но жрать оно может и 64 псевдонативно.

anonymous
()
Ответ на: комментарий от anonymous

У разных моделей PDP-11 был 16, 18 и 22-разрядный адрес.

Да, было 4Мбайта памяти, но это достигалось не увеличением разрядости указателя, а переключением «банков памяти».
Одновременно было видно только 64Кб.
Все инструкции процессора работали с 16-битными адресами.

Egor_
()
16 июня 2021 г.
Ответ на: комментарий от bigbit

Или современные 4-8-разрядные микроконтроллеры с гарвардской архитектурой. Данные могут быть 8-разрядные, инструкции 14-разрядные, адрес данных – 10-разрядный, а инструкций – 12-разрядный. Или перепрограммирования логика, где для одной задачи одни разрядности, а для других – другие.

В контексте C++ в платформонезависимом коде не следует делать никаких предположений о разрядности, не следующих из стандарта языка. Платформозависимую оптимизацию выполнять исходя из рекомендаций руководств по оптимизации разработчиков платформы, а не на основе чьих-либо фантазий о машинном слове.

vM ★★
()
Ответ на: комментарий от Psilocybe

Памяти в вычислительной системе могут быть разные.

vM ★★
()
Ответ на: комментарий от Psilocybe

И сразу же типичный викизм

В бизнес-ориентированных компьютерах, занимавшихся экономическими и бухгалтерскими расчётами, НЕ ТРЕБОВАЛАСЬ высокая ТОЧНОСТЬ вычислений

Слово из двенадцати 6-битных символов было уже у UNIVAC в 1950-х https://ru.wikipedia.org/wiki/UNIVAC_I

64-разрядное – у IBM 7030 Stretch в 1960-х https://ru.wikipedia.org/wiki/IBM_7030_Stretch

vM ★★
()
Ответ на: комментарий от anonymous

Это и есть машинное слово, оно должно умещать размер любого указателя, оно определяет какова будет кеш линия чтения процессора.

Это не так. Например, в AVR машинное слово 8 бит, но почти вся адресация 16-битная.

COKPOWEHEU
()

не пытайся понять.

когда-то это имело значение, когда компы были еще огромными из кучи шкафов. и вот там как раз память была нарезана на «слова».

salozar
()

Если мне не изменяет память, то в ВУЗе нас учили, что маш. слово это максимальный размер данных, которыми может оперировать процессор. Но да, это разве мамонтам вроде 8086 применимо.

urxvt ★★★★★
()
Ответ на: комментарий от Psilocybe

ٍУ ARM есть 16-разрядные THUMB.

А диапазонов адресов в табличках нет…

vM ★★
()
Ответ на: комментарий от Psilocybe

в таблице архетиктур у RISC размер инструкции как раз одно слово. Кроме, почему-то, RISC-V

Да нет, у RISCV слово/полслова, все нормально.

COKPOWEHEU
()
Ответ на: комментарий от Psilocybe

Байт - единица адресации.

Не всегда. В некоторых RISC процессорах минимальной адресуемой единицей является 16/32 бит, если обратится по адресу, не кратному единице адресации, то будет исключение.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Не всегда. В некоторых RISC процессорах минимальной адресуемой единицей является 16/32 бит, если обратится по адресу, не кратному единице адресации, то будет исключение.

Точно? Я знаю что если пытаться прочитать 32-битную переменную с адреса, не кратного 4, будет исключение, как и 16-битную с адреса, не кратного 2. Но 8-битную можно читать с любого места.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Так же, как на S/360.

А в полностью word-ориентированых архитектурах у полу-, четверть- и других частей слов своих адресов нет.

vM ★★
()
Ответ на: комментарий от X512

В некоторых RISC процессорах минимальной адресуемой единицей является 16/32 бит

значит там байт 16\32 бита ;)

это как в интеле при переходе с 16 бит на 32 под словом в доках так и оставили 16 бит а 32 стали называть двойным словом

Psilocybe ★★★★
()
Ответ на: комментарий от COKPOWEHEU

вроде бы один из смыслов риска - в одинаковом размере команд, чтобы съэкономить на анализе команду ли мы прочитали или невсю или несколько

Psilocybe ★★★★
()
Ответ на: комментарий от Psilocybe

зато так теряют на потребляемом кэше и bandwidth

anonymous
()
Ответ на: комментарий от X512

Байт - единица адресации.

Не всегда.

Почему я не удивлён?

man CHAR_BIT

LamerOk ★★★★★
()
Ответ на: комментарий от vM

Так же, как на S/360.

А в полностью word-ориентированых архитектурах у полу-, четверть- и других частей слов своих адресов нет.

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

COKPOWEHEU
()
Ответ на: комментарий от Psilocybe

вроде бы один из смыслов риска - в одинаковом размере команд, чтобы съэкономить на анализе команду ли мы прочитали или невсю или несколько

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

COKPOWEHEU
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.