使用 AVX 的有符号/无符号整数的最小值

Posted

技术标签:

【中文标题】使用 AVX 的有符号/无符号整数的最小值【英文标题】:Minimum of signed/unsigned integers using AVX 【发布时间】:2012-12-13 22:24:37 【问题描述】:

我浏览了 AVX 指令指南,虽然有 32 位整数值的加载、存储和置换操作,但其他操作(例如确定最小值或最大值)或随机操作仅适用于浮点数和双精度数。

所以,如果我想对 32 位整数使用这些操作,我需要将其类型转换为浮点数,然后再将其类型转换回来,还是我缺少其他一些指令?

另外,如果我想在 32 位整数上使用随机播放掩码,它们是否与浮点数相同?

【问题讨论】:

【参考方案1】:

32B 向量的大部分整数运算都在 AVX2 扩展中(不是最初的 AVX 扩展,它几乎完全是浮点运算)。 Intel 最新的AVX Programming Reference 有完整的细节;您可能还想看看英特尔的blog post 宣布了一些细节。

不幸的是,您不能使用浮点最小值或最大值运算来模拟对整数数据的这些运算,因为当解释为浮点数据时,大量整数映射到 NaN 值,并且 NaN 比较的语义不会' t 做你想要的整数比较(你还需要处理浮点编码是符号大小的事实,所以负值的顺序是“反转的”,并且 +0 和 -0 比较相等) .

【讨论】:

英特尔将 128 位整数 SSE 操作移动到 128 位 AVX 指令中(使用 3 操作数编码),但不理会它们。唯一的 256 位整数操作用于 intfloat 转换。 AVX2 是好东西即将到来的地方。 @Stephen:您能否详细说明为什么类型转换不起作用,即整数何时映射到 NaN 或如何保留负值的顺序? @user1715122 我认为斯蒂芬误读了这一点,并认为您打算重新解释位模式。当您进行普通类型转换时,您的问题是 a)它很慢,可能比条件移动慢,b)精度损失,integer -> floating -> integer 不一定是往返。 但是为什么最小、最大或随机操作会损失精度呢? @danielfischer:老实说,我认为很明显,进行转换是行不通的,而且即使这样做了也会有糟糕的表现,我什至没有想到提问者可能正在询问它。

以上是关于使用 AVX 的有符号/无符号整数的最小值的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中找到三维矩阵中的有符号最小值

使用 AVX2 计算 8 个长整数的最小值

如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

MySQL Integer类型与INT(11)

将 256 位 AVX 向量存储为无符号长整数的最佳方法

确定整数溢出是不是超过或低于界限