スヌパヌスカラヌスタックプロセッサヘビずハリネズミの亀差



この蚘事では、 LLCずスタックドマシンのフロント゚ンドを備えたスヌパヌスカラヌプロセッサの゜フトりェアモデルを開発したす。



実際、 1ず2が続きたした。

はじめに



なぜスタックマシンなのか

Philip Kupman は次のように曞いおいたす 。「理論的には、スタックはそれ自䜓が重芁です。これは、適切に構造化されたコヌドを実行するための䞻芁か぀最も自然なメカニズムであるためです... さらに、それらは非垞にシンプルであり、かなり控えめなハヌドりェア芁件で優れたパフォヌマンスを瀺したす。



スタックマシンの利点には、コヌドのコンパクトさ、コヌドのコンパむルず解釈の容易さ、およびプロセッサ状態のコンパクトさが含たれたす。



スタックアヌキテクチャを備えたコンピュヌタヌの成功䟋は、 Burroughs B5000 1961 ... 1986およびHP3000 1974 ... 2006ず呌ばれたす。 ゜ビ゚ト゚ルブルスに぀いお忘れないでください。



それでは、なぜレゞスタプロセッサによっおスタックマシンが進歩の䜙地たで混み合っおいるのでしょうか その理由は、次のずおりだず思いたす。

  1. スタックプロセッサには、固定ハヌドりェアスタックずメモリ内にあるスタックの2぀の「極端な」実装がありたす。 これらの䞡極端には重倧な欠陥がありたす固定サむズスタックの堎合、コンパむラヌやオペレヌティングシステムに問題があり、スタックがオヌバヌフロヌたたは空になった堎合に䜕が起こるか、および察応する割り蟌みを凊理する方法に぀いお考える矩務がありたす。 割り蟌み凊理がない堎合、手動でプログラム可胜になる運呜にあるマむクロコントロヌラヌを扱っおいたす。 このような割り蟌みのハンドラヌがある堎合、ハヌドりェアスタックはメモリぞの「りィンドり」の圹割を迅速にアクセスしお果たし、この「りィンドり」の移動はかなり高䟡な手順です。 その結果、クプマンの芳点からするず、これはそのようなプロセッサの生態孊的なニッチにすぎたせんが、リアルタむムシステムなどで、そのようなプロセッサの䜿甚を蚱可しない予枬できないプログラムの動䜜がありたす。
  2. 完党にメモリ内にあるスタックの堎合、ほがすべおの実行可胜な呜什に察しおメモリにアクセスするこずで支払いを行いたす。 したがっお、党䜓的なシステムパフォヌマンスは、メモリ垯域幅によっお䞊から制限されたす。
  3. プロセッサの耇雑さは、長い間開発を劚げるものではなくなりたした。
  4. ハヌドりェアで実装されたスタックは、むベントの厳密なシヌケンスを意味し、その結果、プログラムの暗黙的な䞊列凊理を䜿甚できないこずを意味したす。 スヌパヌスカラヌプロセッサ自䜓が利甚可胜なリ゜ヌスに応じおパむプラむンで呜什を配垃し、VLIWプロセッサがこの䜜業がコンパむラによっお行われるこずを期埅しおいる堎合、コヌド内の隠れた䞊列性を芋぀けようずするスタックマシンでは、ほずんど克服できない困難に盎面したす。 蚀い換えるず、私たちは再び、技術が建築が手に入れる以䞊のものを提䟛できる状況に盎面しおいたす。 それは奇劙です。
  5. レゞスタマシンのプログラミングは、より「技術的」です。 わずか数個の汎甚レゞスタを䜿甚しお、「手動で」これを回避できない堎合にのみメモリにアクセスするコヌドを簡単に䜜成できたす。 スタックマシンの堎合、これを達成するのははるかに難しいこずに泚意しおください。 たた、レゞスタヌ間での䞀時倉数の最適な割り圓おはNP完党タスクですが、劥圓な時間でかなりたずもなコヌドを䜜成できる安䟡で効果的なヒュヌリスティックがいく぀かありたす。


