SSE 向量重新对齐?

Posted

技术标签:

【中文标题】SSE 向量重新对齐?【英文标题】:SSE vector realign? 【发布时间】:2020-11-07 07:17:52 【问题描述】:

有没有办法重新对齐已加载到 SSE/AVX 向量寄存器中的数据(比如实现滑动窗口)?还是我需要自己移动字节并再次从内存重新加载到向量寄存器中?

【问题讨论】:

您要按位、按字节还是按字对齐它们? 对于 128 位向量,SSSE3 / AVX palignr 有效。对于 AVX2,2x 128 位通道行为对此几乎没有用处。不过,有时从内存重新加载会更好:如果您不跨越缓存线边界(在 Intel 上),则 2/时钟负载吞吐量不会受到影响。 @dai 位或字节 【参考方案1】:

对于 128 位向量,SSSE3 / AVX [v]palignr xmm 适用于一对寄存器上的任意字节窗口。对于 AVX2 ymm 寄存器,2x 128 位通道行为对此几乎没有用处。 _mm_alignr_epi8 (PALIGNR) equivalent in AVX2

不过,有时从内存重新加载会更好:如果您不跨越缓存线边界(在 Intel 上),则 2/时钟负载吞吐量不会受到任何惩罚,而 1/时钟 shuffle 吞吐量则是 1/时钟。缓存线拆分的吞吐量/延迟损失并不可怕。如果一个palignr 就足够了,通常使用它,但通常最好进行未对齐的加载,而不是尝试为 AVX2 模拟它。

【讨论】:

以上是关于SSE 向量重新对齐?的主要内容,如果未能解决你的问题,请参考以下文章

SSE2 向量移位

使用 SSE 缩放复杂向量

浮点向量的 SSE 缩减

将 SSE 矩阵向量乘法代码转换为 AVX

随机播放 16 位向量 SSE

SSE/AVX 向量类型的差异