此外,我还阅读了以下说明:
ptrue p0.s
ptrue p0.d
ptrue p0.b vl64
ptrue p0.b vl32
那么,它们的影响和区别是什么呢?
发布于 2022-02-23 09:45:08
我是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
)操作将处理寄存器中的所有字段。
“32位操作”是指将320位SVE寄存器解释为10 32位值的操作。
ptrue p0.d
此指令设置寄存器P0
的值,以便以后的64位(.d
)操作将处理寄存器中的所有字段。
ptrue p0.b vl64 ptrue p0.b vl32
这些指令将设置寄存器P0
的值,以便以后的8位(.b
)操作将处理寄存器的低64字节(vl64
)或32字节(vl32
)。
在SVE寄存器小于512 (vl64
)或256 (vl32
)位宽的CPU上,相应的指令将P0
的值设置为“所有元素都无效”,以确保不会发生任何愚蠢的事情。
https://stackoverflow.com/questions/71233647
复制相似问题