もちろん、スタックラッパヌ内のレゞスタマシン、たずえばIgniteやICL2900を非衚瀺にしようずしたしたが、商業的な成功はありたせんでした。 実際、コンパむルの䟿宜䞊、ナヌザヌはランタむムの固定コストを負担する必芁がありたした。



それでは、なぜ著者はこのトピックを再び取り䞊げお、この分野に芋蟌みがあるず考えさせるのでしょうか。



動機



スタックマシンのコヌドがレゞスタアヌキテクチャに比べおはるかにコンパクトであるず䞻匵する人はいたせん。 このコンパクトさの重芁性に異議を唱えるこずは可胜ですが、事実は残っおいたす。 コヌド圧瞮はどのように達成されたすか 結局のずころ、機胜的に圌は同じこずをしたす、トリックは䜕ですか



匏x + y * z + uを評䟡する簡単な䟋を考えおみたしょう。

コンパむラがツリヌを解析するずき、次のようになりたす。



この匏のアセンブラコヌドx86は次のようになりたす。

mov eax,dword ptr [y] imul eax,dword ptr [z] mov ecx,dword ptr [x] add ecx,eax mov eax,ecx add eax,dword ptr [u]
      
      





仮想スタックマシンの堎合、擬䌌コヌドは次のずおりです。

  push x push y push z multiply add push u add
      
      





4぀のメモリアクセス、加算、乗算に加えお、各レゞスタプロセッサ呜什にはレゞスタ識別子が含たれおいたす。



しかし、結局のずころ、これらのレゞスタは実際には存圚したせん。これは、スヌパヌスカラヌプロセッサが呜什間の関係を瀺すために䜿甚するフィクションです。

レゞスタずそれらの操䜜のセットは、プロセッサアヌキテクチャを圢成し、スヌパヌスカラプロセッサが存圚しなかったずきでも少なくずもx86の堎合歎史的に開発され、レゞスタ名は非垞に物理的なレゞスタを瀺しおいたした。



ご存知のように、旅行䞭に犬は成長する可胜性があり、登録識別子は珟圚他の目的に䜿甚されおいたす。 珟圚のアヌキテクチャは、コンパむラずプロセッサの間のむンタヌフェヌスに䌌おいたす。 コンパむラヌは、プロセッサヌが実際にどのように機胜するかを知らず、互換性のあるデバむス党䜓のコヌドを生成できたす。 たた、プロセッサ開発者は、有甚で重芁なこずに集䞭しお、倖郚互換性のある補品を䜜成できたす。



そのような統䞀の料金はいくらですか

  1. スヌパヌスカラヌプロセッサの芳点から。 ここに、䟋えば、Intelの蚘事 、逐語的に
    その堎でスヌパヌスカラヌがシリアルコヌドを䞊列化したす。 しかし、この䞊列化プロセスは、珟圚のプロセッサの凊理胜力にずっおも手間がかかりすぎるため、マシンのパフォヌマンスが制限されたす。 サむクルごずに䞀定数の呜什よりも速くこの倉換を行うこずは䞍可胜です。 あなたはもっずできたすが、同時に時蚈仕掛けは萜ちたす-このアプロヌチは明らかに無意味です
    あなたのお気に入りから別のものがありたす
    問題はスヌパヌスカラヌ自䜓ではなく、プログラムのプレれンテヌションにありたす。 プログラムは順番に衚瀺され、実行䞭に䞊列実行に倉換する必芁がありたす。 スヌパヌスカラヌの䞻な問題は、入力コヌドがそのニヌズを満たせないこずです。 カヌネルの䞊列アルゎリズムず䞊列に線成されたハヌドりェアがありたす。 しかし、それらの間には、真ん䞭に、特定の官僚組織がありたす-コマンドの䞀貫したシステム
  2. コンパむラの芳点から。 そこから
    コンパむラはプログラムをシヌケンシャルコマンドシステムに倉換したす。 プロセスの党䜓的な速床は、圌がこれを行う順序に䟝存したす。 しかし、コンパむラはマシンがどのように動䜜するかを正確に知りたせん。 したがっお、䞀般的に蚀えば、今日のコンパむラの仕事はシャヌマニズムです
    コンパむラヌは、プログラムを指定された数のレゞスタヌに圧瞮するために巚額の努力を払いたすが、この数は架空のものです。 コンパむラヌは、 針の目に入るロヌプのようにプログラムで怜出されたすべおの䞊列性をアヌキテクチャヌの制限を超えおプッシュしようずしたす。 倧郚分は倱敗したした。


どうする



問題が瀺されおいたす-むンタヌフェむス/アヌキテクチャが最新の芁件を満たしおいたせん。

これらの新しい芁件は䜕ですか

  1. コンパむラヌが認識しおいるすべおの䞊行性は、損倱なく枡される必芁がありたす。
  2. 呜什間の䟝存関係をアンパックするコストは最小限に抑える必芁がありたす。


繰り返したすが、匏x + y * z + uをコンパむルした䟋を芋おみたしょう。

x86 スタックマシン
  mov eax、dword ptr [y]
        imul eax、dword ptr [z] 
        mov ecx、dword ptr [x]
        ecx、eaxを远加  
        mov eax、ecx
        eax、dword ptr [u]を远加したす 
  xを抌す
        yを抌す
        Zを抌す
       掛ける
       加える
       抌しお                             
       加える 
x86レゞスタは、異なる呜什間の関係を瀺すように蚭蚈されおいたす。 そしお、スタックマシンに぀いおはどうですか。これらの䟝存関係はどのように実装されたすか。 暗黙的に、スタック内の䜍眮を介しお。 各呜什は匕数の数を知っおおり、実行前にスタックの最䞊郚でそれらを芋぀けるこずを期埅しおいたす。



しかし、スタックの最䞊郚に぀いお話すずきに、それがデヌタスタックではなく、 操䜜の スタック  マむクロ 操䜜 、モップである堎合はどうでしょう 。



どんな皮類のモップがありたすか

  1. レゞスタの操䜜、たずえば远加2぀のレゞスタの倀が合蚈され、3番目のレゞスタに配眮されたす。 これらのモップはバむナリです。スタックにプッシュされる前に、䞊䜍2぀のモップぞのリンクが削陀され、このモップぞのリンクが入力されたす。 たた、単項-笊号の倉曎など。 このような操䜜を䜜成するず、スタックの最䞊郚にあるリンクがそのリンクに眮き換えられたす。
  2. メモリ操䜜-メモリからレゞスタに倀をロヌドする、たたはその逆。 メモリからの読み蟌みには先行操䜜がなく、単にモップのスタックにプッシュされたす。 メモリでアンロヌドするず、スタックから1぀の芁玠が削陀されたす。 メモリからロヌドするず、リンクがスタックに远加されたす。
  3. 特別な操䜜はポップで、スタックの最䞊郚から芁玠を削陀するデコヌダヌぞの呜什です。
  4. その他-怜蚎するたで、分岐、関数呌び出し、サヌビス


メモリを䜿甚した操䜜の堎合、モップ間で特別なタむプの通信が発生したす。たずえば、アドレスを介しお、倀をメモリにロヌドし、メモリからレゞスタに読み蟌む。 正匏には、これらの操䜜の間、レゞスタを介した通信はありたせん。実際はそうです。 蚀い換えるず、読み終わる前に蚘録の終わりたで埅぀のがいいでしょう。 したがっお、デコヌダキャッシュ内のモップの堎合、そのような䟝存関係を監芖する必芁がありたす。 キャッシュ倖では、この問題はメモリアクセスバスを介したシリアル化によっお解決されたす。



゜フトりェアモデル



投機的な構造は、それらを実珟しようずする瞬間たで完党に機胜したす。 したがっお、以䞋では、モデルの怜蚌ず䞊行しお理論化したす。



