Есть ли 256-битный целочисленный тип? - PullRequest
2 голосов
/ 23 апреля 2019

ОС: Linux (Debian 10)

CC: GCC 8,3

CPU: i7-5775C

В GCC есть unsigned __int128 / __int128,но есть ли способ получить uint256_t / int256_t в GCC?

Я читал __m256i, который, кажется, от Intel.Есть ли какой-нибудь заголовок, который я могу включить, чтобы получить его?

Это так же полезно, как гипотетический unsigned __int256?Я имею в виду, если вы можете назначить из / на него, сравнить их, побитовые операции и т. Д.

Каков его эквивалент со знаком (если есть)?


РЕДАКТИРОВАТЬ 1:

Я добился этого:

#include <immintrin.h>
typedef __m256i uint256_t;

и скомпилировал.Если я могу сделать некоторые операции с ним, я обновлю его здесь.


РЕДАКТИРОВАТЬ 2:

Обнаружены проблемы:

uint256_t   m;
ptrdiff_t   l = 5;

m = ~((uint256_t)1 << l);

выход:

error: can’t convert a value of type ‘int’ to vector type ‘__vector(4) long long int’ which has different size
  m = ~((uint256_t)1 << l);

1 Ответ

6 голосов
/ 23 апреля 2019

Нет, нет прямой / встроенной поддержки компилятора для 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.

...