AVX2 置换控制位

Posted

技术标签:

【中文标题】AVX2 置换控制位【英文标题】:AVX2 permute control bit 【发布时间】:2018-12-22 02:22:26 【问题描述】:

AVX2 指令中的置换命令需要 imm8 类型的参数。此参数控制如何执行排列。不幸的是,我不明白这个 imm8 参数是如何“创建”的。我必须设置什么值或如何确定我必须为特定排列设置什么值?

示例: _mm256_permute_pd(vec2, 0x5);

这里的参数 0x5 置换了 vec2 中的第一个和第二个 double 以及 vec2 中的第三个和第四个 double。但是我怎么知道 0x5 做到了呢?

【问题讨论】:

_mm256_permute_pd 只需要 AVX1,它是 vpermilpd,一个车道内置换。您是否将其与 AVX2 _mm256_permute4x64_pd (vpermpd) 混在一起?尝试将 Intel 的固有名称与 asm 指令匹配时可能会造成混淆。 【参考方案1】:

对于每个目标元素,它是从源向量的相应通道中选择两个元素之一的 4x 1 位索引。阅读文档的操作部分以了解 asm 指令:http://felixcloutier.com/x86/VPERMILPD.html

或者look it up in Intel's intrinsics guide,它具有类似的伪代码,可以准确地显示每个位如何选择结果元素的源。

vpermpd 不是车道交叉口,所以它不像 _MM_SHUFFLE 是辅助宏的 2 位索引,所以它也不像 Convert _mm_shuffle_epi32 to C expression for the permutation?。

【讨论】:

很抱歉,我不太明白。你能用一个例子解释一下吗?位的值是用十六进制给出的,不是吗? @vydesaster:直接字节是一个数字。十六进制是指定它的一种方式,但它是 C,因此任何写入数字常量的方式都是有效的。 Base 2 是一个不错的选择,因为每个位都是一个单独的字段。例如0b010150x5 的另一种写法,相同的常量。低位是目标低元素的选择器,它从源的低通道中选择元素 1。 0b1010 是复制输入不变的身份洗牌。 好的,现在说得通了。我想我明白了。非常感谢。

以上是关于AVX2 置换控制位的主要内容,如果未能解决你的问题,请参考以下文章

DES加密

在啥情况下,AVX2 收集指令会比单独加载数据更快?

如何使用 avx2 将 24 位 rgb 转换为 32 位?

AVX2 上的 256 位 CRC 计算

如何在两个 AVX2 向量之间交换 128 位部分

仅使用 avx 而不是 avx2 转置 64 位元素