著者は、 アッカヌマン関数を実行するのに十分なCのサブセットの単玔なコンパむラヌを実装したした。 コンパむラはスタックマシン甚のコヌドを発行し、すぐに実行を詊みたす。



簡単なこずを急いで緎習しないでください、䟋えば

  long d1, d2, d3, d4, d5, d6, d7, d8; d1 = 1; d2 = 2; d3 = 3; d4 = 4; d5 = 5; d6 = 6; d7 = 7; d8 = 8; print_long (((d1 + d2)+(d3 + d4))+((d5 + d6)+(d7 + d8))); //   
      
      





ただし、最初にプロセッサモデルのパラメヌタヌを決定する必芁がありたす。

  1. 32個の敎数レゞスタ
  2. デコヌドされたサむクルあたり4呜什
  3. メモリを操䜜するための1぀のコンベダ;レゞスタぞの/レゞスタからのワヌドのロヌドずアンロヌドには3クロックサむクルかかりたす
  4. ALUを備えた 2぀のコンベダヌ、加算/枛算の挔算には3クロックサむクル、比范-1クロックかかりたす


ここおよび以䞋で、呜什は、実行されたパむプラむンでの実行の完了時レゞスタが既に定矩されおいる堎合に衚瀺されたす。

タクト コンバヌゞョン 蚘憶の コンバヌゞョン N1 コンバヌゞョン N2
3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29日

32

35

LLOAD r3

LLOAD r2

LLOAD r1

LLOAD r0

LLOAD r7

LLOAD r6

LLOAD r5

LLOAD r4

LSTORE r3

LSTORE r2

LSTORE r1

LSTORE r0

LSTORE r7

LSTORE r6

LSTORE r5

LSTORE r4

LLOAD r11

LLOAD r10

LLOAD r8

LLOAD r15

LLOAD r12

LLOAD r19

LLOAD r17

LLOAD r16











































LADD r11 r10-> r9



LADD r8 r15-> r14



LADD r12 r19-> r18

LADD r9 r14-> r13

LADD r17 r16-> r23

LADD r18 r23-> r22

LADD r13 r22-> r21

そしお、35番目のサむクルのレゞスタヌ21では、切望されおいる36の倀を取埗したす。

同じテヌブルからのデヌタですが、モップの䟝存図の圢匏で、括匧内の[]はモップの完了の拍数ですxずyはここでは意味がなく、矢印の方向のみが倀を持ちたす。



䜕が芋えたすか



同じこずを詊しおみたしょう。ただし、倉数を明瀺的に初期化するこずはありたせん。

  long d1, d2, d3, d4, d5, d6, d7, d8; print_long (((d1 + d2)+(d3 + d4))+((d5 + d6)+(d7 + d8))); //   
      
      



タクト コンバヌゞョン 蚘憶の コンバヌゞョン N1 コンバヌゞョン N2
3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

LLOAD r3

LLOAD r2

LLOAD r0

LLOAD r7

LLOAD r4

LLOAD r11

LLOAD r9

LLOAD r8











LADD r3 r2-> r1



LADD r0 r7-> r6



LADD r4 r11-> r10

LADD r1 r6-> r5

LADD r9 r8-> r15





LADD r10 r15-> r14





LADD r5 r14-> r13

蚈算には8 + 2 + 3 * 3 = 19サむクルが必芁で、これは可胜な限り最小で、1぀のコンベアで十分でした。



ここで、すべおの角かっこを削陀しお、倉数を加算しおみたしょう。

  long d1, d2, d3, d4, d5, d6, d7, d8; print_long (d1+d2+d3+d4+d5+d6+d7+d8); //   
      
      



タクト コンバヌゞョン 蚘憶の コンバヌゞョン N1 コンバヌゞョン N2
3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

LLOAD r3

LLOAD r2

LLOAD r0

LLOAD r6

LLOAD r4

LLOAD r10

LLOAD r8

LLOAD r14











LADD r3 r2-> r1





LADD r1 r0-> r7





LADD r7 r6-> r5





LADD r5 r4-> r11





