gpt4 book ai didi

cpu-architecture - 什么是打包和解包和扩展打包数据

转载 作者:行者123 更新时间:2023-12-04 12:23:40 25 4
gpt4 key购买 nike

我一直在经历Intel Intrinsics并且每个函数都在处理整数或浮点数或 double 数,这些整数或浮点数或 double 数被打包或解包或扩展打包。
似乎应该在互联网上的某些地方回答这个问题,但我根本找不到答案。
那个包装的东西是什么?

最佳答案

好吧,我一直在寻找同一问题的答案,但也没有成功。所以我只能猜测。
英特尔已经在其 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的接口(interface)是C语言,没有函数名的多态性。
对于 AVX,Intel 选择了不同的策略,并开始在开头的“_mm”字母之后添加寄存器长度,c.f.:
__m256i _mm256_add_epi8 (__m256i a, __m256i b)
__m512i _mm512_add_epi8 (__m512i a, __m512i b)
为什么他们在这里选择“ep”而不是“p”是个谜,与程序员无关。实际上,他们似乎对浮点数和 double 数的操作使用“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 助记符
因此,基本上,从程序员的角度来看,“ep”(“扩展打包”)和“p”(“打包”)之间没有区别,因为我们已经知道我们在代码中的目标寄存器长度。

至于问题的下一部分, “解包”与“标量”和“打包”属于完全不同的概念类别 .这是特定数据重新排列或洗牌的通俗术语,如旋转或移位。
在内部函数名称中使用“epi”的原因,如 _mm256_unpackhi_epi16是它是 16 位整数元素向量上的真正向量(非标量)函数。请注意,这里的“解包”属于描述其操作的函数名称部分(如 mul、add 或 permute),而“s”/“p”/“ep”(标量、打包、扩展打包)属于描述操作模式的部分(“s”的标量,“p”或“ep”的向量)。
(没有在两个 XMM 寄存器之间运行的标量整数指令,但“si”确实出现在 movd eax, xmm0 的内部名称中: _mm_cvtsi128_si32。有一些类似的内部函数。)

关于cpu-architecture - 什么是打包和解包和扩展打包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64600563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com