(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-12-12
(45)【発行日】2023-12-20
(54)【発明の名称】スレッドの実行順序を維持する同期デジタル回路を生成する言語およびコンパイラ
(51)【国際特許分類】
G06F 8/41 20180101AFI20231213BHJP
G06F 9/30 20180101ALI20231213BHJP
G06F 30/32 20200101ALI20231213BHJP
【FI】
G06F8/41 170
G06F9/30 390
G06F30/32
(21)【出願番号】P 2021540807
(86)(22)【出願日】2020-01-04
(86)【国際出願番号】 US2020012278
(87)【国際公開番号】W WO2020150013
(87)【国際公開日】2020-07-23
【審査請求日】2022-12-20
(32)【優先日】2019-01-14
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】314015767
【氏名又は名称】マイクロソフト テクノロジー ライセンシング,エルエルシー
(74)【代理人】
【識別番号】100118902
【氏名又は名称】山本 修
(74)【代理人】
【識別番号】100106208
【氏名又は名称】宮前 徹
(74)【代理人】
【識別番号】100196508
【氏名又は名称】松尾 淳一
(74)【代理人】
【識別番号】100162846
【氏名又は名称】大牧 綾子
(72)【発明者】
【氏名】ペルトン,ブレイク・ディー
(72)【発明者】
【氏名】コールフィールド,エイドリアン・マイケル
【審査官】山本 俊介
(56)【参考文献】
【文献】米国特許第7315991(US,B1)
【文献】米国特許第8671371(US,B1)
【文献】国際公開第2004/036463(WO,A1)
【文献】特開2006-185423(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/41
G06F 9/30- 9/38
G06F 30/30-30/398
(57)【特許請求の範囲】
【請求項1】
コンピュータ実施方法であって、
マルチスレッドプログラミング言語で表現されたソースコードを受け取るステップであって、前記ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含む、受け取るステップと、
前記ソースコードを、パイプラインを含む回路記述にコンパイルするステップであって、前記パイプラインは、前記複数のソースコードパスに関連付けられた複数のコードパスを含み、
前記コンパイルするステップは、
最大数のパイプラインステージを有する前記複数のコードパスのうち1つのコードパスにおけるパイプラインステージの数を決定するステップと、
前記複数のコードパスの各々がパイプラインステージの前記数を有するまで、パイプラインステージを前記複数のコードパスの少なくとも1つに追加するステップとを含み、
前記回路記述に基づいて、回路実装を備える同期デジタル回路を生成するステップとを備える、コンピュータ実施方法。
【請求項2】
複数のスレッドは、第1の順序で前記パイプラインに入り、前記複数のスレッドは、前記第1の順序で前記パイプラインを出る、請求項1に記載のコンピュータ実施方法。
【請求項3】
前記複数のコードパスのうちの1つまたは複数にパイプラインステージを追加するステップは、最長のコードパスにおけるパイプラインステージの数を決定するステップと、そのコードパスにおける前記パイプラインステージの数を、前記最長のコードパスにおける前記パイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加するステップとを含む、請求項1に記載のコンピュータ実施方法。
【請求項4】
前記パイプラインは、第1のパイプラインを備え、前記回路記述は、第2のパイプラインを含み、前記第1のパイプラインを実行するスレッドは、ローカル変数を先入れ先出しキューにプッシュすることによって、実行を前記第2のパイプラインに渡し、前記第2のパイプラインは、プッシュされた順序で先入れ先出しキューからローカル変数を読み取ることにより、パイプライン全体でスレッドの実行順序を維持する、請求項1に記載のコンピュータ実施方法。
【請求項5】
前記ソースコードは、スレッドの実行順序を維持しないプログラミング構築をラップする並べ替えブロック構築を含み、前記並べ替えブロック構築は、
到来するスレッドの実行順序を記録し、
スレッドが、スレッドの実行順序を維持しない構築を実行できるようにし、
すべての下位スレッドが再開するまでスレッドの再開をブロックする回路実装にマッピングする、請求項1に記載のコンピュータ実施方法。
【請求項6】
追加された前記パイプラインステージの少なくとも1つは、計算ユニットを備え、前記計算ユニットによって生成される結果をレジスタに格納するよう構成されている、請求項1に記載のコンピュータ実施方法。
【請求項7】
前記パイプラインは、順に実行されるステージを備え、前記ステージを前記順に通過することによって、複数のスレッドが、実行順序を維持する、請求項1に記載のコンピュータ実施方法。
【請求項8】
コンピューティングデバイスであって、
1つまたは複数のプロセッサと、
前記1つまたは複数のプロセッサによって実行された場合、前記コンピューティングデバイスに対して、
マルチスレッドプログラミング言語で表現されたソースコードを受け取らせ、
前記ソースコードを、第1のパイプライン、第2のパイプライン、および前記第1のパイプラインから前記第2のパイプラインに渡されるローカルスレッド変数のセットを格納する先入れ先出し(FIFO)キューを含む回路記述にコンパイルさせ、前記第1のパイプラインは、ローカルスレッド変数のセットを、スレッドの実行順序で前記FIFOキューに格納し、前記第2のパイプラインは、前記スレッドの実行順序で前記FIFOキューからローカルスレッド変数のセットを取得することによって前記スレッドの実行順序を維持し、
前記ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含み、前記第1のパイプラインは、前記複数のソースコードパスに関連付けられた複数のコードパスを含み、前記複数のコードパスが同じ数のパイプラインステージを有するように、1つまたは複数のパイプラインステージが、前記複数のコードパスのうちの1つまたは複数に追加され、前記追加されたパイプランステージの少なくとも1つは、計算ユニットを含み、前記計算ユニットによって生成される結果をレジスタに格納するように構成され、
前記回路記述に基づいて、回路実装を備える同期デジタル回路を生成させる、コンピュータ実行可能命令を格納した少なくとも1つのコンピュータ記憶媒体と
を備える、コンピューティングデバイス。
【請求項9】
前記複数のコードパスのうちの1つまたは複数にパイプラインステージを追加することは、最長のコードパスにおけるパイプラインステージの数を決定することと、そのコードパスにおける前記パイプラインステージの数を、前記最長のコードパスにおけるパイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加することとを含む、請求項
8に記載のコンピューティングデバイス。
【請求項10】
前記ソースコードは、スレッドの実行順序を維持しないプログラミング構築をラップする並べ替えブロック構築を含み、前記並べ替えブロック構築が、
到来するスレッドの実行順序を記録し、
スレッドが、スレッドの実行順序を維持しない構築を実行できるようにし、
すべての下位スレッドが再開するまでスレッドの再開をブロックする回路実装にマッピングする、請求項
8に記載のコンピューティングデバイス。
【請求項11】
スレッドは、入った順序で前記並べ替えブロックを出る、請求項
10に記載のコンピューティングデバイス。
【請求項12】
スレッドは、実行のために前記第1のパイプラインに提供されるローカルスレッド変数の集合を備える、請求項
8に記載のコンピューティングデバイス。
【請求項13】
前記第1のパイプラインは、順に実行されるステージを備え、前記ステージを順に通過することによって、複数のスレッドが、実行順序を維持する、請求項
8に記載のコンピューティングデバイス。
【請求項14】
1つまたは複数のプロセッサによって実行された場合、コンピューティングデバイスに対して、
マルチスレッドプログラミング言語で表現されたソースコードを受け取らせ、前記ソースコードは、回路実装にマッピングする構築を備え、前記構築は、並べ替えブロックと、スレッドの実行順序を維持しない構築とを備え、前記回路実装は、
複数のスレッドを受信した順序でスレッド識別子を登録する並べ替えバッファと、
前記複数のスレッドの各々について、未知の数のクロックサイクルのために実行する回路とを備え、前記並べ替えバッファは、実行順序の低いすべてのスレッドが再開されるまで、スレッドの再開をブロックし、
前記構築を、回路記述へコンパイルさせ、
前記回路記述に基づいて、前記回路実装を備える同期デジタル回路を生成させる、コンピュータ実行可能命令を格納した少なくとも1つのコンピュータ記憶媒体。
【請求項15】
前記ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含み、前記回路記述は、複数のコードパスを含むパイプラインを含み、前記複数のコードパスが同じ数のパイプラインステージを有するように、1つまたは複数のパイプラインステージが、前記複数のコードパスのうちの1つまたは複数に追加される、請求項14に記載の少なくとも1つのコンピュータ記憶媒体
。
【請求項16】
前記複数のコードパスのうちの1つまたは複数にパイプラインステージを追加することは、最長のコードパスにおけるパイプラインステージの数を決定することと、そのコードパスにおけるパイプラインステージの数を、前記最長のコードパスにおける前記パイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加することとを含む、請求項15に記載の少なくとも1つのコンピュータ記憶媒体。
【請求項17】
スレッドは、実行のために前記パイプラインの第1のパイプラインに提供されるローカルスレッド変数の集合を備える、請求項15に記載の少なくとも1つのコンピュータ記憶媒体。
【請求項18】
前記パイプラインの第1のパイプラインは、順に実行されるステージを備え、前記ステージを前記順に通過することによって、複数のスレッドが、実行順序を維持する、請求項15に記載の少なくとも1つのコンピュータ記憶媒体。
【請求項19】
前記パイプラインは第1のパイプラインを含み、前記回路記述は第2のパイプラインを含み、前記第1のパイプラインを実行するスレッドは、ローカル変数を先入れ先出しキューにプッシュすることによって、実行を前記第2のパイプラインに渡し、前記第2のパイプラインは、プッシュされた順序で先入れ先出しキューからローカル変数を読み取ることにより、パイプライン全体でスレッドの実行順序を維持する、請求項15に記載の少なくとも1つのコンピュータ記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
[0001]ハードウェア記述言語(「HDL」:hardware description language)は、電子回路、最も一般的にはデジタル論理回路の構成および動作を記述するためにハードウェアエンジニアによって使用されるモデリング言語である。HDLの例は、超高速集積回路(「VHSIC」)HDLおよびVERILOG(登録商標)を含む。
【背景技術】
【0002】
[0002]HDLは、一般に、デジタル論理回路をモデル化するために多くのコード行を必要とする。HDLに精通しているハードウェアエンジニアでさえ、そのようなコードの生成には非常に時間がかかることがある。さらに、設計に存在するコード行が多いほど、設計にエラーが含まれたり、性能が低下したりする可能性が高くなる。
【0003】
[0003]HDLは通常、命令型プログラミング言語とは異なるプログラミングパラダイム(programming paradigm)を利用するので、HDLに精通していないソフトウェアエンジニアは、一般に、これらの言語を利用するのに非常に苦労する。その結果、ソフトウェアエンジニアによって生成されたHDLから生成された電子回路にも、エラーが含まれ、性能が低下する可能性がある。
【0004】
[0004]これらおよび他の技術的課題に関して、本明細書でなされた開示が提示される。
【発明の概要】
【課題を解決するための手段】
【0005】
[0005]スレッドの実行順序(thread execution order)を維持する同期デジタル回路を生成する言語およびコンパイラについての技術が開示される。開示された技術の実施を通じて、ハードウェアエンジニアは、性能を犠牲にすることなく、同時に、一部のタイプの回路設計の実施に必要なコード行数を減らし、一般的な設計エラーのクラス全体を排除することで、生産性を大幅に向上させることができる。HDLを使用して回路を設計した経験がほとんどまたはまったくないソフトウェアエンジニアの場合、開示された技術は、高性能の回路設計を生成するために使用できる使い慣れたプログラミングセマンティクスを提供する。
【0006】
[0006]開示された技術の実施はまた、スレッドの実行順序を維持することができるハードウェア回路を生成することができる。スレッドの実行順序を維持することで、オーバヘッドの少ないスレッド同期などの最適化が可能になる。スレッドの実行順序を維持することで、プログラマは順序固有の操作を実行することもできる。たとえば、偶数の実行順序のスレッド(たとえば、スレッド「2」、「4」、「6」...)は、プログラム全体で、奇数の実行順序のスレッドとは異なる方式で処理され得る。また、スレッドが、実行される最初のスレッドまたは最後のスレッドである場合、特別な操作が実行され得る。本明細書で具体的に言及されていない他の技術的利点もまた、開示された主題の実施を通じて実現することができる。
【0007】
[0007]上記で簡単に述べた技術的利点を実現するために、開示された言語およびコンパイラは、同じ数のステージを有するコードパスを有するパイプラインを生成する。たとえば、第1のパイプラインのすべてのコードパスには、6つのステージがあり、第2のパイプラインのすべてのコードパスには、15のステージがある場合がある。この特性を維持するために、コンパイラは、パイプライン内の関連するコードパスのバランスをとる。たとえば、特定の「ifステートメント」では、「then」ブロックまたは「else」ブロックのいずれかを、他のブロックと同じ数のステージを有するようにパディングする(pad)ことができる。ステージは、有用な作業を実行しないダミーステージを追加することで追加できるか、または、パイプラインの深さを増やすことでステージを追加できる。つまり、ブロックの実施に使用するステージの数を増やすことができる。「then」ブロックと「else」ブロックとのステージ数のバランスをとることにより、すべてのスレッドが、同じクロックサイクル数で「if」ステートメントを実行するため、スレッドは入力した順序で「if」ステートメントを出る。
【0008】
[0008]いくつかのプログラミング構築は、スレッド実行が、設計によって並べ替えられることを可能にする。たとえば、スレッドが異なればループの実行回数も異なる可能性があるため、ループのスレッドの実行順序は保証されない。そのため、1つのスレッドが10回の反復でループを完了し、別のスレッドが500回の反復で同じループを完了する場合がある。しかしながら、開示される言語は、スレッドが、入力した順序で並べ替えブロック(reorder block)を出ることを保証する並べ替えブロックを含む。プログラマは、スレッドの実行順序を維持するために、ループや、他の順序を保持しない構築を、並べ替えブロックでラップすることができる。それに加えて、またはその代わりに、開示された言語は、並べ替えブロック機能を「組み込む」ループ構築を含み得る。たとえば、「reorder for」ループは、スレッドの実行順序を保持する「for」ループとして機能する。いくつかの構成では、並べ替えブロックは、SDCの並べ替えバッファを使用して実施される。
【0009】
[0009]いくつかの構成では、実行のパイプラインは、別のパイプラインによって使用されるためにローカル変数を格納する先入れ先出しキュー(「キュー」または「FIFO」を有すると呼ばれる)によって接続される。FIFOは、関数呼び出し、制御フロー、および開示された言語の他の態様を実施するために使用され得る。スレッド順序は、FIFOからローカル変数を、キューに入れられた順序で取得することにより、パイプライン全体で維持される。
【0010】
[0010]上記で簡単に論じたように、本明細書に開示された技術の実施は、低オーバヘッドのスレッド同期を提供する。さらに、プログラマは、偶数スレッドと奇数スレッドを異なる方式で処理したり、最初または最後のスレッドに対して特別な操作を実行したりするなど、順序固有の操作を実行できる。本明細書で具体的に特定されていない他の技術的利点もまた、開示された技術の実施を通じて実現することができる。
【0011】
[0011]上記の主題は、コンピュータ制御装置、コンピュータ実施方法、コンピューティングデバイスとして、またはコンピュータ可読媒体などの製造物品(article of manufacture)として実施できることを理解されるべきである。これらおよび他の様々な特徴は、以下の詳細な説明を読み、関連付けられた図面を検討することで明らかになる。
【0012】
[0012]この概要は、以下の詳細な説明でさらに説明される簡略化された形式で、開示された技術のいくつかの態様の簡単な説明を紹介するために提供される。この概要は、特許請求された主題の主要な特徴または本質的な特徴を特定することを意図しておらず、また、この概要が、特許請求された主題の範囲を限定するために使用されることも意図していない。さらに、特許請求された主題は、本開示のいずれかの部分において言及された不利な点のいずれかまたはすべてを解決する実施に限定されない。
【図面の簡単な説明】
【0013】
【
図1】[0013]同期デジタル回路にマッピングするプログラミング構築を含むプログラムソースコードに基づいて同期デジタル回路を生成するための、本明細書に開示されるシステムの態様を示すコンピューティングアーキテクチャ図である。
【
図2】[0014]各々が複数のパイプラインステージを有するいくつかのハードウェアパイプラインと、開示された技術を使用して定義および実施できる計算ユニットとを含む、実例となる例示的な同期デジタル回路の態様を示すハードウェアアーキテクチャ図である。
【
図3】[0015]開示された言語で記述された機能をハードウェア回路にマッピングすることを示すハードウェアアーキテクチャ図である。
【
図4】[0016]ダミーステージを備えたパイプラインのパディングコードパス(padding code path)を示すハードウェアアーキテクチャ図である。
【
図5】[0017]for-loopループに適用される並べ替えブロック構築を示すハードウェアアーキテクチャ図である。
【
図6】[0018]
図1~
図5を参照して説明されるスレッドの実行順序を維持する言語およびコンパイラの動作の態様を例示するルーチンを示すフロー図である。
【
図7】[0019]本明細書に提示される技術の態様を実施することができるコンピューティングデバイスのための例示的なコンピュータハードウェアおよびソフトウェアアーキテクチャを示すコンピュータアーキテクチャ図である。
【
図8】[0020]開示された技術の態様を実施することができる分散型コンピューティング環境を示すネットワーク図である。
【発明を実施するための形態】
【0014】
[0021]以下の詳細な説明は、スレッドの実行順序を維持する言語およびコンパイラに関する。上記で簡単に論じたように、スレッドの実行順序を維持すると、オーバヘッドの少ないスレッド同期などの最適化を可能にする。スレッドの実行順序を維持することで、プログラマは順序固有の操作を実施することもできる。たとえば、偶数の実行順序のスレッドは、プログラム全体で、奇数の実行順序のスレッドとは異なる方式で処理され得る。また、スレッドが、実行される最初のスレッドまたは最後のスレッドである場合、特別な操作が実行される場合がある。本明細書で具体的に言及されていない他の技術的利点もまた、開示された主題の実施を通じて実現することができる。
【0015】
[0022]本明細書で説明される主題は、スレッドの実行順序を維持する言語およびコンパイラの一般的な文脈で提示されるが、当業者は、他の実施が他のタイプのコンピューティングシステムおよびモジュールと組み合わせて実行できることを認識するであろう。当業者はまた、本明細書で説明される主題が、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な家庭用電化製品、デバイスに組み込まれたコンピューティングまたはプロセシングシステム(たとえば、ウェアラブルコンピューティングデバイス、自動車、ホームオートメーションなど)、ミニコンピュータ、メインフレームコンピュータなどを含む、他のコンピュータシステム構成で実現されることを認識するであろう。
【0016】
[0023]以下の詳細な説明では、本明細書の一部を形成し、例示として固有の構成または例として示されている添付の図面を参照する。ここで、いくつかの図全体を通して同様の数字が同様の要素を表す図面を参照して、スレッドの実行順序を維持する言語およびコンパイラの態様が説明される。
【0017】
[0024]
図1は、同期デジタル回路(「SDC」)112にマッピングするプログラミング構築を含むプログラムソースコード102に基づいてSDC112を定義および生成するために本明細書に開示される、例示的なシステム100の態様を示すコンピューティングアーキテクチャ図である。SDC112は、ゲートアレイ、フィールドプログラマブルゲートアレイ(「FPGA」)、特定用途向け集積回路(「ASIC」)、および他のタイプの回路デバイスによって実施される。開示された主題は、主にFPGAにおいて実施されたSDC112の文脈で説明されているが、本明細書に開示された技術を利用して、他のタイプのデバイスを使用して実施されるSDC112を定義できることを理解されたい。
【0018】
[0025]
図1に例示されるように、例示的なシステム100は、プログラムソースコード102をコンパイルして、ハードウェア記述言語(「HDL」)コード106、またはネットリストなどの回路の低レベル表現を生成するコンパイラ104を含む。上記で簡単に論じたように、HDLは、ハードウェアエンジニアが、電子回路、最も一般的にはデジタル論理回路の構造および動作を記述するために使用されるモデリング言語である。HDLの例は、VHSIC HDLおよびVERILOGを含む。
【0019】
[0026]以下で詳細に説明するように、プログラムソースコード102は、SDC112を対象とするように設計されたマルチスレッドの命令型プログラミング言語を使用して表現される。開示された言語は、関数呼び出し、forループ、算術演算子、条件文など、「C」や「JAVA(登録商標)」などの言語の特徴の多くを提供する。しかしながら、開示される言語は、基盤となるSDC112ハードウェア実施に直接マッピングする構築を含む。これにより、ハードウェアエンジニアとソフトウェアエンジニアの両方が、性能について論理的に考え、設計を効果的に最適化することができる。上記のように、これにより、言語をソフトウェアエンジニアに馴染みやすくし、ハードウェアエンジニアが、HDLでコーディングするときに発生するバグのクラス全体に対処する必要がなくなる。
【0020】
[0027]開示されたマルチスレッド命令型プログラミング言語は、プログラムステートメントが次々に実行されるという点で必須であり、実行の複数のスレッドが並行して実行され得るという点でマルチスレッドである。上記で論じたように、スレッドはローカル変数の集合である。ローカル変数がハードウェア回路によって処理されるときに、スレッドが実行される。
【0021】
[0028]本明細書で説明されるスレッドは、ソフトウェアスレッドに類似しているが、異なる。ソフトウェアスレッドは、ローカル変数を含む呼び出しスタックを維持し、メモリ内でコードを実行するが、本明細書で説明されるスレッドは、ハードウェア回路を移動するローカル変数の集合である。ソフトウェアスレッドは、命令ポインタによって決定される実行可能コード内の場所を有するが、開示されたスレッドは、所与の時点においてSDC上の物理的な場所を有する。SDCは、数百、数千、さらには数百万のスレッドを実行する場合があり、SDCの実行は、パイプライン化される場合がある。つまり、異なるスレッドが、回路の異なるステージ内で同時に実行する場合がある。
【0022】
[0029]以下でより詳細に説明されるように、言語構築は、回路実装にマッピングするプログラムソースコード102で定義することができる。言語構築は、1つまたは複数の字句トークンから形成される可能性のあるプログラムの構文的に許容される部分である。本明細書で説明される言語構築は、スレッド順序を保証する回路実装にマッピングする(つまり、スレッドは、入力したのと同じ順序で回路実装を出る)。
【0023】
[0030]以下により詳細に説明されるように、本明細書に開示される構築によって生成される回路実装は、FPGA、ゲートアレイ、ASIC、または別のタイプの適切なデバイスにおけるSDCとして実施される。NICなどの別のハードウェア構成要素は、必要な機能を実施するために、FPGA、ゲートアレイ、またはASICで構成できる。
【0024】
[0031]
図1に示されるように、コンパイラ104は、この例ではHDLコード106である回路記述に、本明細書に開示される言語構築のうちの1つまたは複数を含むプログラムソースコード102をコンパイルすることができる。HDLコード106は、HDL合成ツール108に提供することができ、これは、次に、たとえばFPGAにおいて、SDC112をプログラムするために利用できるビットストリーム110を生成することができる。ASICを対象とする場合、HDLコード106は、工場で生産するためにASIC製造業者に提供することができる。
【0025】
[0032]
図2は、開示された技術を使用して定義および実施することができるいくつかのハードウェアパイプライン200A~200C(または「パイプライン」)を含む実例となる例示的なSDC112の態様を示すハードウェアアーキテクチャ図である。各ハードウェアパイプラインは、複数のパイプラインステージ206を有し、各ステージは、計算ユニット208を有する。
図2に示されるように、プログラムソースコード102は、ハードウェア計算ユニット208のパイプライン200A~200Cにコンパイルすることができる。
【0026】
[0033]パイプライン200A~200Cは、先入れ先出し(「FIFO」)キュー(本明細書では「FIFO」または「キュー」と呼ばれることがある)によって接続することができる。パイプライン200A~200Cは、プログラムソースコード102によって定義される機能を実施する。FIFO202は、データ値を格納し、パイプライン200に入力を提供するとともに、パイプライン200によって生成された出力を格納する。たとえば、SDC112は、その出力をFIFO202Aに供給するパイプライン200Aを含む。次に、パイプライン200Bは、FIFO202Aからその入力を得、その出力をFIFO202Bに提供する。パイプライン200Cは、FIFO202Bからその入力を得る。
【0027】
[0034]いくつかの構成では、パイプライン200は、FIFO202から次の値をいつ取得するかを決定するポリシー回路構成210を実装する。たとえば、ポリシー回路210は、入力FIFO(たとえば、パイプライン200Bの場合、FIFO202A)が空ではなく、出力FIFO(たとえば、FIFO202B)がフルではないことを要求してから、処理のために入力FIFO(たとえば、FIFO202A)から値を取得してもよい。
【0028】
[0035]
図2に示されるように、パイプライン200は、1つまたは複数のパイプラインステージ206A~206Bから構成され得る。実行は、パイプライン200の異なるステージ206で、異なるスレッドを同時に実行することによってパイプライン化される。ステージの結果は、レジスタ204に格納され、次のクロックサイクルの期間中、次のステージ206に提供され得る。
【0029】
[0036]各パイプラインステージ206は、加算器208Aおよびルックアップテーブル(「LUT」)208Bなどの1つまたは複数の計算ユニット208を含むことができる。例示される例では、加算器208Aは、基本的な算術、たとえば、加算、減算、または乗算を実行することができる。計算ユニットは、ブール演算子(「OR」、「NOR」、「XOR」など)または、SDC製造者によって提供される他のカスタムロジックを実施することもできる。
【0030】
[0037]計算ユニットはまた、ユーザプログラム可能なルックアップテーブル208Bによって実施することができる。例示されるLUT208Bは、2つの入力ビットを単一の出力ビットにマッピングする2入力真理値表を示す。LUT208Bは、異なる数の入力ビットをサポートするように構成することができる。より複雑な出力値を生成するには、たとえば文字または8ビット整数、それぞれが入力変数の異なるビットに接続された複数のLUT208Bを使用することができる。
【0031】
[0038]計算ユニットは、結果をレジスタ204(または「フリップフロップ」)に一時的に格納することができる。そのようなレジスタの内容は、同じまたは異なるパイプライン200内の他の計算ユニットに提供することができる。レジスタ204は、接続されたデジタルクロックが0から1に遷移するときに入力における値をキャプチャし、次のクロックサイクルの終了まで(すなわち、クロックが再び0から1に遷移するまで)出力におけるその値を提供することができる。レジスタには、イネーブルライン(enable line)を含めることもできる。イネーブルラインが偽に設定されている場合、レジスタは、上記の操作を実行せず、複数のクロックサイクルにわたって現在の出力値を維持する。
【0032】
[0039]
図2に示されるパイプラインアーキテクチャは、議論のために簡略化されていると理解されたい。本明細書で説明されるプログラミング言語構築は、
図2に例示されているよりもより多くの構成要素を含む、はるかに複雑なSDC112を実装するために利用できる。
【0033】
[0040]
図3は、1つの実施形態に従って、開示された言語で記述された機能をハードウェア回路にマッピングすることを示すハードウェアアーキテクチャ
図300である。プログラムソースコード302は、開示された言語で記述された関数「f()」304を含む。プログラムステートメントが次々に実行されるという点で、開示された言語は命令型であり、実行の複数のスレッドが並行しておよび/または同時に実行され得るという点でマルチスレッド化されている。関数「f()」304は、「x」306と「y」308の2つのパラメータをとり、整数を返す。関数「f()」304は、2つの式を有し、式310は、加算を実行し、結果をローカル変数「z」に格納し、式312は、乗算の結果を返す。
【0034】
[0041]関数「f()」は、計算ユニット316、318およびレジスタ320、322を含むハードウェア回路314にマッピングされる304である。ハードウェア回路314は、2つのステージ、すなわち、式310において説明される加算を実行する第1のステージ324と、式312において説明される乗算を実行する第2のステージ326とを有する各ステージは、単一のクロックサイクルで実行され、各ステージの結果は、1つまたは複数のレジスタに格納される。
【0035】
[0042]例を続けると、ステージ324は、パラメータ「x」306に対して「+1」演算を実行し、結果(「z」)をレジスタ322に格納する。ステージ324の間に、パラメータ「y」308は、レジスタ320に直接提供される。ステージ326の間に、計算ユニット318は、「y」および「z」の値を乗算する。結果はレジスタ328に格納される。
【0036】
[0043]ハードウェア回路314は、スレッド330によって実行され得、その一部のみが図示される。SDCは、数百、数千、または数百万のスレッドを実行する場合がある。スレッドは、ローカル変数の集合を参照する。ローカル変数がハードウェア回路によって処理されるときに、スレッドが実行される。たとえば、スレッド330Aは、値332(x=1およびy=2)を有し、値332がハードウェア回路314によって処理されるときに、スレッド330Aは、関数「f()」304を実行する。関数によって返される値は、ローカル変数のセットに追加され、特定の変数がハードウェア回路によって使用されなくなることがわかっている場合はいつでも、その変数をローカル変数のセットから削除できる。
【0037】
[0044]開示されたスレッドは、ソフトウェアスレッドに類似しているが、異なる。ソフトウェアスレッドは、ローカル変数を含む呼び出しスタックを維持し、メモリ内でコードを実行するが、開示されたスレッドは、ハードウェア回路を移動するローカル変数の集合である。ソフトウェアスレッドは、命令ポインタによって決定される実行可能コード内の場所を有するが、開示されたスレッドは、所与の時点においてSDC上の物理的な場所を有する。
【0038】
[0045]SDC実行は、パイプライン化され得る。すなわち、異なるスレッドが、回路の異なるステージ内で同時に実行してもよい。テーブル334は、ハードウェア回路314のパイプライン実行が発生するときの、異なるステージにおける異なるスレッドからの変数を示す。列336は、ステージ間(つまり、ステージの前後)に格納された値を表示し、336Aは、スレッド330A、330B、および330Cによって提供されるxおよびyの値を含み、列336Bは、ステージ324が実行された後の値を含み、列336Cは、ステージ326が実行された後の値を含む。行338A~Cは、連続するクロックサイクル後に格納された値を表示する。
【0039】
[0046]たとえば、行338Aは、スレッド330Aが、値332A(x=1およびy=2)をハードウェア回路314に入力しようとしていることを示す。行338Aと行338Bとの間でクロックサイクルが発生し、ステージ324においてスレッド330Aを実行した結果(332Aからのホールドオーバであるy=2、および「+1」演算の結果であるz=2)が332Bに示される。同時に、スレッド330Bからの値340A(x=3およびy=5)が、ハードウェア回路314に入力されようとしている。行338Bと行338Cの間で別のクロックサイクルが発生し、ステージ326を実行したスレッド330Aの結果が、332Cに示される(「4」)。同時に、ステージ324を実行するスレッド330Bの結果(y=5およびz=4)は、340Bに示され、スレッド330Cからの値342(x=7およびy=1)が、ハードウェア回路314に入力されようとしている。パイプライン実行は、SDCの使用率を高めることにより、より高いスループットを可能にする。つまり、一度に1つのスレッドだけがハードウェア回路305を実行できる場合よりも、所与の時点において多くのSDCが有用な作業を実行する。
【0040】
[0047]
図4は、パイプラインのすべてのパスが同じ数のステージを有するように、ダミーステージを備えたパイプラインのパディングコードパスを示すハードウェアアーキテクチャ
図400である。ステージ数が同じであると、スレッドの実行順序がパイプラインを通じて維持される。いくつかの構成では、コードリスト402は、次の2つのパラメータ、すなわちint「x」406およびint「y」408を受け入れる関数「f()」404を含む。行410は、「L」を「x」に追加し、値を「z」に割り当てる。これは、回路記述418において、「G」を「x」に追加し、結果をレジスタ422に格納する計算ユニット420として示される。
【0041】
[0048]行411は、「z>2」の条件を有する「if」ステートメントを導入している。いくつかの構成では、「if」ステートメントのような分岐ステートメントは、両方の分岐を並行して実行し、条件に基づいて続行する結果を選択することによって実施される。回路記述418における対応する構成要素は、マルチプレクサ424であり、これにより、「z」が「2」より大きい場合、スレッドは、コードパス427によって生成される値で進行し、そうではない場合、スレッドは、コードパス435(N)によって生成される値で進行する。
【0042】
[0049]コードブロック412(「then」ブロック)は、2つのステートメントを含み、「y=y+3」は、「y」408の値に「3」を追加する計算ユニット428に対応する。結果はレジスタ430に格納される。レジスタ430は、コンパイラが「y」の正しい値を含んでいると理解し、パラメータとして渡された値を置き換える。次のステートメント「y=y*2」は、計算ユニット432によって実施され、計算ユニット432は、レジスタ430に格納された「y」の値に「2」を乗じ、その結果をマルチプレクサ424に提供する。「z」の値が「2」より大きい場合、計算ユニット432によって提供された値がレジスタ434に提供される。
【0043】
[0050]コードブロック414(「else」ブロック)は、単一のステートメント「y=y-1」を含む。このステートメントは、計算ユニット436によって実施され、計算ユニット436は、「y」408から「1」を減算し、その結果をレジスタ438に格納する。しかしながら、次のクロックサイクルで、ダミー計算ユニット440は、レジスタ438に格納された値をマルチプレクサ424に転送し、マルチプレクサ424は、「z」の値が「2」以下である場合、レジスタ438に格納された値をレジスタ434に提供する。このダミー計算ユニット440は、コードパス427におけるステージ数のバランスをとるために追加される。いくつかの構成では、レジスタ438は、ダミー計算ユニット440の「y」の値を維持するために追加される。
【0044】
[0051]いくつかの構成では、所与のコードパスに追加されるダミー計算ユニットの数は、最長のコードパスにおけるステージ数から、所与のコードパスのステージ数を引いた数に等しい。この場合、ステージの最大数は、2つの計算ユニット428、432であり、コードパス435には1つのステージ436がある。そのため、1つの計算ユニット435のみが追加され、1つの新しいパイプラインステージが生成される。
【0045】
[0052]いくつかの実施形態では、(分岐のバランスをとることを除いて)有用な作業を実行しない計算ユニットを挿入する代わりに、値は、各クロックサイクルの最後にレジスタに単に格納される。いくつかの実施形態では、ダミーステージを追加する代わりに、コンパイラは、より深いパイプラインを生成する。すなわち、通常生成されるよりも多くのステージを有するコードパスが生成される。これは、計算がより多くのステージに分散されるため、ステージの平均実行時間を短縮する効果を有する場合がある。
【0046】
[0053]行416は、戻る前に「y」の値を「z」の値で乗じる単一のステートメント「return z*y」を含む。これは、レジスタ434に格納された「y」の値を、「z」の値で乗じる計算ユニット444に対応する。
【0047】
[0054]
図5は、「do-while」ループを囲む並べ替えブロック構築を示すハードウェアアーキテクチャ
図500である。コードリスト502は、パラメータ「x」506および「y」508をとる関数「f()」504を含む。行512は、int「z」を「x+1」に初期化し、実行パイプライン522の一部に対応する。具体的には、実行パイプライン522は、「+1」計算ユニット534を含み、これは、「x」506の値に「1」を追加し、それを「z」としてレジスタ535に格納する。行513は、ループカウンタ変数「i」を「1」に初期化する。パイプライン522は、値「i」、「y」、および「z」を、FIFO524にプッシュすることによって終了する。
【0048】
[0055]機能504の並べ替えブロック516は、「do-while」ループ518をラップする。
図5は、設計によって、スレッドの実行順序を保持しない一種の言語構築の例として、「do-while」ループ518を使用する。しかしながら、スレッドの実行順序を保持しない他の言語構築も同様に考慮される。並べ替えブロック516は、パイプライン522およびパイプライン526によって部分的に実施される。パイプライン522は、スレッドが入る順序でスレッドを登録する並べ替え開始ブロック(begin reorder block)536を含む。
【0049】
[0056]いくつかの構成では、スレッドは、インデクスまたはスレッドIDに関連付けられる。並べ替え開始ブロック536に入る第1のスレッドのインデクス/IDは、たとえば、配列の要素「0」内のような、並べ替えブロックの第1の位置に格納される。後続のスレッドでは、入力した順序に対応する要素にインデクス/IDが格納される。このようにして、スレッドの実行順序のレコードが生成される。並べ替えブロック516の議論は、「do-while」ループ518の議論の後に続く。
【0050】
[0057]「do-while」ループ518は、「y」に「2」を追加するたびに、「z」回ループする。「do-while」ループ518は、パイプライン526によって実施されるが、明確化のためにいくつかの態様は省略されている。「do-while」ループ518は、最初に、パイプライン522によってFIFO524に配置された「z」の値を受け取る。次に、「do-while」ループ518は、ブロック538において、「i」の値を、「z」と比較してもよい。「i」が「z」以下の場合、ループは継続し、計算ユニット540は、「2」を「y」に追加する。「y」の更新値、「z」の値、および「i」の現在の値は、その後、FIFO528に格納される。しかしながら、「i」が「z」より大きい場合、ループは終了し、以下で論じるように、実行は並べ替えブロック542に渡される。
【0051】
[0058]第1の実行後、「do-while」ループ518は、さらに「z-1」回、ループ518を繰り返すことを続ける。各繰返しにおいて、「y」および「i」の現在の値は、「z」の値とともにFIFO528から取得される。「x」は、関数の残りの部分で使用されないため、この時点では維持されないことが理解される。比較538が実行され、「i」がそれでも「z」よりも小さい場合、実行は、上記で論じたように、計算ユニット540に続く。しかしながら、「i」が「z」より大きい場合、「do-while」の「do-while」ループ518は終了する。
【0052】
[0059]スレッドが「do-while」の「do-while」ループ518を出ると、スレッドは、並べ替え終了ブロック(end reoder block)542を通過する。並べ替え開始ブロック536および並べ替え終了ブロック542は別々に示されているが、それらはSDC上の単一の機能ユニットによって実施され得る。並べ替え終了ブロック542は、実行順序がより低いすべてのスレッド(すなわち、スレッドインデクス/IDの配列内のより低い番号の要素に登録されたスレッド)が解放されるまで、スレッドをブロックする。実行順序が最も低いスレッドが検出されると、すぐに解放されて実行が続行される。このようにして、スレッドは解放され、並べ替えブロック516に入った順序で他の計算を開始する。パイプライン526は、「z」および「y」の値をFIFO530に格納することによって終了する。
【0053】
[0060]行520は、「do-while」ループ518および並べ替えブロック516が完了した後に実行され、「z*y」の値を返す。行520は、FIFO530から「y」および「z」の値を読み取り、計算ユニット543を適用して「y」および「z」を乗算するパイプライン532によって部分的に実施される。
【0054】
[0061]
図5は、「do-while」ループを実行することによってどのようにスレッド順序が変化し、次にスレッド並べ替えブロックによって元の順序に復元されるのかを示している。スレッド546A~Dは、順序548において、「do-while」の「do-while」ループ518などのループに入る。各スレッドは異なる「z」の値544を有しているので、各スレッドは「do-while」ループ518を、異なる反復回数で実行する。具体的には、最初に入るスレッド546Aが6回反復し、2番目に入るスレッド546Bが8回反復し、3番目に入るスレッド546Cが2回反復し、4番目に入るスレッド546Dが4回反復する。スレッド546は、並べ替え開始ブロック536を通過し、入った順に、それらのスレッドインデクス/IDを登録する。チャート550は、各スレッドが実行される時間をクロックサイクルで示す。スレッド546は、異なる順序で「do-while」ループ518を出る。すなわち、スレッド546Aは3番目に存在し、スレッド546Bは4番目に出て、スレッド546Bは最初に出て、スレッド546Aは2番目に出る。
【0055】
[0062]スレッド546Cが最初に「do-while」ループ518を出る一方、並べ替え終了ブロック542はさらに、スレッド546A、546Bが「do-while」ループ518を終了して実行を再開するまで実行を遅延させる。次に、スレッド546Dは、「do-while」ループ518を終了し、また、スレッド546A~Cが終了するまでブロックされる。次に、スレッド546Aは、「do-while」ループ518を終了するが、546Aは、並べ替え開始ブロック536に登録する最初のスレッドであったため、再開を許可される。同時に、並べ替え終了ブロック542は、スレッド546Aが再開したので、後続のスレッドが継続することを許可されているか否かをチェックする。この場合、スレッド546Bはまだ終了していないため、許可されない。しかしながら、スレッド546Bが「do-while」ループ518を終了すると、並べ替え終了ブロック542は、より低い初期実行順序を有するすべてのスレッド(すなわち、スレッド546A)が実行を再開したことに注目し、スレッド546Bは、実行再開を許可される。次に、スレッド546B後に並べ替え開始ブロック536に入ったスレッドは、再開を許可されるか否かを判定するためにチェックされる。この例では、スレッド546Cと546Dとの両方がブロックされ、それらの前に到着したすべてのスレッドが再開を許可されているため、両方を(この順序で)再開することを許可される。このようにして、スレッド546は、順序554で、すなわち、並べ替え開始ブロック536に入ったのと同じ順序で、並べ替え終了ブロック542を出る。
図4および
図5および対応する議論は、非限定的な例を示す。他のタイプのループ、パイプライン、式、分岐、および順序付けも同様に考慮される。
【0056】
[0063]
図6は、本明細書に開示される1つの実施形態に従って
図1~
図5に例示され、上記で説明された、スレッドの実行順序を維持する言語およびコンパイラの態様を例示するルーチン600を示すフロー図である。
図6および他の図に関して本明細書で説明される論理演算は、(1)コンピューティングデバイス上で実行される一連のコンピュータ実施動作またはプログラムモジュールとして、および/または(2)コンピューティングデバイス内の相互接続された機械論理回路または回路モジュールとして実施することができると理解されるべきである。
【0057】
[0064]本明細書に開示される技術の特定の実施は、コンピューティングデバイスの性能および他の要件に依存する選択の問題である。したがって、本明細書で説明される論理演算は、状態、演算、構成デバイス、動作、またはモジュールと様々に呼ばれる。これらの状態、演算、構成デバイス、動作、およびモジュールは、ハードウェア、ソフトウェア、ファームウェア、専用デジタルロジック、およびそれらの任意の組合せで実施できる。図面に示され、本明細書で説明されるよりも多いまたは少ない演算を実行できることが理解されるべきである。これら演算は、本明細書で説明されるものとは異なる順序で実行することもできる。
【0058】
[0065]ルーチン600は、動作602で開始し、ここで、ソースコード102は、コンパイラ104によって受信される。ソースコード102は、マルチスレッドプログラミング言語で表現され得る。いくつかの構成では、ソースコード102は、命令型プログラミング言語で表現される。ソースコードは、「if」、「switch」、「case」、または「while」ステートメントなどの分岐ステートメント411を含み得、これにより、スレッドは、複数のコードパス(回路で説明されるコードパスと区別するため「ソースコードパス」とも呼ばれる)のうちの1つで実行される。いくつかの構成では、ソースコードは、「do-while」ループ518など、スレッドの実行順序を維持しないコードをラップする並べ替えブロック516を含む。
【0059】
[0066]動作602から、ルーチンは動作604に進み、そこで、コンパイラ104は、ソースコード102を回路記述106にコンパイルする。いくつかの構成では、回路記述106は、複数のソースコードパスに関連付けられた複数のコードパス427、435を含み、コンパイラ104は、ダミーパイプラインステージ440を、複数のコードパスのいくつかまたはすべてに追加し、複数のコードパスのうちのいくつかまたはすべては、同数のパイプラインステージ324を有するようになる。
【0060】
[0067]いくつかの構成では、回路記述は、第1の実行パイプライン200Aおよび第2の実行パイプライン200Bを含み、第1の実行パイプライン200Aは、ローカル変数のセットをFIFO202Aにプッシュすることによって第2の実行パイプライン200Bに実行を渡す。次に、第2の実行パイプライン200Bは、ローカル変数のセットを、それらがプッシュされた順序でFIFO202Aから取得することができ、それによって、スレッドの実行順序を維持する。
【0061】
[0068]いくつかの構成では、回路記述521は、スレッドの実行順序を維持しない構築518の回路記述をラップする並べ替えバッファ536、542を含む。これらの構成では、並べ替えバッファ536、542は、構築が実行される前にスレッド順序548を登録し、構築を離れると、スレッドを元の実行順序548に戻す。いくつかの構成では、並べ替えバッファ536、542は、実行順序がより低い(すなわち、実行する最初のスレッドに近い)すべてのスレッドが実行を再開するまで、スレッドの実行をブロックする。
【0062】
[0069]動作604から、ルーチン600は、動作606に進み、ここで、回路記述(たとえば、HDLコード)は、回路記述106によって定義された回路実装を含むSDL112を生成するために利用される。次に、ルーチン600は、動作606から動作608に進み、そこで終了する。
【0063】
[0070]
図7は、本明細書で提示される様々な技術を実施できるコンピューティングデバイスのための例示的なコンピュータハードウェアおよびソフトウェアアーキテクチャを示すコンピュータアーキテクチャ図を示す。特に、
図7に例示されるアーキテクチャは、サーバコンピュータ、モバイル電話、電子リーダ、スマートフォン、デスクトップコンピュータ、AR/VRデバイス、タブレットコンピュータ、ラップトップコンピュータ、または別のタイプのコンピューティングデバイスを実施するために利用することができる。
【0064】
[0071]
図7に例示されるコンピュータ700は、中央処理装置702(「CPU」)と、ランダムアクセスメモリ706(「RAM」)および読取専用メモリ(「ROM」)708を含むシステムメモリ704と、メモリ704をCPU702に結合するシステムバス710とを含む。起動中など、コンピュータ700内の要素間での情報の転送に役立つ基本的なルーチンを含む基本入力/出力システム(「BIOS」または「ファームウェア」)を、ROM708に格納することができる。コンピュータ700はさらに、オペレーティングシステム722、アプリケーションプログラム、および他のタイプのプログラムを格納するための大容量記憶デバイス712を含む。大容量記憶デバイス712はまた、他のタイプのプログラムおよびデータを記憶するように構成することができる。
【0065】
[0072]大容量記憶デバイス712は、バス710に接続された大容量記憶コントローラ(図示せず)を介してCPU702に接続される。大容量記憶デバイス712およびその関連付けられたコンピュータ可読媒体は、コンピュータ700に不揮発性ストレージを提供する。本明細書に含まれるコンピュータ可読媒体の説明は、ハードディスク、CD-ROMドライブ、DVD-ROMドライブ、またはUSBストレージキーなどの大容量記憶デバイスに言及しているが、コンピュータ可読媒体は、コンピュータ700によってアクセスされ得る任意の利用可能なコンピュータ記憶媒体または通信媒体であり得ることが当業者によって理解されるべきである。
【0066】
[0073]通信媒体は、コンピュータ可読命令、データ構成、プログラムモジュール、または搬送波または他の伝送メカニズムなどの変調データ信号における他のデータを含み、任意の配信媒体を含む。「変調データ信号」という用語は、信号内の情報をエンコードするような方式で変更または設定されたその特性の1つまたは複数を有する信号を意味する。例として、限定されないが、通信媒体は、有線ネットワークまたは直接有線接続などの有線媒体、および音響、無線周波数、赤外線および他のワイヤレス媒体などのワイヤレス媒体を含む。上記のいずれかの組合せも、コンピュータ可読媒体の範囲内に含める必要がある。
【0067】
[0074]限定ではなく例として、コンピュータ記憶媒体は、コンピュータ可読命令、データ構成、プログラムモジュール、または他のデータなどの情報を記憶するための任意の方法または技術で実施された揮発性および不揮発性、リムーバブル、および非リムーバブルな媒体を含むことができる。たとえば、コンピュータ記憶媒体は、これらに限定されないが、RAM、ROM、EPROM、EEPROM、フラッシュメモリまたは他のソリッドステートメモリ技術、CD-ROM、デジタル多用途ディスク(「DVD」)、HD-DVD、BLU-RAY、または他の光学ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気記憶デバイス、または所望の情報を記憶するために使用でき、コンピュータ700によってアクセスできる他の任意の媒体を含む。特許請求の範囲の目的のために、「コンピュータ記憶媒体」という句、およびその変形は、波または信号自体または通信媒体を含まない。
【0068】
[0075]様々な構成によれば、コンピュータ700は、ネットワーク720などのネットワークを介したリモートコンピュータへの論理的な接続を使用して、ネットワーク化された環境で動作することができる。コンピュータ700は、バス710に接続されたネットワークインターフェースユニット716を介してネットワーク720に接続することができる。ネットワークインターフェースユニット716はまた、他のタイプのネットワークおよびリモートコンピュータシステムに接続するために利用され得ることが理解されるべきである。コンピュータ700はまた、キーボード、マウス、タッチ入力、電子スタイラス(
図7には示されていない)、またはビデオカメラのような物理的センサを含む、他の多くのデバイスからの入力を受信および処理するための入力/出力コントローラ718を含むことができる。同様に、入力/出力コントローラ718は、ディスプレイスクリーンまたは他のタイプの出力デバイス(
図7にも示されていない)に出力を提供することができる。
【0069】
[0076]本明細書で説明されるソフトウェア構成要素は、CPU702にロードされて実行されると、CPU702およびコンピュータ700全体を、汎用コンピューティングデバイスから、本明細書で提示された機能を容易にするようにカスタマイズされた専用のコンピューティングデバイスに変換できることが理解されるべきである。CPU702は、任意の数のトランジスタまたは他の離散的な回路要素から構築することができ、これらは、個別にまたは集合的に、任意の数の状態をとることができる。より具体的には、CPU702は、本明細書に開示されるソフトウェアモジュール内に含まれる実行可能命令に応答して、有限状態マシンとして動作することができる。これらのコンピュータ実行可能命令は、CPU702が状態間でどのように遷移するかを指定することによって、CPU702を変換することができ、それによって、CPU702を構成するトランジスタまたは他の離散的なハードウェア要素を変換する。
【0070】
[0077]本明細書に提示されるソフトウェアモジュールをエンコードすることはまた、本明細書に提示されるコンピュータ可読媒体の物理的構成を変換することができる。物理的構成の固有の変換は、この説明の異なる実施において、様々な要因に依存する。そのような要因の例は、コンピュータ可読媒体を実施するために使用される技術、コンピュータ可読媒体が一次または二次ストレージとして特徴付けられるか否かなどを含むが、これらに限定されない。たとえば、コンピュータ可読媒体が半導体ベースのメモリとして実施される場合、本明細書に開示されるソフトウェアは、半導体メモリの物理的状態を変換することによって、コンピュータ可読媒体においてエンコードすることができる。たとえば、ソフトウェアは、半導体メモリを構成するトランジスタ、コンデンサ、または他の離散的な回路要素の状態を変換できる。ソフトウェアは、データをそこに保存するために、そのような構成要素の物理的状態を変換することもできる。
【0071】
[0078]別の例として、本明細書に開示されるコンピュータ可読媒体は、磁気または光学技術を使用して実施することができる。そのような実施において、本明細書に提示されるソフトウェアは、ソフトウェアがその中にエンコードされるとき、磁気または光学媒体の物理的状態を変換することができる。これらの変換は、所与の磁気媒体内の特定の場所の磁気特性の変更を含む場合がある。これらの変換は、所与の光学媒体内の特定の場所の物理的特徴または特性を変更して、それらの場所の光学的特性を変更することも含む。物理媒体の他の変換は、本説明の範囲および精神から逸脱することなく可能であり、前述の例は、この議論を容易にするためにのみ提供される。
【0072】
[0079]上記に照らして、本明細書に提示されるソフトウェア構成要素を格納および実行するために、コンピュータ700において多くのタイプの物理的変換が行われることが理解されるべきである。コンピュータ700について
図7に示されるアーキテクチャまたは同様のアーキテクチャを利用して、ハンドヘルドコンピュータや、ビデオゲームデバイスや、組込コンピュータシステムや、スマートフォンのようなモバイルデバイスや、タブレットや、AR/VRデバイスを含む他のタイプのコンピューティングデバイス、ならびに、当業者に知られている他の任意のタイプのコンピューティングデバイスを実施できることが理解されるべきである。コンピュータ700は、
図7に示される構成要素のすべてを含まないこともあり、
図7に明示的に示されていない他の構成要素を含むことができるか、または、
図7に示されるものとは完全に異なるアーキテクチャを利用できることも企図される。
【0073】
[0080]
図8は、本明細書に提示される様々な実施形態に従って、開示された技術の態様を実施することができる分散型ネットワークコンピューティング環境800を示すネットワーク図である。
図8に示されるように、1つまたは複数のサーバコンピュータ800Aは、(固定有線またはワイヤレスLAN、WAN、イントラネット、エクストラネット、ピアツーピアネットワーク、仮想プライベートネットワーク、インターネット、Bluetooth通信ネットワーク、独自の低電圧通信ネットワーク、または他の通信ネットワークのいずれかまたはそれらの組合せであり得る)通信ネットワーク720を介して、限定されないが、タブレットコンピュータ800Bや、ゲームコンソール800Cや、スマートウォッチ800Dや、スマートフォンなどの電話800Eや、パーソナルコンピュータ800Fや、AR/VRデバイス800Gのような多数のクライアントコンピューティングデバイスと相互接続することができる。
【0074】
[0081]通信ネットワーク720がたとえば、インターネットであるネットワーク環境では、サーバコンピュータ800Aは、ハイパテキスト転送プロトコル(「HTTP」)、ファイル転送プロトコル(「FTP」)、またはシンプルオブジェクトアクセスプロトコル(「SOAP」)のようないくつかの既知のプロトコルのいずれかを介して、クライアントコンピューティングデバイス800B~800Gとの間でデータを処理および通信するように動作可能な専用のサーバコンピュータであり得る。それに加えて、ネットワーク化されたコンピューティング環境800は、セキュアソケットレイヤ(「SSL」)またはプリティグッドプライバシ(「PGP」)などの様々なデータセキュリティプロトコルを利用することができる。クライアントコンピューティングデバイス800B~800Gの各々は、1つまたは複数のコンピューティングアプリケーション、またはウェブブラウザ(
図8には示されていない)のような端末セッション、または他のグラフィカルユーザインターフェース(
図8には示されていない)、またはサーバコンピュータ800Aへのアクセスを得るためのモバイルデスクトップ環境(
図8には示されていない)をサポートするように動作可能なオペレーティングシステムを装備することができる。
【0075】
[0082]サーバコンピュータ800Aは、他のコンピューティング環境(
図8には示されていない)に通信可能に結合され得、参加しているユーザの相互作用/リソースネットワークに関するデータを受信することができる。例示的な動作では、ユーザ(
図8には示されていない)は、クライアントコンピューティングデバイス800B~800Gで実行されているコンピューティングアプリケーションとインタラクトして、所望のデータを取得し、および/または他のコンピューティングアプリケーションを実行してもよい。
【0076】
[0083]データおよび/またはコンピューティングアプリケーションは、サーバ800Aまたは複数のサーバ800Aに格納され得、例示的な通信ネットワーク720を介してクライアントコンピューティングデバイス800B~800Gを介して、協調するユーザに通信され得る。参加ユーザ(
図8には示されていない)は、サーバコンピュータ800Aに全体的または部分的に収容される固有のデータおよびアプリケーションへのアクセスを要求することができる。これらのデータは、処理および記憶のために、クライアントコンピューティングデバイス800B~800Gと、サーバコンピュータ800Aとの間で通信され得る。
【0077】
[0084]サーバコンピュータ800Aは、データおよびアプリケーションの生成、認証、暗号化、および通信のためのコンピューティングアプリケーション、プロセス、およびアプレットをホストすることができ、アプリケーション/データトランザクションを実現するために、他のサーバコンピューティング環境(
図8には示されていない)、サードパーティサービスプロバイダ(
図8には示されていない)、ネットワーク接続ストレージ(「NAS」)、およびストレージエリアネットワーク(「SAN」)と協働してもよい。
【0078】
[0085]
図7に示されるコンピューティングアーキテクチャと、
図8に示される分散ネットワークコンピューティング環境とは、議論を容易にするために簡略化されていることが理解されるべきである。コンピューティングアーキテクチャおよび分散コンピューティングネットワークは、より多くのコンピューティング構成要素、デバイス、ソフトウェアプログラム、ネットワークデバイス、および本明細書に具体的に説明されていない他の構成要素を含み、利用できることも理解されるべきである。
【0079】
[0086]本明細書に提示される開示はまた、以下の条項に記載される主題を包含する。
[0087]条項1:コンピュータ実施方法であって、マルチスレッドプログラミング言語で表現されたソースコードを受け取ることであって、ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含む、受け取ることと、ソースコードを、パイプラインを含む回路記述にコンパイルすることであって、パイプラインは、複数のソースコードパスに関連付けられた複数のコードパスを含み、複数のコードパスが同じ数のパイプラインステージを有するように、1つまたは複数のパイプラインステージが、複数のコードパスのうちの1つまたは複数に追加される、コンパイルすることと、回路記述に基づいて、回路実装を備える同期デジタル回路を生成することとを備える、コンピュータ実施方法。
【0080】
[0088]条項2:複数のスレッドは、第1の順序でパイプラインに入り、複数のスレッドは、第1の順序でパイプラインを出る、条項1のコンピュータ実施方法。
[0089]条項3:複数のコードパスのうちの1つまたは複数にパイプラインステージを追加することは、最長のコードパスにおけるパイプラインステージの数を決定することと、そのコードパスにおけるパイプラインステージの数を、最長のコードパスにおけるパイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加することとを含む、条項1または2のコンピュータ実施方法。
【0081】
[0090]条項4:パイプラインは、第1のパイプラインを備え、回路記述は、第2のパイプラインを含み、第1のパイプラインを実行するスレッドは、ローカル変数を先入れ先出しキューにプッシュすることによって、実行を第2のパイプラインに渡し、第2のパイプラインは、プッシュされた順序で先入れ先出しキューからローカル変数を読み取ることにより、パイプライン全体でスレッドの実行順序を維持する、条項1から3のいずれかのコンピュータ実施方法。
【0082】
[0091]条項5:ソースコードは、スレッドの実行順序を維持しないプログラミング構築をラップする並べ替えブロック構築を含み、並べ替えブロック構築は、到来するスレッドの実行順序を記録し、スレッドが、スレッドの実行順序を維持しない構築を実行できるようにし、すべての下位スレッドが再開するまでスレッドの再開をブロックする回路実装にマッピングする条項1から4のいずれかのコンピュータ実施方法。
【0083】
[0092]条項6:スレッドは、実行のためにパイプラインに提供されるローカル変数の集合を備える、条項1から5のいずれかのコンピュータ実施方法。
[0093]条項7:パイプラインは、順に実行されるステージを備え、ステージを順に通過することによって、複数のスレッドが、実行順序を維持する、条項1から6のいずれかのコンピュータ実施方法。
【0084】
[0094]条項8:コンピューティングデバイスであって、1つまたは複数のプロセッサと、1つまたは複数のプロセッサによって実行された場合、コンピューティングデバイスに対して、マルチスレッドプログラミング言語で表現されたソースコードを受け取らせ、ソースコードを、第1のパイプライン、第2のパイプライン、および第1のパイプラインから第2のパイプラインに渡されるローカルスレッド変数のセットを格納する先入れ先出し(FIFO)キューを含む回路記述にコンパイルさせ、第1のパイプラインは、ローカルスレッド変数のセットを、スレッドの実行順序でFIFOキューに格納し、第2のパイプラインは、スレッドの実行順序でFIFOキューからローカルスレッド変数のセットを取得することによってスレッドの実行順序を維持し、回路記述に基づいて、回路実装を備える同期デジタル回路を生成させる、コンピュータ実行可能命令を格納した少なくとも1つのコンピュータ記憶媒体。
【0085】
[0095]条項9:ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含み、第1のパイプラインは、複数のソースコードパスに関連付けられた複数のコードパスを含み、複数のコードパスが同じ数のパイプラインステージを有するように、1つまたは複数のパイプラインステージが、複数のコードパスのうちの1つまたは複数に追加される、条項8のコンピューティングデバイス。
【0086】
[0096]条項10:複数のコードパスのうちの1つまたは複数にパイプラインステージを追加することは、最長のコードパスにおけるパイプラインステージの数を決定することと、そのコードパスにおけるパイプラインステージの数を、最長のコードパスにおけるパイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加することとを含む、条項8または9のコンピューティングデバイス。
【0087】
[0097]条項11:ソースコードは、スレッドの実行順序を維持しないプログラミング構築をラップする並べ替えブロック構築を含み、並べ替えブロック構築が、到来するスレッドの実行順序を記録し、スレッドが、スレッドの実行順序を維持しない構築を実行できるようにし、すべての下位スレッドが再開するまでスレッドの再開をブロックする回路実装にマッピングする、条項8から10のいずれかのコンピューティングデバイス。
【0088】
[0098]条項12:スレッドは、入った順序で並べ替えブロックを出る、条項8から11のいずれかのコンピューティングデバイス。
[0099]条項13:スレッドは、実行のために第1のパイプラインに提供されるローカルスレッド変数の集合を備える、条項8から12のいずれかのコンピューティングデバイス。
【0089】
[00100]条項14:第1のパイプラインは、順に実行されるステージを備え、ステージを順に通過することによって、複数のスレッドが、実行順序を維持する、条項8から13のいずれかのコンピューティングデバイス。
【0090】
[00101]条項15:1つまたは複数のプロセッサによって実行された場合、コンピューティングデバイスに対して、マルチスレッドプログラミング言語で表現されたソースコードを受け取らせ、ソースコードは、回路実装にマッピングする構築を備え、構築は、並べ替えブロックと、スレッドの実行順序を維持しない構築とを備え、回路実装は、複数のスレッドを受信した順序でスレッド識別子を登録する並べ替えバッファと、複数のスレッドの各々について、未知の数のクロックサイクルのために実行する回路とを備え、並べ替えバッファは、実行順序の低いすべてのスレッドが再開されるまで、スレッドの再開をブロックし、構築を、回路記述にコンパイルさせ、回路記述に基づいて、回路実施を備える同期デジタル回路を生成させるコンピュータ実行可能命令を格納した少なくとも1つのコンピュータ記憶媒体。
【0091】
[00102]条項16:ソースコードは、複数のソースコードパスのうちの1つに実行を指示する分岐ステートメントを含み、回路記述は、複数のコードパスを含むパイプラインを含み、複数のコードパスが同じ数のパイプラインステージを有するように、1つまたは複数のパイプラインステージが複数のコードパスのうちの1つまたは複数に追加される、条項15の少なくとも1つのコンピュータ記憶媒体。
【0092】
[00103]条項17:複数のコードパスのうちの1つまたは複数にパイプラインステージを追加することは、最長のコードパスにおけるパイプラインステージの数を決定することと、そのコードパスにおけるパイプラインステージの数を、最長のコードパスにおけるパイプラインステージの数から引いたものに等しい数のパイプラインステージを、各コードパスに追加することとを含む、条項15または16の少なくとも1つのコンピュータ記憶媒体。
【0093】
[00104]条項18:スレッドは、実行のために第1のパイプラインに提供されるローカルスレッド変数の集合を備える、条項15から17のいずれかの少なくとも1つのコンピュータ記憶媒体。
【0094】
[00105]条項19:第1のパイプラインは、順に実行されるステージを備え、ステージを順に通過することによって、複数のスレッドが、実行順序を維持する、条項15から17のいずれかの少なくとも1つのコンピュータ記憶媒体。
【0095】
[00106]条項20:パイプラインは、第1のパイプラインを備え、回路記述は、第2のパイプラインを含み、第1のパイプラインを実行するスレッドは、ローカル変数を先入れ先出しキューにプッシュすることによって、実行を第2のパイプラインに渡し、第2のパイプラインは、プッシュされた順序で先入れ先出しキューからローカル変数を読み取ることにより、パイプライン全体でスレッドの実行順序を維持する、条項15から19のいずれかの少なくとも1つのコンピュータ記憶媒体。
【0096】
[00107]上記に基づいて、スレッドの実行順序を維持する言語およびコンパイラが本明細書に開示されていることが理解されるべきである。本明細書に提示される主題は、コンピュータの構成的な特徴、方法論的および変換的動作、固有のコンピューティング機構、およびコンピュータ可読媒体に固有の言語で説明されているが、添付の特許請求の範囲に記載される主題は必ずしも、本明細書で説明される固有の特徴、動作、または媒体に限定されないことを理解されたい。むしろ、固有の特徴、動作および媒体は、特許請求された主題を実施する例示的な形態として開示されている。
【0097】
[00108]上記の主題は、例示としてのみ提供され、限定として解釈されるべきではない。例示および説明された例示的な構成および用途に従わずに、以下の特許請求の範囲に記載された本開示の範囲から逸脱することなく、本明細書で説明される主題に対して様々な修正および変更を行うことができる。