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 是一个不错的选择,因为每个位都是一个单独的字段。例如0b0101
是 5
或 0x5
的另一种写法,相同的常量。低位是目标低元素的选择器,它从源的低通道中选择元素 1。 0b1010
是复制输入不变的身份洗牌。
好的,现在说得通了。我想我明白了。非常感谢。以上是关于AVX2 置换控制位的主要内容,如果未能解决你的问题,请参考以下文章