此外,我閱讀了以下說明:
ptrue p0.s
ptrue p0.d
ptrue p0.b vl64
ptrue p0.b vl32
那么,它們的作用和區別是什么?
uj5u.com熱心網友回復:
我是 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) 位元組的方式設定暫存器的值。
On a CPU where the SVE registers are less than 512 (vl64) or 256 (vl32) bits wide, the corresponding instruction sets the value of P0 to "all elements are invalid" to ensure that nothing stupid happens.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/437341.html
