此外,我阅读了以下说明:
ptrue p0.s
ptrue p0.d
ptrue p0.b vl64
ptrue p0.b vl32
那么,它们的作用和区别是什么?
我是 SVE 的新手,所以我的回答可能是错误的:
一些背景
(可能你已经知道了……)
SVE 寄存器的宽度因 CPU 而异,因此您可能会遇到以下问题:
您为 CPU 编写程序,每个寄存器允许 3 个数字,并将值加载{10, 20, 30}
到一个寄存器和{5, 10, 3}
另一个寄存器并执行元素除法。你期望{10/5, 20/10, 30/3} = {2, 2, 10}
的结果。
但是,您正在另一个 CPU 上运行程序,每个寄存器允许 5 个元素,因此第二个寄存器包含{0, 0, 5, 10, 3}
,因此您将得到除以零(因为前两个元素)。
为了避免这种情况,SVE 使用特殊的“谓词寄存器”(P0
- P15
),其中包含一个位掩码,告诉 CPU 寄存器中的哪个元素有效,哪个元素无效。在上面的示例中,位掩码应为{invalid, invalid, valid, valid, valid}
.
你的实际问题
那么,它们的作用和区别是什么?
ptrue p0.s
该指令设置寄存器的值,P0
以便稍后的 32 位 ( .s
) 操作将处理 SVE 寄存器中的所有字段。
“32 位操作”是指:将 320 位 SVE 寄存器解释为 10 个 32 位值的操作。
ptrue p0.d
该指令设置寄存器的值,P0
以便稍后的 64 位 ( .d
) 操作将处理 SVE 寄存器中的所有字段。
ptrue p0.b vl64 ptrue p0.b vl32
这些指令将以P0
稍后的 8 位 ( .b
) 操作将处理 SVE 寄存器的低 64 ( vl64
) 或 32 ( vl32
) 字节的方式设置寄存器的值。
在 SVE 寄存器小于 512 ( vl64
) 或 256 ( vl32
) 位宽的 CPU 上,相应的指令将值设置P0
为“所有元素都无效”以确保不会发生任何愚蠢的事情。