有256位整数类型吗?

时间:2019-04-22 23:23:51

标签: c gcc types x86-64

操作系统:Linux(Debian 10)

CC:GCC 8.3

CPU:i7-5775C

GCC中有unsigned __int128 / __int128,但是有什么办法在GCC中有uint256_t / int256_t

我读过一个__m256i,它似乎来自英特尔。我可以包含任何标头来获取它吗?

它是否可以用作假设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);

2 个答案:

答案 0 :(得分:6)

否,gcc或任何其他主流x86-64编译器不支持256位整数的直接/内置编译器支持。您需要一个使用随身携带(或模仿) 1 的库。

__m256i是AVX2 SIMD 4x uint64_t(或像8x uint32_t这样的较窄元素大小)。 这不是256位标量整数类型,您不能将其用于标量运算,__m256i var = 1甚至不会编译。 x86 SIMD 不支持宽度大于64位的整数,而Intel __m128i__m256i之类的Intel固有类型仅用于SIMD。

GCC的__int128 / unsigned __int128通常使用标量add/adc和/或标量mul / imul,因为AVX2通常对扩展精度没有帮助。 (仅适用于元素边界无关的按位AND / OR / XOR之类的东西。)


脚注1:不幸的是C不能提供加/减运算的进位,因此用C编写甚至都不方便。sum = a+b / carry = sum<a可以在没有进位时进行进位,但是用C语言编写一个完整的加法器要困难得多。而且编译器通常会制作废话汇编,而不仅仅是在可用的机器上使用本机随身携带指令。对于很大的整数(例如GMP),扩展精度库通常以asm编写。

答案 1 :(得分:2)

我只在 Pollard Rho 算法中计算“f(x) = (x^2+a) mod n”时才需要“uint256_t”。函数“f”之外的所有变量都是内置类型 __uint128_t。

我为此目的简单地实现了 uint256_t:

typedef __uint128_t uint256_t[2];

然后我实现了计算“f()”所需的函数:

__uint128_t set_128(unsigned long h, unsigned long l);
void set_256(uint256_t d, __uint128_t l, __uint128_t h);
void add_128(uint256_t d, uint256_t x, __uint128_t a);
void add_256(uint256_t d, uint256_t x, uint256_t a);
void shl_256(uint256_t d, long s);
void sqr_128(uint256_t d, __uint128_t x);
several print functions and macros for printing 128bit and 256bit numbers
__uint128_t mod_256(uint256_t x, __uint128_t n);
__uint128_t f(__uint128_t x);

在这个要点中找到实现:
https://gist.github.com/Hermann-SW/a20af17ee6666467fe0b5c573dae701d

我确实针对 gmplib 函数对我的代码进行了基准测试,并在所有方面都实现了对 gmplib 的加速(经过大量工作),详情如下:
https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=311893&p=1873552#p1873552

函数执行 100 万次的运行时间(以纳秒为单位):
enter image description here