当前位置: 首页 > 知识库问答 >
问题:

AVX将\uu m256i压缩32位整数除以2(无AVX2)

谯和煦
2023-03-14

我正在寻找使用AVX将压缩的32位整数除以2(即右移1)的最快方法。我没有访问AVX2的权限。据我所知,我的选择是:

  1. 下拉至SSE2

如果我需要去SSE2,我会很感激最好的SSE2实现。如果是2),我想知道要使用的内在函数,以及是否有更优化的实现来专门除以2。谢谢!

共有1个答案

柯伟志
2023-03-14

假设你知道你在做什么,这是这个函数。

inline __m256i div2_epi32( __m256i vec )
{
    // Split the 32-byte vector into 16-byte ones
    __m128i low = _mm256_castsi256_si128( vec );
    __m128i high = _mm256_extractf128_si256( vec, 1 );
    // Shift the lanes within each piece; replace with _mm_srli_epi32 for unsigned version
    low = _mm_srai_epi32( low, 1 );
    high = _mm_srai_epi32( high, 1 );
    // Combine back into 32-byte vector
    vec = _mm256_castsi128_si256( low );
    return _mm256_insertf128_si256( vec, high, 1 );
}

然而,这样做并不一定比处理16字节向量更快。在大多数CPU上,这些插入/提取指令的性能不是很好,除了AMD Zen 1 CPU。

 类似资料:
  • 我开发了一种无损压缩算法,将32位整数(频率/概率未知)压缩到每整数31.95824位(对于较小的值,它的效果更好,就像大多数压缩算法一样)。显然,不可能将均匀分布的随机数据压缩到小于其未压缩大小。 因此,我的问题是,假设32位整数,对于伪随机数据,哪些无损压缩算法最接近每整数32位的香农熵? 本质上,我在寻找一个表,其中包括压缩算法和它们各自的位/整数值,用于正的、压缩的、32位整数。

  • 问题内容: 我有一个byte [4],其中包含一个32位无符号整数(按大端顺序),我需要将其转换为long(因为int无法保存无符号数字)。 另外,我该如何做相反(即从包含32位无符号整数的long到byte [4])呢? 问题答案: 听起来像是ByteBuffer的工作。 有点像

  • 问题内容: 我正在尝试将整数右移32,但结果是相同的数字。(例如5。) 如果我尝试对Byte和Short执行相同的操作,则可以使用。例如,“(字节)5 >> 8”为0。 整数有什么问题? 问题答案: JLS 15.19。移位运算符 …如果左侧操作数的提升类型为int,则 仅将右侧操作数的最低5位 用作移位距离。 因此转移是无效的。

  • 问题内容: Java编译器 或 JIT编译器是否通过恒定的2到位移位的幂来优化除法或乘法? 例如,以下两个语句是否被优化为相同? (基本上是这个问题,但对于Java) 问题答案: 不,Java编译器不会执行此操作,因为无法确定将显示什么符号。为什么这么重要?负整数上的位移产生与普通除法不同的结果。在这里,您可以看到一个演示:这个简单的测试: 另请注意,我使用代替。A 是无符号的移位,而A 是带符号

  • 主要内容:压实问题我们知道动态分区受到外部碎片的影响。 但是,这可能会导致一些严重的问题。 为了避免压缩,我们需要更改规则,该规则指出进程无法存储在内存中的不同位置。 也可以使用压缩来减少外部碎片的可能性。 在压缩过程中,所有的空闲分区都是连续的,所有加载的分区都集中在一起。 通过应用这种技术,可以将更大的进程存储在内存中。 合并可用分区,现在可以根据新进程的需要分配这些分区。 这种技术也称为碎片整理。 如上图所示

  • Android API提供了保存位图对象的方法。我创建了一个示例应用程序,它将jpeg图像(一些嘈杂的相机照片)加载到位图中,然后将其压缩回同一个文件。然后,再做5次。 显然,我的位图积累了压缩伪影。让我惊讶的是,这些伪影的数量以一种奇怪的方式取决于压缩的质量。当我将质量设置为100(我认为这是最好的质量)时,工件清晰可见。当我将质量降低到90时,工件的可视性明显降低。质量设置为80会给我最好的效