В компьютерах используются 32-битные или 64-битные процессоры, почему бы не 40-битные или другие числа?

Например, в случае 32-битных процессоров слово имеет 4 байта. Можно ли использовать 5-байтовое слово или другое.

1 ответ

Можно ли также использовать 5-байтовое слово или другое

Да. Вы даже можете использовать всего несколько битов вместо всего байта / слова через битовые поля. Технически компиляторы могут поддерживать любые целочисленные размеры на любых архитектурах, например, 12-битное, 30-битное или 96-битное int на 16-битном компьютере. Фактически Clang только что получил новое расширение для целых чисел с произвольной разрядностью, которое называется _ExtInt. Смотрите также

почему не 40-битные или другие числа?

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

Еще один важный момент - несовпадение. Современные процессоры работают более эффективно, когда адрес переменной кратен ее размеру или, по крайней мере, кратен ширине шины данных / размеру слова. Работать с переменной нечетного размера просто неудобно


Тем не менее, существует множество 32-битных архитектур с 40-битным типом, таких как TI C6000 или TI C5500 DSP.

long является

  • 40 бит или 5 байтов для C6000 COFF

[...] и C5500 имеет 40-битныйlong long

Поддержка C89 в компиляторах TI

Это потому, что эти DSP имеют специальный 40-битный аккумулятор, позволяющий складывать 32-битные числа 256 раз без переполнения. Но почему бы просто не использовать 64-битный аккумулятор? Для этого потребуется ALU гораздо большего размера, потребуется больше энергии и он будет работать медленнее (поскольку большая площадь означает большее расстояние между аппаратными компонентами, а работа с большими числами медленнее, чем с меньшими), что неприемлемо в DSP, который предназначен для обеспечения производительности (и, возможно, также мощность)

... Например, процессор DSP Texas Instruments TMS320C6000 использует 32 бита для представления типа int и 40 бит для представления типа long(этот выбор не редкость). Те процессоры (обычно DSP), которые используют 24 бита для представления типаint, часто используют 48 бит для представления типа long. Использование 24/48-битных представлений целочисленных типов может быть обусловлено требованиями приложения, когда представление 32/64-битных целочисленных типов не является экономически эффективным.

Новый стандарт C (выдержки из материалов): экономический и культурный комментарий

Фактически, 40-битное int очень распространено среди DSP (другими примерами являются Blackfin и SHARC). SHARC даже имеет 80-битный аккумулятор, поэтому вы можете добавлять множество 64-битных значений, не беспокоясь о переполнении


Но для этого не нужна особая архитектура или специальная поддержка компилятора. Вы все равно можете использовать 40-битную переменную, если вам действительно нужно, например, когда вы работаете с огромным массивом, где 64-битные целые числа сделают его слишком большим, чтобы поместиться в основной памяти, и меньшее количество элементов поместится в кеш. Самый простой способ сделать это - отключить выравнивание с#pragma pack или __attribute__((packed))

struct int40_t {
    int64_t : 40;
} __attribute__((packed));
int40_t myArray[200] __attribute__((packed));

или получить доступ к значениям из простого массива char (на основе решения cmm)

unsigned char _5byteInts[5*size+3];  // +3 avoids overfetch of last element

int64_t get5byteInt(size_t index)
{
    int64_t v = 0;
    memcpy(&v, &_5byteInts[index*5], 5);        // little endian
    return (v << 24) >> 24;
}

void set5byteInt(size_t index, int64_t value)
{
    memcpy(&_5byteInts[index*5], &value, 5);    // little endian
}

Но это приведет к снижению производительности на архитектурах без невыровненного доступа. Вы можете упаковать четыре 40-битных int в одну 20-байтовую структуру для лучшего выравнивания.

struct four_int40s {
    uint32_t low[4];
    uint8_t hi[4];
};

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

Рассмотрим такую ​​операцию, как "перейти на 14 слов вперед". Если размер слова является степенью двойки, скажем, 64, то схема должна сдвинуть число 14 на log(64)/log(2)=6 и добавить к ipи это легко сделать за 1 цикл. Однако, если размер слова равен 36, как в IBM 701, то число 14 нужно будет умножить на 36, и это займет больше циклов. Учитывая, что умножение целого числа на размер слова является очень распространенной операцией, замедление будет значительным.