簡體   English   中英

澄清什么是 Vulkan SPIR-V 中的持續目標

[英]Clarification on what exactly constitutes as a continue target in Vulkan SPIR-V

我正在嘗試了解 SPIR-V 規范,例如了解循環。 在 1.6 修訂 2 規范的開頭,下面的例子(為了一致性,只取其中的一部分)

for (int i = 0; i < 4; ++i)
    color *= multiplier;

變成:

%49 = OpLabel
      OpLoopMerge %51 %52 None ; structured loop
      OpBranch %53
%53 = OpLabel
%54 = OpLoad %16 %48
%56 = OpSLessThan %25 %54 %55 ; i < 4 ?
      OpBranchConditional %56 %50 %51 ; body or break
%50 = OpLabel ; body
%58 = OpLoad %7 %57
%59 = OpLoad %7 %31
%60 = OpFMul %7 %59 %58
      OpStore %31 %60
      OpBranch %52
%52 = OpLabel ; continue target
%61 = OpLoad %16 %48
%62 = OpIAdd %16 %61 %21 ; ++i
      OpStore %48 %62
      OpBranch %49 ; loop back
%51 = OpLabel ; loop merge point
      OpReturn
      OpFunctionEnd

在規范中,它指定一個塊以 label 開始,並以任何分支終止指令結束。 這會將上面的內容變為以下內容:

;Block 1
%49 = OpLabel
      OpLoopMerge %51 %52 None ; structured loop
      OpBranch %53

;Block 2
%53 = OpLabel
%54 = OpLoad %16 %48
%56 = OpSLessThan %25 %54 %55 ; i < 4 ?
      OpBranchConditional %56 %50 %51 ; body or break

;Block 3
%50 = OpLabel ; body
%58 = OpLoad %7 %57
%59 = OpLoad %7 %31
%60 = OpFMul %7 %59 %58
      OpStore %31 %60
      OpBranch %52

;Block 4
%52 = OpLabel ; continue target
%61 = OpLoad %16 %48
%62 = OpIAdd %16 %61 %21 ; ++i
      OpStore %48 %62
      OpBranch %49 ; loop back

;Block 5
%51 = OpLabel ; loop merge point
      OpReturn

      OpFunctionEnd

然后規范指出:

Header 塊:包含合並指令的塊。

Loop Header:一個 header 塊,其合並指令是一個 OpLoopMerge

所以這里的循環header就是block 1,OpLoopMerge所在的位置。

OpLoopMerge 聲明了三個參數,其中兩個在這里很重要:

合並塊是此結構化循環的合並塊的 label。

繼續目標是用於處理循環“繼續”的塊的 label。

合並塊是

合並塊:由合並指令的合並塊操作數聲明的塊。

我的理解是當“結構化循環/選擇”結束時,在這種情況下,它就在 function 的末尾,第 5 塊。這對我來說很有意義。

繼續目標是我不清楚的。 這里的 continue 目標是塊 4,根據 op loop 合並指令。 為什么繼續目標不是塊 3? 還是塊 2? 是什么讓第 4 塊成為此處的繼續目標? 是因為它是最終決定退出或繼續循環的塊嗎? 這就是“處理循環”繼續“的意思嗎?

“繼續目標”的存在是為了滿足大多數語言中continue控制流指令的需求。 在高級語言中,您可以在循環中發出continue語句。 這會跳轉到循環中的下一個迭代。

“繼續目標”是開始下一次迭代的循環代碼部分。 您要么直接從continue語句分支到此處,要么從循環體的末尾分支到此處。

如果源包含一個continue語句,那將是循環主體的一部分,在您的示例中是 Block 3。因此沒有理由將其作為 continue 目標; 這將導致無限循環,因為從未檢查過實際的終止條件,也不會評估迭代表達式。

Block 2 也沒有任何意義。 continue循環時,必須執行迭代表達式。 重復終止條件無濟於事,因為它顯然已經通過了 這就是它開始進入循環體的方式。 在計算迭代表達式之前,終止條件將繼續通過。 再一次,將導致無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM