【问题标题】:Instructions for STRLEN function in AVX with YMM registers带有 YMM 寄存器的 AVX 中的 STRLEN 函数说明
【发布时间】:2020-02-25 13:44:56
【问题描述】:

我正在使用 AVX(不是 AVX2)创建 strlen 函数... 使用 AVX 可以访问(YMM)寄存器,但有一个问题......我知道的 strlen 函数的指令是:

vmovdqu
vpcmpeqb
vpmovmskb

但这些说明仅适用于 AVX 中的“XMM”...如果我想将它们与 (YMM) 一起使用,我需要一个 AVX2-CPU ...但我在谈论 AVX ... 现在要使用“AVX”和“YMM”寄存器创建 strlen 函数,我必须使用哪些指令?

【问题讨论】:

  • 也可以试试pcmpistrmpcmpistri
  • 这仍然是 SSE (4.2) 和 AVX (XMM) 而不是 AVX (YMM)
  • 我知道。但是这些说明是专门为此目的而制定的。如果 AVX 指令都使用 128 位寄存器,则与 SSE 指令没有性能差异,并且由于使用 256 位寄存器是不可能的,这是一个可能的选择。
  • 但是'pcmpistri'的速度真的很差!!!!!!!!!!!!它甚至比 SSE2 慢 30%!
  • 取决于用例,但对于这种情况可能是的。

标签: assembly avx avx2


【解决方案1】:

没有 AVX2 无法与 YMM 寄存器进行字节比较。 AVX1 中实际上没有字节元素 YMM 指令。

AVX1 仅适用于 256 位 浮点 向量,或复制/改组任意数据。在 AVX2 之前,大多数整数/位精确的事情都是不可能的;这就是 AVX2 存在的原因。

像使用 SSE2 strlen 一样使用 XMM 寄存器,AVX1 的唯一好处是节省了 movdqa 寄存器复制指令。

您可以假设将字节解包为浮点数(慢慢地,使用 shuffles + vinsertf128),然后一次将 8 与 vcmpps 进行比较。但是您可以一次将 16 个字节与 vpcmpeqb xmm 进行比较,所以像普通人一样进行比较,每个向量完成的工作量是原来的两倍,同时仍然可以享受 AVX 非破坏性 3 操作数指令编码的好处。

【讨论】:

猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 2014-02-26
  • 2016-04-19
  • 1970-01-01
  • 2013-01-11
  • 2011-11-04
  • 2012-05-26
  • 2015-01-04
相关资源
最近更新 更多