【问题标题】:AVX2 permute control bitAVX2 置换控制位
【发布时间】:2023-04-09 11:26:01
【问题描述】:

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 指令匹配时可能会造成混淆。

标签: avx avx2


【解决方案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 是复制输入不变的身份洗牌。
  • 好的,现在说得通了。我想我明白了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2010-11-12
相关资源
最近更新 更多