Какая архитектура процессора лучше всего подходит для арифметики с большими целыми числами?

Если бы мне пришлось писать ассемблерный код для больших целочисленных вычислений (например, простой факторинг, вычисления по модулю и т. д.) с упором на скорость, какая архитектура лучше всего подходит для этого: x86 (-64), ARM, PowerPC, MIPS или другие. ?


person james    schedule 09.09.2011    source источник
comment
Какой язык вы планируете использовать для этого?   -  person Paul R    schedule 09.09.2011
comment
Извините, но на этот вопрос нет ответа в его нынешнем виде: вы смешиваете архитектуры, которые на данный момент даже не нацелены на одни и те же сегменты рынка (мобильные, настольные и серверные - так, для какого типа компьютера лучше всего подходит?). Вы можете переформулировать вопрос как лучшую целочисленную производительность на герц или на ватт, на это может быть ответ...   -  person fvu    schedule 09.09.2011


Ответы (2)


Если вы работаете с небольшим количеством чисел переменного размера, я думаю, что POWER 6 лучше всего подойдет для ваших нужд (хотя я не работал с этой архитектурой), поскольку он обеспечивает высокий IPC и очень высокую частоту (до 5 ГГц).

Если вы работаете с большим количеством чисел фиксированного размера, x86-64 будет лучшим выбором, так как он имеет SIMD-операции, которые работают с 64-битными числами, и вы можете использовать эти операции для ускорения длинных арифметических операций с несколькими числами. Скорее всего, вам понадобится ЦП с поддержкой SSE 4.2 (Intel Nehalem/Westmere/Sandy Bridge или грядущий AMD Bulldozer), поскольку 64-битная инструкция сравнения PCMPGTQ была добавлена ​​только в SSE 4.2.

Кроме того, вам могут быть интересны эти результаты сравнительного анализа GMP.

person Marat Dukhan    schedule 13.09.2011
comment
Power6, Power7 также имеют SIMD (AltiVec/VMX/VSX) - person Paul R; 23.04.2012
comment
Да, но они не поддерживают 64-битные SIMD-операции, а использовать 32-битные SIMD-операции не стоит — простые (не SIMD) 64-битные операции ALU обеспечат лучшую производительность - person Marat Dukhan; 24.04.2012

IMO ничто не сравнится с x86-64, потому что никто не заботится о высокоточной арифметике

Многие архитектуры RISC, такие как MIPS, DEC Alpha или RISC-V, не имеют регистра флагов, поэтому для получения переноса вам потребуется отдельная инструкция. Поэтому они являются плохим выбором и устраняются сразу. Например, чтобы сделать a += b в MIPS, вам нужно

addu aLow, aLow, bLow     # aLow += bLow
sltu tmp, aLow, bLow      # carry: tmp = (aLow < bLow)
addu aHigh, aHigh, bHigh  # aHigh += bHigh
addu aHigh, aHigh, tmp    # aHigh += carry

С флагом переноса вам нужно всего 2 инструкции: add aLow, bLow; adc aHigh, bHigh

Разработчики MIPS могли бы сделать это лучше, но не

Более высокие часы помогают, как сказал Марко ван де Воорт, но эти архитектуры не имеют на 50%-100% более быстрых часов, чем эквивалент x86. Остальные вещи, которые он сказал, довольно неверны. Важно отметить, что математика произвольной точности не может быть тривиально распараллелена, поэтому

Вкратце: Вы действительно хотите вычислить переносы параллельно, что очень сложно.


В мире x86 у вас уже есть флаг переноса с самого начала. Но позже Intel представила набор инструкций ADX с новыми инструкциями ADOX, ADCX и MULX для еще большего ускорения арифметики больших целых чисел. Как они помогают, объясняется в документе Intel Новые инструкции, поддерживающие арифметику больших целых чисел на процессорах с архитектурой Intel

Но не только ADX делает x86 быстрым. Как я упоминал ранее (), SIMD на самом деле не помогает, но в настоящее время на x86 все может быть по-другому. У нас есть очень длинные векторы в x86 (256 бит с AVX2, 512 бит с AVX512 и, возможно, больше в будущем), поэтому, если вы используете различные приемы, такие как использование арифметики неполных слов для задержки распространения переноса, или расположите слова странным образом (например, llhhllhhllhhllhh) вместо линейного, как в обычной арифметике больших целых чисел (llllllllhhhhhhhh), тогда SIMD может быть быстрее, чем скалярные операции. Для получения дополнительной информации вы должны прочитать

Конечно, AVX512 поможет, только если у вас очень большие числа. В противном случае для 512-битного числа у вас могут быть лучшие результаты со скалярным кодом.

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

person phuclv    schedule 01.05.2019
comment
Я думаю, что некоторые процессоры AArch64 с SVE (Scalable Vector Extensions) имеют 256-битные векторы. (Введение в SVE: community.arm.com/developer/tools-software/hpc/b/hpc-blog/posts/). Я не уверен, насколько это актуально, потому что у IDK, если SVE, есть необходимые перетасовки, чтобы делать что-либо, кроме чисто вертикальных операций. - person Peter Cordes; 01.05.2019
comment
PowerPC имеет несколько регистров FLAGS, которые, я думаю, решают ту же проблему, что и ADCX/ADOX. PowerPC64 должен быть довольно разумным для BigInteger на основе количества инструкций, аналогично x86-64, если только нет каких-либо серьезных пробелов, о которых я не знаю. ARM64, он же AArch64, тоже может подойти; он имеет 64x64 => высокое или низкое умножение на половину. (32-битный ARM имеет некоторые 32x32 => 64-битные инструкции с двумя выходами, но AArch64 имеет только расширение 32x32 => 64 или 64x64 -> старшая половина). Но у него целочисленный MAC (умножение-накопление), в отличие от x86. __int128 * __int128 меньше инструкций, чем на x86-64: godbolt.org/z/K1M_ZA - person Peter Cordes; 01.05.2019
comment
Но да, ISA без FLAGS определенно в невыгодном положении для BigInteger: MIPS, RISC-V и устаревшая Alpha. Но это далеко не универсально среди RISC ISA; многие RISC больше заботятся о реальном мире, чем о чистоте RISC, например. POWER и ARM — наиболее очевидные примеры архитектур, для которых существуют современные высокопроизводительные реализации. Конечно, я думаю, что x86-64, вероятно, по-прежнему лучший выбор, но, насколько мне известно, он не лучше, чем POWER для этого, если только x86 mulx r64 (2 мкп) не значительно дешевле, чем POWER64 mulld (64x64=>64) + mulhdu (64x64=> высокая 64). - person Peter Cordes; 01.05.2019
comment
pmull - Polynomial Multiply Long instructions (PMULL/PMULL2) от ARM звучит интригующе en.wikichip.org/wiki/arm/armv8. Сегодня я получил сервер ARM Cavium ThunderX2 с pmull, поэтому я начинаю изучать технологии ARM. - person Z boson; 02.05.2019
comment
@Zboson да, результат очень похож на PPC. Я знаю, что у них есть флаги, но я не знал, что у них есть целочисленное умножение-сложение. - person phuclv; 02.05.2019