-1

此外,我阅读了以下说明:

ptrue p0.s
ptrue p0.d
ptrue p0.b vl64
ptrue p0.b vl32

那么,它们的作用和区别是什么?

4

1 回答 1

1

我是 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为“所有元素都无效”以确保不会发生任何愚蠢的事情。

于 2022-02-23T09:45:08.767 回答