什么是打包和解包以及扩展打包数据

Posted

技术标签:

【中文标题】什么是打包和解包以及扩展打包数据【英文标题】:What is packed and unpacked and extended packed data 【发布时间】:2020-10-29 23:21:49 【问题描述】:

我一直在经历Intel Intrinsics,每个函数都在处理整数、浮点数或双精度数,它们是打包、解包或扩展打包的。

似乎这个问题应该在互联网上的某个地方得到回答,但我根本找不到答案。

那个包装的东西是什么?

【问题讨论】:

正常打包仅意味着您在一个 16 字节向量中有 4 个浮点数,例如 addps xmm0, xmm1。 “解压”不是描述 SIMD 数据格式的正常方式;你能给出一个你看到这个使用的特定上下文吗? Unpacking 是您可以对数据执行的操作,例如扩展每个元素,或者在 SSE 指令的情况下,从 2 个向量中交错元素。 IDK 为什么将其称为“解包”。 打包为“打包在一个寄存器中”。扩展压缩似乎意味着“扩展以使用压缩整数”。 “解压”是,IDK,可能只使用标量或将寄存器视为一个整体 这就是我所说的unpacking。我想这就像@PeterCordes 的意思。 谢谢你们,我现在明白了。我想你应该回答这个问题,因为我似乎无法在 *** 上找到所有内容。 @MargaretBloom:我猜“扩展压缩”只是对pmovsxwd 或其他任何东西的误解:“将压缩的 16 位整数符号扩展为压缩的 32 位整数”。扩展是动词,正在执行的操作,不是存储格式描述的一部分。搜索“Extended packed”在该指南中找不到任何匹配项,这很好,因为它听起来毫无意义。 【参考方案1】:

嗯,我一直在寻找同一个问题的答案,但也没有成功。所以我只能猜测。

英特尔已经在其 MMX 技术中引入了打包和标量指令。比如他们引入了一个函数

__m64 _mm_add_pi8 (__m64 a, __m64 b)

当时还没有“加长包装”这样的东西。唯一的数据类型是__m64,所有操作都对整数进行。 SSE 出现了 128 位寄存器和浮点数运算。然而,SSE2 包含了对在 128 位寄存器中执行的整数的 MMX 操作的超集。例如,

__m128i _mm_add_epi8 (__m128i a, __m128i b)

这里我们第一次看到函数名的“ep”(扩展打包“)部分。为什么引入它?我相信这是解决名称_mm_add_pi8已经被上面列出的MMX指令。SSE/AVX的接口是C语言,没有函数名的多态性。

对于 AVX,英特尔选择了不同的策略,并开始在开头的“_mm”字母之后添加寄存器长度,c.f.:

__m256i _mm256_add_epi8 (__m256i a, __m256i b)
__m512i _mm512_add_epi8 (__m512i a, __m512i b)

为什么他们在这里选择“ep”而不是“p”是一个谜,与程序员无关。实际上,他们似乎使用“p”对浮点数和双精度数进行操作,使用“ep”对整数进行操作。

__m128d _mm_add_pd (__m128d a, __m128d b); // "d": function operates on doubles
__m256 _mm256_add_ps (__m256 a, __m256 b); // "s": function operates on floats

也许这可以追溯到从 MMX 到 SSE 的过渡,其中引入了“ep”用于整数运算(MMX 不处理浮点数),并试图使 AVX 助记符尽可能接近 SSE 的操作

p>

因此,基本上,从程序员的角度来看,“ep”(“扩展打包”)和“p”(“打包”)之间没有区别,因为我们已经知道我们的目标寄存器长度我们的代码。


至于问题的下一部分,“解包”属于与“标量”和“打包”完全不同的概念类别。这是一个特定数据重新排列或随机播放的通俗术语,例如旋转或移位。

在像_mm256_unpackhi_epi16 这样的内部函数名称中使用“epi”的原因是它是一个真正的向量(不是标量)函数,它是一个16 位整数元素向量的函数。请注意,这里的“unpack”属于函数名称中描述其操作的部分(如 mul、add 或 permute),而“s”/“p”/“ep”(标量、打包、扩展打包)属于描述操作模式的部分(“s”为标量,“p”或“ep”为向量)。

(没有在两个 XMM 寄存器之间操作的标量整数指令,但“si”确实出现在 movd eax, xmm0:_mm_cvtsi128_si32 的内部名称中。有一些类似的内部函数。)

【讨论】:

如果您对问题对“扩展打包”的引用是内在名称是正确的,那么是的,对历史的良好解释,我同意您对英特尔命名选择的结论/猜测。 (包括 SSE _ps 和 SSE2 _pd 内在函数没有从任何其他 FP 向量宽度“扩展”的事实。) @PeterCordes 感谢您的编辑。这么多人自愿提供帮助,我真的很惊讶。

以上是关于什么是打包和解包以及扩展打包数据的主要内容,如果未能解决你的问题,请参考以下文章

Perl Cryptology:使用打包和解包功能加密/解密 ASCII 字符

Linux文件压缩和解压缩命令

SSE/SSE2 指令的打包和解包数据?

linux 下 打包 和解压缩

qt中如何解包利用python 的struct.pack()函数打包的数据

Android ROM包定制(解包,增删模块,打包)