Есть ли снижение производительности при обращении к массиву 32-битных целых чисел в x86-64?

Извините, если вопрос звучит глупо. Я лишь смутно осведомлен о проблеме выравнивания данных и никогда не занимался 64-битным программированием. Я сейчас работаю над 32-битным кодом x86. Он часто обращается к массиву int. Иногда читается одно 32-разрядное целое число. Иногда два или более читаются. В какой-то момент я хотел бы сделать код 64-битным. Я не уверен, должен ли я объявить этот массив int как int или же long int, Я бы предпочел оставить ширину целого числа одинаковой, чтобы не беспокоиться о различиях. Я немного обеспокоен тем, что чтение / запись адреса, который не соответствует естественному слову, может быть медленным.

7

Решение

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

  • Естественный размер слова оборудования. (32-разрядный или 64-разрядный *)
  • Размер типа данных.

Если вы загружаете 4-байтовое слово в 64-битной (8-байтовой) архитектуре. Это не должно быть 8-байтовым выравниванием. Он должен быть выровнен только 4 байта.

Аналогично, если вы загружаете 1-байтовый символ на любом компьютере, его совсем не нужно выравнивать.

* Обратите внимание, что векторы SIMD могут подразумевать больший естественный размер слова. Например, 16-байтовый SSE по-прежнему требует 16-байтового выравнивания как на x86, так и на x64. (за исключением явных смещенных загрузок / магазинов)


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

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

7

Другие решения

64-разрядные процессоры x86 по-прежнему сильно оптимизированы для эффективного управления 32-разрядными значениями. Даже в 64-битных операционных системах доступ к 32-битным значениям, по крайней мере, так же быстр, как доступ к 64-битным значениям. На практике это будет быстрее, поскольку потребляется меньше места в кэш-памяти и пропускной способности памяти.

3

Здесь есть много полезной информации:
Производительность 32 бит против 64 бит арифметика

Еще больше информации https://superuser.com/questions/56540/32-bit-vs-64-bit-systems, где ответ утверждает, что видел худшее замедление на 5% (с точки зрения приложения, а не отдельных операций).

Короткий ответ — нет, вы не получите удар по производительности.

1

Всякий раз, когда вы обращаетесь к какой-либо ячейке памяти, вся строка кэша считывается в кэш L1, и любой последующий доступ к чему-либо в этой строке выполняется максимально быстро. Если ваш 32-битный доступ не пересекает строку кэша (чего не будет, если он находится на 32-битном выравнивании), он будет таким же быстрым, как и 64-битный доступ.

1
По вопросам рекламы [email protected]