在ARMV8中,汇编指令"ptrue p0.b vl64"的作用是什么?
In ARMV8, what is the assembly instruction "ptrue p0.b vl64" effect?
此外,我阅读了这些说明:
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}
加载到另一个寄存器并执行 element-wise分配。您期望结果为 {10/5, 20/10, 30/3} = {2, 2, 10}
。
但是,您运行将您的程序放在另一个允许每个寄存器有 5 个元素的 CPU 上,因此第二个寄存器包含 {0, 0, 5, 10, 3}
,因此您将得到除以零(因为前两个元素)。
为避免这种情况,SVE 使用特殊的“谓词寄存器”(P0
-P15
),其中包含一个位掩码,告诉 CPU 寄存器中的哪个元素有效哪个无效。在上面的示例中,位掩码应为 {invalid, invalid, valid, valid, valid}
.
你的实际问题
So, what are their effects and differences?
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
) 操作将处理低位 64 (vl64
) 或 32 SVE 寄存器的 (vl32
) 个字节。
在 SVE 寄存器小于 512 (vl64
) 或 256 (vl32
) 位宽的 CPU 上,相应的指令设置 P0
到“所有元素都无效”,以确保不会发生任何愚蠢的事情。
此外,我阅读了这些说明:
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}
加载到另一个寄存器并执行 element-wise分配。您期望结果为 {10/5, 20/10, 30/3} = {2, 2, 10}
。
但是,您运行将您的程序放在另一个允许每个寄存器有 5 个元素的 CPU 上,因此第二个寄存器包含 {0, 0, 5, 10, 3}
,因此您将得到除以零(因为前两个元素)。
为避免这种情况,SVE 使用特殊的“谓词寄存器”(P0
-P15
),其中包含一个位掩码,告诉 CPU 寄存器中的哪个元素有效哪个无效。在上面的示例中,位掩码应为 {invalid, invalid, valid, valid, valid}
.
你的实际问题
So, what are their effects and differences?
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
) 操作将处理低位 64 (vl64
) 或 32 SVE 寄存器的 (vl32
) 个字节。
在 SVE 寄存器小于 512 (vl64
) 或 256 (vl32
) 位宽的 CPU 上,相应的指令设置 P0
到“所有元素都无效”,以确保不会发生任何愚蠢的事情。