天狗会議録
Posts Pages About

Lazy Code Motion

2024年9月28日読了

Credit

Jens Knoop, Oliver Rüthing, and Bernhard Steffen. 1992. Lazy code motion. In Proceedings of the ACM SIGPLAN 1992 conference on Programming language design and implementation (PLDI ‘92). Association for Computing Machinery, New York, NY, USA, 224–234. https://doi.org/10.1145/143095.143136

Permission to copy without fee all or part of this material is granted provided that the copias are not made or distributed for direct commercial advantaga, the ACM copyright notica and the title of the publication and its date appear, and notice is given that copying is by permission of the Association for Computing Machinery. To copy otherwise, or to republish, raquires a fee and/or specific permission.

Summary

Flow graphのcode motionにおいて、必要であるものに限り・なるべく直前にコードを移動するアルゴリズムを提唱する。

アルゴリズム:

このようにすることで、register pressureの少ないcode motionを、しかも(当時の手法に比べて)完全に・計算量を抑えながら実現できる。

Note

Code Motion

Code motionとは、再計算を防ぐためのflow graph上の最適化。 ソースコードで例えるならば、次のコード:

for (int i = 0; i < 4; ++i) {
    x = a + b;
    y = x + i;
}

を次のように移動する:

x = a + b;
for (int i = 0; i < 4; ++i) {
    y = x + i;
}

The Safe-Earliest Transformation

ノード nn について、backward analysisによって得られる次の D-SAFE(n)\text{D-SAFE(n)} のgreatest solutionをD-Safeと言う:

D-SAFE(n)=nが最後のノードでない(nに再計算を防ぎたい計算が含まれる値が変わっていないmsucc(n)D-SAFE(m))\text{D-SAFE}(n) = n \text{が最後のノードでない} \land ( n \text{に再計算を防ぎたい計算が含まれる} \lor \text{値が変わっていない} \land \prod_{m \in succ(n)} \text{D-SAFE}(m) )

ノード nn について、forward analysisによって得られる次の EARLIEST(n)\text{EARLIEST(n)} のleast solutionをEarliestと言う:

EARLIEST(n)=nが最初のノードであるmpred(n)(値が変わっている¬D-SAFE(m)EARLIEST(m))\text{EARLIEST}(n) = n \text{が最初のノードである} \lor \sum_{m \in pred(n)} ( \text{値が変わっている} \lor \lnot \text{D-SAFE}(m) \land \text{EARLIEST}(m) )

次の手順でcode motionするアルゴリズムをSafe-Earliest Transformationと定義する:

しかし、このアルゴリズムでは、不必要に遠くへ移動してしまう。 もっと直前に移動したい。

The Latest Transformation

ノード nn について、forward analysisによって得られる次の DELAY(n)\text{DELAY(n)} のgreatest solutionをLatestと言う:

DELAY(n)=D-SAFE(n)EARLIEST(n)nが最初のノードでないmpred(n)¬Used(m)DELAY(m)\text{DELAY(n)} = \text{D-SAFE}(n) \land \text{EARLIEST}(n) \lor n \text{が最初のノードでない} \land \prod_{m \in pred(n)} \lnot Used(m) \land \text{DELAY}(m)

ノード nn について、次の述語 Latest(n)Latest(n) を定義する:

Latest(n)=DELAY(n)(nに再計算を防ぎたい計算が含まれる¬msucc(n)DELAY(m))\text{Latest(n)} = \text{DELAY}(n) \land ( n \text{に再計算を防ぎたい計算が含まれる} \lor \lnot \prod_{m \in succ(n)} \text{DELAY}(m) )

次の手順でcode motionするアルゴリズムをLatest Transformationと定義する:

しかし、このアルゴリズムでは、一度しか計算されない計算も移動してしまう。 一度しか計算されない計算は移動したくない。

The Lazy Code Motion Transformation

ノード nn について、backward analysisによって得られる次の ISOLATED(n)\text{ISOLATED(n)} のgreatest solutionをIsolatedと言う:

ISOLATED(n)=msucc(n)(Latest(m)mに再計算を防ぎたい計算が含まれないISOLATED(m))\text{ISOLATED(n)} = \prod_{m \in succ(n)} ( \text{Latest}(m) \lor m \text{に再計算を防ぎたい計算が含まれない} \land \text{ISOLATED}(m) )

移動先ノードの集合 OCP\text{OCP} を次のように定義する:

OCP={nLatest(n)¬ISOLATED(n)}\text{OCP} = \lbrace n | \text{Latest}(n) \land \lnot \text{ISOLATED}(n) \rbrace

移動元ノードの集合 RO\text{RO} を次のように定義する:

RO={nnに再計算を防ぎたい計算が含まれる¬(Latest(n)ISOLATED(n))}\text{RO} = \lbrace n | n \text{に再計算を防ぎたい計算が含まれる} \land \lnot ( \text{Latest}(n) \land \text{ISOLATED}(n) ) \rbrace

次の手順でcode motionするアルゴリズムをLazy Code Motion Transformationと定義する:

Impression

私の所属する研究室出の博士の博論を理解するために必要だと言われて読んだ。 理論系の論文を初めて読んだ。 大量の証明が羅列されていて驚いた。 そうしなければならないのは、考えてみれば当然だ。

この論文では新しい定義をするたびに補題を提示し、最終的にLazy Code Motion Transformationが計算的・ライフタイム的に最適であることの証明をしている。 今回は手法を理解すればいいと割り切って、また省略されている証明も多からずあり、証明を深く追わなかった。

原文を読んでも、ChatGPTで翻訳しても、全く理解できない文章が多々あった。 自分の英語力の無さに悲しくなった。 ……論文の内容に関係ないな。

戻る