0

Мне не хватает информации о том, как производительность зависит от характеристик процессора. Я бегу приложение для выполнения модульного расчета (DH обмена ключами) на платформе Windows, со следующими параметрами:Модульный расчет 32-разрядная и 64-разрядная ОС

Modular: простое число = 4096 бит

Генератор: 2

экспонент: 256 бит

Когда приложение запускается на 32-разрядной Windows 7 с процессором 2,4 ГГц и 4 ГБ ОЗУ, оно занимает от 3-4 секунд. Тем не менее, когда я запускаю одно и то же приложение на 64-разрядной Windows 7 с той же скоростью процессора и 8 ГБ ОЗУ, это занимает 1-2 секунды.

Я пытаюсь понять, но я запуталась ли модульное скорость вычисления зависит от размера ARM или поддержки CPU (64-бит против 32-бит)

ответ

2

64-разрядные процессоры значительно быстрее, находятся в большом целое арифметические, чем 32-битные процессоры. Мой опыт - это фактор 2 с идентичным кодом и фактор 4 со специальным кодом.

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

    Процессоры AMD64 (64 бит) имеют более крупные регистры и больше их по сравнению с процессорами x86 (32 бит). Таким образом, эти промежуточные значения вписываются в один регистр, и компилятору не нужно сшивать два 32-битных регистра, чтобы обеспечить появление 64-битных целых чисел в c. Дополнительные регистры означают, что вам нужно работать со стеклом реже.

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

  • Другое важное отличие заключается в том, что AMD64 (64-разрядная версия) поддерживает 64-битное 64-битное умножение, а x86 (32 бит) поддерживает только 32x32-> 64-битное умножение. Это большое умножение вдвое дороже, но в 4 раза больше.

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

+0

Спасибо за ваш ответ. Мне интересно, имеет ли размер ОЗУ даже модульный расчет, так как я использую тип данных BigInteger. – user3019794

+0

Размер ОЗУ не имеет значения. Вы можете делать эти вычисления с несколькими килобайтами ОЗУ. – CodesInChaos