IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ イルヌメリックス ゲーエムベーハーの特許一覧

特許7495028コンピュータ実装方法及びコンピュータプログラム
<>
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図1A
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図1B
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図2
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図3
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図4
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図5
  • 特許-コンピュータ実装方法及びコンピュータプログラム 図6
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-05-27
(45)【発行日】2024-06-04
(54)【発明の名称】コンピュータ実装方法及びコンピュータプログラム
(51)【国際特許分類】
   G06F 8/41 20180101AFI20240528BHJP
   G06F 8/30 20180101ALI20240528BHJP
【FI】
G06F8/41 170
G06F8/30
【請求項の数】 17
【外国語出願】
(21)【出願番号】P 2022202008
(22)【出願日】2022-12-19
(65)【公開番号】P2023118663
(43)【公開日】2023-08-25
【審査請求日】2023-02-16
(31)【優先権主張番号】22156804
(32)【優先日】2022-02-15
(33)【優先権主張国・地域又は機関】EP
(73)【特許権者】
【識別番号】522492473
【氏名又は名称】イルヌメリックス ゲーエムベーハー
(74)【代理人】
【識別番号】110000877
【氏名又は名称】弁理士法人RYUKA国際特許事務所
(72)【発明者】
【氏名】ハイモ クッチバッハ
【審査官】山本 俊介
(56)【参考文献】
【文献】特表2020-518881(JP,A)
【文献】特表2020-537789(JP,A)
【文献】Anala M.R. et al.,Framework for Automatic Parallelization,2018 IEEE 25th International Conference on High Performance Computing Workshops (HiPCW) [online],IEEE,2018年,pp.112-118,https://ieeexplore.ieee.org/document/8634283 [2024年1月24日検索],DOI: 10.1109/HiPCW.2018.8634283
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00-8/77
(57)【特許請求の範囲】
【請求項1】
それぞれの共通データタイプの複数の要素を記憶する少なくとも1つの入力アレイデータ構造についてのアレイ命令のシーケンス、及び前記少なくとも1つの入力アレイデータ構造の入力サイズ情報についてのアレイ命令の前記シーケンスの各アレイ命令の出力の出力サイズ情報を決定することを可能にする関数メタ情報(FMI)を含むプログラムコードを受信する段階;
前記プログラムコードから、第1のプログラムセグメントを生成する段階、前記第1のプログラムセグメントを生成する段階は:
・前記少なくとも1つの入力アレイデータ構造のそれぞれのランタイムインスタンスのランタイムサイズ情報を決定する段階;及び
・アレイ命令の前記シーケンスから、前記ランタイムサイズ情報、前記関数メタ情報及び前記アレイ命令に基づいて、アレイ命令を、対応するアレイ演算として前記第1のプログラムセグメントに含める段
を有する;
処理ユニットのハードウェア情報を受信する段階;
前記第1のプログラムセグメント、前記ランタイムサイズ情報及び前記ハードウェア情報に基づいて、前記処理ユニット上で実行可能である第1の計算カーネルをコンパイルする段階;及び
前記少なくとも1つの入力アレイデータ構造の前記ランタイムインスタンス入力として使用して、前記処理ユニット上で前記第1の計算カーネルを実行する段階
を備える、コンピュータ実装方法。
【請求項2】
前記アレイ命令を、対応するアレイ演算として含める段階は、
アレイ命令のセット、特にアレイ命令の前記シーケンスからのアレイ命令のサブセットを、対応するアレイ演算として前記第1のプログラムセグメントに含める段階;
前記関数メタ情報及び前記ランタイムサイズ情報を使用して、前記アレイ演算のそれぞれのランタイム出力サイズ情報を決定する段階;
削減アレイ命令を削減アレイ演算として含める段階;
単項アレイ命令を、単項アレイ演算として含める段階;
アレイアクセス命令を、アレイアクセス演算として含める段階;
前記少なくとも1つの入力アレイデータ構造に対応するか又はこれから導出されるアレイデータ構造についての少なくとも1つのアレイアクセス命令にわたるループ命令のスカラ反復変数を、前記ループ命令によって生成される複数のループ反復インデックス値を参照するインデックスデータ構造に変換し、前記アレイアクセス命令とともに前記スカラ反復変数の代わりに前記インデックスデータ構造を使用する段階;及び
バイナリアレイ命令を、バイナリアレイ演算として前記第1のプログラムセグメントに含める段階
のうちの少なくとも1つを有する、請求項1に記載のコンピュータ実装方法。
【請求項3】
前記バイナリアレイ命令の前記入力アレイデータ構造のランタイムインスタンスのそれぞれのサイズを決定し、全てのサイズが一致する場合、又は前記バイナリアレイ命令への前記入力アレイデータ構造の前記ランタイムインスタンスのうちの少なくとも1つが複雑性基準を満たす場合、前記バイナリアレイ命令を、前記バイナリアレイ演算として前記第1のプログラムセグメントに含め、そうではない場合、前記第1のプログラムセグメントの生成を終了する段階;
前記第1のプログラムセグメントの計算コストに依存して前記第1のプログラムセグメントの生成を終了する段階;
アレイ命令を前記第1のプログラムセグメントに含める前に、前記アレイ命令を含める段階が、含まれる前記アレイ命令を有しない前記第1のプログラムセグメントの計算コストの総和よりも低いか又は等しい計算コスト及び含まれる前記アレイ命令のみを含む新たなプログラムセグメントの計算コストを含む第1のプログラムセグメントをもたらすか否かを検証し、そうではない場合、前記第1のプログラムセグメントの生成を終了する段階;
その出力サイズがその入力アレイデータ構造のうちの少なくとも1つの要素値に依存するアレイ命令が発見されると、前記第1のプログラムセグメントの生成を終了する段階;
削減アレイ命令が、前記FMI及び前記ランタイムサイズ情報に基づいて、1つの出力要素、例えばゼロを生成するために決定される場合、前記削減アレイ命令を含めた後に前記第1のプログラムセグメントの生成を終了する段階;
前記第1のプログラムセグメントの生成を終了した後、前記プログラムコードから、第2のプログラムセグメントを生成する段階、前記第2のプログラムセグメントを生成する段階は、アレイ命令の前記シーケンスから、前記ランタイムサイズ情報、前記関数メタ情報及び前記アレイ命令に基づいて、残りのアレイ命令を、対応するアレイ演算、典型的には残りのアレイ命令のセットとして前記第2のプログラムセグメントに含める段階を有する;及び
前記第1のプログラムセグメントの生成を終了する間、前記削減アレイ命令を削減アレイ演算として含めることからもたらされる遅延マージアレイ演算を含める段階
のうちの少なくとも1つを更に備える、請求項2に記載のコンピュータ実装方法。
【請求項4】
前記処理ユニットの前記ハードウェア情報を受信する段階は:
前記処理ユニットの第1のサブユニットのハードウェア情報を受信する段階;及び
前記処理ユニットの第2のサブユニットのハードウェア情報を受信する段
を有し、
前記第1の計算カーネルをコンパイルする段階は:
前記第1のサブユニットの前記ハードウェア情報、前記第2のサブユニットの前記ハードウェア情報、及び前記FMIに基づいて、前記少なくとも1つの入力データ構造の前記ランタイムインスタンスから、前記ランタイムインスタンスの第1の部分を参照する第1の部分的入力データ構造インスタンス及び前記ランタイムインスタンスの第2の部分を参照する第2の部分的入力データ構造インスタンスを決定し、それにより、前記第1のサブユニットが前記第1の部分的入力データ構造インスタンスを入力として使用してアレイ演算のセットの前記対応するアレイ演算を実行する場合、かつ前記第2のサブユニットが前記第2の部分的入力データ構造インスタンスを入力として使用して前記対応するアレイ演算を実行する場合に、前記アレイ命令を実行するコストが最低であると予想される段階;及び、以下のうちの少なくとも1つ:
特に前記ハードウェア情報に従って、前記第1のサブユニット及び前記第2のサブユニットが同じタイプであり、及び/又は同じ計算特性を有する場合、及び/又は、前記FMIに従って、前記第1の部分的入力データ構造インスタンスのサイズ情報が前記第2の部分的入力データ構造インスタンスの前記対応するサイズ情報に等しい場合、前記第1のサブユニット及び前記第2のサブユニット上で実行可能であるように前記第1の計算カーネルをコンパイルする段階;
前記第1の計算カーネルの第1の計算サブカーネルをコンパイルする段階、前記第1の計算サブカーネルは、前記処理ユニットの前記第1のサブユニット上で実行可能である;及び
前記第1の計算カーネルの第2の計算サブカーネルをコンパイルする段階、前記第2の計算サブカーネルは、前記処理ユニットの前記第2のサブユニット上で実行可能である
を有する、請求項1に記載のコンピュータ実装方法。
【請求項5】
前記それぞれのランタイムインスタンスの前記ランタイムサイズ情報及び前記FMIに基づいて、それぞれのプログラムセグメントのワークロードを決定する段階;
前記第1のサブユニット及び前記第2のサブユニットによって処理される前記ワークロードのそれぞれの部分を決定する段階;
前記ハードウェア情報を使用して、前記第1のサブユニット及び前記第2のサブユニットのためのそれぞれの計算容量を決定する段階;
前記第1のサブユニット及び前記第2のサブユニットのための前記計算容量に従って、前記第1の部分的入力データ構造インスタンスのサイズ及び前記第2の部分的入力データ構造インスタンスのサイズを決定する段階;
前記第1の部分的入力データ構造インスタンス及び前記第2の部分的入力データ構造インスタンスを作成する段階;
前記第1の部分的入力データ構造インスタンスを、前記処理ユニットの前記第1のサブユニット上で実行される前記第1の計算カーネルの入力として使用する段階;
前記第2の部分的入力データ構造インスタンスを、前記処理ユニットの前記第2のサブユニット上で実行される前記第1の計算カーネルの入力として使用する段階;及び
前記第2のサブユニット上で実行される前記第1の計算カーネルの第1の出力及び前記第2のサブユニット上で実行される前記第1の計算カーネルの第2の出力を組み合わせて、第1の出力アレイ構造インスタンスを形成する段階
のうちの少なくとも1つを更に備える、請求項4に記載のコンピュータ実装方法。
【請求項6】
前記プログラムコードを解析する段階及び/又は前記プログラムコードについての抽象構文木を生成する段階;
それぞれのプログラムセグメントについて空セグメントを生成する段階;
前記プログラムコードの抽象構文木を検査する段階;及び
前記抽象構文木内で発見されたノードを前記それぞれのプログラムセグメントに含める段階
のうちの少なくとも1つを更に備える、請求項1に記載のコンピュータ実装方法。
【請求項7】
前記ハードウェア情報は、前記処理ユニットのタイプ、前記処理ユニット、例えば、SIMD処理ユニットの1つ又は複数の計算サブユニットの数及び/又はタイプ、プロセッサの周波数、或る時間間隔あたりに複数の浮動小数点命令を実行する能力、ともに実行される同様の又は等しい命令の数、データについての転送速度、記憶容量、より効率的に特定の演算を処理する能力、のうちの少なくとも1つを含む、請求項1に記載のコンピュータ実装方法。
【請求項8】
前記関数メタ情報は、前記アレイ演算の各々についてのサイズ情報、要素タイプ情報、及び/又はレイアウト情報を含む、請求項1に記載のコンピュータ実装方法。
【請求項9】
前記ランタイムサイズ情報は、前記それぞれのランタイムインスタンスの次元の数、前記それぞれのランタイムインスタンスの前記次元のうちの少なくとも1つの次元の長さ、前記それぞれのランタイムインスタンスの前記要素のデータタイプ、前記それぞれのランタイムインスタンスのロケーション情報、及び前記それぞれのランタイムインスタンスの前記次元のうちの少なくとも1つの次元のストライド情報、のうちの少なくとも1つを含む、請求項1に記載のコンピュータ実装方法。
【請求項10】
前記処理ユニット上で前記第1の計算カーネルを実行することからもたらされる出力アレイ構造インスタンス、特に第1の出力アレイ構造インスタンスを、前記プログラムコードから生成された第2のプログラムセグメントに基づいてコンパイルされた第2の計算カーネルの入力アレイデータ構造インスタンスとして使用する段階を更に備える、請求項1に記載のコンピュータ実装方法。
【請求項11】
それぞれのプログラムセグメントは少なくとも1つのコンパイラによって生成され、及び/又は、前記プログラムコードから、幾つかのプログラムセグメントが生成され、特に、プログラムセグメントのシーケンスが生成され、及び/又は、対応する計算カーネルが、前記プログラムセグメントの各々についてコンパイルされる、請求項1に記載のコンピュータ実装方法。
【請求項12】
それぞれのランタイムインスタンスについての前記ランタイムサイズ情報は、特に、更なるプログラムセグメント、特に直前のプログラムセグメントのそれぞれの計算カーネルを実行する前に、及び/又はこれを実行することとは独立して、前記更なるプログラムセグメントによって決定される、請求項11に記載のコンピュータ実装方法。
【請求項13】
入力アレイデータ構造インスタンスのロケーション情報は、更なるプログラムセグメント、特に前記第2のプログラムセグメントによって決定される、請求項10に記載のコンピュータ実装方法。
【請求項14】
それぞれのプログラムセグメントは、中間表現、特にバイトコード表現として生成され、及び/又は、計算カーネルは、JITコンパイラによってコンパイルされる、請求項13に記載のコンピュータ実装方法。
【請求項15】
前記関数メタ情報は、それぞれのプログラムセグメントに含まれる前記シーケンスの前記アレイ命令の各々について対応するアレイ命令メタ情報を含み、及び/又は、前記アレイ命令を、対応するアレイ演算として前記第1のプログラムセグメントに含める段階は、前記第1のプログラムセグメントに、前記アレイ命令の各々についての前記対応するアレイ命令メタ情報を含める段階を有する、請求項1に記載のコンピュータ実装方法。
【請求項16】
各アレイ命令メタ情報は、それぞれのアレイ命令の少なくとも1つの入力アレイデータ構造の入力サイズ情報についての前記それぞれのアレイ命令の出力の出力サイズ情報を決定することを可能にする、請求項15に記載のコンピュータ実装方法。
【請求項17】
コンピュータによって実行されると、前記コンピュータに、請求項1~16のいずれか1項に記載のコンピュータ実装方法を実行させる命令を備えるコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、コンピュータ実装方法に関し、特に、典型的には異種及び/又は並列コンピューティングシステム上でアレイ命令を実行するコンピュータ実装方法、及びコンピュータ可読媒体に関する。
【背景技術】
【0002】
特に数値計算の分野において、及び/又はデータ解析のために、コンピューティングリソースの効率的な利用に対する高い需要が存在する。これは、アレイ命令を並列化するタスクを伴い、これは、多くの場合、単調で、コスト集約的であり、かつ低レベルコンピュータアーキテクチャ及びこれに関係付けられたプログラミング技術についてのかなりの知識を要求する。
【0003】
典型的には、異種又は並列コンピューティングリソースに対してアルゴリズムを効率的に実行することの主な課題は、(所与の問題サイズ及び特定のハードウェアセットアップについて)可能な最短時間内で、及び/又は最低エネルギー消費で、所望の精密度の範囲内の正しい結果を取得することである。
【0004】
特に、最も効率的な方法において全ての利用可能なコンピューティングリソースを利用する、それゆえ、最短実行時間に至る解決手段が発見されなければならない可能性がある。
【0005】
しかしながら、ワークロードのチャンクの、全ての利用可能なコンピューティングリソースへの効率的なマッピングは、コンパイラのために非常に困難なタスクである。
【0006】
これまで、コンパイラのタスクは、ユーザコードを、対象のプロセッサによって実行可能なコードに低級化することである。この手法を最新のコンピューティングシステムに拡張する試みは、プログラマによって行われる高度な手動判断:いずれのプロセッサをプログラム内の特定のポイントにおける特定のデータを処理するための対象とするか、に至る。10年以上もの間、産業全体が、増加したメンテナンス労力に煩わされており、そのようなプログラムの非互換性、及び遅延した製品出荷を含むより長い開発サイクルがもたらされている。
【0007】
例えば、コンパイラは、特定の判断:いずれの処理ユニットを対象とするか、データを処理するようにどのように処理ユニットに命令するか、及びどのようにデータを処理ユニットに提供するか、を行わなければならない。課題としては、(急速に変化する)コンピューティングハードウェアの広範な多様性、任意のGPL(汎用プログラミング言語)言語要素及び命令グラフの複雑性、処理されるデータの動的性質、及び全ての制約情報が最終的に利用可能になる時間が挙げられる。
【0008】
したがって、コンピューティングアーキテクチャのためのユーザソフトウェアプログラムの、典型的にはコンパイラベースの適応を改善する必要がある。
【発明の概要】
【0009】
コンピュータ実装方法の一実施形態によれば、方法は、それぞれの共通データタイプの複数の要素を記憶する少なくとも1つの入力アレイデータ構造についてのアレイ命令のシーケンス、及び関数メタ情報を含むプログラムコードを受信する段階を備える。関数メタ情報は、少なくとも1つの入力アレイデータ構造の入力サイズ情報についてのアレイ命令のシーケンスの各アレイ命令の出力の出力サイズ情報を決定することを可能にする。プログラムコードから、第1のプログラムセグメントが生成される。第1のプログラムセグメントを生成する段階は:少なくとも1つの入力アレイデータ構造のそれぞれのランタイムインスタンスのランタイムサイズ情報を決定する段階、及びアレイ命令のシーケンスから、ランタイムサイズ情報、関数メタ情報及びアレイ命令に基づいて、アレイ命令を、対応するアレイ演算として第1のプログラムセグメントに含める段階を有する。方法は、処理ユニットのハードウェア情報を受信する段階、第1のプログラムセグメント、ランタイムサイズ情報及びハードウェア情報に基づいて、処理ユニット上で実行可能である第1の計算カーネルをコンパイルする段階;及び少なくとも1つの入力アレイデータ構造のランタイムインスタンスを入力として使用して、処理ユニット上で第1の計算カーネルを実行する段階を更に備える。
【0010】
この方法は、特に、それぞれ、最大でもほんのわずかの手動の適応での、典型的には一切の手動の適応を伴わない、処理ユニット上でのアレイ命令を有するユーザプログラムコードの効率的な実行、及びワークロードのチャンクの、利用可能なハードウェアリソースへの効率的なマッピングを可能にする。
【0011】
これは部分的には、第1の計算カーネルがランタイムサイズ情報及びハードウェア情報に基づいてコンパイルされる。したがって、所与のハードウェア及びデータに対して計算カーネルを最適化するために望まれる全ての情報を考慮に入れることができる。
【0012】
特に、最高の実行ストラテジの判断に影響を与える任意の所望の情報が考慮に入れられてよい。これは、処理される実際のアレイデータ(ランタイムインスタンスのランタイムサイズ情報)、処理段階を記述するアルゴリズム(アレイ命令の関数メタ情報)及びハードウェア情報に関する情報を含む。
【0013】
これらのコンポーネントは多くの場合高いばらつき及び高い複雑性を呈するので、コンパイル時に、(実際の入力アレイデータを用いてターゲットマシン上でアルゴリズムを実行する前に)最高の実行ストラテジを発見することは困難であるか、又は更には不可能である。
【0014】
例えば、今日一般に見られる、以下でPUとも称される様々なタイプの処理ユニットを考慮する場合、ハードウェアのバリエーションを観察することができる。例えば:CPU、GPU、及びアクセラレーティングプロセッサデバイスは全て、様々な特色及び個々の特性を備えている。それらは、コアの数としてのサブ処理ユニットの数、浮動小数点ユニットの数、クロック周波数、ベクトルレジスタの長さ、複数のデータで単一の命令を実行する能力(SIMD)、及び更に多くのものにおいて異なる。
【0015】
ハードウェア情報は:処理ユニットのタイプ、処理ユニット、例えば、SIMD処理ユニットの計算サブユニットの数及び/又はタイプ、プロセッサの周波数、或る時間間隔あたりに複数の浮動小数点命令を実行する能力、ともに又は並列に実行される同様の又は等しい命令の数、例えばベクトルレジスタ長、データについての転送速度、記憶容量、例えばキャッシュサイズ、及びより効率的に特定の演算を処理する能力、例えば、結合積和又はプロセッサ固有演算、のうちの少なくとも1つを含んでよい。
【0016】
ハードウェアのバリエーションは、典型的には、より高いレベルの処理ユニットを、コンピュータのクラスタ/クラウド/ネットワークの個々に構成されるノードとみなす場合に継続する。各個々の異種コンピュータシステムバリエーションに固有なバリエーションに加えて、当然ながら、複数の、幾つかの、異なるコンピュータ上で、及び/又はその別のバージョン上で、プログラムを実行する能力、要求又は望みによっても導入される。
【0017】
処理ユニットのハードウェア情報を受信することは、処理ユニットの第1のサブユニット(第1のサブ処理ユニットとも称される)のハードウェア情報を受信すること、及び処理ユニットの第2のサブユニット(第2のサブ処理ユニットとも称される)のハードウェア情報を受信することを含んでよい。
【0018】
代替的に又はこれに加えて、ハードウェア情報を受信することは、第1の処理ユニットのハードウェア情報を受信すること、及び第2の処理ユニットのハードウェア情報を受信することを含んでよい。
【0019】
同様に、入力アレイデータにおけるバリエーションは、異なる入力アレイデータを用いて、及び/又は異なるサイズの入力アレイデータを用いてプログラムコードを実行する場合に観察され得る。「入力アレイデータ」という用語は、本明細書において使用される場合、プログラムコード内の特定のアルゴリズム分岐上のサブプログラム部分からもたらされる中間アレイデータを包含することに留意されたい。
【0020】
アルゴリズムにおけるバリエーションは、高レベルユーザプログラムコードを、コードを実行する役割を担う処理ユニットによって理解可能である(アレイ)命令に低級化する必要性から派生し得る。一般に、処理ユニットの個々のカテゴリ及び/又はタイプは、個々の命令セットの使用、及びその上、そのような実行に取り組むための個々のストラテジを要求する。例えば、CPU上で100.000の数を加算するために、シングルコアを使用することは、同じCPUの複数のコア上で同じ数を加算すること、及び/又はベクトルレジスタ、例えば、AVXを使用することとは異なる手法を要求する。同じコンピューティングシステム上のGPUを使用してこれらの数を加算するために更に異なる手法が要求され得る。
【0021】
本明細書において説明されるコンピュータ実装方法は、今日使用されている一般的なアレイベース言語実装において記述されるプログラムコードに特に適用可能であり、様々なハードウェア及び/又はデータサイズに対して高い効率性及び互換性を要求するプログラムに特に有用である。
【0022】
アレイベースプログラムアルゴリズムは、科学コミュニティ及び多くの産業分野において普及していることに留意されたい。今日最も一般的である2つのアレイベースプログラミング言語は、Matlab(登録商標)(Mathworks Inc.による)及びnumpy(python言語に基づく)である。別の例は、.NETプラットフォームのために利用可能であるILNumerics言語である。
【0023】
様々なタイプのスカラデータをそれらの命令における基本アイテムとして使用する一般的なアルゴリズムとは対照的に、アレイベース言語は、基本データアイテムとして入力アレイデータ構造を使用する。アレイは、典型的には、矩形構造を呈する。アレイの要素は、任意の数の次元に沿って配置されてよく、典型的には、全て同じタイプ、典型的には数値データタイプ、例えば、C言語における「double」又は「int」データタイプである。
【0024】
行列は、2次元を有するアレイの1つの典型的な例である。等しいサイズの行列のセットを、3次元アレイとして記憶することができる。「テンソル」という用語は、同様のn次元形状の抽象数学構造を指す。n次元アレイは、コンピュータストレージ上で記憶されるテンソルとして理解することができる。ストレージ要件に起因して、そのようなストレージのために一般に1次元コンピュータメモリが使用されるので、テンソルと比較してアレイを完全に表すために追加の情報が望まれ:ストレージレイアウトは、アレイの個々の要素がどのように1次元ストレージを介してアクセスされるのかを記述する。
【0025】
「ストライド」という用語は、本明細書において使用される場合、多次元アレイのストレージレイアウトに関する情報を指すように意図している。典型的には、ストライドは、アレイとともに、一般に(入力)アレイデータ構造のヘッダ部に記憶される。或る次元についてのストライド値は、一般に、その次元内に記憶される要素についてのストレージ距離を指定する。ストライド値は、多くの場合単位なしであり、アレイ要素タイプの単一の要素についてのストレージサイズのスケーリング係数であり、又はバイト距離について1である。
【0026】
潜在的なアレイ形状のセットは、ベクトル形状アレイも含み、ここで、ベクトルは、アレイの任意の次元に沿って、多くの場合最初の次元又は最後の次元に沿って延在し得ることに留意されたい。幾つかの言語は、単一の要素のみを記憶するスカラデータ(0次元アレイ)を可能にする。幾つかの言語は、アレイのための最小数の次元を定義し、少なくともその最小数の次元の行列又はアレイとしてスカラデータを記憶し、ここで、全ての次元が、1の長さを有する「シングルトン次元」である。N次元アレイは、Nが0よりも大きく、かつその次元のうちの少なくとも1つが0要素を有する場合、ゼロ要素を有し得る。Nが0である場合、典型的には、慣例によって、アレイはスカラであり、すなわち:それは、厳密に1つの要素を記憶する。
【0027】
ランタイムサイズ情報は、それぞれのランタイムインスタンスの次元の数、それぞれのランタイムインスタンスの次元のうちの少なくとも1つの次元の長さ、それぞれのランタイムインスタンスの要素のデータタイプ、それぞれのランタイムインスタンスのロケーション情報、それぞれのランタイムインスタンスの次元のうちの少なくとも1つの次元のストライド情報、のうちの少なくとも1つを含んでよい。
【0028】
以下でFMIとも称される「関数メタ情報」という用語は、本明細書において使用される場合、アレイ命令の入力に関するそれぞれの情報を所与として、アレイ命令又は更にはアレイ命令のシーケンスの出力の出力サイズ、形状及び潜在的には他の特性に関してプログラム的に通知することが可能であるデータ構造又は機能データ構造を記述することを意図している。典型的には、この方法が機能するために、各アレイ命令は、それぞれの(個々の)FMI、例えば、(コード)属性(C#属性クラスを参照されたい)を関連付ける。代替的に、各アレイ命令は、事前定義されたFMIのクラスを関連付け、又はコンパイラは、既知のアレイ命令又はアレイ命令の既知のクラスを事前定義されたFMIと照合する。
【0029】
プログラムコードの関数メタ情報は、典型的には、アレイ命令のシーケンスを指す。プログラムコードのFMIは、特に、シーケンスのアレイ命令の各々についての対応する(個々の)関数メタ情報を含んでよい。
【0030】
以下では、1つのアレイ命令のみを参照するFMIは、アレイ命令メタ情報、略してAIMIとも称される。AIMIは、典型的には、アレイ命令の(少なくとも1つの)入力に関するそれぞれの情報を所与として、アレイ命令の出力の出力サイズ、形状及び潜在的には他の特性に関してプログラム的に通知するように構成されている。
【0031】
特に、プログラムコードのFMIは、シーケンスの各アレイ命令についてのAIMI、例えばAIMIのセットを含んでよいか、又は更にはこれからなる。
【0032】
アレイ命令を、対応するアレイ演算として第1のプログラムセグメントに含めることは、第1のプログラムセグメントに、アレイ命令の各々についての対応するアレイ命令メタ情報を含めることを含んでよい。したがって、処理ユニット上で第1の計算カーネルを実行することは容易になり得る。
【0033】
これは、典型的には、生成され得る他のプログラムセグメント、特に以下で説明される第2のプログラムセグメントにも適用される。
【0034】
したがって、生成される第1のプログラムセグメント、典型的には幾つかの又は更には各々の生成されるプログラムセグメントは、(それぞれの)アレイ演算及び(各それぞれのアレイ演算についての)対応するアレイ命令メタ情報を含んでよい。
【0035】
各アレイ命令メタ情報は、典型的には、それぞれのアレイ命令の(少なくとも1つの)入力アレイデータ構造の入力サイズ情報についてのそれぞれのアレイ命令の出力の出力サイズ情報を決定することを可能にする。
【0036】
(プログラムコードの)関数メタ情報は、典型的には、アレイ演算の各々についてのサイズ情報、要素タイプ情報、及びレイアウト情報のうちの少なくとも1つ、典型的には、サイズ情報及び要素タイプ情報を含む。
【0037】
より典型的には、(プログラムコードの)関数メタ情報は、シーケンスの各アレイ命令についてのAIMIを含み、ここで、各AIMIは、それぞれのアレイ演算についてのサイズ情報、要素タイプ情報、及びレイアウト情報のうちの少なくとも1つ、典型的には、サイズ情報及び要素タイプ情報を含む。
【0038】
FMI及びAIMIは、それぞれ、多くの場合:入力データ情報を受信する関数、事前定義された関数、コンパイル時のコンパイル段階において、又はランタイムにおいてコンパイラによって構築及び/又はコンパイルされる関数のうちの少なくとも1つを含む。
【0039】
AIMI(個々のFMI)は、一般に、アレイ命令に関連付けられる。この方法に係るコンパイラは、多くの場合、複数のアレイ命令をセグメントに累積し、また、典型的にはセグメント化段階内で、それらのそれぞれのAIMIがセグメントFMIに組み合わされる(一例のために、以下の段階26も参照されたい)。
【0040】
国際公開WO2018/197695 A1号において記述されているように、FMIは、さらに、第1の(サブ)処理ユニットと同じタイプ又はカテゴリを有する処理ユニット上でそれぞれの共通データタイプのスカラ入力データ構造インスタンス及び/又は1つの要素を用いてそれぞれのアレイ命令を実行するための第1の数値エフォート係数、及び第2の(サブ)処理ユニットと同じタイプ又はカテゴリを有する処理ユニット上でそれぞれの共通データタイプのスカラ入力データ構造インスタンス及び/又は1つの要素を用いてそれぞれのアレイ命令を実行するための第2の数値エフォート係数を参照するエフォート情報を更に含み得る。
【0041】
さらに、FMI及びランタイムサイズ情報は、第1の(サブ)処理ユニット上でそれぞれのランタイムインスタンスを用いて第1のプログラムセグメントのアレイ命令を実行する第1の予想コストを数値計算し、第2の(サブ)処理ユニット上でそれぞれのランタイムインスタンスを用いてアレイ命令を実行する第2の予想コストを数値計算するのに使用される。
【0042】
またさらに、第1の(サブ)処理ユニットは、第1の計算カーネルがコンパイルされ、かつ第1の予想コストが第2の予想コストよりも低いか又はこれに等しい場合に第1の計算カーネルが実行される処理ユニットとして選択されてよい。そうではない場合、第2の(サブ)処理ユニットは、第1の計算カーネルがコンパイルされ、かつ第1の予想コストが第2の予想コストよりも高い場合に第1の計算カーネルが実行される処理ユニットとして選択されてよい。
【0043】
第1の計算カーネルをコンパイルすることは、特に、第1のサブユニットのハードウェア情報、第2のサブユニットのハードウェア情報、及びFMIに基づいて、少なくとも1つの入力アレイデータ構造インスタンスのランタイムインスタンスから、ランタイムインスタンスの第1の部分を参照する第1の部分的入力(アレイ)データ構造インスタンス及びランタイムインスタンスの第2の部分を参照する第2の部分的(アレイ)入力データ構造インスタンスを決定し、それにより、第1のサブユニットが第1の部分的入力データ構造インスタンスを入力として使用してアレイ演算のセットの対応するアレイ演算を実行する場合、かつ第2のサブユニットが第2の部分的入力データ構造インスタンスを入力として使用して対応するアレイ演算を実行する場合に、アレイ命令を実行するコストが最低であると予想されることを含んでよい。
【0044】
したがって、ワークロードは特に良好に分配されてよい。
【0045】
第1の計算カーネルは、特にハードウェア情報に従って、第1のサブユニット及び第2のサブユニットが同じタイプであり、及び/又は同じ計算特性を有する場合、及び/又は、FMI(AIMI)に従って、第1の部分的入力データ構造インスタンスのサイズ情報が第2の部分的入力データ構造インスタンスの対応するサイズ情報に等しい場合、第1のサブユニット及び第2のサブユニット上で実行可能であるようにコンパイルされてよい。
【0046】
さらに、第1の計算カーネルの第2の計算サブカーネルがコンパイルされてよく、第2の計算サブカーネルは、処理ユニットの第2のサブユニット上で実行可能である。
【0047】
計算カーネルはセグメントに対応するので、計算カーネルは、以下ではセグメントカーネル(略してカーネル)とも称される。本明細書において説明されるような計算カーネルは、幾つかの実施形態では、それぞれのプログラムセグメントからランタイムセグメントにおける計算カーネルを導出するために国際公開WO2018/197695 A1号において記述されているものと同様にそれぞれのプログラムセグメントから導出されてよいことに留意されたい。
【0048】
(それぞれ、第1のプログラムセグメントを生成するために、及びセグメント化中に)アレイ命令を、対応するアレイ演算として含める段階は、典型的には:
・アレイ命令のセット、特にアレイ命令のシーケンスからのアレイ命令のサブセットを、対応するアレイ演算として第1のプログラムセグメントに含める段階、
・関数メタ情報及びランタイムサイズ情報を使用して、アレイ演算のそれぞれのランタイム出力サイズ情報を決定する段階、
・削減アレイ命令を削減アレイ演算として含める段階、
・単項アレイ命令を、単項アレイ演算として含める段階、
・アレイアクセス命令を、アレイアクセス演算として含める段階、
・少なくとも1つの入力アレイデータ構造に対応するか又はこれから導出される(入力又は導出された)アレイデータ構造についての少なくとも1つのアレイアクセス命令にわたるループ命令のスカラ反復変数を、ループ命令によって生成される複数のループ反復インデックス値を参照するインデックスデータ構造に変換し、アレイアクセス命令とともにスカラ反復変数の代わりにインデックスデータ構造を使用する段階、及び
・バイナリアレイ命令を、バイナリアレイ演算として第1のプログラムセグメントに含める段階
のうちの少なくとも1つを有する。
【0049】
より詳細には、関数型言語要素のセットから、特にILNumerics言語からのアレイ命令を含むユーザプログラムコードが受信されてよい。
【0050】
そのような命令は、典型的には、関数/命令の以下のカテゴリに対応し、これらは、時として「map-reduce」タイプ演算と称されるとともにこれを含む、他のアレイベース言語において同様に見出される。
【0051】
単項関数、主に単一のアレイ引数を受信する。
【0052】
例:入力アレイAの要素の正弦を計算するsin(A)。出力のサイズ及び/又は形状は、一般に、入力Aのサイズに対応するか又はこれに等しい。
【0053】
バイナリ関数、主に2つのアレイ引数を受信する。出力のサイズ及び/又は形状は、一般に、両方の入力引数のブロードキャストされるサイズに対応するか又はこれに等しい。
【0054】
ここで、ブロードキャストという用語は、複数の異なるアレイ形状を二項演算においてハンドリングする確立された方法を指す(numpy又はILNumericsにおける「ブロードキャスト演算」及びMatlab(登録商標)における「互換可能アレイサイズ」を参照されたい)。短く述べると:2つのアレイのサイズ/形状は、全ての対応する次元の長さが一致するか又は次元のうちの少なくとも1つが長さ1であるかのいずれかである場合、ブロードキャスト可能(broadcastable)であるとみなされる。出力の次元の長さは、第1の入力及び第2の入力の対応する次元長の最大値に等しい。
【0055】
例:
1.2つのアレイA及びBの要素単位の総和を計算するadd(A,B);
2.2つのアレイA及びBの要素値の要素単位の最大値を計算するmax(A,B);
3.2つのアレイA及びBについてAがBの対応する要素の値よりも低い要素値を識別するIt(A,B)。
【0056】
削減関数、主に単一のアレイ引数を受信する。削減関数は、削減演算が実行される際に沿う軸又は次元を制御する別の引数を受信してよい。多くの場合、そのような軸は、定数値を軸引数として提供することによって固定される。又は、関数は、事前定義されたデフォルト値、多くの場合、第1の入力引数の次元のセットにおいて発見される第1の非シングルトン次元に従って削減次元を選択してよい。
【0057】
例:
1.アレイAの第2の(0ベースインデックス#1)次元内に記憶された全ての要素の総和を計算するsum(A,1)。
2.アレイAの第4の(0ベースインデックス#3)次元に沿って任意の非ゼロ値要素の存在を検出するany(A,3)。
【0058】
アレイ値へのアクセスは、アレイアクセス命令によって可能にされてよい。アレイアクセスは、単一/個々の要素、アレイの特定の次元内の要素の部分/範囲、インデックスによってアドレス指定される個々の要素、又はその混合を参照する。アレイアクセスは、変数によっても可能である:A[i,k]は、行i、列kにおける要素を読み出し、ここで、i及びkは、ユーザコードによって事前に定義及び初期化されるスカラの整数変数であってよい。
【0059】
方法は、バイナリアレイ命令の入力アレイデータ構造のランタイムインスタンスのそれぞれのサイズを決定し、全てのサイズが一致する場合、又はバイナリアレイ命令への入力アレイデータ構造のランタイムインスタンスのうちの少なくとも1つが複雑性基準(例えば、複雑性閾値未満であるか、又はアレイアクセス命令である)を満たす場合、バイナリアレイ命令を、バイナリアレイ演算として第1のプログラムセグメントに含め、そうではない場合、第1のプログラムセグメントの生成を終了することを更に含んでよい。
【0060】
第1のプログラムセグメントの(計算)コストに依存して第1のプログラムセグメントの生成が終了されてもよい。
【0061】
さらに、アレイ命令を第1のプログラムセグメントに含める前に、アレイ命令を含めることが、含まれるアレイ命令を有しない第1のプログラムセグメントの計算コストの総和よりも低いか又は等しい計算コスト及び含まれるアレイ命令のみを含む新たなプログラムセグメントの計算コストを有する第1のプログラムセグメントをもたらすか否かが検証されてよく、そうではない場合、第1のプログラムセグメントの生成が終了する。
【0062】
第1のプログラムセグメントを生成することは、その出力サイズがその入力データのうちの少なくとも1つの要素値に依存するアレイ命令が発見される場合、又は未知の命令が発見される場合、終了されてもよい。
【0063】
第1のプログラムセグメントを生成することは、典型的には、削減アレイ命令が、FMI及びランタイムサイズ情報に基づいて、1つの出力要素、例えば唯一の要素が値ゼロを有するスカラアレイを生成するために決定される場合、削減アレイ命令を含めた後にも終了される。
【0064】
第1のプログラムセグメントの生成を終了した後、典型的には第1のプログラムセグメントについて説明されたものと少なくとも実質的に同じ方法において、プログラムコードから、第2のプログラムセグメントが生成されてよい。
【0065】
特に、第2のプログラムセグメントは、アレイ命令のシーケンスから、ランタイムサイズ情報、関数メタ情報及びアレイ命令に基づいて生成されてよい。特に、対応するアレイ演算、より典型的には残りのアレイ命令のセットとして、1つ又は複数の残りのアレイ命令が第2のプログラムセグメントに含められてよい。さらに、第1のプログラムセグメントの生成を終了する間、削減アレイ命令を削減アレイ演算として含めることからもたらされ得る遅延マージアレイ演算が、(第1のアレイ命令として)第2のプログラムセグメントに追加されてよい。
【0066】
それぞれのランタイムインスタンスについてのランタイムサイズ情報、特にサイズ情報は、更なるプログラムセグメントによって、又は更なるプログラムセグメント、特に直前のプログラムセグメントのFMIに基づいて、典型的には更なるプログラムセグメントのそれぞれの計算カーネルを実行する前に、決定されてよい。
【0067】
同様に、処理ユニット上で第1の計算カーネルを実行することからもたらされる出力アレイ構造インスタンス、特に第1の出力アレイ構造インスタンスは、プログラムコードから生成された更なる、例えば第2のプログラムセグメントに基づいてコンパイルされた更なる、例えば第2の計算カーネルの入力(アレイ)データ構造インスタンスとして使用されてよい。
【0068】
入力アレイデータ構造インスタンスのそれぞれのランタイムインスタンスのロケーション情報は、第2のプログラムセグメント、又は多くの場合遅延マージ演算から開始する別の更なるプログラムセグメントに基づいて決定されてよい。
【0069】
上記で既に説明されたように、それぞれのプログラムセグメントは、典型的には、少なくとも1つのコンパイラによって生成される。
【0070】
幾つかの既知のコンパイラは、カーネル(時として「ランタイムセグメント」の一部と称される)又は特定のPU上での実行のための同様の低レベルコードを、或る程度まで最適化することができることに留意されたい。時として、JITコンパイラは、まず弱く最適化されたか又は最適化されていないバージョンを作成し、この結果を、後に更により良好に最適化されたバージョンに置き換えてよい。しかしながら、そのようなコンパイル単位(例えば:関数、中間言語命令、プログラムセグメント又はアレイ命令の特定のセット)についてのソースの範囲は、現在まで同じままであり、及び/又は、ランタイム情報を考慮しておらず、少なくともプログラムコードをセグメント化するためには考慮していない。それとは異なり、本明細書において説明される方法は、ランタイムにおいて、及び全ての関連情報が利用可能である場合、プログラムセグメントが含む命令のスパン(カーネルコンパイルのソース範囲)を最適化することを可能にする。
【0071】
さらに、幾つかのプログラムセグメントは、典型的には、プログラムコードから生成され、特に、プログラムセグメントのシーケンスは、時としてユーザコードの修正されていない部分と交互配置されて、生成されてよい。
【0072】
したがって、プログラムセグメントの各々について対応する計算カーネルがコンパイルされてよい。
【0073】
さらに、計算カーネルは、(サブ)処理ユニット上で実行されてよい。
【0074】
一実施形態によれば、受信されたプログラムコードのセグメント化、すなわち、受信されたプログラムコードから、それぞれのプログラムセグメントを生成することは、入力アレイデータ構造のそれぞれのランタイムインスタンスのランタイムサイズ情報を決定すること、及び、受信されたプログラムコードのアレイ命令のシーケンスから、ランタイムサイズ情報、処理ユニットのハードウェア情報、関数メタ情報及びアレイ命令に基づいて、アレイ命令を、対応するアレイ演算としてそれぞれのプログラムセグメントに含めることを含む。
【0075】
同様に、1つ又は複数のコンパイラは、そのようなセグメント化を実行するように構成されてよい。特に、(対応する)コンピュータプログラム製品及び/又はコンピュータ可読媒体は、コンピュータによって実行されると、コンピュータに、本明細書において説明されるような受信された(ユーザ)プログラムコードのセグメント化のプロセスを実行すること、及び典型的には処理ユニット上で実行可能であるそれぞれの計算カーネルをコンパイルすることも行わせる命令を含んでよい。
【0076】
ハードウェア情報は、典型的にはコンパイルのために使用されるが、セグメントを終了する等のセグメント化中の特定のプロセスのため、及び/又は、アレイ命令が現在生成されているプログラムセグメントに含まれるか又は更なるプログラムセグメントに含まれるかのいずれかを判断するためにのみ使用されてよいことに留意されたい。
【0077】
それぞれのプログラムセグメントは、典型的には、中間表現、特にバイトコード表現として(特に第1のコンパイラ又はコンパイラステージによって)生成される。
【0078】
それぞれの計算カーネルは、典型的には処理ユニットを提供するコンピューティングシステム、例えばコンピュータ上で実行される、典型的にはジャストインタイム(JIT)コンパイラによってコンパイルされる。
【0079】
この目的で、JITコンパイラは、典型的には、対応する中間表現として受信されるそれぞれのプログラムセグメント、ランタイムサイズ情報及びハードウェア情報に基づいて、処理ユニット上で実行可能な計算カーネルを(特に第2のコンパイラとして)コンパイルする。
【0080】
JITコンパイラは、例えば、(処理されるランタイムインスタンスの)ランタイムサイズ情報が変化すると、(新たな)計算カーネルをコンパイル/再コンパイルしてよいことに留意されたい。
【0081】
しかしながら、再コンパイル段階は、ランタイムサイズ情報が顕著に変化しない場合、より特に追加のコンパイルコストが計算カーネルの実行中に達成可能な更なるコスト削減を超えることが予想される場合、例えば、それぞれのランタイムインスタンスの次元の長さが例えば数パーセント未満だけ変化するのみである場合、及び/又は、既にコンパイルされたカーネルが可変次元長の入力アレイインスタンスをハンドリングするように適している(カーネル特殊化)である場合、破棄されてもよい。
【0082】
第1のコンパイラは、アレイ命令を実行するために処理ユニットを提供するコンピューティングシステム上で実行され得るが、異なるコンピューティングシステム上でも実行され得る。
【0083】
さらに、第1のコンパイラ及び第2のコンパイラの機能は、(計算カーネルを実行するために処理ユニットを提供するコンピューティングシステム上で実行される)1つのコンパイラによっても提供されてよい。
【0084】
この目的で、プログラムセグメントを生成し、計算カーネルをコンパイルするために使用されるコンピューティングシステムは、典型的には、本明細書において説明されるように、プログラムコードから、プログラムセグメントを生成し、それぞれの計算カーネルをコンパイルするそれぞれの命令を記憶する非一時的コンピュータ可読媒体へのアクセスを有し、より典型的にはこれを含む。
【0085】
したがって、コンピュータプログラム製品及び/又は非一時的コンピュータ可読媒体は、典型的には、コンピュータの少なくとも1つのプロセッサ(例えば、処理ユニット)によって実行されると、コンピュータに、少なくとも計算カーネルをコンパイルするプロセスに至るまで、かつこれらを含む、本明細書において説明される方法を実行させる命令を含む。
【0086】
それゆえ、それぞれのコンパイラインフラストラクチャは、アレイ命令を有するプログラムコードから、改善された又は更には最適化された計算カーネルを生成するために提供されてよい。
【0087】
それぞれのプログラムセグメントを生成する(それが中間表現を形成するコンパイルプロセスを含み得る場合であっても、略してセグメント化とも称される)ために、以下のプロセスが典型的には(少なくとも1つのコンパイラによって)実行される:
・プログラムコードを解析する段階;
・プログラムコードについての抽象構文木(AST)を生成する段階;
・それぞれのプログラムセグメントについて空セグメントを生成する段階;
プログラムコードの抽象構文木(AST)を検査する段階;及び/又は
・抽象構文木(AST)内で発見されたノードをそれぞれのプログラムセグメントに含める段階。
【0088】
本明細書において説明される方法は、典型的には、効率的なドメイン固有言語(domain specific language:DSL)実装に対応する。一般に、そのようなDSLは、効率的なメモリ管理が可能なアレイデータタイプを含む。例えば、ILNumerics数学DSLにおけるアレイは、全てのPU/PUに関連付けられたメモリ上に要素値を記憶することができる。アレイデータが記憶される(ロケーション情報)PU又はそれらのそれぞれのメモリのセットは、アレイの特性(ランタイム情報)であり、アレイのライフタイム全体を通した実行中に維持される。
【0089】
アレイデータが同時に複数のPUのメモリ上で記憶され得る一方、本願の残りの部分では、別段に述べられない場合、任意の1つのPUメモリ上の排他的ストレージロケーションを仮定する。この制約は、本明細書において説明される方法の一般的利用可能性を限定しない。これは、簡潔性の理由で導入され、方法を実証するために複雑性を低減させる。
【0090】
少なくとも主にDSLにおいて記述されるユーザコードは、C#又はVisual Basic(登録商標)等のホスト言語に埋め込まれてよい。ホスト言語は、典型的には、コードの複数の部分にわたってループ又は反復する一般的な手段を提供する。
【0091】
以下のC#の例は、各要素の値を、現在の値から正弦を計算した結果に置き換えて、行列Aの第4列の要素にわたって反復するループを記述している:
【数1】
【0092】
そのようなループも、本明細書において説明される方法によって効率的にハンドリングすることができる。
【0093】
計算カーネルをコンパイルすることは、典型的には、以下のプロセス:
・それぞれのランタイムインスタンスのランタイムサイズ情報及びFMIに基づいて、それぞれのプログラムセグメントのワークロードを決定する段階;
・第1のサブユニット及び第2のサブユニットによって処理されるワークロードのそれぞれの部分を決定する段階;
・ハードウェア情報を使用して、第1のサブユニット及び第2のサブユニットのためのそれぞれの計算容量を決定する段階;
・第1のサブユニット及び第2のサブユニットのための計算容量に従って、第1の部分的入力(アレイ)データ構造インスタンスのサイズ及び第2の部分的入力(アレイ)データ構造インスタンスのサイズを決定する段階;
・第1の部分的入力データ構造インスタンス及び第2の部分的入力データ構造インスタンスを作成する段階;
・第1の部分的入力データ構造インスタンスを、処理ユニットの第1のサブユニット上で実行される第1の計算カーネルの入力として使用する段階;
・第2の部分的入力データ構造インスタンスを、処理ユニットの第2のサブユニット上で実行される第1の計算カーネルの入力として使用する段階;及び
・第2のサブユニット上で実行される第1の計算カーネルの第1の出力及び第2のサブユニット上で実行される第1の計算カーネルの第2の出力を組み合わせて、第1の出力アレイ構造インスタンスを形成する段階
のうちの少なくとも1つ、より典型的にはその幾つか、及び更により典型的にはその全てを含む。
【0094】
「ワークロード」という用語は、本明細書において使用される場合、少なくとも入力データ(より詳細には入力アレイデータ)の特定のセットを所望の結果に変換するために要求される基本数値演算の総数の尺度を指す。基本命令は、典型的には、スカラ数学演算:加算、減算、乗算、除算、否定、ブール値(真/偽)をもたらす比較演算を含む。
【0095】
多くの場合、数値アルゴリズムの実用的な実装のために、処理ユニットは、特定の処理ユニット(PU)上で基本命令を実行するために、更なるサポート、制御、又は管理命令を実行する。例えば、2つのスカラ数値入力データa及びbに対する基本命令プラス(「+」又は加算)は、1つの単一クロックサイクル内で最新の処理ユニットによって実行することができる。しかしながら、これは、データが関連付けられたレジスタ内で既に利用可能であることを要求する。データをそれぞれのレジスタにロードすることは、多くの場合、更なる命令を要求し、したがって、更なるクロックサイクルがPUによって費やされる。
【0096】
本明細書において説明される方法を使用する幾つかのシステムは、時として、個々に各処理ユニットのための、又は各処理ユニットタイプ又は種類及び/又は各基本命令タイプ又は種類のための、そのようなオーバヘッドについて、少なくとも1つの値、例えば平均被加数値を取得、考慮、及び/又は維持してよい。しかしながら、多くの場合、実装は、方法を非機能的にすることなく、ワークロードのための値の決定におけるそのようなオーバヘッドを無視する。
【0097】
理想化プロセッサは、有用な基本命令を実行するために、一切のオーバヘッドを招かない仮想処理ユニットである。ワークロードは、典型的には、特定のユーザコード命令又はそれから導出された命令又は演算から導出されるか、又はこれらに関連付けられ、及び特定の入力データから導出されるか、又はこれらに関連付けられる。ワークロードは、独立したデバイスとみなされる。ワークロード値は、一般には、特定のハードウェアデバイス又は処理ユニットに関連付けられることもなく、それが当該特定のハードウェアデバイス又は処理ユニットに関することもなく、それが特定のハードウェア能力を考慮することもない。
【0098】
以下では、別段に述べられない場合、単に簡潔性の理由のために、ワークロード値は、個々の処理ユニットが理想化プロセッサであるという簡略化した仮定に基づいて計算される。
【0099】
アレイ命令又はアレイ命令のシーケンスのワークロードは、アレイ命令、特にアレイ命令のシーケンス又はセットに従って入力アレイデータを所望の結果に変換するために要求される基本命令の総和として理解される。幾つかのアレイ命令は、他のアレイ命令と比較される場合、命令ワークロード及び/又は単一の要素を計算するワークロードに関する異なる特徴を呈し得ることに留意されたい。
【0100】
例えば、基本命令プラス(又は加算又は「+」)は、所与のハードウェア(コンピューティングシステム)について、単一の浮動小数点演算に対応する1の例示的なワークロード(値)に関連付けられてよい。したがって、(2つの入力アレイA及びBの対応する要素を加算するための)アレイ命令add(A,B)は、1を乗算される(潜在的にはブロードキャストを実行する)生成される出力の要素の数に従ってワークロードに関連付けられる。
【0101】
同じハードウェアの場合、入力数aの正弦を計算するより複雑な命令sin(a)は、複数の基本演算が(同じコンピューティングシステム上で)正弦を計算するように実行することが要求されることに対応する、(少なくとも1つのコンパイラによって)100のワークロード値に関連付けられてよい。100の数は、例えば、経験によって、発見的手法によって、ルックアップテーブルによって、測定によって、又は特定の処理ユニットの仕様によって、見出すことができる。
【0102】
したがって、この例では、入力アレイAの各要素の正弦を計算するアレイ命令sin(A)は、100を乗算されるAにおける要素の数に対応するワークロード値に関連付けられてよい。
【0103】
同様に、同じハードウェアの場合、Aの第1の次元に沿った要素を削減してこれらの要素の値の総和を生成するアレイ削減命令sum(A,0)のワークロードWは、以下の定式に従ってワークロードに関連付けられてよい:
【0104】
W=1*(A.S[0]-1)*A.NumberOfElements/A.S[0] .
【0105】
ここで、主係数1は、sum()アレイ命令に内在的な基本命令add(a)の例示的なワークロードに対応する。(括弧内の)第2の係数は、A(Aが行列として表示される場合)の各列における要素に沿って実行される加算の数に対応する。これらの2つの係数によって形成される積は、1つの単一出力要素のためのワークロードに対応する。第3の係数は、アレイ命令sum(A)によって生成される要素の数に対応する。
【0106】
上記の例は理想化プロセッサに基づいてワークロード計算を考慮することに留意されたい。
【0107】
方法の多くの実装では、ワークロード値は、特に、入力データのうちの少なくとも1つが浮動小数点数である場合(例えば:IEEE754を参照されたい)、及び/又はシステムが処理のための専用浮動小数点ユニットを認識又は利用する場合(例えば:x87数値プロセッサ拡張、NPXを参照されたい)、単位「浮動小数点演算」(FLOP又はFLOPs)を有する。非浮動小数点演算(例えば:整数又は比較演算)のために、より一般的な尺度又は単位、例えば:低レベル演算、又は演算を実行するために要求されるクロックサイクルが使用されてよい。
【0108】
典型的には、特に効率性の理由で、厳密な絶対値の代わりに、個々の演算間で処理のために実際に要求される低レベル演算の比率に従った相対ワークロードを表すとともに保持する基本演算についてのワークロード値を決定及び使用することがより重要である。しかしながら、効率性は、典型的には、より厳密な基本ワークロード尺度を使用することによって改善される。
【0109】
「コスト」という用語は、本明細書において使用される場合、典型的には、「計算コスト」及び「予想コスト」という用語と同義で使用され、(計算カーネルを実行するために使用される)時間及び/又はエネルギーの量又は尺度を記述することを意図している。多くの場合、コストは、処理ユニット(PU)が、それぞれ、計算カーネルを実行する(アレイ命令、特にアレイ命令の特定のセットを実行する)、及びアレイ演算を含むプログラムセグメントの結果を計算する際に費やすと予想される最小時間又はエネルギーに関する。コストという用語は、「エフォート」及び「予測最小実行時間」という用語を包含するものとし、典型的には、特定のワークロードに関連付けられた命令を実行するための処理ユニットの容量又は能力を考慮する。
【0110】
セグメントの命令を実行するコストは、(時として、楽観的に)少なくとも1つの処理ユニットの最大コンピューティング能力に基づいて、費やされる理想又は最小時間又はエネルギーとして決定されてよい。この理想化された視点では、関与する処理ユニットの全てのコンピューティングリソースは理想的には結果(ピーク性能)を計算するために対処及び利用されることが仮定される。この視点は、多くの場合、少なくとも幾つかの影響を与える因子、例えば、処理ユニットによる、及びメモリ階層の様々なレベルでのデータアクセスのオーバヘッド、実行中の任意の時点における処理ユニットの利用レートの厳密な尺度を決定する複雑性、システムを利用する他のプロセスによる影響、関与する様々なアーキテクチャ上でのセグメントカーネルコードコンパイル及びインスタンス化を管理するオーバヘッドを無視する。
【0111】
典型的には、複数の処理ユニット及び/又はサブユニットに対応するそれぞれのコストは、(コンパイラによって)計算、使用、及び/又は比較される。そのようなコストは、多くの場合、それぞれの処理ユニット上でセグメントのワークロードを組み合わせる命令を実行するために少なくとも要求される時間を考慮する。多くの場合、システムは、理想化プロセッサとして特定のPUを考慮する。
【0112】
アレイ命令の特定のシーケンスのためのワークロードが主に特定のコンピューティングシステムのハードウェア構成から独立している一方、コストという用語は、特定の処理ユニット(又は複数の処理ユニット)上でワークロードに対応する命令を実行するために要求される時間又はエネルギーの尺度を記述する。それゆえ、それぞれのコスト(値)は、特定のハードウェア特性に依存するとともに、これに関する。
【0113】
コスト値は、典型的には、処理部分に対応する更なる時間又はエネルギー値を一般的に含むコストモデルの結果として取得され、これらは、セグメントワークロードを処理するために要求される全体時間に顕著に寄与し、例えば:メモリ転送時間を含むデータプロビジョンは、メモリアクセス及びデータストレージ時間を含む場合も含まない場合もある。
【0114】
他の例は、管理命令、制御命令、又は更なる命令、例えば:カーネル生成及びカーネルコンパイル、コスト決定のためのオーバヘッドによって示唆される更なる実行時間である。幾つかの実装は、より複雑なモデルよりもコスト決定のための単純なコストモデルに選好し、それゆえ、厳密性よりもコスト予測の簡潔性を優先する。他の実装は、より厳密なコスト計算を優先し、時としてより高速な結果を達成することができる。幾つかの実装は、時として動的に及び/又はランタイムにおいてでさえ、厳密性を実行速度とバランスさせることができる。
【0115】
特定のPU上の特定の入力アレイデータ(入力アレイデータ構造のランタイムインスタンス)を用いてアレイ命令のシーケンスを実行するコストは、多くの場合理想化プロセッサを仮定して、又は測定に基づいて、データをPUに転送する時間、及びPU上で入力データを用いてアレイ命令のワークロードを組み合わせる全ての基本命令を実行するために要求される時間を総和することによって計算されてよい。
【0116】
特に、PUは、セグメントのワークロードをコストに基づいてそのサブユニットのうちの少なくとも2つに分割するように(コンパイラによって及び/又は計算カーネルを介して)命令されてよい。この実施形態では、セグメントワークロードを処理する全体コストは、個々のサブユニットコストの最大値として決定されてよい。
【0117】
したがって、ワークロードは、特に低い実行時間及び/又は特に低いエネルギー消費をもたらす方法において分配されてよい。
【図面の簡単な説明】
【0118】
図におけるコンポーネントは、必ずしも縮尺どおりではなく、その代わりに、本発明の原理を示すことに強調が置かれている。その上、図において、同様の参照符号は、対応する部分を指定する。図面は、以下のとおりである。
【0119】
図1A】一実施形態に係るコンピュータ実装方法を示す図である。
【0120】
図1B図1Aにおいて示された方法が使用され得る例示的なコンピューティングシステムを示す図である。
【0121】
図2】実施形態に係るコンピュータ実装方法を示す図である。
【0122】
図3】実施形態に係るコンピュータ実装方法を示す図である。
【0123】
図4】一実施形態に係る、コンピュータ実装方法及び異種コンピューティングシステムの方法の段階を示す図である。
【0124】
図5】実施形態に係る、コンピュータ実装方法の方法の段階を示す図である。
【0125】
図6】実施形態に係る、コンピュータ実装方法の方法の段階を示す図である。
【発明を実施するための形態】
【0126】
以下の詳細な説明では、本明細書の一部をなすとともに、本発明が実践され得る特定の実施形態が例示として示されている添付の図面に対して参照が行われる。これに関して、「頂部(top)」、「底部(bottom)」、「前(front)」、「後(back)」、「前縁(leading)」、「後縁(trailing)」等のような方向に関する術語は、説明されている図の向きを参照して使用される。実施形態のコンポーネントは多くの異なる向きにおいて位置決めすることができるので、方向に関する術語は、決して限定ではなく、図示の目的で使用される。本発明の範囲から逸脱することなく、他の実施形態が利用されてよく、構造的又は論理的変更が行われてよいことが理解されるべきである。したがって、以下の詳細な説明は、限定の意味で解釈されるべきではなく、本発明の範囲は、添付の特許請求の範囲によって定義される。
【0127】
ここで、様々な実施形態に対して詳細に参照が行われ、それらの1つ又は複数の例が図において示されている。各例は、説明として提供され、本発明の限定として意図されていない。例えば、1つの実施形態の一部として図示又は説明される特徴は、他の実施形態に対して、又はこれらと組み合わせて使用して、また更なる実施形態を得ることができる。本発明は、そのような修正及びバリエーションを含むことが意図される。例は、特定の言語を使用して説明されるが、これは、添付の特許請求の範囲の範囲を限定するものとして解釈されるべきではない。図面は、縮尺どおりではなく、単に例示の目的のためのものである。明瞭性のために、同じ要素又は製造段階は、別段に述べられない場合、異なる図面において同じ参照符号によって指定されている。
【0128】
図1Aに関して、コンピュータ実装方法1000の方法の段階が説明される。
【0129】
その各々が1つ又は複数のプロセス又は段階に対応し得るブロックI~IVを有する示されたフローチャートのブロックIにおいて、それぞれの共通データタイプの複数の要素を記憶するアレイ命令入力アレイデータ構造のシーケンス、及び入力アレイデータ構造のそれぞれの入力サイズ情報についてのアレイ命令のシーケンスの各アレイ命令の出力の出力サイズ情報を決定することを可能にする関数メタ情報(FMI)を有するプログラムコードが、典型的にはコンパイラによって、受信される。
【0130】
後続のブロックII、IIIにおいて、(第1の)プログラムセグメントがプログラムコードから生成され、処理ユニット、例えば図1Bにおいて示されるような処理ユニットのハードウェア情報が、それぞれ受信及び/又は決定される。
【0131】
ブロックIIにおいて、処理される入力アレイデータ構造のそれぞれのランタイムインスタンスのランタイムサイズ情報が決定され;アレイ命令は、ランタイムサイズ情報、関数メタ情報及びアレイ命令に基づいて、アレイ命令のシーケンスから対応するアレイ演算としてプログラムセグメントに追加される。ブロックII、III間の矢印によって示されているように、プログラムセグメントを生成することは、ハードウェア情報にも依存し得る。
【0132】
後続のブロックIVにおいて、第1のプログラムセグメント、ランタイムサイズ情報及びハードウェア情報に基づいて、処理ユニット上で実行可能である(第1の)計算カーネルがコンパイルされる。
【0133】
その後、計算カーネルは、ランタイムインスタンスを入力として用いて、処理ユニット上で実行される。
【0134】
典型的には、ブロックIにおいてユーザプログラムコードが受信及び解析される。
【0135】
さらに、コンパイラに既知であり、それぞれのFMIに関連付けられるアレイ命令のシーケンスが位置特定され、1つ又は複数のプログラムセグメントに含まれてよい。
【0136】
したがって、方法は、入力アレイデータ構造のランタイムインスタンスのランタイムサイズ情報を検査し、ランタイムサイズ情報、関数メタ情報及びアレイ命令に基づいて、アレイ命令のシーケンスからのいずれの命令が対応するアレイ演算としてセグメントに含められることになるのかを判断してよい。
【0137】
図1Bは、処理ユニットPU1を有する例示のコンピューティングシステムを示している。例示的な実施形態では、PU1は、多くの場合、デスクトップコンピュータ、ラップトップ、又はコンピューティンググリッド又はクラウドシステムのコンピューティングノードにおいて見出されるもののような、コンピューティングシステムの計算リソースを表す。PU1は、(第1のサブユニットPU2として)CPU、及び(第2のサブユニットPU3及び第3のサブユニットPU4として)2つのGPUを含む。PUのうちの幾つかは、多くの場合、それぞれのPUによる専用メモリに記憶されたデータへの高速アクセスを可能にする当該専用メモリを備えてよい。システム上の他のPUのメモリに記憶されたデータにアクセスすることは、一般に、より長いアクセス時間を要求する。幾つかの実施形態では、幾つかのPUは、同じメモリ及び/又は同じアドレス空間を共有する。
【0138】
図1Bのコンピューティングシステムでは、PU2、PU3及びPU4は、PU1のサブユニットである。PU1は、サブユニットの親ユニットと呼ばれる。任意の処理ユニットを、サブユニットのサブユニットとすることができる。PUの更なる例は、DSP、マイクロコントローラ及びFPGAである。
【0139】
多くの場合、そのようなシステムは、CPUのようなホストコントローラを含む。サブユニットは、典型的には、ホストコントローラによって管理され、これは、自身が制御するサブユニットと同じユニット/デバイス上に存在しても、しなくてもよく、及び/又は、それ自体処理ユニットである。データ又はコードを実行、コンパイル及び/又は転送するようにサブユニットに命令するコマンドは、本発明のコンパイラによって共通して発行され、ホストコントローラに送信され、ホストによって、コマンドを受信及び/又はハンドリングするためにアドレス指定及び選択された処理ユニットに転送される。
【0140】
時として、そのようなコマンドは、更なるコンパイラ又は同様の技術によって、アドレス指定された処理ユニット又はそのサブユニットのうちの少なくとも1つに固有の命令に更に翻訳される。例えば、OpenCLカーネルコードは、OpenCL対応PUに送信され、多くの場合、PUに関連付けられたコンパイラによってPUのための命令に翻訳され(低級化され)、PU又は当該PUのサブユニットのプロセッサは、多くの場合、バイナリ命令を実行することが可能である。
【0141】
典型的には、処理ユニットは、複数のより小さいユニットが1つのより大きいユニットとしてともに機能するために接続される階層アーキテクチャを呈する。したがって、処理ユニットは、そのサブユニットのコンピューティングリソースへのアクセスを利用可能にしてよく/これを提供又は管理する。典型的には、処理ユニットのマージされたコンピューティング能力は、コンピューティングシステム階層のノード内のPU位置とともに増大する。
【0142】
幾つかのPUは、例えば、ハードウェア特性を決定する制御命令、ワークロードを分割する制御命令、セグメントカーネルを準備する制御命令、及び/又は、データ及び/又は命令を分配する制御命令を実行することが可能である。そのようなPUは、「アクティブ」PUと呼ばれ、例えば、Intel(商標)i9 CPUのシングルコアである。
【0143】
他のPUは、基本演算、例えば、事前構成されたセグメントカーネルを実行することが可能である。そのようなPUは、「パッシブ」PUと呼ばれ、例えば、Nvidia GeForce GTX 280 GPUのストリーミングマルチプロセッサである。
【0144】
一般に、コンピューティングシステムのコンピューティングリソース/PUの組織構造は、PUのツリーを形成し、ここで、ツリーの内部ノードは、アクティブPUを表し、一方、ツリーの葉は、パッシブPUを表す。多くの場合、本明細書において説明される方法の実装は、セグメント化、カーネル準備、ワークロード分配及びディスパッチ、エンキュー、及び/又は、時として再帰的な、時としてカーネル命令実行とも称される、セグメントカーネル実行の開始のためにアクティブPUを利用する。パッシブPUは、主に、カーネル命令を実行する。アクティブPUは、パッシブPUとして使用されてもよい。
【0145】
PUのコンピューティング能力又は計算容量は、PUベンダの仕様によって、測定によって、又は構成によって決定され、適切なインターフェース、多くの場合ベンダによって提供されるドライバ又は標準化されたAPIを使用してコンパイラによってランタイムにおいてクエリされ得る。例えば、PUにおけるAVX拡張のコンピューティング能力は、多くの場合、OpenCL APIによって、又はCPUID x86命令を介して提供される対応する関数を呼び出すことによって決定することができる。
【0146】
多くの場合、「コンピューティング能力」又は「計算容量」のための有用な尺度は、ユニットが実行することが可能である浮動小数点演算/秒(floating-point operations per seconds:FLOPS)の数である。時として、非浮動小数点演算の場合、一般的な尺度はMIPSである。PUは、例えば、そのサブユニットのコンピューティング能力及びそれ自体の能力を、存在する場合、かつコンパイラがそれら全てに効率的に対処することができる場合、累積することによる、自身が実行することが可能である累積コンピューティング能力に関して通知することができる。
【0147】
例えば、CPUのシングルコア(一般的にアクティブPUとして示される)は、そのサブユニット(多くの場合、AVX又はSSEのようなSIMDベクトル拡張)のFLOPSに、そのx87ユニットのFLOPS値(存在する場合)を加えた総和を提供することができる。しかしながら、セグメントカーネル内のコンパイラがベクトルレジスタのみに対処する場合、x87ユニットは、ワークロードを処理するために直接利用されず、そのFLOPS値は無視され得る。
【0148】
図2は、上記で説明された方法1000と同様であるが、以下の(部分的)ユーザプログラムコードUCを参照するものとして更に詳述される、コンピュータ実装方法の方法の段階を示している。
【表1】
【0149】
例示的なユーザコードは、Aと名付けられるデータセット内の各データ点について、Bと名付けられる別のデータセット内の最近傍(L2ノルム)データ点のインデックスを位置特定するアレイ命令、発見された各インデックスに、第3のデータセットC内のデータ点座標の正弦を乗算するアレイ命令、及びその結果を「クラス」と名付けられるデータ構造の対応するスロットに記憶するアレイ命令を含む。
【0150】
この部分的コードは擬似コードとみなされ、典型的には実行される完全なコードではなく、それ自体明瞭性の理由で選択されたものであることに留意されたい。典型的には、それは、ここでは示されていない、実行可能である更なる命令を有するより大きなユーザプログラムコードの一部である。例示的なユーザコードは、主に、方法を実証するために、ILNumerics及びC#言語の要素に基づいている。当業者であれば、そのような要素の具体的な名称及びシンタックスは1つの言語に固有であるが、これらの詳細は、説明される方法が機能するためには関連していないことが明らかであろう。全てのアレイベース言語が、本明細書において説明される方法に適用可能であり、例示的な例において示される要素の代わりに使用することができる同様の言語構築を提供する。
【0151】
例えば、左オペランドの、右オペランドの指数に対するべき乗を示す「**」演算子は、C#言語においては存在しないが、FORTRAN言語において存在する。C#言語では、ユーザは、代わりにpow(...,2) ILNumerics言語要素を使用する可能性がある。この方法に係るコンパイラは、「**2」及び「pow(..,2)」の両方のセマンティックにおける類似性を理解し、両方とも「平方」演算を利用して実装する。
【0152】
第1のブロック10(実質的に図1AにおけるブロックIに対応する)において、ユーザプログラムコードが受信され、その一部が、更なる効率的な解析及び操作のために抽象構文木(AST)又は同様のデータ構造に変換される。
【0153】
一般的に、コンパイラは、ユーザコード又はその代替、例えば、別のコンパイラの出力としての中間表現、手動翻訳、又は意図されるアルゴリズム、例えばXMLコードを表すデータ構造を受信する。典型的には、コンパイラは、ユーザコードを検査し、個々のアレイ命令をパースし、命令から抽象構文木(AST)が形成される。幾つかの実装では、AST又はその修正バージョンは、コンパイラへの入力として機能する。この場合、段階10は省略されてよい。
【0154】
典型的には、コンパイラは、ユーザコードからの命令のサブセットのみを認識してよい。したがって、一実装は、発見された既知のサポートされているアレイ命令のシーケンスに従って、複数のASTインスタンスを作成及び/又はハンドリングしてよい。方法の後のブロックにおいて、そのような実装は、ユーザプログラムの最適化されたバージョンを得るために、セグメントコードをユーザプログラムに再結合することができる。したがって、セグメントは、典型的には、解析されたユーザコードと同じ言語において(コンパイラによって)実装され、外部ライブラリ呼び出しを介してユーザコードに接続される。
【0155】
図2のブロック20(実質的に、図1AにおけるブロックIIに対応する)において、ASTはセグメントに変換される。セグメント化段階20において、コンパイラは、アレイ命令を反復し、対応するアレイ演算のシーケンスを含む第1のセグメントを形式する。このプロセスは、図3に関して以下で更に詳細に説明される。
【0156】
図2のブロック30(実質的に、図1AにおけるブロックIII、IVに対応する)において、それぞれ、処理ユニットのハードウェア情報が受信され、計算カーネルがコンパイルされる。
【0157】
ユーザコードから1つのセグメント又は複数のセグメントを形成するために、コンパイラは、一般的には、ユーザコードのASTの葉において、すなわち:図3のブロック21において示されるようなアレイ入力データにおいて開始する。ASTの葉は、アレイ、アレイアクセス命令、インデックス作成命令、又はアレイビュー命令によって形成される。他の実装では、アレイアクセス命令のみが葉として機能し得る。そのような場合では、アレイ上のインデックス作成命令及びビュー命令も、アレイ演算としてセグメントに含まれなければならない。
【0158】
図4は、上記の例示的なユーザコードUCのループ本体のアレイ命令から形成される例示的なASTを示している。ここで、アレイ演算としてアレイアクセス命令を含まない例示的な実施形態が実証される。
【0159】
段階21において、コンパイラは、ユーザコードに関係付けられた入力データ及びその特性を検査する。ここで、入力アレイA、B、及びCが発見される。実証の目的で、以下のテーブル1において列挙されるようなこれらのアレイインスタンスの特性を仮定する。
【表2】
【0160】
典型的には、コンパイラは、AST内の最長経路に関連付けられた葉を位置特定することによって、ASTのノードの反復を開始するための葉を選択する。
【0161】
例示的な実施形態では、コンパイラは、アレイビュー命令A[full,i]を用いて解析を開始し、アレイAからのインデックスiにおける列が抽出される。典型的で効率的なアレイ実装では、そのような抽出又はアレイビューは、要素値のコピーのための追加のメモリ空間を導入しない。アレイビューの出力アレイデータ構造は、ユーザコードのAST分岐の葉として機能する。
【0162】
典型的には、コンパイラは、空セグメントから開始し、ASTの葉から開始し、潜在的なアレイ命令ノードを訪問するようにASTを上昇してノードを反復する。アレイ命令を表す各ノードにおいて、コンパイラは、命令を現在のセグメントに含めるか、又はセグメント境界を作成することによってセグメントを終了するかを判断する。
【0163】
セグメント化ブロック22において、コンパイラは、典型的には後行順(post-order)トラバーサルにおいて、10において形成されたASTからノードを選択する。
【0164】
ノードの各々について、及び次のブロック24において、コンパイラは、現在選択されたノードに対応するアレイ命令をセグメントに含めるか否かを判断する。多くの場合、このプロセスをコンパイル時からランタイムに遅延させる必要がある。なぜならば、多くのアレイ命令のセマンティック又は効率的実装は、そのアレイ引数の特性、及び命令を実行するために使用される及び/又は利用可能な処理ユニットの具体的な特性に依存する。
【0165】
典型的には、コンパイラは、可能な限り大きいセグメントを構築することを試みる。より多くのアレイ命令がセグメント内に含まれるほど、より多くのワークロードがこのセグメントによってハンドリングされる。典型的には、セグメントに含まれるより多い数の命令は、計算/メモリアクセスの比率を上昇させ、及び/又は、セグメント/プログラム入力/出力データを書き込む及び/又は読み出すために要求される中間一時アレイストレージの数を減少させる。大きいセグメントは、プロセッサバウンドの計算を実行するか、又は有利なメモリアクセスパターンを呈する可能性がより高い。
【0166】
ここで説明される方法はまた、コンパイラがコンピューティングシステムの処理/サブユニットに効率的にセグメントワークロードを分配することができ、かつ個々のユニットのためのカーネルを、積極的な最適化が適用される状態で実装することができる方法において、セグメントが構成されるように強制する。
【0167】
本明細書において説明されるようにセグメント化規則を適用することによって、セグメントワークロードサイズは、セグメント演算を実行する前に計算することができる。セグメントの複雑性は、特定の限度内に留まり、具体的なアレイデータ構造/入力アレイデータ構造のランタイムインスタンスを有するセグメントからアレイ命令を実行するために要求される基本命令の数及び/又はタイプを事前に計算/予測することが可能になる。また、アレイ命令のシーケンスは、典型的には、PU又は当該PUのメモリ間のデータアレイ転送演算のためのコストと、アレイ命令を実行するためのより多くの/より高速のPUの利用とのトレードオフによって、コンパイラによって制限される。
【0168】
図4において示されている例の場合の図3のブロック22において発見される第1のノードは、アレイ命令マイナスである。このノードは、バイナリアレイ命令を表す。一般的なアレイバイナリ命令セマンティックによれば、基本バイナリ命令マイナス又は「-」は、適用可能な場合、ブロードキャストを考慮して、アレイ命令への左入力及び右入力の全ての対応する要素に適用されるものである。
【0169】
バイナリノードは、両方の入力のサイズが等しくなく、かつ両方の入力引数が一致するサイズを有する場合、ブロードキャストを実行してよい。両方の入力アレイからの全ての対応する次元長が一致する場合、2つのアレイがブロードキャストに参加することができる。2つのアレイからの次元の対応する長さは、当該長さが同じである場合、又は当該長さのうちの一方が値1を有する場合、「一致」する。この概念は、数値コンピューティングにおいて、及びアレイベース数値言語にとって、非常に普及しており、かつ広く知られている。
【0170】
本明細書の文脈において、欠落している次元は、長さ1を有する仮想次元とみなされる。長さ1の次元は、シングルトン次元と呼ばれる。
【0171】
ブロードキャスト中、1つのアレイのシングルトン次元からの値は、他のアレイの非シングルトン次元の対応する要素に繰り返し適用されることになる。
【0172】
セグメント化の1つの目的は、メモリアクセスオーバヘッドを最適化することである。1つの方法は、個々のアレイ命令間の可能な限り多くの一時的アレイ結果を排除することである。しかしながら、ブロードキャストが実行される場合、一時アレイを削除することは、例えばシングルトン次元のための値の繰り返しの計算によって、繰り返しの冗長な演算が実行されることに至り得る。したがって、コンパイラは、ブロードキャストがバイナリ命令によって実行される場合、セグメント境界を実装してよい。
【0173】
2つのセグメント間の境界は、典型的には、第2のセグメントへの入力として機能する、第1のセグメントの一時又は中間アレイ結果を導入する。
【0174】
この例では、マイナス命令への両方の入力が、アレイアクセス命令である。多くの場合、メモリに記憶されたアレイ要素から値を直接読み出すことは、より複雑な演算、例えば:特定の値の正弦を計算すること又は多くの要素にわたって削減を実行すること、と比較して比較的効率的な演算として実装することができる。コンパイラは、一般に、構成される複雑性閾値の尺度を有し、当該閾値未満では、入力値/式は、ブロードキャスト演算における繰り返しの適用のために「十分安価」とみなされる。
【0175】
例えば、単純なコンパイラ規則は、アレイインデックス命令としてアレイアクセス命令のみを、及び/又は、ブロードキャストを実行するようなバイナリノードへの入力として完全又は部分的アレイビュー命令のみを受け入れる。又は、遅延マージ(deferred-merge)演算(以下を参照されたい)結果も受け入れられる。
【0176】
多くの場合、より少ない中間アレイを使用するより良好な手法は、バイナリ入力側にのみセグメント境界を導入し、シングルトンのブロードキャスト次元をもたらすことである。これは、図4において示されている実施形態におけるASTを更に上昇するバイナリ乗算ノードから観察することができる。2つよりも多くの次元の場合、この手法は、セグメント境界がバイナリ命令への両方の入力分岐のために挿入されることをもたらし得ることに留意されたい。
【0177】
図5において示されている実施形態では、マイナスノードは、段階24においてセグメントに追加され、コンパイラは、段階26に進む。ここで、セグメントに現在含まれている全ての命令についての累積FMIが更新される。このようにして、コンパイラは、セグメント内/AST内の各中間アレイ命令について中間結果のサイズ/形状/特性を計算することができる。
【0178】
この例では、処理のこの時点において、セグメントは、マイナス演算のみを含む。マイナス演算への入力A及びBは、それぞれ、サイズ[1000,1]及び[1000,500]を有する。出力は、ブロードキャスト規則に従って、サイズ[1000,500]を有する。
【0179】
セグメントのFMIは、後続して、セグメントを構築する間にコンパイラによって含まれる各新たなアレイ命令を用いて、更新することができる。又は、それらは、ASTからの複数又は全てのアレイ命令について、一度に構築されてよい。この実施形態では、(サイズ/形状/レイアウト等の)出力アレイ特性のためのリクエストは、出力情報をクエリするために命令/セグメント演算のセットを選択する追加のパラメータ/情報によって対応される。
【0180】
有利には、特定のセグメントについての累積FMIは、同じセグメント境界を有し、かつ同じアレイ演算を含む後続のセグメントのために、又は後に再使用される同じセグメントのために、キャッシュ及び再使用されてよい。
【0181】
中間演算結果のサイズ/形状を計算するための別の特に効率的な方法は、セグメントに対する各出力アレイインスタンスのデータサイズ情報構造を直接更新し、各アレイ命令が、アレイ命令の個々のFMIを使用して、検査され及び/又はセグメントに含まれる。
【0182】
ブロック26に後続して、制御は、図3におけるブロック22に戻ってよい。現在のASTノードの親ノードが考慮される。それに応じて、コンパイラは、平方ノードを発見する。このノードは、「マップ」という種類の演算を実行する単項命令である。この命令は、ブロック24においてコンパイラによってセグメントに含まれ、ブロック26に制御が与えられる。
【0183】
ブロック26:この例における平方演算の出力は、サイズ[1000,500]である。
【0184】
ブロック22:ASTを上昇する次の命令は、単項削減ノード総和である。削減は、軸/次元0に沿って実行され、すなわち:それは、入力アレイインスタンスの列に沿った要素値を合計する。
【0185】
ブロック24:コンパイラは、セグメントへの総和削減演算を含む。それは、典型的には、後に説明されるより多くのチェックを実行する。
【0186】
ブロック26:総和削減は、サイズ[1,500]の出力を生成する。セグメントFMIは、それに応じて更新され、段階22に制御が与えられる。
【0187】
次の命令は、マップタイプ、単項命令:sqrtである。それは、単項演算としてコンパイラによって含まれ、その入力として同じサイズ:[1,500]の出力を生成する。セグメントFMIは、更新され(ブロック26)、段階22に制御が与えられる。
【0188】
ASTを上昇する途中で発見される次の命令(ブロック22)は、削減演算であるargmin命令である。それは、第2の次元(ゼロベースインデックス1)に沿った要素の中で最小値を有する要素のインデックスを発見する。
【0189】
ブロック24において、コンパイラは、削減演算への入力の特性を検査してよく、特定のアレイサイズのために最適化された方法において、後のコンパイラブロックにおける演算を実装する。例えば、指定された削減次元/機能次元/削減軸が長さ1である場合、削減命令は、多くの場合においてno-opとして実装されるものとマーク付けすることができる。
【0190】
この例では、argmin演算の出力は、サイズ[1,1]を有する。したがって、ここで、中間結果はスカラである。
【0191】
削減演算が段階24においてセグメントに追加され、段階26においてFMIが更新された後、幾つかのコンパイラ実装は、現在の入力データについての命令の現在のセグメントのシーケンスについての実行ストラテジを決定する。典型的には、そのようなコンパイラは、個々に及び/又は同時に利用可能な処理ユニット上で命令を実行する予測コストを計算するために、全ての関連したハードウェア及びデータ情報を考慮する。選択される実行ストラテジに依存して、段階24におけるコンパイラは、ASTを上昇する次の命令(親命令)に進むか、又はセグメント境界が削減演算後に挿入される(段階28)かのいずれかである。
【0192】
コンパイラが、(特に最短実行時間の予測に従って)実行のために、入力データインスタンスを有するその現在の状態におけるセグメントが特定の単一PU上で最も良好に実行されると判断する場合、セグメント境界は要求されず、コンパイラは、ブロック26に進む。
【0193】
コンパイラが、複数のPU(以下を参照されたい)上でチャンク結果を生成するために現在の削減次元に沿ってセグメントワークロードを分割することを判断する場合、ブロック28において後続のセグメント境界が導入される。この場合、現在のセグメントに後続するセグメントは、現在の削減演算に従って遅延マージ演算から開始するように構成されている。
【0194】
図5は、セグメント002における遅延マージ演算を示している。そのような演算は、複数のPU/サブユニット上で実行される削減演算Rの実行を完了する。
【0195】
それは、実行中のPUから直前のセグメントの結果/出力を収集し、Rとして同じ基本削減演算を使用してそれらをマージして、最終セグメント結果を計算する。典型的には、チャンク結果は、遅延マージ演算を含むセグメントを実行するために選択されたPUに関連付けられたメモリにコピーされる。この選択は、子孫セグメントへの入力データ特性、及び/又は、例えば利用レート及び/又は転送レートを含む現在のハードウェア特性を考慮することによって実行される。
【0196】
図5において示されている例示的な実施形態では、セグメント002は、セグメント001を終了する(分割)argmin削減演算のための遅延マージ演算を含む。コンパイラはセグメント001のためのワークロードを分割することを判断したので、チャンク結果は、複数のPU上に記憶されることになる。セグメント002の演算を実行する準備において、コンパイラは、典型的には、まず、セグメント002を実行することを判断し、そのための少なくとも1つのターゲットメモリ/PUを選択する。
【0197】
典型的には、個々に及び/又は同時に利用可能なPU上でセグメント002を実行する予測コストの評価中に、コンパイラは、サイズ、形状及びストレージロケーション及びレイアウトとしての入力データ特性を検査する。それは、典型的には、検討中のPUへのデータ転送時間も考慮して、予測コストを最小化するために、1つ又は複数のPU上でセグメントを実行することを判断する。遅延マージ演算がセグメント内で発見される場合、対応するデータ入力は、そのようなデータ転送コスト決定から無視される。
【0198】
その代わりに、セグメントのために選択されたPUは、遅延マージ演算のためのターゲットPUとして使用される。例えばコンパイラがセグメント002(テーブル1からの入力データを参照されたい)を実行するためにPU4(図1Bを参照されたい)を利用するときの最速実行時間を予測する場合、セグメント002からの遅延マージ演算は、セグメント001を計算するために利用される全てのPUメモリからチャンク結果を収集し、PU4にargmin削減演算を完了するように命令し、サイズ[1,1]の結果をPU4に関連付けられたメモリに記憶する。
【0199】
チャンク結果に対して削減Rを実行する結果は、一般に、現在のセグメントによって選択されたものとして、ターゲットPUに関連付けられたメモリに記憶される。時として、特にそのような結果が小さい場合、コンパイラは、PUのメモリへの削減結果のストレージを削除すること、及び、それを、選択されたPU上でのセグメント命令のためにカーネルコードにおいて定義されるレジスタ又は一時変数に記憶することを判断してよい。
【0200】
典型的には、遅延マージ演算の結果はスカラである。これは、出力において他の要素が存在することになる場合、それらを、-を計算するために、及びワークロードを分割するために独立して使用することができるためである。さらに、機能次元の分割は、セグメントによって生成される1つのみの要素が存在し、かつ削減(機能)次元が分割されることになる場合にのみ、実行されてよい。
【0201】
一般に、遅延マージ演算を実行するセグメントは、ソースチャンク結果をコピーするためのターゲットとしてPU及び関連付けられたメモリを選択し、チャンク結果の最終削減を実行する。典型的には、遅延マージ演算は、削減演算に続くセグメント境界に続くものである。
【0202】
図4におけるASTにおけるブロック22において発見される次の命令は、バイナリ乗算命令である。
【0203】
図3のブロック24では、コンパイラは、左入力及び右入力を検査してよく、それらのサイズを決定する。1つの目標は、乗算命令がブロードキャストを実行するか否かを決定することである。左入力について、サイズは、[1,1]であることが発見される。右入力サイズは、乗算ノードの下のASTの右分岐を考慮することによって評価される。
【0204】
典型的には、ASTの検査及びセグメントへの変換は、コンパイラによって再帰的に実行される。ここで、後行順においてASTのノードを反復することによってASTのセグメントへの変換を実行するコンパイラが説明され、すなわち:その子を訪問した後に内部ノードが訪問される。
【0205】
右入力分岐サイズは、[4000,1]であることが発見される。したがって、次元#0に沿ったブロードキャストは、乗算ノードによって実行される。
【0206】
この実施形態では、コンパイラは、構成された複雑性基準を有し、これは、ブロードキャストを実行するようなバイナリノード上のアレイアクセス命令又は遅延マージ演算以外の全てのためにセグメント境界を導入する。幾つかの実装では、コンパイラは、より小さい入力上の同じ要素値に繰り返しアクセスするエフォートをより正確に決定する。それは、同じメモリアドレスへの繰り返しのメモリアクセスのコストと、入力AST分岐によって定義される式に従った計算を繰り返し実行するエフォートとを比較する。
【0207】
例えば、より小さい入力の単一の要素の値をより大きい入力の10個の要素にマッピングする、入力[1]及び[10]のブロードキャストを実行するバイナリノードを検討する。より小さい入力の値は、10回評価されなければならないが、その値は、マッピング演算全体を通して同じに留まる。セグメント境界は、単一の値を評価するエフォートを、セグメント境界によって導入される、中間アレイから値を読み出すための10回の繰り返しのメモリアクセスに制限する。
【0208】
別の実施形態では、一時変数又はレジスタが、より小さい入力からの単一の値をキャッシュするために、及び繰り返しのメモリアクセスを節約するために導入される。そのようなキャッシュは、場合によっては、一時アレイ又はセグメント境界を削除することができる。それは、多くの場合、システム設計中にコンパイラ著作者によって考慮されなければならない、選択された処理ユニットに固有の、コンパイラ及びカーネル内のセグメント実装の複雑性を高める。
【0209】
時として、単純な計算を冗長に実行することは、特にそのような単純な計算が特殊なプロセッサ命令にマッピングされ、かつこれによって実行され得る場合、メモリから値を繰り返し又は冗長に読み出すよりも費用が低い可能性がある。
【0210】
多くの場合、効率的なコンパイラは、セグメント境界について判断するためにブロック24において更なる演算を実行する。例えば、バイナリ命令を含めることは、セグメントへの入力の数を増加させ得る。したがって、選択されたPUに対する対応する入力データアレイインスタンスの追加のコピー演算が実行時間に影響を与え得る。
【0211】
例えば、ユーザコード「sum(D)+E」を検討する。シーケンスは、2つのアレイ命令:総和(sum)及びプラス(plus)を含む。以前のセグメント化ブロック24において、コンパイラは、新たなセグメントに総和命令を既に含めていた。この時点において、総和演算は、現在のセグメントにおける唯一の演算である。
【0212】
コンパイラは、ここで、親ノード:プラスを検査することができる。それは、次に、プラス命令を現在のセグメントに含めるか、又はセグメント境界を導入し、かつプラス命令のための新たなセグメントを開始するかを判断する。両方のセグメント化オプションが、図6において実証されている。
【0213】
テーブル2:
【表3】
【0214】
上記のテーブル2は、以下の例示的なプログラムコードについて図6において示されているセグメント化オプションに対応する計算カーネルを実行するために使用され得る例示的なコンピューティング(実行)システムについての特性を列挙している:
sum(D)+E.
【0215】
例示的な実施形態では、テーブル2のシステムは、(少なくとも)4つの処理ユニットを有し、一方、PU2及びPU4のみがユーザコードからのアレイ命令を実行するために考慮されるように構成されている。PU2は、3*10^11浮動小数点演算(FLOP)/秒を実行する最大能力を有するCPUである。PU4は、3*10^12FLOP/秒を実行する最大能力を有するGPUである。両方のユニットが、それらに関連付けられた専用メモリストレージを有し、これらは、1.5*10^10バイト/秒の最大転送レートを有するPCIバスを介して接続される。
【0216】
この例について、入力データアレイDはサイズ[1000,1000,100]を有する3次元を有し、PU2のみに関連付けられたメモリ上に現在記憶されていることが仮定される。Dの要素は、倍精度浮動小数点数であり、8*10^8バイトのメモリに及ぶ。入力アレイEは、長さ[1000,1000]の2次元を有し、PU4のみに関連付けられたメモリ上の8*10^6バイトに及ぶ。
【0217】
1つの実施形態では、方法は、個々に両方のセグメント化オプションについての予測コストを定期的に計算し、最低コストに関連付けられたオプションを選択するコンパイラを使用する。それにもかかわらず、そのような情報は、セグメントを実行する前及び後のブロック30において要求され、したがって、コンパイラランタイムオーバヘッドを顕著に増加させない。
【0218】
図6における第1のセグメント化オプション(オプション1)は、両方のアレイ命令のために単一のセグメントを作成するためにセグメントにプラス命令を含める。例示的な入力データD及びEを用いてこのセグメントについての結果を計算するために10*10^10FLOPsが要求される。
【0219】
コンパイラは、ここで、利用可能なPUの各々上でセグメントを実行するための個々のコストを計算する。それは、現在のデータストレージロケーション、予想最小データ転送時間、処理ユニット能力を考慮し、一般に、セグメント結果がより高速に又はより低いエネルギーで計算されることが予想されるPUを選択する。
【0220】
例えば、融合されたセグメント(図6におけるオプション1)は、PU2上で全ての10^10FLOPsを計算するために少なくとも3.39*10^-2秒を要求することが予想される。このコストは、PU4~PU2のメモリからアレイEのデータをコピーするために、及び全ての要求される数値計算をPU2上で実行するために要求される最小時間を含む。コンパイラは、実行のためにPU2を選択することになる可能性が高い。なぜならば、PU4の選択は、(DのPU4へのより高い転送コストに起因して)少なくとも5.7*10^-2秒を要求することになるためである。
【0221】
コンパイラは、オプション1のコストを、オプション2のためのコストと比較する。オプション2は、セグメント境界を導入する。ユーザコード命令sum(D)+Eの結果を計算することは、ここでは、オプション2である、図6におけるセグメント1及びセグメント2の両方の実行を要求する。2つのセグメントの各々について、実行PUが個々に決定され、コンパイラによって選択される。テーブル2に従って、コンパイラは、セグメント1の9*10^10FLOPsがPU2上で実行される場合U4と比較してより少ない時間(コスト)を要求し、一方、後続のセグメント2がPU4上で1*10^10FLOPsのより高速で結果を計算することが予想されることを発見する。セグメント境界は、PU4上でセグメント2を実行する前にPU4に転送されるセグメント1の結果を記憶する中間アレイを導入する。転送は、PU2と比較したPU4のより高い最大FLOP/秒能力に起因して、(実行時間/エネルギーの観点で)功を奏する。
【0222】
したがって、オプション1のためのコスト及びオプション2のためのコストを比較することによって、コンパイラは、オプション1よりもオプション2を、そのより低い予想最小実行時間/コストに起因して選好する。したがって、バイナリ命令プラスは、第1のセグメントに含められないが、セグメント境界は導入され(ブロック28)、プラス演算を含む新たなセグメントがコンパイラによって開始される。
【0223】
更なる実施形態では、セグメントのワークロードは、この例のように単一のPUを使用する代わりに、同時実行のために複数のPUに分配される。したがって、予測コストは、以下で説明されるように計算することができ、最良のセグメント化オプションの選択は同様に機能する。
【0224】
方法は、他のアレイ命令について同様に機能する。例えば、コンパイラは、そのようなアレイ命令に対して同じ計算を実行することができ、これらは、セグメントに含められる場合、潜在的に、セグメントのワークロードを顕著に増加させ得る。例えば、バイナリ命令matmul(行列乗算)は、更なる命令とともに1つのセグメントにおいて実行される代わりに、別個のセグメントにおいてより効率的に実行され得る。コンパイラは、両方のオプションを評価し、より高速なオプション、又は現在のランタイム状況の全ての関連因子を考慮して、より少ないエネルギーを消費すると予測されるオプションを判断することができる。
【0225】
説明される方法は、典型的には、特定のランタイム状況のために最速実行ストラテジを選好する。コンパイラがコストモデルにおけるPUのためのエンキューされたセグメントの利用の現在のレベル/累積コストを考慮する場合、方法は、特にセグメントが非同期的に実行される場合に、他の処理ユニットよりも現在利用が少ない処理ユニットへの実行経路をもたらし得る。それは、ユーザコードを、そのサイズ及び形式が十分に活用されていない又は他の処理ユニットよりも高いコンピューティング能力を呈するような処理ユニットに向けた実行の転送をサポートするアルゴリズムチャンクにセグメント化する。
【0226】
代替的に、より多くの情報又はより少ない(利用可能)情報がコンパイラによって考慮されてよい。例えば、個々のPUメモリ間のデータ転送レートを考慮することができるのみではなく、レジスタにデータをロードするために要求される時間も、結果を計算するのに使用することができる。又は、データ転送時間は、多くの場合コマンドが開始された後の当該コマンドの実行の開始時に待機のために要求される、又は待機のために費やされた時間又はエネルギー(転送又は実行コマンドを開始するためのオーバヘッド;コマンドキューレイテンシ)も考慮してよい。そのようなオーバヘッドは、一度又は繰り返し、ユーザによる構成された補正値として、又は測定によって取得されるものとして、提供されてよい。
【0227】
説明される方法に従って動作するコンパイラは、最小予測値の代わりに、説明される特性/影響を与える因子のうちの全て又は幾つかについての平均値を計算又は考慮してよい。そのような平均値は、測定によって、事前構成された及び/又はキャッシュされた値によって、及び/又はルックアップテーブルから、決定されてよい。実装は、セグメントを実行するための予測コストを調整するために、実行システム上で実行される他のプロセスによって引き起こされる効果及び/又は現在のデバイス利用レートを考慮してもよいし、しなくてもよい。
【0228】
ブロック24において最後のアレイ命令ノードargminが現在のセグメントに含められた後、コンパイラは、ブロック26においてargmin演算を用いてFMIを更新し、図5におけるASTの更なるノードを検査するブロック22に進む。更なる適した既知のアレイ命令ノードが発見されなかったので、セグメント化は、セグメント境界を挿入することによって終了する。
【0229】
典型的には、コンパイラがブロック22において、その出力情報が入力アレイデータ構造インスタンスの少なくとも1つの要素の値に少なくとも部分的に依存するアレイ命令を発見した場合、セグメントの作成が終了される。
【0230】
多くのコンパイラ実装は、幾つかのループ命令をループ演算に変換し、それらをセグメントに含めることによって、多くの場合ループインデックスの新たなデータ次元への変換によって、方法の効率性を高めることができる。この方法は、個々のループ反復を独立して、かつ任意の順序において計算することができる場合に特に有用である。
【0231】
例えば、以下のユーザコードループを検討する:
【数2】
【0232】
一実施形態によれば、ループは以下の式に変換される:
A[3,full]=sin(A[3,full]);
【0233】
この実施形態では、この方法を実装するコンパイラは、ループインデックス範囲又はループ境界(loop bound)を検査することができる。それは、値0...A.S[1]-1に及ぶループの反復変数iについてのインデックス値、すなわち:昇順のAの第2の次元についての全ての要素インデックスの範囲を発見する。コンパイラは、既知のパターンについてループヘッダ定義を検査することによってこのインデックス範囲を発見してよく、及び/又は、iを利用して、コード式のコンテキストからインデックス範囲を推定する。例えば、A.S[1]は、Aの第2の次元の長さとしてコンパイラに既知とすることができ、アレイアクセス式A[3,i]は、Aの第2の次元によって要素に対処するために反復変数iを使用する。さらに、専用の関数「length(A,1)」又は同様の関数のセマンティックは、コンパイラに既知であってよい。
【0234】
コンパイラは、スカラ反復変数iを、ループ境界に従ったインデックスの範囲に置き換えることができる:
【0235】
A[3,range(0,A.S[1])]=sin(A[3,range(0,A.S[1])]);
【0236】
ここで、「range」関数は、コンパイラによって識別されるようなインデックスのアレイを生成する。幾つかのコンパイラは、更なる最適化を変換に適用してよい。例えば、ここで、コンパイラは、全次元長に及ぶインデックス範囲についてチェックし、この場合、アレイインデックス範囲を、全次元に対処するプレースホルダ「full」に置き換えることができる。他の言語も同様の構築を有する。例えば、Matlab(登録商標)言語における「:」(コロン)演算子を用いて、コードは、Matlab(登録商標)式に変換/対応する:
【0237】
A(3,:)=sin(A(3,:))
【0238】
修正された式は、(この方法において説明されるようにセグメントに更に変換される場合)ループ本体からのスカラ式と比較して大きいワークロードを処理する。したがって、セグメントは、多くの場合、並列コンピューティングリソース上でより効率的に実行することができる。また、コンパイラは、ループを完全に削除することが可能であり、アドレス指定データ(要素アクセス)の必要なオーバヘッドに関係付けられたような演算に対する価値のある基本数値演算の比率が改善され、及び/又は、実行経路(ループ命令、条件付き)が制御される。
【0239】
多くの場合、この方法の効率的な実装は、更なるアクションを実行することを要求する。コンパイラは、ループを変換/削除することができるか否かを決定するために、ループ本体の命令に対する依存性解析を実行してよい。時として、反復変数によって対処される次元のインデックスは、アレイインスタンス自体を修正することを含めて、修正されなければならない。
【0240】
例えば、反復される次元は、他のアレイインスタンスからの同じ次元と競合することを防止するために、空き/未使用次元インデックスに移動させることができる。そのような実施形態は、それに応じて、反復変数を利用して、全てのアレイインスタンスを修正し、処理後のセグメントの結果に対する次元インデックス変更を反転させる。
【0241】
それゆえ、上記のユーザコードUCは、全ての関与するアレイインスタンス上の前処理ブロックにおいて反復次元#1を空きの未使用次元#2に移動させる、以下のコードに変換されるか、又はこれに置き換えられてよい:
//前処理
var Amod=swap(A,1,2);
var Cmod=swap(C,1,2);
//「ループ本体処理」
classes=argmin(sqrt(sum((Amod-B)**2,dim:0)),1)*sin(Cmod);
//後処理
classes=swap(classes,2,1)
【0242】
ここで、swap関数は、アレイからの2つの指定された次元を交換する。多くの場合、アレイ要素値のコピーは実行されないが、元のアレイのビューが生成され、これは、この方法を効率的にする。アレイBは、ループ反復によって影響を受けないので、修正されないことに留意されたい。しかしながら、コンパイラは、空き/未使用次元インデックスを決定するためにBも検査してよい。
【0243】
コンパイラは、多くの場合、修正されたループ本体を少なくとも1つのセグメントに更に変換し、本明細書において説明されるようにそれを実行する。上記のループを含めることは、ここでもやはり、セグメントのワークロードを増加させ、個々のループ反復を用いてセグメント命令を実行することと比較してより効率的に並列リソースを利用することを可能にすることが明らかとなろう。上記のスカラループインデックスの、インデックスの範囲への変換は、多くの場合、増加したワークロード及びそれゆえ増加したメモリストレージ要件によって課されるメモリ制約に起因して、本明細書において説明される更なる方法を用いなければ実現可能でも可能でもないことも明らかとなろう。一般に、そのような「コードベクトル化」は、多くの場合、中間アレイのサイズによって制限され、これは、多くの場合、一般的なコンピューティングシステムのメモリに効率的に記憶されるためには過度に大きくなる。本発明者らの方法は、それとは異なり、多くのループ構築を同時に組み込むことを可能にする。本発明者らの方法に係るコンパイラは、ほとんどの中間アレイを削除することになり、それゆえ、多くの場合、任意のサイズのワークロードを処理することが可能である。
【0244】
図2のブロック30において、セグメントのための実行ストラテジが決定されてよく、少なくとも1つの選択された処理ユニットは、セグメントの演算に従ったカーネルプログラムを用いて準備される。
【0245】
典型的には、コンパイラは、セグメントのワークロードを決定し、例えばPUのためのコストに基づいて、実行ストラテジについて判断する。
【0246】
したがって、利用可能なPUに関するランタイム情報が決定される。時として、この情報は、上記で説明されたように、セグメント化ブロック20の前又はその間に、例えば、セグメント化判断(24,テーブル2)がコスト計算に依拠する場合、決定される。
【0247】
選択された処理ユニット上でセグメントを実行するためのカーネルコンパイルは、典型的には、少なくとも1つの最適化段階又はストラテジを含む。例えば、提案される方法は全てのランタイムに影響を与える因子を考慮することを可能にするので、カーネルは、少なくとも1つの入力アレイデータ構造インスタンス(A1、B1)の特定のランタイムサイズ情報のために最適化することができる。例えば入力データの特定のストライド情報のために特殊化されたカーネルは、多くの場合、ストライド情報が可変に保たれるカーネルと比較してより効率的にハードウェアリソース利用することができることを留意されたい。後者の非特殊化カーネルは、ストライド値がメモリアドレスから頻繁に読み出されることを要求する一方で、特殊化されたバージョンは、カーネルコードにおいて定数値を使用することができる。他のランタイム情報、例えば、入力アレイデータ構造インスタンスの次元の数及び/又は長さのために更なる特殊化が適用されてよい。
【0248】
特殊化によるより効率的な実行の利点は、低減した互換性を示唆する:特定のランタイム情報のために特殊化されたカーネルは、異なるランタイム情報を有する異なる入力データインスタンスを用いた実行のためにより頻繁に再作成されなければならない。これは、同じ又は同様のハードウェア特性を有するPU上で実行されるようにコンパイルされるようなカーネルにとってでさえ真であり、ここで、同じカーネルは、本来であればセグメントアレイ演算を実行するのに使用することができる。
【0249】
幾つかの実施形態は、特殊化のレベル、又はカーネル特殊化のために使用される情報の数及び種類を、構成によって、又はランタイムにおいて動的に、手動で調整することを可能にする。
【0250】
幾つかの実施形態は、ランタイム(JIT、ジャストインタイム)において方法の全ての段階を実行する。他の実装は、ランタイムに先立って、特にコンパイル時(第2の(JIT)コンパイラステージにおいてカーネルをコンパイルする前の第1のコンパイラステージ)に、方法の幾つかの段階又は部分を実行することによって、方法のオーバヘッドを最適化する。例えば、早期のコンパイル段階において、及びランタイム情報が利用可能になる前に、AST解析が少なくとも部分的に実行されてよい。
【0251】
しかしながら、セグメントアレイ演算を実行するために最終的に使用されるセグメントカーネルのための具体的な形状、形式及びコンテンツ、並びにカーネルによって処理されるワークロードは、典型的には、(ハードウェア、アルゴリズム及びデータに関係付けられた)ほとんど又は全ての情報に依存するので、コンパイラは、この情報が最終セグメントカーネル実装及び実行ストラテジを判断するために(ランタイムにおいて)完全に既知になるまで待機する。専門家であれば、例えば新たな情報が利用可能になるとそれを追加及び/又は考慮する、複数のステージ(時点)においてセグメント又は(セグメント)カーネルを準備するオプションを理解するであろう。
【0252】
ランタイム情報の全ての潜在的なバリエーションは、(潜在的には大きい)パラメータ空間を形成する。1つの最適化ストラテジは、コンパイル時に事前に全ての潜在的な又は可能性が高いセグメントカーネル形式を準備することであり、ランタイムにおけるコンパイラの処理エフォートを、例えば決定木の支援によって、適切なカーネル実装の選択に制限する。実行のために可能にされたPUにセグメントのワークロードを分配する有望な方法は、少なくとも1つの入力アレイ(A1、A2)及びセグメントFMIに従ってセグメントによって生成される出力の出力要素の数を考慮することである。多くの場合、各出力要素は、独立して計算することができ、したがって、個々のPUによって計算することができる。コンパイラは、一般に、特定の数の出力要素を計算する役割を、PUの特定の技術のために準備されるセグメントカーネルとともに、処理のための複数のPU、多くの場合パッシブPUに移転する。PUがアクティブPUである場合、コンパイラは、代わりに、セグメントにおいて収集される命令のシーケンスを、多くの場合、AST又はそのバイナリ表現のような抽象形式において、PUに送信してよい。この場合、アクティブPUは、一般に、受信されたワークロードを、そのサブユニット、多くの場合、パッシブPU、又は(ネスティングの更なるレベルが存在する場合には)アクティブPUに分配する役割を担う。
【0253】
アクティブPUは、多くの場合、上記で説明されたものと同じ又は同様の段階を実行し、多くの場合、受信されたセグメントのワークロードの実行を準備するための、そのパッシブサブユニット(存在する場合)のうちの少なくとも1つを再帰的に含む。
【0254】
計算のために各PUに送信される出力要素の数は、全てのPUのためのコストがほぼ等しい、すなわち:各PUがワークロードのその一部の実行を終了することが予想される予測時点が最低量だけ異なる方法において計算される。
【0255】
例えば方程式系を解くことによる、又は単純な最適化方法、例えば反復ソルバを使用することによる、ワークロード分配を計算する幾つかの方法が存在する。多くの場合、計算は、ワークロードデータ及びカーネル/セグメント命令データを各PUに転送するために要求される時間を考慮する。時として、例えばカーネル実行を開始することのオーバヘッドのため、セグメント演算又はAST命令を処理するため、ワークロードデータをアクティブPU上のサブユニットメモリに分配するための補正係数又は被加数も考慮される。
【0256】
幾つかのコンパイラは、小さいワークロードのための短い経路、例えばスカラ入力、スカラ中間結果、及びスカラ出力の場合にはセグメント演算のスカラ実装を実装する。典型的には、そのような実装は、単一のPU、時としてホストコントローラ(存在する場合)上での実行を対象とする。
【0257】
時として、コンパイラは、多くの場合、複数のPUを管理するため及び他のPUへのデータ転送のために要求されるオーバヘッド/時間がワークロードと比較して過度に高いこと、又は潜在的コスト節約に起因して、可能にされる複数の又は全てのPUに特定のサイズ未満のワークロードを分配することができない。この場合、セグメントは、典型的には、最小コストが計算される単一のPU上で計算される。
【0258】
少なくとも1つのカーネルは、ブロック40において、少なくとも1つの処理ユニット上で実行される。
【0259】
多くの場合、カーネル実行は、カーネルが非同期的に実行される場合に特に効率的である。例えば、マルチスレッドシステム上での実装では、多くの場合、メインスレッドは、セグメント化、ワークロード分配及びカーネル開始を実行する制御命令を実行する役割に担う。しかしながら、メインスレッドは、典型的には、セグメントカーネルを(直接)実行もせず、他のスレッド又はPUによるセグメントカーネル実行の完了も待機しないが、後続の命令の処理、後続のセグメントの構築及び/又は処理、後続のセグメントワークロードの分配及び後続の/更なるセグメントカーネルの実行の開始を継続する。そのようなシステムは、多くの場合、事前に、及び実行時間に先立って、すなわち:カーネル実行の前に、多くのアレイ命令のために効率的な実行を準備する。
【0260】
重要な同期点(カーネルが実行を終了するまでメインスレッドが待機しなければならない)は、アレイ要素値を出力するために要求されるアクセスである。典型的には、そのようなシステムは、セグメントカーネルを、特定のPU上での実行のためにデバイス固有のコマンドキューにエンキューする。エンキューされるカーネルの累積コストに対応するキューの長さは、典型的には、メインスレッドによってスケジューリングされる新たなセグメント及び新たなアレイ命令のためのコストの計算に寄与する。
【0261】
別の同期点は、セグメント命令/第1のセグメントカーネルを実行するために選択されたPU上でセグメントを実行するために要求されたメモリを割り当てる失敗した試みであり得る。典型的な実施形態は、そのような失敗を認識し、それから回復し、処理を継続するか、又は十分なメモリが利用可能になると、典型的にはセグメント実行が完了された後、及び/又は十分に大きいメモリ領域が選択されたPUメモリ上で利用可能になった後に、割り当てを再試行する。
図1A
図1B
図2
図3
図4
図5
図6