Нет, нет прямой / встроенной поддержки компилятора для 256-битных целых чисел в gcc или любом другом основном компиляторе x86-64.Вам нужна библиотека, которая использует add-with-carry (или эмулирует ее) 1 .
__m256i
- это AVX2 SIMD 4x uint64_t
(или более узкий размер элемента, например 8x * 1007)*). Это не 256-битный скалярный целочисленный тип, его нельзя использовать для скалярных операций, __m256i var = 1
даже не скомпилирует .X86 SIMD не поддерживается для целых чисел шире 64-битных, а встроенные типы Intel, такие как __m128i
и __m256i
, предназначены исключительно для SIMD.
GCC __int128
/ unsigned __int128
обычно использует скаляр add/adc
и / или скаляр mul
/ imul
, поскольку AVX2, как правило, не помогает в увеличении точности.(Только для таких вещей, как побитовое И / ИЛИ / XOR, где границы элементов не имеют значения.)
Сноска 1: К сожалению, C не обеспечивает вынос из сложения / вычитания, поэтому писать даже не удобнов C. sum = a+b
/ carry = sum<a
работает для выполнения, когда нет переноса, но гораздо сложнее написать полный сумматор на C. И компилятор обычно создает дерьмо asm, которое не просто использует собственный add-with-carryинструкции на машинах, где они доступны.Библиотеки расширенной точности для очень больших целых чисел, таких как GMP, обычно пишутся в asm.