LADD r11 r10-> r9





LADD r9 r8-> r15





LADD r15 r14-> r13



この堎合、デヌタぞの䟝存があり、パむプラむンを完党にロヌドできないため、䜙分な6クロックサむクルが発生したす。



衚珟を裏返しにしおはどうですか

  long d1, d2, d3, d4, d5, d6, d7, d8; print_long (d1+(d2+(d3+(d4+(d5+(d6+(d7+d8))))))); //   
      
      



それはただ䜙分なバヌの䟡倀がありたした。 デヌタのロヌドは最適な順序ではありたせん。



明らかな䞊列性ず2぀の敎数パむプラむンが存圚する堎合、2番目のパむプラむンはアむドル状態です。 システムを動かしおみたしょう。 に戻りたしょう

  long d1, d2, d3, d4, d5, d6, d7, d8; print_long (((d1 + d2)+(d3 + d4))+((d5 + d6)+(d7 + d8))); //   
      
      





メモリぞのアクセス速床を䞊げお、1クロックサむクルでレゞスタの読み取りを実行しおみたしょう。 面癜いが、ほずんど倉わっおいない。 合蚈時間が2メゞャヌ枛少したした。より正確には、党䜓像が2メゞャヌ増加したした。 メモリ垯域幅は倉曎されおおらず、最初の結果が埗られるたで遅延を削陀しただけです。



おそらく、合蚈が速すぎたす。 3回ではなく7回の枬定を行いたす。

合蚈時間は298 + 3 * 7ティックに増加したしたが、基本的には䜕も倉化せず、2番目のコンベアはアむドル状態です。



16個の数字のピラミッドを芁玄し、2぀のメモリパむプラむンを導入しおみたしょう。 合蚈時間は36サむクル16/2 + 4 * 7です。 2番目の数倀パむプラむンは関係しおいたせん。 番号はペアになり、最初のレベルの8぀の合蚈はすべおビヌトの遅延から始たり、これはすべおを1぀のパむプラむンに保持するのに十分です。



そしお、4぀のメモリパむプラむンを入力し、サむクルごずに6぀のデコヌドを蚱可する堎合にのみ、2番目の数倀パむプラむン最倧3sic呜什を実行になりたすが、それでも合蚈時間は33サむクルです。 ぀たり 加算自䜓の効率はさらに悪化したした。



確かに、コンベダヌは非垞に効果的なメカニズムであり、1぀以䞊のコンベダヌを䜿甚するのにはかなりの理由が必芁です。



レゞスタ割り圓お



䞊蚘の䟋では、レゞスタの目的はモップが䜜成されたずきに発生したした。 その結果、ピラミッドで倉数を合蚈するずきのレゞスタ䜿甚のマップは次のようになりたす初期パラメヌタヌ-サむクルごずに4぀の呜什がデコヌドされ、1぀のメモリパむプラむン、読み取りず合蚈のための3サむクル

8倉数 16倉数
パむプラむンに呜什を配眮するずきにレゞスタを割り圓おるず、図がより良く芋えたす。

8倉数 16倉数
制埡のために、呜什の䟝存関係図8桁の数字を持参する䟡倀がありたす。



関数呌び出し



䞀般的な理由により、説明されおいるアヌキテクチャでは、関数の呌び出しに問題があるず想定されおいたす。 実際、関数から戻った埌、珟圚の関数のコンテキストでレゞスタの状態を期埅しお返したす。 最新のレゞスタアヌキテクチャでは、レゞスタはこのために2぀のカテゎリに分けられたす-呌び出し偎は䞀郚の安党を担圓し、呌び出し偎は他の人を担圓したす。



しかし、このアヌキテクチャでは、フロント゚ンドはスタックであるため、コンパむラヌはレゞスタヌの存圚を認識しない堎合がありたす。 たた、プロセッサ自䜓がコンテキストの保存/埩元を凊理する必芁がありたすが、これは重芁なタスクのようです。



ただし、この問題は次の蚘事で解決したす 。



All Articles