AVX 中 STRLEN 函数的说明与 YMM 寄存器
Instructions for STRLEN function in AVX with YMM registers
我正在使用 AVX(不是 AVX2)创建 strlen 函数 ...
使用 AVX 可以访问 (YMM) 寄存器,但是有一个问题......我知道的关于 strlen 函数的指令是:
vmovdqu
vpcmpeqb
vpmovmskb
但这些说明仅适用于 AVX 中的 'XMM' ... 如果我想将它们与 (YMM) 一起使用,我需要有一个 AVX2-CPU ... 但我谈论 AVX ...
现在用 'AVX' 和 'YMM' 寄存器创建一个 strlen 函数,我必须使用什么指令?
没有 AVX2,就无法与 YMM 寄存器进行字节比较。 AVX1 中字面上没有字节元素 YMM 指令。
AVX1 仅适用于 256 位 浮点 向量,或复制/改组任意数据。大多数整数/位精确的东西在 AVX2 之前是不可能的;这就是 AVX2 存在的原因。
像使用 SSE2 strlen 一样使用 XMM 寄存器,AVX1 的唯一好处是节省 movdqa
寄存器复制指令。
假设您可以将字节解压缩为浮点数(慢慢地,使用 shuffles + vinsertf128),然后立即将 8 与 vcmpps
进行比较。但是您可以一次将 16 个字节与 vpcmpeqb xmm
进行比较,所以像普通人一样进行比较,每个向量完成的工作量是原来的两倍,同时仍然受益于 AVX 非破坏性 3 操作数指令编码。
我正在使用 AVX(不是 AVX2)创建 strlen 函数 ... 使用 AVX 可以访问 (YMM) 寄存器,但是有一个问题......我知道的关于 strlen 函数的指令是:
vmovdqu
vpcmpeqb
vpmovmskb
但这些说明仅适用于 AVX 中的 'XMM' ... 如果我想将它们与 (YMM) 一起使用,我需要有一个 AVX2-CPU ... 但我谈论 AVX ... 现在用 'AVX' 和 'YMM' 寄存器创建一个 strlen 函数,我必须使用什么指令?
没有 AVX2,就无法与 YMM 寄存器进行字节比较。 AVX1 中字面上没有字节元素 YMM 指令。
AVX1 仅适用于 256 位 浮点 向量,或复制/改组任意数据。大多数整数/位精确的东西在 AVX2 之前是不可能的;这就是 AVX2 存在的原因。
像使用 SSE2 strlen 一样使用 XMM 寄存器,AVX1 的唯一好处是节省 movdqa
寄存器复制指令。
假设您可以将字节解压缩为浮点数(慢慢地,使用 shuffles + vinsertf128),然后立即将 8 与 vcmpps
进行比较。但是您可以一次将 16 个字节与 vpcmpeqb xmm
进行比较,所以像普通人一样进行比较,每个向量完成的工作量是原来的两倍,同时仍然受益于 AVX 非破坏性 3 操作数指令编码。