JP2013502648A - 最適化simdコードのための動作指示命令の挿入 - Google Patents

最適化simdコードのための動作指示命令の挿入 Download PDF

Info

Publication number
JP2013502648A
JP2013502648A JP2012525576A JP2012525576A JP2013502648A JP 2013502648 A JP2013502648 A JP 2013502648A JP 2012525576 A JP2012525576 A JP 2012525576A JP 2012525576 A JP2012525576 A JP 2012525576A JP 2013502648 A JP2013502648 A JP 2013502648A
Authority
JP
Japan
Prior art keywords
instruction
value
code
exception
vector
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2012525576A
Other languages
English (en)
Other versions
JP5583770B2 (ja
Inventor
アイッケンバーガー・アレクサンダー
ガラ・アラン
ガーシュイン・マイケル
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JP2013502648A publication Critical patent/JP2013502648A/ja
Application granted granted Critical
Publication of JP5583770B2 publication Critical patent/JP5583770B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30021Compare instructions, e.g. Greater-Than, Equal-To, MINMAX
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30043LOAD or STORE instructions; Clear instruction
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3861Recovery, e.g. branch miss-prediction, exception handling
    • G06F9/3865Recovery, e.g. branch miss-prediction, exception handling using deferred exception handling, e.g. exception flags
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]

Abstract

【課題】 ベクトル化コードの実行時の例外を追跡し示すために指示された命令を挿入するためのメカニズムを提供する。
【解決手段】 コンパイルのために第1のコード(620)の一部分を受信する。第1のコード(620)の一部分を分析して、指定の非投機的動作を実行し、置換動作指示命令(1020)へのベクトル・レジスタ入力内に存在する特殊例外値(840)に対応する任意の例外条件を示すための指示動作をさらに実行する置換動作指示命令による置換の候補である第1のコード(620)内の指定の非投機的動作を実行している非投機的命令を識別する。置換を実行し(1080)、少なくとも1つの非投機的命令の置換に基づいて第2のコード(630)を生成する。コンパイル済みコード(630)を実行しているこのデータ処理システム(100)は、投機的命令が例外条件を生成したことに応答して、例外処理を開始せずに、特殊例外値(840)をベクトル出力レジスタ(1130)に保管するように構成される。
【選択図】 図5

Description

本出願は、一般に、改良されたデータ処理装置および方法に関し、より具体的には、最適化単一命令多重データ(SIMD:Single Instruction Multiple Data)コードのための動作指示(operation-and-indicate)命令の挿入のためのメカニズムに関する。
本発明は米国エネルギー省によって授与された契約書第B554331号に基づく米国政府の援助によりなされたものである。米国政府は本発明に対し一定の権利を有している。
マルチメディア拡張(MME)は、汎用マイクロプロセッサに対する追加として最も人気のあるものの1つになっている。既存のマルチメディア拡張は、パックされた固定長ベクトルをサポートする単一命令多重データ(SIMD)パス・ユニットとして特徴付けることができる。マルチメディア拡張のための従来型のプログラミング・モデルは、(インライン)アセンブリまたは高水準プログラミング言語に埋め込まれた組み込み関数のいずれかを使用する明示ベクトル・プログラミング(explicit vector programming)であった。明示ベクトル・プログラミングは、時間がかかり、誤りがちなものである。将来有望な代替策は、標準的な高水準言語で作成されたプログラムからSIMDコードを自動的に生成するためにベクトル化技術を活用することである。
数十年前に従来型のベクトル・プロセッサのためにベクトル化が幅広く研究されたが、2つのアーキテクチャ間にはいくつかの根本的な違いがあるため、SIMDアーキテクチャのためのベクトル化は新しい問題を提起した。2つのタイプのベクトル化を区別するために、後者はSIMDベクトル化またはSIMD化(SIMDization)という。このような根本的な違いの1つはメモリ・ユニットから生じている。典型的なSIMDプロセッサのメモリ・ユニットは、従来型のベクトル・プロセッサより幅広いスカラ・プロセッサのメモリ・ユニットに似ている。特定のPowerPC(商標)マイクロプロセッサ(ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社製)上で検出されるVMX命令セットでは、たとえば、ロード命令は16バイトの境界合わせされたメモリから16バイトの連続メモリをロードし、その命令内のメモリ・アドレスの最後の4ビットを無視する。同じことが保管命令にも適用される。
最近、プログラムからSIMD並行処理を自動的に抽出するためのコンパイラ技法に対する関心が急上昇した。この急増は、マルチメディア・プロセッサおよびハイパフォーマンス・コンピューティングにおけるSIMDアーキテクチャの普及の増加によって駆り立てられたものである。これらのプロセッサは、複数の機能ユニット、たとえば、浮動小数点ユニット、固定小数点ユニット、整数ユニットなどを有し、これらのユニットはユニプロセッサのパフォーマンスを強化するために同じマシン・サイクルで2つ以上の命令を実行することができる。これらのプロセッサの機能ユニットは典型的にパイプライン化される。
SIMD並列処理を抽出するためにループについてコンパイラベースの変換を実行する際に、配列参照の安全性を保証することが重要である。すなわち、SIMDアーキテクチャによる実行のためにソース・コードのコンパイル中に、コンパイラは、SIMDアーキテクチャによる実行のために並列化することができるコードの一部分を決定することを含む、様々な最適化を実行することができる。この並列化は、典型的に、コードのその部分をベクトル化、またはSIMDベクトル化、あるいはSIMD化することを含む。このような最適化の1つは、パイプライン化された機能ユニットが遭遇する分岐予測ミス(branch misprediction)の不利益を回避するために、コード内の分岐をプレディケートされた動作(predicated operation)に変換することを含む。この最適化は、分岐条件に対応するブール・プレディケート(Boolean predicate)をセットアップするために比較命令を使用して、ソース・コード内の条件付き分岐をプレディケート動作(predicate operation)を有するプレディケートされたコード(predicatedcode)に変換することを含む。したがって、プレディケートとは、この時点で命令を保護するものであり、一般に「if変換(if-conversion)」というプロセスであり、プレディケートの値に応じて命令を実行するかまたは無効にする。
手短に言えば、従来型のif変換によって生成されたプレディケートされたコードは、2つの相互排他的な実行パスから命令を実行し、2つの相互排他的なパスのうちの1つに対応する命令を抑制することにより、直線的コードを生成する。これらの相互排他的な実行パスのうちの1つが選択されたパスに対応しない場合、このパスが様々な望ましくない誤った実行結果、特に、不適切なメモリ参照を生成することは極めて一般的である。したがって、「if変換」により非選択のプレディケートされた命令の無効化、特に、if変換されたコード内のメモリ参照命令がなければ、「if変換」の結果、誤った実行が行われる可能性がある。
Gschwind他による「SynergisticProcessing in Cell’s Multicore Architecture」(IEEEMicro、2006年3月)では、データ並列SIMDアーキテクチャに関するコンパイルのためにますます広範に採用されているデータ並列if変換の概念を紹介している。従来型のスカラif変換とは異なり、データ並列if変換は、典型的に、Gschwind他により2006年8月4日に出願され、同時係属かつ本出願人に譲渡された米国特許出願公報第US20080034357A1号「Method and Apparatus for Generating Data Parallel Select Operationsin a Pervasively Data Parallel System」に記載されているように、多くのSIMDアーキテクチャによってサポートされるデータ並列選択によるコード生成を目標にしている。というのは、データ並列SIMDアーキテクチャは、典型的に、プレディケートされた実行を提供しないからである。
したがって、従来型のif変換は、相互排他的なパスのうちのどちらかに対応する各命令の実行または非実行を示すプレディケートで各命令を保護する。Gschwind他の特許出願公報に記載されているデータ並列選択によるデータ並列if変換は、プレディケートなしで両方のパスからの命令を実行し、データ並列選択命令を使用して、まさにそれが元のソース・コード内で取られたパスに対応するときに、コンパイルされたコード内で無条件に実行されたパスに対応する結果を選択する。したがって、取られたパスの情報に基づいて結果選択を実装するためにデータ並列選択を使用することができるが、データ並列選択によるデータ並列if変換は命令を無効にするように適合されない。これは、ベクトル命令が、その結果ベクトルの一部が選択されないときに、その結果ベクトルの他の一部が選択され、従来型の命令プレディケーションを非実用的なものにする可能性があるからである。
従来型のif変換と、データ並列選択動作を使用するデータ並列if変換との違いは、QPXアセンブリ言語で示されている以下のコード例に関して容易に理解できるであろう。
a[i]=b[i]/=0?1/b[i]:DEFAULT;
従来型のif変換は、以下の形式でこのコードを実装するであろう。
Figure 2013502648
上記で分かるように、その命令を実行してはならいことをプレディケート条件が示している場合、結果ならびに例外などのすべての関連する副作用が抑制される。FREは、単一結果を生成することになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。
次に、たとえば、模範的な4要素ベクトルについてデータ並列選択を活用することによるデータ並列if変換とSIMDベクトル化によって生成されたコードについて考慮する。
Figure 2013502648
この例によれば、QVFRE命令はプレディケートされず、必ず結果を書き込む。上記の通り、FRE命令は、単一結果を生成するのでその結果を書き込むことになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。FRE命令とは異なり、QVFRE命令は、ベクトルa[i:i+3]に書き戻される0、1、2、3、または4つの結果を生成することができる。しかし、結果が使用されるかどうかに関する知識はQVFRE命令にとって使用可能ではなく、したがって、正しい1組の例外を生成することができない。
米国特許出願公報第US20080034357A1号 米国特許出願第12/250575号
Gschwind他による「Synergistic Processing in Cell’sMulticore Architecture」(IEEEMicro、2006年3月) Gibbs他による「IBM eServer BladeCenter JS20 PowerPC 970 Programming Environment」というレッドブック(2005年1月)
したがって、SIMDプロセッサ・アーキテクチャで実行するためのSIMD化コードを生成するためにコンパイラによって使用されるデータ並列if変換により、スプリアス・エラーを回避するために例外が抑制される。しかし、例外生成であっても、アプリケーションの挙動を保存できることは重要である。
例示的な一実施形態では、データ処理システムにおいて、ベクトル化コードの実行時の例外を追跡し指示するために指示された命令を挿入するための方法が提供される。この方法は、データ処理システムのプロセッサ上で実行されるコンパイラにおいて、第1のコードの一部分を受信することを含む。この方法は、プロセッサ上で実行されるコンパイラにより、第1のコードの一部分を分析して、指定の非投機的動作を実行し、置換動作指示命令へのベクトル・レジスタ入力内に存在する特殊例外値に対応する任意の例外条件を示すための指示動作をさらに実行する置換動作指示命令による置換の候補である第1のコード内の指定の非投機的動作を実行している少なくとも1つの非投機的命令を識別することをさらに含む。また、この方法は、プロセッサ上で実行されるコンパイラにより、第1のコード内の指定の非投機的動作を実行している少なくとも1つの非投機的命令を置換動作指示命令で置換することも含む。その上、この方法は、プロセッサ上で実行されるコンパイラにより、少なくとも1つの非投機的命令の置換に基づいて第2のコードを生成することを含む。このデータ処理システムは、例外処理を開始せずに、投機的命令が例外条件を生成したことに応答して、特殊例外値をベクトル出力レジスタに保管するように構成される。
他の例示的な諸実施形態では、コンピュータ可読プログラムを有するコンピュータ使用可能媒体またはコンピュータ可読媒体を含むコンピュータ・プログラム(computer program product)が提供される。このコンピュータ可読プログラムは、コンピューティング・デバイス上で実行されると、この例示的な実施形態の方法に関して上記で概略を述べた動作のうちの様々な動作およびその組み合わせをそのコンピューティング・デバイスに実行させる。
さらに他の例示的な実施形態では、システム/装置が提供される。このシステム/装置は、1つまたは複数のプロセッサと、1つまたは複数のプロセッサに結合されたベクトル・レジスタ・ファイルとを含むことができる。この1つまたは複数のプロセッサは、この例示的な実施形態の方法に関して上記で概略を述べた動作のうちの様々な動作およびその組み合わせをこの1つまたは複数のプロセッサに実行させるように構成される。
本発明の上記その他の特徴および利点は、本発明の実施形態例に関する以下の詳細な説明に記載されるか、またはその詳細な説明を考慮すれば当業者にとって自明なものになる。
本発明ならびにその好ましい使用態様と追加の目的および利点は、添付図面に併せて読んだときに例示的な諸実施形態に関する以下の詳細な説明を参照することにより最もよく理解されるであろう。
例示的な諸実施形態の模範的な諸態様を実装可能なチップ上の異種マルチプロセッサ・システムのブロック図の例である。 いくつかの例示的な諸実施形態によってなされた改良点の考察のために示された既知のプロセッサ・アーキテクチャのブロック図である。 例示的な諸実施形態の模範的な諸態様を実装可能な、図2に示されているプロセッサ・アーキテクチャの変更形式の模範的な図である。 例示的な一実施形態により例外値がそのベクトル要素内に保管されており、伝搬される1つまたは複数のベクトル要素について操作するデータ並列選択動作の実行を示す図の例である。 例示的な一実施形態により例外値がそのベクトル要素内に保管されており、伝搬される1つまたは複数のベクトル要素について操作するデータ並列選択動作の実行を示す図の例である。 例示的な一実施形態による保管指示(store-and-indicate)命令を示す図の例である。 例示的な一実施形態によるコンパイラの模範的なブロック図である。 例示的な一実施形態により失われた例外条件を検出するために除数レジスタ上のオーバフローのテストを実行可能な1組の条件を示す図の例である。 例示的な一実施形態によりオーバフローからNaNへの変更条件(overflow-to-NaNchange condition)を検出するためにオペランド・レジスタ上のオーバフローのテストを実行可能な1組の条件を示す図の例である。 例示的な一実施形態によりベクトル要素の値を設定するための動作例の概略を示す流れ図である。 例示的な一実施形態により例外を生成するための動作例の概略を示す流れ図である。 例示的な一実施形態によりコンパイラによりSIMDベクトル化コードに指示命令を挿入するための動作例の概略を示す流れ図である。 例示的な一実施形態の基準によりチェック可能SIMDコード部分とチェック不能SIMDコード部分との違いを示す図の例である。 例示的な一実施形態の基準によりチェック可能SIMDコード部分とチェック不能SIMDコード部分との違いを示す図の例である。 例示的な一実施形態の基準によりチェック可能SIMDコード部分とチェック不能SIMDコード部分との違いを示す図の例である。 例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。 例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。 例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。 他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。 他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。 他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。
例示的な諸実施形態は、浮動小数点例外および保管ベースの例外指示のインデータ・パス(in-data path)追跡のためのメカニズムを提供する。例示的な諸実施形態のメカニズムにより、命令などの投機的実行中など、例外条件に遭遇したときに特殊値がベクトル要素に保管される。実行スレッドの一部としての命令の投機的実行は、コードの実行中にそのスレッドの結果が必要になる場合、すなわち、投機的状態から結果が使用される非投機的状態へとスレッドが遷移する場合により良いパフォーマンスを達成するように、その結果が後で必要になる場合もあれば必要にならない場合もあるスレッドの早期実行が行われるという最適化技法である。例示的な諸実施形態の特殊値は、例外条件を示すが、対応する例外ハンドラを呼び出すものではない。これらの特殊値は、コンピュータ・プログラムの実行により、ならびに、たとえば、保管動作またはベクトル内のデータをそのベクトル・レジスタから他のベクトル・レジスタに移動するための移動動作などの非投機的命令を介するなど、ベクトルがメモリに固定(persist)されるまで、ベクトルを有するプロセッサ・アーキテクチャにより、伝搬される。このような非投機的命令が実行されると、実際の例外が生成され、適切な例外処理が実行される。このようにして、実行パイプライン内のあるポイントで例外条件を検出することができ、投機的命令または1組の命令の実行が非投機的になることなどにより、例外条件がコンピュータ・プログラムの実行に実際に影響を及ぼすときに処理されるように例外をトリガするように、例外条件検出および例外処理が相互に切り離される。
例示的な諸実施形態のメカニズムは、好ましくは、ソース・コードを、ベクトル化命令、たとえば、単一命令多重データ(SIMD)命令を実行できる1つまたは複数のプロセッサ上で実行するためのコードに変換するコンパイラに併せて実装される。例示的な諸実施形態のメカニズムにより、ソース・コード、たとえば、スカラ・コードをSIMDベクトル化コードに変換する際に、例外条件の発生を識別する特殊値の使用を利用するために、移動指示(move-and-indicate)、保管指示などの動作指示命令(まとめて「指示(indicate)」命令という)がコード内の適切な位置に挿入される。コンパイラは、以下に定義するように関心のある値がチェック可能であるかまたはチェック不能であるかに基づいて、1つまたは複数の方法により適切な挿入ポイントを決定する。ある方法では、チェック不能であるSIMDコードの一部分をマスキング・メカニズムの使用によりチェック可能SIMDコードに変換することができる。また、ある方法では、関心のある値、たとえば、関心のある複数の値の配列を伴うすべての計算の後に指示命令を挿入することができる。他の方法では、それぞれの生(live)出力値をテストするように最小数のチェック命令が適切な位置に挿入され、ここで、値が最終的にコードの記憶イメージまたは決定プロセスに影響を与える(あるいは次の計算がその結果を使用して、最終的にコードの記憶イメージまたは決定プロセスに影響を与えることになる)場合にその値は生である。
SIMD対応プロセッサが提供されるデータ処理システムの一例は、ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社から入手可能なセル・ブロードバンド・エンジン(CBE:Cell Broadband Engine)である。以下の説明では例示的な諸実施形態のメカニズムを実装するためにCBEアーキテクチャを使用すると想定することになるが、本発明はCBEアーキテクチャでの使用に限定されないことを認識されたい。それとは反対に、例示的な諸実施形態のメカニズムは、コンパイラによって実行される変換とともに配列参照安全分析を使用できる任意のアーキテクチャで使用することができる。CBEアーキテクチャは、例示的な諸実施形態のメカニズムを使用することができ、例示的な諸実施形チアのメカニズムに関していかなる制限も明記または暗示することを意図しない、1つのタイプのデータ処理システムの一例としてのみ、以下に提供される。
当業者であれば認識するように、本発明は、システム、方法、またはコンピュータ・プログラムとして実施することができる。したがって、本発明の諸態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコードなどを含む)、またはソフトウェアとハードウェアの諸態様を組み合わせた実施形態の形を取ることができ、いずれも一般に本明細書では「回路」、「モジュール」、または「システム」と呼ぶことができる。さらに、本発明の諸態様は、コンピュータ使用可能プログラム・コードがそこに実施されている任意の1つまたは複数のコンピュータ可読媒体に実施されたコンピュータ・プログラムの形を取ることができる。
1つまたは複数のコンピュータ可読媒体の任意の組み合わせを使用することができる。このコンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読記憶媒体にすることができる。コンピュータ可読記憶媒体は、たとえば、電子、磁気、光、電磁、赤外線、または半導体のシステム、装置、またはデバイス、あるいは上記の任意の適切な組み合わせにすることができるが、これらに限定されない。コンピュータ可読媒体のより具体的な例(非網羅的リスト)としては、1つまたは複数のワイヤを有する電気接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み取り専用メモリ(ROM)、消去可能プログラマブル読み取り専用メモリ(EPROMまたはフラッシュ・メモリ)、光ファイバ、ポータブル・コンパクト・ディスク読み取り専用メモリ(CD−ROM)、光学記憶装置、磁気記憶装置、または上記の任意の適切な組み合わせを含むであろう。本明細書では、コンピュータ可読記憶媒体は、命令実行システム、装置、またはデバイスによりあるいはそれに関連して使用するためのプログラムを収容または保管することができる任意の有形媒体にすることができる。
コンピュータ可読信号媒体は、たとえば、ベースバンド内でまたは搬送波の一部として、コンピュータ可読プログラム・コードがそこに実施された伝搬データ信号を含むことができる。このような伝搬信号は、電磁、光、またはこれらの任意の適切な組み合わせを含むがこれらに限定されない様々な形のいずれかを取ることができる。コンピュータ可読信号媒体は、コンピュータ可読記憶媒体ではなく、命令実行システム、装置、またはデバイスによりあるいはそれに関連して使用するためのプログラムを伝達、伝搬、または移送することができる任意のコンピュータ可読媒体にすることができる。
コンピュータ可読媒体上に実施されたコンピュータ・コードは、無線、有線、光ファイバ・ケーブル、無線周波(RF)など、またはこれらの任意の適切な組み合わせを含むがこれらに限定されない任意の適切な媒体を使用して伝送することができる。
本発明の諸態様に関する動作を実行するためのコンピュータ・プログラム・コードは、Java(TM)、Smalltalk(TM)、C++などのオブジェクト指向プログラミング言語ならびに「C」プログラミング言語または同様のプログラミング言語などの従来のプロシージャ型プログラミング言語を含む1つまたは複数のプログラミング言語の任意の組み合わせで作成することができる。このプログラム・コードは、完全にユーザのコンピュータ上で、一部分はユーザのコンピュータ上で、スタンドアロン・ソフトウェア・パッケージとして、一部分はユーザのコンピュータ上でかつ一部分はリモート・コンピュータ上で、あるいは完全にリモート・コンピュータまたはサーバ上で実行することができる。後者のシナリオでは、リモート・コンピュータは、ローカル・エリア・ネットワーク(LAN)または広域ネットワーク(WAN)を含む任意のタイプのネットワークによりユーザのコンピュータに接続される場合もあれば、外部コンピュータに対して(たとえば、インターネット・サービス・プロバイダを使用してインターネットにより)接続が行われる場合もある。
本発明の例示的な諸実施形態による方法、装置(システム)、およびコンピュータ・プログラムの流れ図あるいはブロック図またはその両方に関連して、本発明の諸態様について以下に説明する。流れ図あるいはブロック図またはその両方の各ブロックならびに流れ図あるいはブロック図またはその両方の複数ブロックの組み合わせは、コンピュータ・プログラム命令によって実装可能であることが理解されるであろう。これらのコンピュータ・プログラム命令は、マシンを生産するために汎用コンピュータ、専用コンピュータ、またはその他のプログラマブル・データ処理装置のプロセッサに提供することができ、コンピュータまたはその他のプログラマブル・データ処理装置のプロセッサを介して実行される命令は流れ図あるいはブロック図またはその両方の1つまたは複数のブロックに指定された機能/行為を実装するための手段を作成する。
また、これらのコンピュータ・プログラム命令は、特定の方法で機能するよう、コンピュータ、その他のプログラマブル・データ処理装置、またはその他のデバイスに指示することができるコンピュータ可読媒体に保管することもでき、コンピュータ可読媒体に保管された命令は流れ図あるいはブロック図またはその両方の1つまたは複数のブロックに指定された機能/行為を実装する命令を含む装置(article of manufacture)を生産する。
また、このコンピュータ・プログラム命令は、コンピュータ、その他のプログラマブル・データ処理装置、またはその他のデバイス上にロードして、一連の動作ステップをコンピュータ、その他のプログラマブル装置、またはその他のデバイス上で実行させ、コンピュータによって実行されるプロセスを生産することもでき、コンピュータまたはその他のプログラマブル装置上で実行される命令は流れ図あるいはブロック図またはその両方の1つまたは複数のブロックに指定された機能/行為を実装するためのプロセスを提供する。
図面内の流れ図およびブロック図は、本発明の様々な諸実施形態によるシステム、方法、およびコンピュータ・プログラムについて可能な実装例のアーキテクチャ、機能、および動作を例示している。この点に関しては、流れ図またはブロック図内の各ブロックは、指定の論理機能(複数も可)を実装するための1つまたは複数の実行可能命令を含む、コードのモジュール、セグメント、または一部分を表すことができる。また、いくつかの代替実装例では、ブロック内に示された機能は図面内に示された順序から外れて行われる可能性があることに留意されたい。たとえば、連続して示されている2つのブロックは、関係する機能に応じて、実際にはほぼ同時に実行される場合もあれば、ときには逆の順序で実行される場合もある。また、ブロック図あるいは流れ図またはその両方の各ブロックならびにブロック図あるいは流れ図またはその両方の複数ブロックの組み合わせは、指定の機能または行為を実行する専用ハードウェアベースのシステム、あるいは専用ハードウェアとコンピュータ命令の組み合わせによって実装可能であることにも留意されるであろう。
図1は、本発明の諸態様を実装可能なデータ処理システムの模範的なブロック図である。図1に示されている模範的なデータ処理システムはセル・ブロードバンド・エンジン(CBE)データ処理システムの一例である。本発明の好ましい諸実施形態の説明ではCBEが使用されるが、以下の説明を読んだときに当業者にとって容易に明らかになるように、本発明はこのようなものに限定されない。
図1に示されているように、CBE100は、プロセッサ(PPU)116とそのL1およびL2キャッシュ112および114を有するパワー・プロセッサ・エレメント(PPE)110と、それぞれがそれ専用の協同プロセッサ・ユニット(SPU:synergistic processor unit)140〜154、メモリ・フロー制御155〜162、ローカル・メモリまたはストア(LS)163〜170、および、たとえば、直接メモリ・アクセス(DMA)、メモリ管理ユニット(MMU)、およびバス・インターフェース・ユニットの組み合わせにすることができるバス・インターフェース・ユニット(BIUユニット)180〜194を有する複数の協同プロセッサ・エレメント(SPE:synergistic processor element)120〜134とを含む。広帯域内部エレメント相互接続バス(EIB)196、バス・インターフェース・コントローラ(BIC)197、およびメモリ・インターフェース・コントローラ(MIC)198も設けられている。
ローカル・メモリまたはローカル・ストア(LS)163〜170は、物理的にはSPU140〜154に結合された小型メモリとして設けることができる大型メモリ・マップの非コヒーレント・アドレス可能部分である。ローカル・ストア163〜170は異なるアドレス・スペースにマッピングすることできる。これらのアドレス領域は非別名構成(non-aliased configuration)で連続している。ローカル・ストア163〜170は、以下により詳細に記載するSPU識別レジスタを介するなど、そのアドレス位置により、それに対応するSPU140〜154およびSPE120〜134に関連付けられている。このシステム内のすべてのリソースは、ローカル・ストア163〜170が安全な動作モードに置かれていない間はローカル・ストアとの間で読み取り/書き込みを行う能力を有し、その(安全な動作モード)場合、その関連SPUだけがローカル・ストア163〜170またはローカル・ストア163〜170の指定の保護部分にアクセスすることができる。
CBE100は、図1に描写されているエレメントのそれぞれを単一のマイクロプロセッサ・チップ上に設けることができるような、1チップ上のシステム(system-on-a-chip)にすることができる。その上、CBE100は、SPUのそれぞれがシステム内の他のSPUのそれぞれから異なる命令を受信する可能性がある異種処理環境である。その上、SPU用の命令セットはPPUのものとは異なり、たとえば、PPUは縮小命令セット・コンピュータ(RISC)ベースの命令を実行することができ、SPUはベクトル命令を実行する。CBEアーキテクチャの他の態様では、PPUはパワー命令セット・アーキテクチャ(ISA)データ並列SIMD拡張をサポートする。
SPE120〜134は、EIB196を介して相互にならびにL2キャッシュ114に結合される。加えて、SPE120〜134はEIB196を介してMIC198およびBIC197に結合される。MIC198は共用メモリ199への通信インターフェースを提供する。BIC197はCBE100とその他の外部バスおよびデバイスとの間の通信インターフェースを提供する。
PPE110はデュアル・スレッドPPE110である。このデュアル・スレッドPPE110と8つのSPE120〜134との組み合わせにより、CBE100は10個の同時スレッドと128個を超える未処理のメモリ要求を処理できるようになる。PPE110は、計算作業負荷のほとんどを処理する他の8つのSPE120〜134用のコントローラとして動作する。PPE110を使用して従来のオペレーティング・システムを実行することができるが、SPE120〜134は、たとえば、ベクトル化浮動小数点コード実行を実行する。
SPE120〜134は、協同プロセッサ・ユニット(SPU)140〜154と、メモリ・フロー制御ユニット155〜162と、ローカル・メモリまたはストア163〜170と、インターフェース・ユニット180〜194とを含む。ローカル・メモリまたはストア163〜170は、模範的な一実施形態では、PPE110にとって可視であり、ソフトウェアによって直接アドレス指定することができる、256KBの命令およびデータ・メモリを含む。
PPE110は、小型プログラムまたはスレッドをSPE120〜134にロードし、複雑な動作の各ステップを処理するためにSPEをひとまとめにつなぐことができる。たとえば、CBE100を取り入れたセットトップ・ボックスは、DVDの読み取り、ビデオおよびオーディオのデコード、ならびにディスプレイのためのプログラムをロードすることができ、データは、最終的に出力ディスプレイ上に表示されるまでSPEからSPEへと渡されることになるであろう。4GHzでは、各SPE120〜134は理論上32GFLOPSのパフォーマンスを示し、PPE110は同様のレベルのパフォーマンスを有する。
メモリ・フロー制御ユニット(MFC)155〜162は、このシステムの残りの部分およびその他のエレメントへのSPU用のインターフェースとして機能する。MFC155〜162は、メイン・ストレージとローカル・ストレージ163〜170との間のデータ転送、保護、および同期のための1次メカニズムを提供する。論理的にはプロセッサ内の各SPUについて1つのMFCが存在する。実装例によっては、複数のSPU間で単一MFCのリソースを共用することができる。このような場合、そのMFCについて定義されたすべての機構およびコマンドは、各SPE用のソフトウェアにとって独立したものに見えなければならない。MFCを共用することの効果は、実装依存の機構およびコマンドに限定される。
図1のデータ処理システム100により、プロセッサ106は、整数(スカラ)と浮動小数点(ベクトル)の両方の命令を処理し、両方のタイプのデータについて操作するための機構を有することができる。しかし、例示的な諸実施形態により、プロセッサ106は、浮動小数点専用SIMD命令およびデータとしてSIMD命令およびデータを処理するためのハードウェア機構を有することができる。スカラ機構は、整数処理に使用され、浮動小数点専用SIMDアーキテクチャに併せて、とりわけ、ループ制御およびメモリ・アクセス制御に使用される。
図2は、例示的な諸実施形態によってなされた改良点の考察のために示されたプロセッサ・アーキテクチャのブロック図である。図2に示されている特定のプロセッサ・アーキテクチャは、ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社から入手可能で、Gibbs他による「IBM eServer BladeCenter JS20 PowerPC970 Programming Environment」というレッドブック(2005年1月、www.redbooks.ibm.com/redpapers/pdfs/redp3890.pdfで入手可能)に記載されているPowerPC(TM)970マイクロプロセッサ用のものである。
図2に示されているように、このプロセッサ・アーキテクチャは、命令キャッシュ202と、命令取り出しユニット204と、命令デコード・ユニット206と、ディスパッチ・バッファ208とを含む。命令は、命令取り出しユニット204によって命令キャッシュ202から取り出され、命令デコード・ユニット206に提供される。命令デコード・ユニット206は、命令をデコードし、デコードした命令をディスパッチ・バッファ208に提供する。デコード・ユニット206の出力は、レジスタ・マップ210とグローバル完了テーブル212の両方に提供される。レジスタ・マップ210は、汎用レジスタ(GPR)、浮動小数点レジスタ(FPR)、ベクトル・レジスタ・ファイル(VRF)などのうちの1つまたは複数にマッピングする。次に命令は、命令デコード・ユニット206およびレジスタ・マップ210のデコードおよびマッピングによって決定された命令タイプに応じて、発行待ち行列(issue queue)220〜232のうちの適切なものに提供される。発行待ち行列220〜232は、実行ユニット240〜258のうちの様々なものに入力を提供する。実行ユニット240〜258の出力はレジスタ・ファイル260〜272のうちの様々なものに送られる。命令で使用するためのデータは、データ・キャッシュ280を介して入手することができる。
特に注目すべきことは、プロセッサ内に浮動小数点、ベクトル、および固定小数点、または整数用の個別の発行待ち行列および実行ユニットが存在することが描写されたアーキテクチャで分かることである。図示の通り、浮動小数点レジスタ・ファイル264への出力ポートを有する2つの浮動小数点実行ユニット244〜246への2つの出力ポートを有する単一の浮動小数点ユニット(FPU)発行待ち行列224が存在する。単一のベクトル置換(vector permute)発行待ち行列226は、ベクトル・レジスタ・ファイル(VRF)266にアクセスするためのポートを有するベクトル置換実行ユニット248への単一出力ポートを有する。ベクトル演算論理装置(ALU)発行待ち行列228は、ベクトル・レジスタ・ファイル268にアクセスするためのポートを有するベクトルALU250に命令を発効するために1つの発行ポートを有する。これらの発行待ち行列、実行ユニット、およびレジスタ・ファイルはいずれもリソース、面積、およびパワーを消費するものであることを認識されたい。
いくつかの例示的な諸実施形態により、浮動小数点専用SIMDアーキテクチャ用のメカニズムを提供する際に、これらの発行ユニット224〜228、実行ユニット244〜250、およびレジスタ・ファイル264〜268は、単一の発行待ち行列、実行ユニット、およびレジスタ・ファイルで置き換えられる。図3は、いずれかの例示的な実施形態による代替プロセッサ・アーキテクチャを示す模範的な図である。図3に示されているプロセッサ・アーキテクチャは、図2に示されているPowerPC(TM)970アーキテクチャの変更形式のものであり、したがって、図2と同様の要素が同様の参照番号とともに示されている。この変更されたアーキテクチャ例は一例に過ぎず、その他のプロセッサ・アーキテクチャに実装される発行ユニット、実行ユニット、およびレジスタ・ファイルの数を削減するために、このようなその他のアーキテクチャに対して同様の変更を行うことができることを認識されたい。したがって、例示的な諸実施形態のメカニズムは、PowerPC(商標)970アーキテクチャの変更形式における実装に限定されない。
図3に示されているように、図3に示されている変更されたアーキテクチャでは、発行ユニット224〜228が単一のクワッド処理(quad-processing)実行ユニット(QPU)発行ユニット310で置き換えられている。その上、実行ユニット244〜250は単一のクワッド処理実行ユニット(QPU)320で置き換えられている。さらに、レジスタ・ファイル264〜268は単一のクワッドベクトル・レジスタ・ファイル(QRF)330で置き換えられている。クワッド処理ユニット(QPU)は単一命令で最高4つのデータ要素を同時に実行できるので、この変更されたアーキテクチャは、プロセッサの設計を単純化しながら、リソース使用量、使用面積、および電力使用量を削減するだけでなく、プロセッサのパフォーマンスも向上させる。
図3の変更されたプロセッサ・アーキテクチャは依然としてスカラ整数を処理する固定小数点ユニット(FXU)を有することに留意されたい。このようなスカラ整数は主としてループ反復などの制御動作に使用される。その他の命令はいずれも浮動小数点またはベクトル・フォーマットのものである。具体的には、VMX命令セットの実行対象が浮動小数点と整数の混合であるのとは異なり、QPX命令は一般に浮動小数点データのみについて操作し、特に算術演算を実行する。整数型データのみの記憶は、このような整数をロードして保管するためにまたは浮動小数点状況および制御レジスタ(FPSCR)との間で制御ワードを移動するために、整数フォーマットへのデータの変換に関連付けられている。整数の算術、論理演算、およびその他のこのような演算の必要性を考慮せずに、浮動数の表現および処理のために最適化された適切な内部表現を選択することができるので、動作を浮動小数点専用フォーマットに削減することにより、浮動小数点処理の効率が大幅に高められる。
例示的な一実施形態により、浮動小数点専用SIMD ISAでは、従来の既知のISAで必要とされるように、比較結果、ブール演算、選択動作、およびデータの境界あわせの記憶のために整数のコード化をサポートするための要件がまったくない。浮動小数点(FP)専用SIMD ISAにより、実質的にすべてのデータを浮動小数点データとして保管することができる。したがって、図3のベクトル・レジスタ・ファイル330には1つのタイプのデータのみが保管される。
例示的な一実施形態により、FP専用SIMD ISAは、浮動小数点ベクトル同士を比較し、比較結果をベクトル・レジスタ・ファイル330の浮動小数点ベクトル・レジスタに保管する能力を提供する。その上、FP専用SIMD ISAは選択動作およびブール演算のためのコード化方式を提供し、その方式により浮動小数点データ表現を使用して選択動作およびブール論理演算を実行することができる。
例示的な一実施形態では、FP専用SIMD ISAは、QPU320によるクワッド実行のために、4つの要素を有するFP専用倍精度SIMDベクトル、すなわち、クワッドベクトルを使用する。単精度SIMDベクトルは、ロードおよび保管動作中に倍精度との間で自動的に変換される。本明細書では倍精度ベクトルSIMD実装例について説明するが、例示的な諸実施形態はこのようなものに限定されず、例示的な諸実施形態の精神および範囲を逸脱せずに、単精度、拡張精度、3倍精度、および10進浮動小数点専用SIMDを含むがこれらに限定されないその他の精度を使用することもできる。
例示的な一実施形態では、FP専用SIMD ISAを実装するための例示的な実施形態のメカニズムは主としてQPU320内の論理素子として提供される。メモリ・ユニットLS1およびLS2のうちの1つまたは複数のいずれか適切な方に追加のロジックを提供することができる。他の例示的な諸実施形態では、例示的な諸実施形態のメカニズムは、図3に示されている複数の要素間に分散されるなど、図3に示されている変更されたアーキテクチャの他の要素内に、あるいは図3に示されている1つまたは複数の要素に結合された1つまたは複数の専用論理素子内に、ロジックとして実装することができる。例示的な諸実施形態の実装の一例を提供するために、本明細書のために、他に指示のない限り、例示的な諸実施形態のメカニズムがQPU320内にロジックとして実装されると想定される。QPU320内のロジックの例示的な一実施形態のより詳細な説明については、QPU320アーキテクチャに関する仕様を提供する付録Aを参照されたい。
例示的な諸実施形態のFP専用SIMD ISAの一部として、FPベクトル同士を比較し、比較結果をFPベクトル・レジスタ・ファイル330に保管する能力が提供される。選択した比較は、ブール値に対応するFP値を使用してコード化される。たとえば、例示的な一実施形態では、「真(TRUE)」の出力の場合、すなわち、比較の条件が満たされ、「真」の結果が生成された場合、その出力は1.0というFP値として表される。「偽(FALSE)」の出力の場合、すなわち、比較の条件が満たされず、「偽」の出力が生成された場合、その出力は−1.0というFP値として表される。比較の条件が満たされたかどうかに基づいてこのようなFP値を生成する関数としては、2つのFP値を比較して、それらが等しいかどうかを判断するQVFCMPEQ関数、2つのFP値を比較して、第1のFP値が第2のFP値より大きいかどうかを判断するQVFCMPGT関数、および2つのFP値を比較して、第1のFP値が第2のFP値より小さいかどうかを判断するQVFCMPLT関数を含む。加えて、「非数値(Not a Number)」(NaN)条件についてテストするためにテスト関数、すなわち、QVTSTNANが提供される。これらの関数の出力は、真の場合の1.0または偽の場合の−1.0のいずれかである。
これらの比較関数に加えて、例示的な諸実施形態のFP専用SIMD ISAには一致選択(matching select)機能が設けられている。このクワッドベクトル浮動小数点選択またはQVFSEL関数は、qvfsel QRT,QRA,QRC,QRBというフォーマットを有する。このクワッドベクトル浮動小数点選択関数により、レジスタQRAの各ダブルワード・スロット内の浮動小数点オペランドが値ゼロと比較され、真または偽の値を決定する。オペランドがゼロより大きいかまたはゼロに等しい(すなわち、真である)場合、レジスタQRTの対応するスロットはレジスタQRCの内容に設定される。オペランドがゼロより小さいかまたはNaNである場合、レジスタQRTはレジスタQRBの内容に設定される。この比較はゼロの符号を無視し、すなわち、+0.0を−0.0に等しいものと見なす。したがって、この一致選択関数の任意の正の比較結果により、QRTレジスタの浮動小数点SIMDベクトル要素はQRCレジスタの対応する浮動小数点SIMDベクトル要素を取る。そうではなく、任意の負またはNaN値により、QRTレジスタの浮動小数点SIMDベクトル要素はQRBレジスタ内の対応する浮動小数点SIMDベクトル要素の値を取ることになる。
例示的な一実施形態により、入力および出力表現として真および偽の明確な定義が使用され、ここで、出力表現(すなわち、計算の結果として真または偽を表すために生成される値)は入力表現として使用される真および偽の値の範囲のサブセットである。具体的には、表1に示されている表現が使用される。
Figure 2013502648
例示的な一実施形態の一態様によれば、このように選択した入出力表現によって未定義挙動が解消される。例示的な一実施形態の他の態様によれば、このような選択により、浮動小数点数としてコード化されたブール値を保管し、比較およびブール演算を実行する能力を提供しない少なくとも1つのレガシー命令セットによる浮動小数点符号に基づくレガシー「選択」関数と「選択」関数との互換性も提供される。例示的な一実施形態のさらに他の態様によれば、このような選択により、ブール入力オペランドを読み取る命令への入力として使用されるときに、ブール値のデコードが単純化される。
その上、例示的な諸実施形態のFP専用SIMD ISAにより、クワッドベクトル浮動小数点論理関数は、ベクトル出力が生成されるように定義される。たとえば、AND、OR、XOR、NANDなどの演算に関する論理関数は、FP専用SIMD ISAブール値に関して定義され、たとえば、真の場合は1.0であり、偽の場合は−1.0である。たとえば、AND演算は、1.0 AND 1.0の結果、1.0が出力され、そうではない場合、少なくとも1つの負のオペランドとのANDの出力が−1.0になるように、FP専用SIMD ISAによって定義される。
一般に、本発明の一実施形態によりSIMDベクトルの各ベクトル位置に関する模範的なFPブールANDの演算は、表2の通りに記述することができる。
Figure 2013502648
同様に、OR演算の場合、FP専用SIMD ISAは、1.0 OR 1.0、−1.0 OR 1.0、および1.0 OR −1.0の結果、1.0が出力され、−1.0 OR −1.0の出力が−1.0になるように定義する。
一般に、本発明の一実施形態によりSIMDベクトルの各ベクトル位置に関する模範的なFPブールORの演算は、表3の通りに記述することができる。
Figure 2013502648
当業者であれば、同様に、上記に含まれる教示によりしかも本発明の範囲内で、真および偽という値について定義された1組の入力および出力表現に基づいて他のブール関数を定義することができるであろう。
本発明の模範的な一実施形態により、「flogical」命令が提供される。「flogical」命令は4ビットを使用して「真理値表」をコード化するものであり(すなわち、最高2つの入力を有する任意のブール論理関数のコード化)、それにより、浮動小数点値としてコード化された2つのブール・オペランドを使用して、この表へのインデックスを付け、ブール結果を入手する。次に、ブール結果は、例示的な諸実施形態のメカニズムにより浮動小数点(FP)ブール値としてコード化され、レジスタ・ファイルに保管される。SIMDベクトル・アーキテクチャでは、「flogical」命令はベクトル「qvflogical」命令である。このような場合、各スロット内のブール値は、各ベクトル位置に関してFPブールとしてコード化された出力結果を独立して導出するために、独立して使用される。
図3において上述したSIMDアーキテクチャで使用可能なFP専用SIMD ISAの詳細は、2008年10月14日に出願され、本出願人に譲渡された同時係属米国特許出願第12/250575号「Floating Point Only Single Instruction Multiple Data Instruction SetArchitecture」に示されている。
もう一度、図1を参照すると、CBE100のSPE120〜134あるいはPPE110またはその両方は、図3に示されているようにFP専用SIMDアーキテクチャを利用することができ、たとえば、SIMD命令などのベクトル命令を使用することができる。代わって、プロセッサがベクトル要素を有するベクトル命令を使用する他のSIMDアーキテクチャを使用することもできる。したがって、ソース・コードから並列処理を抽出し、この並列処理を利用するようにソース・コードを再構成または変換することにより、PowerISAまたはFP専用SIMD ISA拡張によりこれらのSPE120〜134またはPPE110上で実行するためにコンパイラによってソース・コードを最適化することができる。SIMDベクトル化コードへの変換ならびに最適化についてソース・コードを分析する際に、コンパイラは「if変換」動作を実行することができる。たとえば、前述の通り、データ並列if変換メカニズムおよびデータ並列選択動作を使用して、このようなif変換を実行することができる。
上述の通り、SIMD対応プロセッサ上で実行するために、コードがSIMD化、すなわち、ベクトル化されると、通常、元のプレディケートされたコードにとって問題ではない問題が例外処理時に発生する。上記の通り、プレディケートされたコード命令は、単一結果を生成するのでその結果を書き込むことになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。しかし、SIMDベクトル化命令では、これらの命令は、特定の結果が使用されるかどうか、すなわち、値が投機的であるかどうかを把握せずに複数の結果を生成することができ、したがって、生成すべき正しい1組の例外が何であるかを判断することができない。したがって、既知のSIMDアーキテクチャでは、いずれかの例外が可能になり、その場合、プロセッサによって実際に実行されない実行パス、すなわち、結果的にサイクルが浪費される投機的実行パスでもスプリアス例外を生成し処理することができ、あるいは例外が抑制され、問題が発生したことはかなり後に判断され、デバッギング・メカニズムのために複雑なトレースバック動作が必要になる。
しかし、例示的な諸実施形態のメカニズムでは、データ並列if変換ループについて適切な1組の例外を決定できないことにより例外を抑制しなければならない代わりに、例示的な諸実施形態のメカニズムがデータフロー主導方法で例外条件についてベクトル要素ごとの追跡(per-vector element tracking)を行う。このベクトル要素ごとの追跡により、例外が特殊な認識可能文字またはビット・パターンとしてベクトル要素に記録され、その特殊な認識可能文字またはビット・パターンは、SIMDベクトル化コードの実行時にどの実行パスが取られたかが判断されるときなどに、関連の例外処理が実行されている例外を生成するために後で使用することができる。換言すれば、投機的データを非投機的なものにする保管命令または移動命令による場合など、投機的実行パス内の例外は、その投機的実行パスが非投機的になるポイントまで据え置かれる。
その上、例示的な諸実施形態は、例外情報を伝搬し廃棄する(supersede)能力を提供する。すなわち、その例外を含む実行パスが取られたかどうかが判断されるまで、例外情報を伝搬することができる。異なる実行パスが取られた場合、例外を廃棄することができ、すなわち、特殊文字またはビット・パターンを無視することができ、例外処理を必要とする例外を生成することができない。代わって、特殊文字またはビット・パターンがベクトル要素に保管されているベクトル要素を実行パスが含む場合、その実行パスがもはや本質的に投機的ではないと判断されるときに対応する例外を生成し、例外処理を実行することができる。
たとえば、上述のようなデータ並列選択動作では、そのデータ並列選択動作が複数のパスからの結果を結合することに留意されたい。例外値を示す特殊文字またはビット・パターンを有するベクトル要素をデータ並列選択動作で選択しないことにより、そのベクトル・スロットについて設定された結果例外からその例外が消滅する。このようにして、データフローに基づいて各ベクトル・スロットについて例外が伝搬される。
さらに、例示的な諸実施形態のメカニズムは、ベクトル例外情報をベクトル要素に保管し、保管指示命令あるいは移動指示命令またはその両方などの特定の動作によって例外を発生して、適切な例外ハンドラに実行を転送する能力を提供する。例示的な諸実施形態のこのようなメカニズムでは、切り離しによるこのような例外を追跡するために提供されたメカニズムにより、例外の認識が例外の実際の処理から本質的に切り離される。
例示的な一実施形態では、この例示的な実施形態のメカニズムが浮動小数点数のコード化を活用して、オーバフロー条件および違法操作に関する例外を診断し追跡する。この例示的な実施形態は、米国電気電子学会(IEEE)値を使用して例外条件を示し、たとえば、無限大はオーバフロー条件を表し、NaN(非数値)値は違法操作を示す。対応する例外が発生した場合、これらのIEEE値はデータ要素の代わりにベクトル要素に保管される。次にこれらのIEEE値は、ベクトル要素が固定されるまで、たとえば、保管されるかあるいはあるレジスタから他のレジスタに移動されるまで、ベクトル要素として伝搬される。ベクトル要素内のこれらの特殊なIEEE値を識別し、対応する例外ハンドラによる処理のために対応する例外を生成するために、特殊な保管指示命令あるいは移動指示命令またはその両方が提供される。したがって、実行フロー中にこれらの保管指示命令または移動指示命令に遭遇しない場合、これらの例外は生成されない。
例示的な諸実施形態のメカニズムにより、コンパイラがコードを最適化して変換する場合、そのコンパイラは、if命令をデータ並列選択動作に変換すること、すなわち、FP指向データ並列if変換を実行することにより、データ並列if変換を実行してSIMD ISAまたは浮動小数点専用SIMD ISAを実装する。その上、ベクトル要素に関連する計算の結果、例外が生成されるときに、コンパイラは、このようなデータ並列選択動作のベクトル要素に例外値、すなわち、特殊文字またはビット・パターンを保管するためのサポートを提供する。これらの特殊文字、値、またはビット・パターンは、直ちに例外を生成するわけではなく、ベクトル要素に対応する実行パスまたはデータ・パスがその状態を投機的状態から非投機的状態に変換することによって固定されるように選択された場合、例外が生成されたものと思われ、その後、生成されるはずであることを示すだけである。したがって、計算の結果、オーバフロー条件が発生した場合、このデータ・パスまたは実行パスをたどった場合にオーバフロー例外が発生するはずであることを示すために、対応するベクトル要素は無限大値、ビット・パターンなどを保管する。その上、計算の結果、違法操作が行われた場合、このデータ・パスまたは実行パスをたどった場合に違法操作例外が発生するはずであることを示すために、NaN値、ビット・パターンなどが対応するベクトル要素に保管される。データ値の代わりにこのような値をベクトル要素に保管するためのこのようなサポートは、たとえば、図3のQPU320に設けることができる。
図4および図5は、例示的な一実施形態により例外値がそのベクトル要素内に保管されている1つまたは複数のベクトル要素について操作するデータ並列選択動作を示す図の例である。図4はデータ並列選択動作を実装するコードの一例であり、図5は図4のコードのグラフィカル表現であり、例示的な諸実施形態により、コード内の命令の結果として生成されるベクトル値と、これらのベクトル値がどのように変化するかを示している。図4に示されているコードの場合のデータ並列選択動作は「QVFSEL」命令であり、これは、たとえば、上述の通りのコンパイラ最適化によりコード4Aに挿入することができる。図5は、例外をスロー(throw)させるのではなく、データ並列選択動作がどのように例示的な諸実施形態の特殊コードを伝搬することができ、コードの実行がその実行パスまたはデータ・パスをたどらない場合に結果的に例外がスローされる可能性のある条件を無視するためにデータ並列選択動作をどのように使用できるかを示している。図5はさらに、非投機的命令が選択された実行パス内にある特殊コードをメモリ、ベクトル・レジスタなどに固定させ、それにより、その後、例外をスローさせ、例外処理を呼び出させるまで、このような特殊コードがどのように伝搬されるかを示している。図4および図5は、例示的な諸実施形態の動作を説明するときに本明細書でまとめて参照する。
図4および図5に示されている命令は、これらの命令の結果がメモリに固定されるかまたはそうではなく非投機的命令実行の一部として他のベクトル・レジスタに固定されるまで、投機的状態で実行されるものと想定されることに留意されたい。本明細書に明記された例示的な諸実施形態の例では、このような非投機的命令は、以下により詳細に述べる保管命令および移動命令を含む。
図4および図5に示されているように、SIMDベクトル化コードのこの部分の場合、クワッドベクトル・ロード浮動小数点データ(QVLFD)命令410は、4つのデータ値を1つのベクトル・レジスタの4つのスロットにロードするものであり、ベクトルQBIの第1の組の値をロードする。図5に示されているように、描写されている例では、ベクトル・レジスタに書き込まれるQBI用の4つの値は{b0,0,b2,0}である。クワッドベクトル浮動小数点逆数値は、QVFRE命令420の実行によって生成され、その結果、値{1/b0,NAN,1/b2,NAN}が得られる。非数値(NAN)値は0の逆数、すなわち、1/0によって生成され、IEEE規格ではこれは非数値の値を生成する。典型的に、このようなNAN結果が生成されると、エラーが報告され、すなわち、例外がスローされ、これによりコードの実行が例外ハンドラに分岐され、この例外ハンドラは例外タイプを処理するために定義済み動作を実行する。命令420の実行は投機的であるので、ベクトル・レジスタ内のNAN値のいずれかが実際に非投機的命令によって命令またはベクトル・レジスタに固定される保証はなく、したがって、例外ハンドラへの分岐の結果、プロセッサ・サイクルおよびリソースが浪費されることになる。
しかし、例示的な諸実施形態のメカニズムにより、例外ハンドラによる処理を必要とする例外を直ちに生成するのではなく、実際の例外値、この場合はNANがメモリに固定され、あるベクトル・レジスタから他のベクトル・レジスタに移動されるか、そうではなく非投機的命令によって使用されるまで、例外は一時的に抑制されるかまたは据え置かれる。したがって、例外値は、例外がスローされ、例外処理が呼び出される状況において非投機的命令によって使用されるまで、実行フローにより伝搬されるだけである。例外値が非投機的命令によってまったく使用されない場合、例外はまったくスローされず、実行フローに対して否定的な影響を与えることはない。
図4および図5に示されている例に戻ると、QVLFD命令410によってロードされたベクトルはクワッドベクトル浮動小数点比較(QVFCMP)命令430にも入力され、この命令はベクトル内のスロットの値をゼロ値ベクトル、すなわち、{0,0,0,0}と比較する。本質的に、QVFCMP命令430は、ロードされたベクトル{b0,0,b2,0}内の値が非ゼロであるかどうかを判断する。非ゼロである場合、真値が生成され、そうではない場合、偽値が生成される。次に、ベクトル{b0,0,b2,0}内の各ベクトル値に関する「真」または「偽」値は、この場合、ベクトル{t,f,t,f}に保管される。このベクトルは、QVFRE命令420から出力されたベクトル{1/b0,NAN,1/b2,NAN}とともに、データ並列選択命令であるQVFSEL命令440に入力される。第3のベクトル{d,d,d,d}は、デフォルト値を提供するためにQVFSEL命令440への入力として提供される。
QVFCMP命令430は本質的に、QVFRE命令420のために結果的にNAN値になるときに、ロードされたベクトル{b0,0,b2,0}内のゼロ値をマスキングするためのマスク・ベクトル{t,f,t,f}を生成する。すなわち、QVFSEL命令440は、QVFSEL命令440に伝搬されるベクトル{1/b0,NAN,1/b2,NAN}内の各スロットについて、ベクトル{1/b0,NAN,1/b2,NAN}からの値またはデフォルト・ベクトル{d,d,d,d}からのデフォルト値のいずれを選択すべきかを判断する。この判断は、QVFCMP命令430の出力ベクトル、すなわち、この例では{t,f,t,f}の対応するスロットに真値が存在するかどうかに基づいて行われる。したがって、3つのベクトル{1/b0,NAN,1/b2,NAN}、{d,d,d,d}、および{t,f,t,f}について操作するQVFSEL命令440の結果として、ベクトル値{1/b0,d,1/b2,d}が生成される。NAN値はもはや実行フローのこの時点では問題ではないことが分かるであろう。既知のメカニズムのようにQVFRE命令420の動作に基づいて例外が生成された場合、例外値はいずれにしても使用されないので、例外処理は、コンピュータ・コードの最終的な実行フローに影響を及ぼさない例外条件を処理し、リソースおよびプロセッサ・サイクルを浪費させているものと思われる。クワッドベクトル保管浮動小数点データ(QVSTFD)命令を使用してベクトルをメモリに固定することなどにより、これがコードの最終出力であり、ベクトル値{1/b0,d,1/b2,d}が非投機的命令によって使用される場合、いかなる例外もスローされないものと思われ、したがって、例外処理が回避される。というのは、非投機的命令によって使用されるベクトルは、処理を必要とする例外またはエラー条件を示す特殊例外値を含まないからである。
しかし、描写された例では、ベクトル値{1/b0,d,1/b2,d}は最終結果ではなく、その代わりに、ベクトル{c0,c1,NAN,c3}をロードする他のクワッドベクトル・ロード浮動小数点データ命令450の出力に加えられる。クワッドベクトル加算(QVADD)命令460はベクトル{c0,c1,NAN,c3}をベクトル{1/b0,d,1/b2,d}に加え、その結果、ベクトル出力{1/b0+c0,d+c1,NAN,d+c3}が得られる。このベクトル出力は非投機的クワッドベクトル保管浮動小数点データ(QVSTFD)命令470に提供され、この命令はベクトル出力{1/b0+c0,d+c1,NAN,d+c3}をメモリに固定する。この時点で非投機的命令470は特殊例外条件値NANを有するベクトルを使用しているので、エラーが報告され、すなわち、例外がスローされ、その結果、エラー条件を処理するためのルーチン、すなわち、例外ハンドラへ実行フローが分岐される。したがって、QVFRE命令420からの出力内のNAN値の結果として、QVSTFD命令470によって受信される最終出力に例外が発生しなかったが、QVLFD命令450の出力内のNAN値によって例外値が非投機的命令470まで実行フローを伝搬し、それにより、据え置かれた例外がスローされる。
上記の通り、既知のシステムでは、QVLFD命令450がNAN結果を生成すると直ちに、例外がスローされたものと思われ、例外ハンドラへの実行の分岐が実行されたものと思われる。しかし、例示的な諸実施形態では、描写されている例のQVFSEL命令440の場合のようにそれが廃棄されるか、または非投機的命令によって使用されるまで、NAN値が伝搬され、それにより、例外がスローされる。これにより、例外処理が必要であると判断されるまで例外の処理を据え置くことができ、例外が実行フローに影響を及ぼさないインスタンスでは例外を廃棄することができる。
もう一度、図3に関連して説明すると、上述のメモリ・ベクトル動作、たとえば、ロードおよびストアは、ベクトル・レジスタ・ファイル330からの値の書き込みおよび読み取りにより、図3のロード/ストア・ユニットLS1 254およびLS2 258によって実行できることを認識されたい。計算など、その他の非メモリ・ベクトル動作は、クワッド処理ユニット(QPU)発行ユニット310およびQPU320により実行することができ、結果はベクトル・レジスタ・ファイル330に書き込まれる。コンパイラはコンピュータ・コードを最適化しSIMDベクトル化することができ、据え置かれた例外処理により例外値を伝搬するためのメカニズムは図3のプロセッサ・アーキテクチャのこれらのメカニズムによって実行されるコンパイル済みコード内で実行される。
したがって、例外を生成し、プログラムの実行によって実際にたどられない実行パス内でこれらの例外を処理しなければならないのではなく、例示的な諸実施形態のメカニズムは、例外の実際の処理から例外条件の識別を切り離し、プログラムの実行フローが実際に遭遇する例外条件のみが実際に処理される。その結果、プログラムの実行に実際に影響を及ぼさない例外を処理するときにプロセッサ・サイクルが浪費されない。
この切り離しを提供するために、上記の通り、例外条件の検出に応答してベクトル要素内に特殊値を設定するためのサポートが提供される。その上、プログラムの実行中にベクトル内のこれらの特殊値に遭遇する場合、すなわち、そのベクトル要素を伴うデータ並列選択動作などによりデータ・パスまたは実行パスが選択される場合、このような特殊値を認識し、適切な例外を生成するための特殊命令が提供される。これらの特殊命令は、例示的な一実施形態では、保管指示命令および移動指示命令である。コンパイラは、SIMDベクトル化実行のためにコードの元の一部分を最適化し変換するときに、コードの元の一部分の通常の保管または移動命令をこのような保管指示または移動指示動作で置き換えることができる。
例示的な諸実施形態では保管指示命令および移動指示命令が使用されるが、例示的な諸実施形態はこのようなものに限定されないことを認識されたい。むしろ、いずれの非投機的命令もその非投機的命令の対応するX指示(X-and-indicate)バージョンを有することができ、ここで「X」はその非投機的命令によって実行される何らかの動作である。保管指示命令および移動指示命令は、例示的な諸実施形態により例外指示を提供するために使用可能なタイプの非投機的命令の例に過ぎない。
図6は、例示的な一実施形態による保管指示命令を示す図の例である。図6に示されているように、図6でクワッドベクトル保管浮動小数点単一インデックス付き指示命令という保管指示命令は、クワッドベクトル・レジスタQRSのベクトル要素のうちの複数バイトが非数値(NaN)または無限大(Inf)値を示すかどうかを判断する。図6において特に注目すべきことは、クワッドベクトル保管浮動小数点単一インデックス付き指示命令は、クワッドベクトル保管浮動小数点単一インデックス付き指示命令、クワッドベクトル・レジスタ入力ベクトルQRS、ならびに命令の結果用の有効アドレスを計算するために使用される値を保持するスカラ・レジスタRAおよびRBの識別子としてその命令を認識するためにプロセッサ・アーキテクチャによって使用されるコード31を含む。
描写されている例では、クワッドベクトル・レジスタQRSの第1のベクトル要素はバイト0:7に対応し、第2のベクトル要素はバイト8:15に対応し、第3のベクトル要素はバイト16:23に対応し、第4のベクトル要素はバイト24:31に対応する。これらのベクトル要素のいずれかがNAN値またはINF値を示す場合、QPU例外が示される。保管指示命令は図6に示されているが、ベクトル要素内のNAN値およびINF値についてこのようなチェックを実行する同様の移動指示命令を提供できることに留意されたい。
図6に示されているように、これらのチェックは、対応する値QPU_enable_indicate_NaNまたはQPU_enable_indicate_Infinityが適切な値に設定されている場合のみ実行される。これらの値は、たとえば、図3のQPU320の適切な制御レジスタに設定することができる。これらの制御レジスタ内の値は、QPU320がNaNまたは無限大値についてモニターし、それらを使用して例外を追跡するかどうかを示すことができる。これらの値が制御レジスタに設定されている場合のみ、図3のQPU320は実際に、ベクトル要素内の例外条件を示す特殊例外値を保管し、保管指示命令または移動指示命令によりベクトル要素内のこれらの特殊値に関するチェックを実行する機能を実行することになる。
図7は、例示的な一実施形態によるコンパイラの模範的なブロック図である。図7に示されているように、コンパイラ610は、そのコンパイラ610が構成される対象である例示的な諸実施形態により分析される元のソース・コード620を受信する。すなわち、コンパイラ610は、SIMDまたはFP専用SIMDベクトル化実行のために変更可能な条件付き制御フローを含むループを有するソース・コード620の一部分を識別する。ソース・コード620のこのような一部分は、ベクトル要素に対応するデータ・パスまたは実行パスが選択され、ベクトル要素の値が保管または移動された場合のみ、例外条件値をベクトル要素に保管し例外を生成するための例示的な諸実施形態のメカニズムを実装するデータ並列選択動作を使用して、データ並列「if」変換によって変換することができる。コンパイラ610は、元のソース・コード620の保管命令あるいは移動命令またはその両方を、ベクトル要素内のこのような例外条件値を認識し、それに応じて命令を生成する保管指示命令あるいは移動指示命令またはその両方で置き換えることができる。他の例示的な諸実施形態では、他のタイプの非投機的命令を、X指示タイプの動作をサポートするように変更されたこれらの命令の対応するバージョンで置き換えることができ、その場合、非投機的命令はその通常の動作を実行するが、次にそのアーキテクチャで可能になっており、X指示タイプの命令への入力内に存在することが判明している例外条件の指示も提供する。
コンパイラによって実行された最適化および変換の結果は、例示的な諸実施形態の最適化および変換を実装する最適化/変換済みコード630である。次に、この最適化/変換済みコード630はリンカ640に提供され、そのリンカは、一般に当技術分野で既知の通り、リンカ動作を実行し、それにより実行可能コード650を生成する。実行可能コード650は次にプロセッサ660によって実行することができ、そのプロセッサは、たとえば、図1のCBE100または他のデータ処理システム・アーキテクチャのプロセッサにすることができる。
例外条件が失われる可能性があるかあるいは保管指示命令または移動指示命令が実行される前に例外条件が変更される可能性があるインスタンスが存在することに留意されたい。望ましいときにこのような条件についてテストするために図3のQPU320内でテストを提供することができる。たとえば、無限大値(INF)を有するベクトル要素が入力されるが、計算の出力が「0」である条件が発生する可能性がある。このような条件を検出する必要がある場合、QPU320はオーバフロー条件について除数をチェックすることができ、すなわち、QPU320はInfという特殊値について除数レジスタをチェックするためのロジックを有することができる。このような特殊値が検出された場合、プログラムの実行がこのような条件に遭遇したときにオーバフロー例外が依然として生成される可能性がある。図8は、例示的な一実施形態により失われた例外条件を検出するために除数レジスタ上のオーバフローのテストを実行可能な1組の条件を示す図の例である。図8から分かるように、除数が「INF」という値を有し、オペランドが−1、−0、0、または1である場合、この条件が発生する。
例外が失われる可能性がある他の条件は、オーバフロー条件(INF)が違法操作条件(NAN)に変換される場合の条件である。このような状況は、計算がINF−INF、0*INF、またはその他のタイプのこの種の計算を含むときに発生する。多くの場合、例外が存在することを検出するだけで十分であり、制御レジスタ値QPU_enable_indicate_NaNおよびQPU_enable_indicate_Infinityの設定によって両方のタイプの例外が可能になる場合のように、例外がオーバフロー例外であるかまたは違法操作例外であるかは重要ではない。しかし、1つのタイプの例外のみが可能である場合のように、その他のインスタンスでは、例外のタイプ同士を区別することが重要である場合もある。このような状況では、オーバフロー例外が違法操作例外に変換される可能性がある場合の条件についてテストすることは重要である。
このようなテストが必要である場合、QPU320には、オーバフロー値についてオペランドあるいは除数レジスタまたはその両方をチェックするためのロジックを設けることができる。図9は、例示的な一実施形態によりオーバフローからNaNへの変更条件を検出するためにオペランド・レジスタ上のオーバフローのテストを実行可能な1組の条件を示す図の例である。図9に示されているように、加算動作または減算動作の場合、オーバフロー条件についてオペランドおよび除数レジスタ値をチェックすることができ、どちらもINF値を有する場合、図9に示されているように、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。その上、乗算動作の場合、除数レジスタがオーバフロー値であり、オペランド・レジスタが0という値を有する場合、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。同様に、除算動作の場合、除数レジスタがオーバフロー値を有し、オペランド・レジスタがオーバフロー値を有する場合、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。
図10は、例示的な一実施形態によりベクトル要素の値を設定するための動作例の概略を示す流れ図である。図10に示されているように、動作は、ターゲット・ベクトルのベクトル要素について操作を実行することによって始まる(ステップ810)。計算中に例外条件に遭遇したかどうかについて判断が行われる(ステップ820)。遭遇しなかった場合、計算結果のデータ値がベクトル要素に保管される(ステップ830)。例外条件に遭遇した場合、例外ハンドラを呼び出さずに、その例外条件に対応する特殊例外値がベクトル要素に保管される(ステップ840)。使用中の命令セット・アーキテクチャにより、保管/移動動作に遭遇するかまたは特殊例外値を廃棄するまで、特殊例外値がベクトル要素でプロセッサ・アーキテクチャ中に伝搬される(ステップ850)。いくつかのインスタンスでは、特殊例外値の伝搬がこの値の廃棄を含む可能性があり、例外値が本質的に実行フローで消滅することに留意されたい。たとえば、上述の通り、例外条件がマスキングされるかまたは非投機的命令によって使用されないインスタンスでは、図4および図5の例で上述したデータ並列選択命令により、例外値が伝搬を終了する。
ベクトル要素が存在するベクトルをターゲットとするコンピュータ・プログラムの実行中に保管指示命令または移動指示命令などの非投機的命令に遭遇したかどうかについて判断が行われる(ステップ860)。遭遇しなかった場合、例外条件は無視される(ステップ880)。保管指示命令または移動指示命令に遭遇した場合、例外が生成され、例外ハンドラに送信される(ステップ870)。その後、動作は終了する。
図11は、例示的な一実施形態により例外を生成するための動作例の概略を示す流れ図である。図11に示されているように、動作は、ベクトルについて保管指示命令または移動指示命令が実行されることから始まる(ステップ910)。制御レジスタに対応するenable_indicate_NaN値が設定されているかどうかについて判断が行われる(ステップ920)。設定されている場合、そのベクトルのベクトル要素のいずれかがNAN値を有するかどうかについて判断が行われる(ステップ930)。有する場合、違法操作例外が生成され、適切な例外ハンドラに実行が分岐される(ステップ940)。
そうではない場合、あるいはenable_indicate_NaN値が制御レジスタに設定されていない場合、enable_indicate_Inf値が対応する制御レジスタに設定されているかどうかについて判断が行われる(ステップ950)。設定されている場合、そのベクトルのいずれかのベクトル要素がINF値を有するかどうかについて判断が行われる(ステップ960)。有する場合、オーバフロー例外が生成され、実行は対応する例外ハンドラに分岐する(ステップ970)。その後、ベクトル要素がInf値を持たない場合、あるいはenable_indicate_Inf値が制御レジスタに設定されていない場合、そのベクトルは保管/移動され(ステップ980)、動作は終了する。
NAN値およびINF値は、おそらく例外処理を必要とする例外条件を識別するために例示的な諸実施形態のメカニズムによって使用可能な特殊例外値の例としてのみ使用されることに留意されたい。例示的な実施形態の精神および範囲を逸脱せずに、命令の投機的実行中に遭遇した例外条件を示すために使用可能な任意の他のタイプの特殊インジケータ値について、同様の動作を実行することができる。
したがって、例示的な諸実施形態は、例外条件を検出し、例外ハンドラを直ちに呼び出さずにベクトルの対応するベクトル要素の一部として例外条件を示す特殊例外値を伝搬するためのメカニズムを提供する。コンピュータ・プログラムの実行の一部として実際に特殊例外値に遭遇した場合のみ、対応する例外が生成され、実行が例外ハンドラに分岐される。このようにして、例外条件の検出と例外の処理は相互に切り離され、コンピュータ・プログラムによって取られる実際の実行パスの一部ではない実行の分岐内の例外条件を無視することができる。例示的な諸実施形態のメカニズムによりSIMD化コードは例外を可能にすることでき、コンピュータ・プログラムの実行パスが実際にたどらない実行の分岐内のスプリアス例外および例外処理が最小限になる。
上記の例示的な諸実施形態は、コンパイラによって既存の保管命令または移動命令を保管指示命令または移動指示命令に変換させるものとして記載されている。しかし、コンパイラがすべての保管命令または移動命令を保管指示命令または移動指示命令に変換する必要はないことを認識されたい。それとは反対に、他の例示的な諸実施形態により、コンパイラには、保管命令または移動命令が保管指示命令または移動指示命令に変換されるコード内の適切な位置を選択するためのロジックを設けることができる。その上、上記の通り、例示的な諸実施形態は保管指示命令または移動指示命令のみに限定されず、むしろ、コンパイラは任意のX指示タイプの命令を使用することができ、ここでXは実行すべき何らかの動作であり、たとえば、加算指示(add-and-indicate)などである。したがって、コンパイラはソース・コード、たとえば、スカラ・コードをSIMDベクトル化コードに変換しているので、コンパイラ内に設けられたロジックに基づいてこのようなX指示タイプの命令のために適切な位置を選択することができる。
例示的な諸実施形態のメカニズムにより、ソース・コード、たとえば、スカラ・コードをSIMDベクトル化コードに変換する際に、例外条件の発生を識別する特殊値の使用を利用するために、移動指示、保管指示などのX指示命令(まとめて「指示」命令という)がコード内の適切な位置に挿入される。コンパイラは、以下に定義するように関心のある値がチェック可能であるかまたはチェック不能であるかに基づいて、1つまたは複数の方法により適切な挿入ポイントを決定する。ある方法では、チェック不能であるSIMDコードの一部分をマスキング・メカニズムの使用によりチェック可能SIMDコードに変換することができる。また、ある方法では、関心のある値、たとえば、関心のある値の配列を伴うすべての計算の後に指示命令を挿入することができる。他の方法では、それぞれの生出力値をテストするように最小数のチェック命令が適切な位置に挿入され、ここで、値が最終的にコードの記憶イメージまたは決定プロセスに影響を与える(あるいは次の計算がその結果を使用して、最終的にコードの記憶イメージまたは決定プロセスに影響を与えることになる)場合にその値は生である。
コンパイラによって最適化されコンパイルされているコード内でこのようなX指示命令を挿入する場所を決定するときにコンパイラによって使用可能なロジックの実施形態例を例示するために、まず、ロジックの概略フローについて説明し、このフローで概略を示したそれぞれの動作の詳細についてはその後、提供する。このフローおよびその後の詳細はX指示タイプの命令の挿入に使用可能なロジックの一例に過ぎず、例示的な諸実施形態の精神および範囲を逸脱せずに、例示的な諸実施形態のメカニズムを実装するその他のロジックをコンパイラが使用できることを認識されたい。
図12は、例示的な一実施形態によりコンパイラによりSIMDベクトル化コードに指示命令を挿入するための動作例の概略を示す流れ図である。図12の動作は、コンパイラによってチェックすべきコードの所与の一部分についてコンパイラによって依存グラフ(dependence graph)が生成されているものと想定する。コードのこの一部分は、コンパイラが操作することができる、基本ブロック、ステートメント、式、または任意のその他の単位の作業またはコードにすることができる。コンパイラによってチェックすべきコードの一部分に関する依存グラフをコンパイラが生成することは、一般に当技術分野で既知であり、したがって、本明細書では詳細な説明を提供しない。一般に当技術分野で既知の通り、依存グラフはノードおよびノード間の弧を含み、弧はコードの一部分同士、たとえば、他の命令に依存する命令同士の依存関係を表す。
図12に示されているように、コンパイラによってチェックすべき作業単位について、コンパイラによってチェックする必要がある1組の値について判断が行われる(ステップ1010)。チェックする必要がある各値について、依存グラフを分析して、同等の適用範囲(equivalent coverage)、すなわち、その値を伴うグラフの各ノードにおけるチェックと同等のチェックを実行可能な位置を提供する依存グラフ内の1組の位置、すなわち、ノードを決定する(ステップ1020)。
たとえば、非数値(NAN)例外の検出を希望する場合の「c[i]=(a[i]+b[i])+1」という計算について考慮する。これを実行するために、a[i]によって生成される入力値がNANではないことをチェックしなければならない。したがって、メモリからのa[i]値をレジスタ・ファイルにロードするロード動作の結果をチェックできるであろう。しかし、ある数値をNAN値に加えてもNANが生成される場合、「a[i]+b[i]」の結果をチェックすると、(a[i]がNANを生成するかどうかをチェックするという見地から)同等の適用範囲が提供される。実際に、「a[i]+b[i]」をチェックすることは、b[i]値がNANであるかどうかもチェックするので、より有益である。これを拡張してみると、a[i]の値をチェックするために、「a[i]」、「a[i]+b[i]」、「a[i]+b[i]+1」という位置をチェックすることは同等である。このような場合、このような位置はいずれも同等であり、「b[i]」の値もチェックするので、第2または第3の位置をチェックすることは明らかに有益である。「a[i]+b[i]+1」の計算値をメモリ位置「c[i]」に保管することを保管指示に変換することができるので、最後の位置のチェックは最も安価である。
作業単位が1つのステートメントより大きい場合、同等の位置が複数のステートメントに及ぶ可能性がある。ステートメント「c[i]=(a[i]+b[i])+1」の後に他のステートメント「d[i]=c[i]+e[i]」が無条件に続く場合について考慮する。このような場合、a[i]がNANであるかどうかをチェックするために同等の位置として「c[i]」および「c[i]+d[i]」を加えることができる。
これらの識別された位置のうちの1つまたは複数をチェックできるかどうかについて判断が行われる(以下の「チェック可能」値または位置の定義を参照)(ステップ1030)。チェックできる場合、これらのチェック可能位置のうちの最良のものが選択される(ステップ1040)。
識別された位置にチェック可能位置がまったくない場合(ステップ1030)、チェック可能形式に変換可能な位置が1つまたは複数存在するかどうかについて判断が行われる(ステップ1050)。存在する場合、このようなチェックに最良の位置が選択され(ステップ1060)、たとえば、その位置にある出力レジスタのレジスタ値のチェック不能部分を安全な値でマスキングし、ループ・ピーリング(loop peeling)などを実行することにより、その位置のチェック不能部分がチェック可能部分から分離されるように、その位置が変換される(ステップ1070)。動作1040または1070の後、選択された位置に動作指示命令(単純に「指示」命令ともいう)が挿入される(ステップ1080)。この指示命令は本質的に例外条件を示す特殊値の有無をチェックするものであり、この例外条件は前の計算のために発生した可能性があるが、このような例外処理は前述の方法で据え置かれている。このような特殊値が存在する場合、例外はX指示命令によって示され、例外処理を開始することができる。
チェック可能位置がまったく存在せず、一部分がチェック可能になるように変換可能な位置もまったく存在しない場合、その値に対応する値計算はスカラとしてマークされる(ステップ1090)。作業単位内の他の値をチェックする必要があるかどうかについて判断が行われる(ステップ1095)。必要がある場合、動作はステップ1020に戻り、次に選択された値について動作を繰り返す。必要がない場合、動作は終了する。上記の実施形態では、ステップ1050は、変換可能な位置が少なくとも1つ存在するかどうかを判断することに留意されたい。そうであれば、コードをチェック可能なものにするようにコードが変換されることになる。他の実施形態では、ステップ1050は、そのコードを有利に変換できるかどうかもチェックする。実際に、それをチェック可能なものにするようにSIMDコードを変換する追加コストがそのステートメントをSIMD化することの利益を超える可能性がある場合もある。このような場合、コードをSIMDコードに変換するより、単純にステップ1090に進むことを選ぶ方が有益である可能性がある。
上述の通り、どこに指示命令を挿入すべきかを決定するときにコンパイラによって行われる主な判断の1つは、依存グラフ内のどの位置がチェック可能であるかどうかを判断することである。依存グラフ内のある位置が「チェック可能」であるかどうかを判断する際に、コンパイラは、依存グラフ内のその位置について結果として得られるSIMDベクトル出力値を保管するレジスタを調べ、レジスタに保管された値が「チェック可能」であるかどうかを判断する。(1)ベクトル・レジスタのあるスロット内の値が、生である浮動小数点値を含み、その値が実際に計算された場合、あるいは(2)その値が、例外を引き起こさないことが保証されている浮動小数点表現を有するものであることが分かっている場合、その値はチェック可能である。上記の(1)に関しては、前述の通り、浮動小数点値が最終的に記憶イメージ、すなわち、メモリに保管されたデータに影響を与えるか、またはコードの決定プロセスに影響を与える、たとえば、コードの実行中にどの実行分岐が取られるかに影響を与える場合に、その浮動小数点値は「生」である。代わって、次の依存計算がその値を使用し、その計算が記憶イメージまたは決定プロセスに影響を与える場合、その値も「生」であると見なされる。また、その値は実際に計算しなければならず、すなわち、レジスタにコピーまたは移動してはならないが、実際には計算の結果である。このため、たとえば、計算にスプライスされるように単純にメモリから読み取られるデータは除外される。
上記の(2)に関しては、ユーザまたはコンパイラは、特定の値を例外を引き起こさないことが保証されているものとして指定することができる。たとえば、コンパイラは特定の複数組の大きい値をゼロに設定することができる。このような場合、コンパイラは、このような複数組の大きい値についてゼロ値が例外を引き起こさないことを示すことができる。したがって、このような値がSIMDベクトル・レジスタ・スロット内にある場合、この値はチェック可能であると見なすことができる。同様に、ユーザは、特定の値を例外を引き起こさないものとして指定することができ、このような値に遭遇した場合、この値は同様にチェック可能にすることができる。たとえば、計算は、既知の値で満たされた小さい係数表からのデータを含むことができる。たとえば、計算は、sin(x)値を繰り返し使用することができ、ここで、xは10度の倍数である。ユーザは、sin(0)値、sin(10)値、・・・sin(350)値を事前計算し、その結果を小さい配列に保管し、sin(x)を毎回計算する代わりに、この配列についてこのような値を読み取ることができる。ユーザはこの表を完全に管理しており、その値が−1.0〜+1.0の間にあることを把握しているので、ユーザはこの表がNAN、負の無限大、または正の無限大にならないことが保証されていることをコンパイラに対して(コンパイラへのディレクティブ、プラグマ、コンパイラ・フラグ、またはその他の情報交換手段を介して)断言することができる。
SIMDベクトル・レジスタ自体は、そのスロットのそれぞれがチェック可能である浮動小数点値、すなわち、「生」であり、実際に計算されたかまたは例外を生成しないものであると分かっている浮動小数点値を保管する場合、チェック可能であると見なされる。たとえば、前述のアーキテクチャ例では、各SIMDベクトル・レジスタは4つのスロットまたは値で構成されている。このようなアーキテクチャでは、4つのスロットのそれぞれは、上記で明記されたチェック可能の定義に基づいてチェック可能である値を保管しなければならない。
図13〜図15は、例示的な一実施形態の基準によりチェック可能SIMDコード部分とチェック不能SIMDコード部分との違いを示す図の例である。図13に示されている第1の例では、コンパイラによってチェックされている作業単位またはコードの一部分は、ステートメントd[i]=(a[i]>0.0)?b[i]:c[i]である。一般に当技術分野で既知の方法で、このステートメントのコンパイルを実行しているときにコンパイラによって生成されるように、このステートメントの結果として得られる依存グラフが図13に示されている。しかし、例示的な諸実施形態のメカニズムにより、依存グラフのノードは、作業単位の値に関して、すなわち、この例ではコンパイラによってチェックされているステートメントに関して、チェック可能および非チェック可能(non-checkable)に分類することができる。
図13に示されているように、a[i]と値「0.0」との比較に基づいて、値a[i]がコードの決定プロセス、すなわち、SIMDコード内の「選択」動作に影響を及ぼすという点で、依存グラフの一部分1120内の命令の出力はチェック可能である。本質的に、a[i]と0.0との比較はマスクを形成し、以下の「選択」命令により、マスクの値が1である場合に第1の値、たとえば、b[i]が取られ、マスクの値が0である場合に第2の値、たとえば、c[i]が取られる。その結果、保管命令st d[i]内の値は値a[i]の影響を受け、したがって、生であり、実際に選択命令によって計算される。
これに反して、依存グラフの一部分1110内のb[i]およびc[i]のロードのためのロード命令の出力は、これらのロードの結果が実際に何らかの方法で使用されるという保証がまったくないので、チェック不能である。これらのロードによって生成された値の1つが使用されるが、コンパイル時にはコンパイラはどの値が使用されるかを把握できず、すなわち、実行中のいずれかのときに、b[i]またはc[i]のいずれかを使用できるのかあるいは使用できないのかを把握できないことが分かっている。したがって、これらの値は、その現行状態ではコンパイラによってチェック不能である。
他の一例として、ステートメントd[2i]=a[i]+b[i]について考慮するが、SIMDベクトル・レジスタd[i]1130のスロットに関するレジスタ値および依存グラフ1125が図14に示されている。図14に示されているように、本明細書に提供されているチェック可能の定義に基づいて、依存グラフ1120の一部分1140はチェック可能であり、依存グラフ1120の一部分1150はチェック不能である。値a[i]およびb[i]は保管命令st d[i]によって保管された値に影響を及ぼすように使用され、すなわち、それらは生であり、メモリに保管された値d[i]に影響を及ぼすように使用される値は加算命令(add instruction)によって計算されることが分かっているので、一部分1140はチェック可能である。d[i]を保管するときにロード命令ld d[i]の結果のすべてが使用されることが保証されていないので、一部分1150はチェック不能である。これはベクトル・レジスタd[i]1130の例に示されており、ここでi=0である場合に、スロット0内の第1の値は値a[0]+b[0]である。i=1であるときに、ステートメントの値はd[2]=a[1]+b[1]であり、したがって、スロットd[2]は値a[1]+b[1]を保管するように更新されるので、スロット1内の第2の値はld d[i]命令によってこのスロットにロードされた元のd[i]値である、同様に、スロットd[3]の場合、保管される値はld d[i]命令によってロードされた元の値である。このため、アンパック命令(unpack instruction)は、ld d[i]命令(実際に値を計算せず、単に値をロードするだけのものである)を介してロードされた値と、加算命令からのベクトルa[i]およびb[i]に基づいて計算された値の両方を結合する。何らかの値はチェック可能であり、他の値はチェック不能であるので、すべてのスロットにチェック可能値を保管させなければならないチェック可能レジスタの定義により、アンパック命令の結果はチェック不能である。その結果、保管命令st d[i]はチェック不能である。しかし、命令ld d[i]によってロードされたd[i]内のすべての値が例外を生成しないことが保証された値であると判断された場合、これは変わる可能性がある。
図15は、例示的な諸実施形態によりチェック可能SIMDコードおよびチェック不能SIMDコードの他の例を示している。図15に示されている例は、読み取り変更書き込み(read-modify-write)動作である(i=0;i<65;i++)a[i+2]=b[i+1]+c[i+3]というステートメントに関するものである。図15に示されているように、入力ベクトルはa[i]、b[i]、およびc[i]であり、ここで、ベクトル値a[i]はメモリ1160から読み取られ、b[i+1]+c[i+3]という加算によって変更され、メモリ1160に書き戻される。SIMDアーキテクチャはこの例では4つのスロットのベクトルについて操作するので、値a[2]が読み取り変更書き込み動作の対象である場合、a[2]に対応する値を取り出すためにベクトル・ロード動作1162が実行される。これは、メモリ1160から値[a0,a1,a2,a3]を読み取ることを含む。a[2]という値は上記のステートメントにおけるi=0という値に対応し、[*,*,b1+c3,b2+c4]という値を保管するために評価されるものである。この2つのベクトルは選択動作1164に入力され、この選択動作は、出力ベクトル・レジスタ1166の各スロットについて、ベクトル・ロード命令1162によってロードされた元の値またはステートメントによって計算された新しい値のいずれかを選択する。この場合、動作は値a[2]に対する読み取り変更書き込み動作であるので、出力ベクトル・レジスタ1166の最初の2つのスロットについて元の値a0およびa1が選択され、出力ベクトル・レジスタ1166の最後の2つのスロットについて計算値b1+c3およびb2+c4が選択される。
元の値a0およびa1が実際に使用されるかどうかをコンパイラは前もって把握していないので、これらの値はチェック不能であり、これらの値は実際に計算されず、むしろ、メモリからロードされるだけである。したがって、これらの値a0およびa1は上記で明記された定義に基づく「生」ではなく、したがって、チェック不能である。これに反して、計算値b1+c3およびb2+c4は、計算され、記憶イメージに影響を与えるという点でチェック可能であり、したがって、「生」である。
上記の通り、SIMDベクトル・レジスタがチェック可能であるためには、ベクトル・レジスタのスロットに保管されたすべての値がチェック可能でなければならない。したがって、出力ベクトル・レジスタ1166の少なくとも1つの値がチェック不能であるので、すなわち、値a0およびa1を保管するスロットがチェック不能であるので、出力ベクトル・レジスタ1166はチェック不能である。しかし、ベクトル保管命令1170の場合、その値がメモリ1160に書き込まれるベクトル・レジスタは、そのベクトル・レジスタの各スロットがステートメントに応じて計算された値を保管し、したがって、「生」値を保管するという点でチェック可能である。
図12に概略が示されている動作に戻ると、上述の通り、この動作は同等の適用範囲を提供する位置を決定するものである。これらの位置のうち、いずれかがチェック可能であるかどうか、すなわち、対応する命令の出力レジスタがチェック可能であるかどうかが判断される。このような判断を行う際に、コンパイラのロジックが上記で明記された基準を使用して、対応する命令の出力レジスタがチェック可能であるかどうかを判断することができる。コンパイラは、このような基準を使用して識別されたそれぞれの位置を分析し、どの位置がチェック可能であるかを判断することができる。
図12に示されているように、いずれの位置もチェック不能である場合、いずれかの位置をチェック可能位置に変換できるかどうかについて判断が行われる。本質的に、この判断は、出力レジスタを分析して、その出力レジスタ内のスロットのいずれかがチェック可能であるかどうかを判断するものである。チェック可能である場合、チェック可能である出力レジスタ内のスロットが識別され、出力レジスタ内の非チェック可能スロットをマスキングするためのマスクを生成することができる。出力レジスタ内の非チェック可能スロットは、例外を生成しないことが分かっている値、たとえば、0値または例外を生成しない他の安全値でこれらの値を置き換えることにより、マスキングすることができる。このマスクは、以下に記載する通り、挿入されたX指示命令によって実行されるチェック動作を実行する前に適用することができる。また、このマスクは、X指示命令の動作のために適用することができる。しかし、その計算のためにコンパイラによって後で使用されるレジスタの値は変更されないので、このマスキング動作はアプリケーションの挙動を変更するものではない(X指示動作によって生成される可能性のある例外は除く)。換言すれば、チェックすべきレジスタについて、X指示動作によってのみ使用される他のベクトル・レジスタでは(それを安全値で置き換えることにより)非チェック可能値がマスキングされる。このチェックが保管指示動作によって実行される場合、マスキングされた値は、元のプログラムによってまったく読み取られないメモリ位置に保管される。たとえば、メモリ・スタック上のメモリ位置はこのような目的のためにのみ予約することができる。移動指示動作が使用される場合、たとえば、レジスタYに位置するマスキングされた値は、同じレジスタY(または現在使用されていない任意の他のレジスタ)に移動することができる。その動作が何であれ、目標はアプリケーションによって現在使用されていないメモリまたはレジスタをターゲットにすることであり、したがって、いずれにしてもアプリケーションの挙動を変更することはない(NAN、無限大、または例外によってチェックされるその他の値の存在により起こりうる例外の生成は除く)。したがって、このようにして、そうでなければ非チェック可能な位置をX指示命令の挿入のためにチェック可能位置に変換することができる。
この場合も、図12に示されているように、少なくとも1つのチェック可能位置、またはチェック可能位置に変換できる位置が存在する場合、X指示命令の挿入のために最良の位置の選択が実行される。挿入のための最良の位置の選択は、特定のレベルの望ましい例外適用範囲(exception coverage)に依存する。すなわち、第1のレベルの例外適用範囲では、スプリアス例外のない低オーバヘッドが達成されるが、部分的な例外適用範囲のみが達成され、すなわち、アンダフローおよびオーバフロー条件の部分検出が提供されるが、NAN条件の完全な適用範囲が提供される。第2のレベルの例外適用範囲では、完全な例外適用範囲とともにスプリアス例外のないより高いオーバヘッドも達成される。さらに、第3のレベルの例外適用範囲では、最初の2つのレベルの例外適用範囲のいずれかが達成され、おそらくスプリアス例外はソフトウェアで矯正される。これら3つのレベルの例外適用範囲のそれぞれによるX指示命令の挿入のための最良位置の選択については、図16〜図18および図19〜図21に関連して以下により詳細に説明する。
図16〜図18は、例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。この例示的な実施形態では、第1のレベルの例外適用範囲が使用され、すなわち、部分的な例外適用範囲のみが存在する。この例示的な実施形態により、それぞれの生出力値をテストするために最小数のX指示命令が挿入される。この例示的な実施形態の一部として、X指示命令の挿入のために最良の位置(複数も可)を選択することは、計算内に各チェック可能ベクトル・レジスタを検出した後、計算によって計算されるそれぞれの生出力レジスタ値をテストする最小数の位置を検出することと、対応するX指示命令、たとえば、保管指示、移動指示、加算指示、またはその命令に対応するその他のX指示命令を識別された位置で挿入することを含む。
それぞれの生出力レジスタ値をテストするために最小数の位置を選択することは、たとえば、X指示命令によってチェックされずにいかなる追加の計算も保管命令に達することができないように、1つまたは複数のチェック可能位置を選択することを含むことができる。作業単位の実行中にできるだけ早く、または追加のオーバヘッド・コストが最小金額になるようなポイントで、このような値を捕捉することが望ましい。これは、作業単位内に複数のステートメントが存在するとき、たとえば、コンパイラが基本ブロックなどについて操作しているときに、さらに緩和することができる。たとえば、コンパイラは、ベクトルa[i]の値を設定する命令、たとえば、a[i]=...と、ベクトル値a[i]を使用する命令、たとえば、...=...a[i]...とを含む基本ブロックについて機能しているものと想定する。このような場合、例外を示す特殊値を保管している第1の命令のa[i]は、第2の命令のa[i]も結果的に例外を示す特殊値になり、たとえば、第1の命令のNAN値により第2の命令のNAN値が発生することを暗示するので、コンパイラは第2の命令に対応する位置にX指示命令を挿入することだけが必要である。
もう一度、図16〜図18を参照すると、図16は、この第1のレベルの例外適用範囲によるX指示命令の挿入に関する第1の例を示している。この第1の例は、ステートメントd[i]=(a[i]>0.0)?b[i]:c[i]に関するものである。図16に示されているように、前述の基準に基づいて、一部分1210はチェック不能であり、一部分1220はチェック可能である。挿入されたX指示命令によってすべての生出力値をチェックできる、依存グラフ内で最も早い挿入位置は、保管命令st d[i]である。すなわち、作業単位、この場合はステートメント内のすべての生値が存在する依存グラフ内の第1のノードは、記憶イメージを変更する際に使用される生値が選択される選択動作の後である。したがって、この場合、元の保管命令を置換するために保管ノード位置に保管指示命令を挿入することができる。この例では、可能なNAN数について「a[i]」の値もチェックしなければならないことに留意されたい。このチェックの理由は、比較動作(ここでは、大なりまたは「>」など)が、その入力のいずれかがNANである場合に偽値を返すものとして定義されていることである。したがって、「a[i]」値内の例外の有無をチェックしない場合、ベクトル・レジスタの所与のスロット内にNAN値が存在する場合、そのスロットについて必ず「c[i]」値を選択することになるであろう。「c[i]」値はNANではない可能性があるので、保管指示が実行されているときに「c[i]」値の有無をチェックしても、「a[i]」値内に存在したNANは明らかにならないであろう。したがって、この例の場合、NANについて「a[i]」値をチェックしなければならない。
図17は、ステートメント例d[2i]=a[i]+b[i]に関するX指示命令の挿入の第2の例を示している。上記で指定したこれらの条件の定義に基づいて、このステートメントに関する依存グラフの一部分1230はチェック可能であり、一部分1240はチェック不能である。この例では、すべての生値をチェックできる依存グラフ内の第1の位置は加算命令である。その結果、元の加算命令の置換の際にこのノードに加算指示命令を挿入することができる。加算指示命令が欠落しているプラットフォームでは、追加の移動指示を使用することができ、加算動作の結果について指示動作を使用するという目的のみのために、加算の結果を保持するレジスタが他の未使用のレジスタ(後で使用されないもの)に移動する。同様に、同じく加算動作の結果について指示動作を使用するという目的のみのために、加算の結果を未使用のメモリ位置に保管するために保管指示も使用できるであろう。
図18は、ステートメントd[2i]=a[i]+b[i]およびe[i]=d[i]+1.0からなる基本ブロック例に関するX指示命令の挿入の第3の例を示している。図18に示されているように、基本ブロック内の第1のステートメントに関する依存グラフは図17に示されているものと同じであり、したがって、同じチェック可能部分1230と非チェック可能部分1240を有する。第2のステートメントに関する依存グラフは完全にチェック可能である。しかし、第1のステートメントの依存グラフの加算ノードにX指示命令を挿入しなければならないのではなく、第2のステートメントは第1のステートメントの結果を使用し、したがって、第1のステートメントによって生成された例外条件を示す任意の特殊値が第2のステートメントに渡されるので、第2のステートメントの依存グラフにX指示命令を挿入することによって第2のステートメントの実行時にこれらの特殊値の有無をチェックすれば十分である。描写されている例では、基本ブロックのすべての生値を収集するためにX指示命令を挿入するために最適な場所は、第2のステートメントの依存グラフ内の保管命令st e[i]である。
したがって、第1のレベルの例外適用範囲に基づいて、最小数のX指示命令がコードに挿入される。これにより、コードはそのコードの実行時間に関してより効率的なものになるが、何らかの例外条件は部分的にしか検出できなくなる。これをさらに例示するために、以下の表について考慮する。
Figure 2013502648
ほとんどの演算の場合、正または負の無限大である入力の結果、演算の出力が正または負の無限大あるいは非数値(NAN)になる可能性があることがこの表から分かる。たとえば、加算動作、たとえば、「c[i]=(a[i]−1)+(b[i]−1)」について考慮する。上記のルール3により、無限大に有限正数Nを加えると無限大が得られ、同様に、上記のルール4により、無限大に無限大を加えても無限大が得られる。しかし、上記のルール13により、正の無限大に負の無限大を加えると、その結果はNANになる。したがって、適切な例外が報告されることをユーザが期待している場合、すなわち、無限大数に遭遇したときに無限大例外を報告し、NAN数に遭遇したときにNAN例外を報告するようユーザがプログラムに期待している場合、実際に「(a[i]−1)」が正の無限大であった可能性があり、「(b[i]−1)」が負の無限大であった可能性があるときに、保管指示動作はNANを報告する可能性があるので、保管されている値(上記の例では「c[i]」)をチェックするのでは十分ではない。したがって、このような場合に例外を正確に報告するために、(非常に大きい有限数に加算すると、その結果、正の無限数表現が生成される可能性があるので)動作の出力に加えて、(NANあるいは正/負の無限大またはその両方がまったくないことを確認するために)加算動作への入力をチェックしなければならない。これをNANのみのチェックと対照させる。いずれかの入力がNANである加算の結果、NAN数が得られるので、値が上記の例で「c[i]」に保管されているときに、加算後に例外の有無をチェックすれば十分である。
上述の通り、完全な例外適用範囲が存在する、すなわち、例示的な諸実施形態のメカニズムによってすべてのアンダフローおよびオーバフロー例外条件が検出される、第2のレベルの例外適用範囲も可能である。この第2のレベルの例外適用範囲により、アンダフロー、オーバフロー、またはNAN条件を生成する可能性のある各計算後に例外条件を示す特殊値のチェックが実行される。たとえば、算術演算はこのような特殊例外条件および値を生成することができるが、選択、境界合わせ、比較などのその他の動作および論理演算はこのような特殊例外および値を生成しない。
図19〜図21は、第2のレベルの例外適用範囲が望ましい、他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。図19〜図21に示されている例は図16〜図18に示されているものと同じステートメントおよび基本ブロックに関するものであり、したがって、依存グラフは同じである。その上、図19ではステートメントが計算を伴わず、図20の例ではこの第2のレベルの例外適用範囲に基づいて挿入が実行される「加算」計算ポイントがその基準に基づいて第1のレベルの例外適用範囲について挿入が実行されるものと同じポイントであるので、図19および図20の結果、X指示命令の挿入のために同様の挿入ポイントが得られる。違いは図21に示されている例に現れ、図18に示されている1つの挿入ポイントの代わりに、2つの挿入ポイントが存在する。第1の依存グラフには計算が存在するので、X指示命令を追加するための追加の挿入ポイントは第1の依存グラフ内の「加算」命令ノードで識別され、第2の挿入ポイントは第1のレベルの例外適用範囲の実施形態と同様に保管st e[i]になる。
上述の通り、作業単位、たとえば、ステートメント、基本ブロックなどの依存グラフに、チェック可能な位置がまったくない状況では、非チェック可能位置をチェック可能位置に変換するために何らかの変換を実行することができる。上述の通り、ある変換は、マスクを使用してベクトル・レジスタ内のチェック不能値をマスキングし、次にその他の値をチェックすることである。他の変換は、チェック不能値のSIMDベクトル化を使用不可にすることと、1つのループを複数のループに分割して、チェック可能ステートメントとチェック不能ステートメントを1つにまとめることを含むことができる。たとえば、ループ・ピーリング動作を使用して、チェック可能値を含むループの反復からチェック不能値を含むループの反復をピーリングすることができる。このような状況は、上記の図15に描写されているように、ループの始めあるいは終わりまたはその両方に読み取り変更書き込みが存在するときに発生する可能性がある。
第3のレベルの例外適用範囲では、最初の2つのレベルの例外適用範囲のいずれかを使用し、チェック不能値が滅多に除外されないことが分かっているかどうかについて経験的判断で増強することができる。すなわち、チェック不能値を投機的にチェックし、最初の場所でチェックされなかったはずの値をチェックすることにより、実際の例外が発生したかどうかまたは例外がスプリアス例外であるかどうかを検出するカスタム無効値例外ハンドラを使用することができる。後者の場合、ベクトル出力レジスタは無効値例外ハンドラによってチェック可能なものとして処理することができる。そうではない場合、チェック不能値の結果、実際の例外が発生する場合、ベクトル出力レジスタのチェック不能部分は、このベクトル出力レジスタ上の命令のスカラおよびSIMD実行がSIMDからスカラ実行に変換されたときに処理される。
無効値例外ハンドラは、このような例外がどこで発生するかを検出し、レジスタ内のどの例外をスプリアスとして無視することができ、どれを無視できないかを判断するためのマスクを計算することができる。次に、無効値例外ハンドラは、例外がスプリアスであった場合にアプリケーションに戻り、例外がスプリアスではなかった場合に例外を報告することができる。上記で考慮したものと同じ例、すなわち、「c[i]=(a[i]−1)+(b[i]−1)」について考慮する。上述の通り、すべての正および負の無限大が報告される第2のレベルの例外適用範囲を提供するために、「a[i]−1」が正の無限大になり、「b[i]−1」が負の無限大になる(逆もまた同様である)可能性がある場合ではないことをチェックするように、2つの移動指示動作が挿入されている。負の無限大に正の無限大を加えるとNANが得られ、その結果、正または負の無限大とは異なる例外が発生するので、このケースについてテストが必要であることを想起されたい。次に、加算への入力の一方が正の無限大であり、加算へのもう一方の入力が負の無限大であるケースは実際に非常に稀なものであるとさらに想定する。このような場合、「a[i]−1」および「b[i]−1」の演算後にこのようなチェックを追加せず、保管指示によって結果をチェックすることのみを決定することができる。次に、NAN例外に遭遇していると想定すると、a[i]またはb[i]のいずれか/両方がNANであるため、あるいは負の無限大に正の無限大を加えたために、例外が生成されたかどうかは分からない。このような場合、第3のレベルの例外適用範囲では、例外ハンドラが計算を再現し、各ステップ後に正の無限大、負の無限大、またはNAN数が計算されるのかどうかを判断する。したがって、このような方式では、例外が始まるのは非常に稀であると想定して、かなり低いコストで同じレベルの例外報告レベルを達成することができる。
ソース・コードまたはソース・コードの少なくとも一部分のコンパイルを開始する前に、望ましい特定のレベルの例外適用範囲を構成パラメータとしてコンパイラに渡すことができることに留意されたい。たとえば、ユーザは、パラメータの値をコンパイラに渡すことにより、望ましい例外適用範囲のレベルを指定することができ、その後、コンパイラは、そのパラメータに基づいてコンパイラによって処理される作業単位に適用すべき適切なロジックを選択することができる。代わって、コンパイラは、所定のしきい値に比較して作業単位について予測されたかまたは経験的に判断された実行時間に基づいて、どのレベルの例外適用範囲を使用すべきかを動的に選択することができる。たとえば、コンパイラは、元のスカラ・コードと比較して変更されたSIMDコードを実行するために必要なプロセッサ・サイクル数を推定することができ、その差が所定のしきい値より大きい場合、たとえば、パーセンテージの差が受け入れ可能なパーセンテージより大きい場合、プロセッサ・サイクル効率がより高い結果を達成することが期待される、異なるレベルの例外適用範囲を使用することができる。
したがって、例示的な諸実施形態のメカニズムにより、コンパイラは、スカラ実行のために作成された元のソース・コードを最適化しコンパイルする際に、上記の様々な例外据え置きメカニズムならびに据え置かれた例外条件が発生していることを示す特殊値のチェックに適した場所でのX指示命令の挿入を使用して、元のソース・コードをSIMDベクトル化コードに変換することができる。コンパイラは、コードの最適パフォーマンスを達成するために上記の様々なメカニズムのうちのいずれか1つまたは組み合わせを使用することができる。特に、コンパイラは、据え置かれた例外を示す特殊値の有無をチェックするためにX指示命令を挿入するための作業単位内の挿入ポイントを選択するために、図12〜図21に関して上記で概略を示したメカニズムのうちの1つまたは複数を実装するロジックを使用することができる。このような挿入ポイントの選択では、上記で明記された「生」値ならびに「チェック可能」値および「チェック不能」値または「非チェック可能」値の定義を使用する。
上記の通り、例示的な諸実施形態は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態、またはハードウェアとソフトウェアの両方の要素を含む実施形態の形を取ることができることを認識されたい。一実施形態例では、例示的な諸実施形態のメカニズムは、ファームウェア、常駐ソフトウェア、マイクロコードなどを含むがこれらに限定されないソフトウェアまたはプログラム・コードで実装される。
プログラム・コードの保管あるいは実行またはその両方に適したデータ処理システムは、システム・バスを介して記憶素子に直接または間接的に結合された少なくとも1つのプロセッサを含むことになる。記憶素子としては、プログラム・コードの実際の実行中に使用されるローカル・メモリと、大容量記憶装置と、実行中に大容量記憶装置からコードを取り出さなければならない回数を削減するために少なくとも何らかのプログラム・コードの一時記憶を提供するキャッシュ・メモリとを含むことができる。
入出力またはI/O装置(キーボード、ディスプレイ、ポインティング・デバイスなどを含むがこれらに限定されない)は、直接あるいは介在する入出力コントローラを介してシステムに結合することができる。データ処理システムが介在する私設網または公衆網を介してその他のデータ処理システムあるいはリモート・プリンタまたは記憶装置に結合された状態になれるようにするために、ネットワーク・アダプタもシステムに結合することができる。モデム、ケーブル・モデム、およびイーサネット・カードは、現在使用可能なタイプのネットワーク・アダプタのうちのいくつかに過ぎない。
本発明の説明は、例示および解説のために提示されたものであり、網羅するためまたは開示された形式に本発明を限定するためのものではない。多くの変更および変形は当業者にとって明白になるであろう。この実施形態は、本発明の原理、実用的な適用例を最も良く説明するため、ならびにその他の当業者が企図された特定の用途に適した様々な変更を含む様々な実施形態について本発明を理解できるようにするために、選択され記載されたものである。

Claims (20)

  1. データ処理システム(100)において、据え置かれた例外条件を示すインデータ・パス特殊例外値(840)についてチェックするための命令をコード(620)に挿入するための方法であって、
    前記データ処理システム(100)のプロセッサ(110、120〜134)上で実行されるコンパイラ(610)により、第1のコード(620)の一部分を分析して、指定の非投機的動作を実行し、動作指示命令(1020)へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値(840)に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第1のコード(620)内の前記指定の非投機的動作を実行している少なくとも1つの非投機的命令を識別することと、
    前記プロセッサ(110、120〜134)上で実行される前記コンパイラ(610)により、前記第1のコード内の指定の非投機的動作を実行している前記少なくとも1つの非投機的命令を前記動作指示命令(1080)で置換することと、
    前記プロセッサ(110、120〜134)上で実行される前記コンパイラ(610)により、前記第1のコード(620)内の前記少なくとも1つの非投機的命令の前記置換に基づいて第2のコード(630)を生成すること
    を含む、方法。
  2. 前記動作指示命令(1080)が、メモリ(163〜170、199)への保管動作を実行し、インデータ・パス特殊例外値(840)がある場合にそれに対応する例外条件を示す保管指示命令、ベクトル入力をあるベクトル・レジスタから他のベクトル・レジスタに移動し、インデータ・パス特殊例外値(840)がある場合にそれに対応する例外条件を示す移動指示命令、または入力ベクトルについて計算動作を実行し、ベクトル出力を生成し、インデータ・パス特殊例外値(840)がある場合にそれに対応する例外条件を示す計算指示命令のうちの1つである、請求項1記載の方法。
  3. 前記第1のコード(620)が単一命令多重データ(SIMD)コードを含む、請求項1記載の方法。
  4. 前記第1のコード(620)の前記一部分を分析することが、前記第1のコード(620)の前記一部分の依存グラフ(1125)を分析して、そのノードに対応する命令に関する置換として動作指示命令を挿入できる前記依存グラフ(1125)内のノードを識別することを含む、請求項1記載の方法。
  5. 前記第1のコード(620)の前記一部分を分析することが、前記ノードに対応する前記命令のベクトル出力レジスタ(1130)がチェック可能であるかまたはチェック不能であるかを判断することをさらに含み、
    ベクトル出力レジスタ(1130)の各スロットに保管された各値がチェック可能である場合に、前記ベクトル出力レジスタ(1130)がチェック可能であり、
    値が生であり、実際に計算された浮動小数点値である場合、または前記値が例外条件を引き起こさないことが保証されている場合に、前記値がチェック可能であり、
    値が前記データ処理システム(100)のメモリ(163〜170、199)の記憶イメージまたは前記第1のコード(620)の決定プロセスに影響を与えるか、あるいは前記値を使用する次の計算が前記記憶イメージまたは決定プロセスに影響を与える場合に、前記値が生である、請求項4記載の方法。
  6. 前記少なくとも1つの非投機的命令を前記動作指示命令(1080)で置換することが、前記第1のコード(620)の前記一部分の前記依存グラフ(1125)内のノードであって、前記第1のコード(620)の前記一部分の前記ベクトル出力レジスタ(1130)の生浮動小数点値が前記インデータ・パス特殊例外値(840)についてチェックされる前記ノードにおいて前記動作指示命令を挿入することを含む、請求項5記載の方法。
  7. 前記少なくとも1つの非投機的命令を前記動作指示命令で置換することが、前記第1のコード(620)の前記一部分の前記依存グラフ(1125)内の計算が実行される各ノードにおいて前記動作指示命令(1080)を挿入することを含む、請求項5記載の方法。
  8. 前記第1のコード(620)の前記一部分を分析することが、
    その出力ベクトル・レジスタがチェック可能である命令(1030)に関連する少なくとも1つのノードが前記依存グラフ内に存在するかどうかを判断することと、
    その出力ベクトル・レジスタ(1130)がチェック可能である命令に関連する少なくとも1つのノードが前記依存グラフ(1125)内に存在しないと判断したことに応答して、前記依存グラフ(1125)内の少なくとも1つのノードが、その出力ベクトル・レジスタ(1130)がチェック可能出力ベクトル・レジスタ(1050)に変換可能である命令に関連する変換可能ノードであるかどうかを判断することと、
    前記少なくとも1つの変換可能ノードに関連する前記命令の前記出力ベクトル・レジスタ(1130)がチェック可能であるように、前記少なくとも1つの変換可能ノード(1070)に関連する前記命令を変換すること
    をさらに含む、請求項5記載の方法。
  9. 前記少なくとも1つの変換可能ノード(1070)に関連する前記命令を変換することが、前記出力ベクトル・レジスタ内の非チェック可能値をマスキングすることを含む、請求項8記載の方法。
  10. 前記少なくとも1つの変換可能ノード(1070)に関連する前記命令を変換することが、前記出力ベクトル・レジスタがチェック可能値のみを保管するようにループ・ピーリングを実行することを含む、請求項8記載の方法。
  11. 前記少なくとも1つの変換可能ノードに関連する前記命令の前記変換に関連するコストがしきい値を上回るかどうかを判断することと、
    前記コストが前記しきい値を上回ることに応答して、前記少なくとも1つの変換可能ノードに関連する前記命令の前記変換を実行しないこと
    をさらに含む、請求項8記載の方法。
  12. 前記コストが前記しきい値を上回る場合に、前記第2のコード(630)のベクトル化が少なくとも部分的に戻される、請求項11記載の方法。
  13. 前記データ処理システム(100)が、投機的命令が例外条件(820)を生成したことに応答して、例外処理(840)を開始せずに、前記インデータ・パス特殊例外値をベクトル出力レジスタ(1130)に保管するように構成される、請求項1記載の方法。
  14. 前記少なくとも1つの非投機的命令を前記動作指示命令(1080)で置換することが、前記第1のコード(620)の前記一部分の前記依存グラフ(1125)内のノードであって、比較動作が実行される前記ノードにおいて前記動作指示命令を挿入することを含む、請求項1記載の方法。
  15. 前記インデータ・パス特殊例外値が、非数値(NaN)値(920)、正の無限大値(950)、または負の無限大値(950)のうちの少なくとも1つである、請求項1記載の方法。
  16. 前記動作指示命令によって識別される前記インデータ・パス特殊例外値が、前記第2のコード(630)が実行されるコンピューティング・デバイスの構成設定によって制御され、前記構成設定が前記NaN値(920)、正の無限大値(950)、または負の無限大値(950)のうちの1つまたは複数を前記動作指示命令による識別のために使用可能であるものとして指定する、請求項15記載の方法。
  17. 前記第2のコード(630)を生成することが、前記動作指示命令によって後でチェックされる対応するベクトル・レジスタ(1130)のベクトル要素にインデータ・パス特殊例外値(840)を挿入することにより例外を据え置く投機的命令を前記第2のコード(630)内で生成することを含む、請求項1記載の方法。
  18. 割り込みがベクトル出力レジスタ内のチェック可能値または非チェック可能値によるものであるかどうかを検出する割り込みハンドラを提供することであって、前記割り込みがチェック可能値によるものであることに応答して前記割り込みハンドラが前記割り込みを処理するための動作を実行し、前記割り込みが非チェック可能値によるものであることに応答して前記割り込みハンドラが前記割り込みを無視すること
    をさらに含む、請求項5記載の方法。
  19. コンピュータ可読プログラムがそこに記録されたコンピュータ可読記憶媒体を含むコンピュータ・プログラムであって、前記コンピュータ可読プログラムが、コンピューティング・デバイス(100)上で実行されると、
    第1のコード(620)の一部分を分析して、指定の非投機的動作を実行し、動作指示命令(1020)へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値(840)に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第1のコード(620)内の前記指定の非投機的動作を実行している少なくとも1つの非投機的命令を識別することと、
    前記第1のコード(620)内の指定の非投機的動作を実行している前記少なくとも1つの非投機的命令を前記動作指示命令(1080)で置換することと、
    前記少なくとも1つの非投機的命令の前記置換に基づいて第2のコード(630)を生成すること
    を前記コンピューティング・デバイス(100)に実行させる、コンピュータ・プログラム。
  20. データ処理システム(100)において、据え置かれた例外条件を示す特殊値(840)についてチェックするための命令をコードに挿入するための方法であって、
    前記データ処理システム(100)のプロセッサ(110、120〜134)により、第1のコード(620)を分析して、指定の非投機的動作を実行し、動作指示命令(1020)へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値(840)に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第1のコード(620)内の前記指定の非投機的動作を実行している少なくとも1つの非投機的命令を識別することと、
    前記プロセッサ(110、120〜134)により、前記第1のコード(620)内の指定の非投機的動作を実行している前記少なくとも1つの非投機的命令を前記動作指示命令(1080)で置換することと、
    前記プロセッサ(110、120〜134)により、前記少なくとも1つの非投機的命令の前記置換に基づいて第2のコード(630)を生成することと、
    前記データ処理システム(100)の前記プロセッサ(110、120〜134)または他のプロセッサ(110、120〜134)内であるいは他のコンピューティング・デバイス内で前記第2のコード(630)を実行することと、
    例外ハンドラを呼び出さずに、例外条件を示す特殊値(840)を使用して前記第2のコード(630)内の投機的命令の実行中に前記例外条件を追跡することと、
    前記特殊値(840)を検出し、前記動作指示動作を実行するために、前記第2のコード(630)内の前記動作指示命令を実行することであって、前記指示動作により前記例外ハンドラが呼び出されること
    を含む、方法。
JP2012525576A 2009-08-19 2010-07-19 最適化simdコードのための動作指示命令の挿入 Expired - Fee Related JP5583770B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/543,628 US8458684B2 (en) 2009-08-19 2009-08-19 Insertion of operation-and-indicate instructions for optimized SIMD code
US12/543,628 2009-08-19
PCT/US2010/042377 WO2011022142A1 (en) 2009-08-19 2010-07-19 Insertion of operation-and-indicate instructions for optimized simd code

Publications (2)

Publication Number Publication Date
JP2013502648A true JP2013502648A (ja) 2013-01-24
JP5583770B2 JP5583770B2 (ja) 2014-09-03

Family

ID=43606222

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012525576A Expired - Fee Related JP5583770B2 (ja) 2009-08-19 2010-07-19 最適化simdコードのための動作指示命令の挿入

Country Status (6)

Country Link
US (1) US8458684B2 (ja)
JP (1) JP5583770B2 (ja)
CN (1) CN102473104B (ja)
DE (1) DE112010003308T5 (ja)
GB (1) GB2486117B (ja)
WO (1) WO2011022142A1 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11886839B2 (en) 2020-01-07 2024-01-30 Fujitsu Limited Non-transitory computer-readable recording medium, function generation method, and information processing device

Families Citing this family (39)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7779399B2 (en) * 2005-05-16 2010-08-17 Armorize Technologies, Inc. System and method for securing web application code and verifying correctness of software
US8327344B2 (en) * 2008-10-14 2012-12-04 International Business Machines Corporation Array reference safety analysis in the presence of loops with conditional control flow
US9652231B2 (en) * 2008-10-14 2017-05-16 International Business Machines Corporation All-to-all permutation of vector elements based on a permutation pattern encoded in mantissa and exponent bits in a floating-point SIMD architecture
US8423983B2 (en) * 2008-10-14 2013-04-16 International Business Machines Corporation Generating and executing programs for a floating point single instruction multiple data instruction set architecture
US9411585B2 (en) 2011-09-16 2016-08-09 International Business Machines Corporation Multi-addressable register files and format conversions associated therewith
US9727336B2 (en) * 2011-09-16 2017-08-08 International Business Machines Corporation Fine-grained instruction enablement at sub-function granularity based on an indicated subrange of registers
US8892946B2 (en) * 2011-12-15 2014-11-18 International Business Machines Corporation Verifying speculative multithreading in an application
US9946540B2 (en) 2011-12-23 2018-04-17 Intel Corporation Apparatus and method of improved permute instructions with multiple granularities
WO2013095620A1 (en) 2011-12-23 2013-06-27 Intel Corporation Apparatus and method of improved insert instructions
US9632980B2 (en) * 2011-12-23 2017-04-25 Intel Corporation Apparatus and method of mask permute instructions
US9268569B2 (en) * 2012-02-24 2016-02-23 Apple Inc. Branch misprediction behavior suppression on zero predicate branch mispredict
US9501276B2 (en) * 2012-12-31 2016-11-22 Intel Corporation Instructions and logic to vectorize conditional loops
EP2757468A1 (en) * 2013-01-22 2014-07-23 Siemens Aktiengesellschaft Apparatus and method for managing a software development and maintenance system
US9823924B2 (en) * 2013-01-23 2017-11-21 International Business Machines Corporation Vector element rotate and insert under mask instruction
US20140244987A1 (en) * 2013-02-22 2014-08-28 Mips Technologies, Inc. Precision Exception Signaling for Multiple Data Architecture
CN103207786B (zh) * 2013-04-28 2016-03-23 中国人民解放军信息工程大学 渐进式智能回溯向量化代码调优方法
US9256631B2 (en) 2013-07-31 2016-02-09 Oracle International Corporation Building a hash table using vectorized instructions
US9659046B2 (en) * 2013-07-31 2017-05-23 Oracle Inernational Corporation Probing a hash table using vectorized instructions
US20150052400A1 (en) * 2013-08-19 2015-02-19 Concurix Corporation Breakpoint Setting Through a Debugger User Interface
CA2831711A1 (en) * 2013-10-31 2015-04-30 Ibm Canada Limited - Ibm Canada Limitee Performing safe conditional-load and conditional-store operations
WO2015089314A1 (en) 2013-12-11 2015-06-18 Mill Computing, Inc. Computer processor employing operand data with associated meta-data
US9501268B2 (en) * 2013-12-23 2016-11-22 International Business Machines Corporation Generating SIMD code from code statements that include non-isomorphic code statements
US9529622B1 (en) * 2014-12-09 2016-12-27 Parallel Machines Ltd. Systems and methods for automatic generation of task-splitting code
US10169014B2 (en) 2014-12-19 2019-01-01 International Business Machines Corporation Compiler method for generating instructions for vector operations in a multi-endian instruction set
US9696992B2 (en) 2014-12-23 2017-07-04 Intel Corporation Apparatus and method for performing a check to optimize instruction flow
US9880821B2 (en) * 2015-08-17 2018-01-30 International Business Machines Corporation Compiler optimizations for vector operations that are reformatting-resistant
US9720691B2 (en) * 2015-09-23 2017-08-01 Qualcomm Incorporated Speculative scalarization in vector processing
GB2543302B (en) * 2015-10-14 2018-03-21 Advanced Risc Mach Ltd Vector load instruction
US10671398B2 (en) * 2017-08-02 2020-06-02 International Business Machines Corporation Low-overhead, low-latency operand dependency tracking for instructions operating on register pairs in a processor core
US10534609B2 (en) * 2017-08-18 2020-01-14 International Business Machines Corporation Code-specific affiliated register prediction
US11176084B2 (en) * 2017-11-09 2021-11-16 International Business Machines Corporation SIMD instruction sorting pre-sorted source register's data elements into a first ascending order destination register and a second descending destination register
EP3797355A4 (en) * 2018-06-22 2021-06-09 Huawei Technologies Co., Ltd. METHOD FOR DAUGHTER DETECTION AND SYNCHRONIZATION OF OPTIMIZATIONS ON ASYNCHRONOUS PROCESSOR ARCHITECTURES
US11169804B2 (en) * 2018-09-24 2021-11-09 Oracle International Corporation Method for vectorizing d-heaps using horizontal aggregation SIMD instructions
CN109947479A (zh) * 2019-01-29 2019-06-28 安谋科技(中国)有限公司 指令执行方法及其处理器、介质和系统
CN110806897B (zh) * 2019-10-29 2022-02-01 中国人民解放军战略支援部队信息工程大学 面向多代码粒度的向量并行性发掘方法
US11630864B2 (en) 2020-02-27 2023-04-18 Oracle International Corporation Vectorized queues for shortest-path graph searches
US11222070B2 (en) 2020-02-27 2022-01-11 Oracle International Corporation Vectorized hash tables
US11461297B1 (en) 2021-06-09 2022-10-04 T-Mobile Usa, Inc. Ensuring database integrity using a data flow in a graph, such as for use by a wireless telecommunications service provider
CN117472388B (zh) * 2023-12-28 2024-04-05 睿思芯科(深圳)技术有限公司 一种优化程序性能的方法、系统及相关设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000122875A (ja) * 1998-10-19 2000-04-28 Internatl Business Mach Corp <Ibm> 例外処理方法およびシステム
US20030028759A1 (en) * 1999-08-13 2003-02-06 J. Arjun Prabhu Exception handling for simd floating point-instructions
JP2006518060A (ja) * 2000-12-27 2006-08-03 インテル・コーポレーション 単一命令多重データ管理のための方法および計算機プログラム
US20090327665A1 (en) * 2008-06-30 2009-12-31 Zeev Sperber Efficient parallel floating point exception handling in a processor

Family Cites Families (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5655096A (en) * 1990-10-12 1997-08-05 Branigin; Michael H. Method and apparatus for dynamic scheduling of instructions to ensure sequentially coherent data in a processor employing out-of-order execution
US5778219A (en) * 1990-12-14 1998-07-07 Hewlett-Packard Company Method and system for propagating exception status in data registers and for detecting exceptions from speculative operations with non-speculative operations
US5386563A (en) * 1992-10-13 1995-01-31 Advanced Risc Machines Limited Register substitution during exception processing
US5430668A (en) * 1994-03-07 1995-07-04 Nec Corporation Floating point multiplier capable of easily performing a failure detection test
US5799179A (en) * 1995-01-24 1998-08-25 International Business Machines Corporation Handling of exceptions in speculative instructions
US5655115A (en) * 1995-02-14 1997-08-05 Hal Computer Systems, Inc. Processor structure and method for watchpoint of plural simultaneous unresolved branch evaluation
US5742840A (en) * 1995-08-16 1998-04-21 Microunity Systems Engineering, Inc. General purpose, multiple precision parallel operation, programmable media processor
US5748936A (en) * 1996-05-30 1998-05-05 Hewlett-Packard Company Method and system for supporting speculative execution using a speculative look-aside table
US5915117A (en) * 1997-10-13 1999-06-22 Institute For The Development Of Emerging Architectures, L.L.C. Computer architecture for the deferral of exceptions on speculative instructions
US6301705B1 (en) * 1998-10-01 2001-10-09 Institute For The Development Of Emerging Architectures, L.L.C. System and method for deferring exceptions generated during speculative execution
JP3334658B2 (ja) * 1999-01-07 2002-10-15 三菱マテリアル株式会社 無線通信処理装置およびその記録媒体
US6519694B2 (en) * 1999-02-04 2003-02-11 Sun Microsystems, Inc. System for handling load errors having symbolic entity generator to generate symbolic entity and ALU to propagate the symbolic entity
US7000226B2 (en) * 2002-01-02 2006-02-14 Intel Corporation Exception masking in binary translation
DE10206764A1 (de) * 2002-02-19 2003-08-28 Bosch Gmbh Robert Verfahren zum Einparken eines Fahrzeugs
AU2003286131A1 (en) * 2002-08-07 2004-03-19 Pact Xpp Technologies Ag Method and device for processing data
US7707566B2 (en) * 2003-06-26 2010-04-27 Microsoft Corporation Software development infrastructure
US7613950B2 (en) * 2004-02-27 2009-11-03 Hewlett-Packard Development Company, L.P. Detecting floating point hardware failures
US7826380B2 (en) * 2005-03-30 2010-11-02 International Business Machines Corporation Apparatus, system, and method for data tracking
US7421566B2 (en) * 2005-08-12 2008-09-02 International Business Machines Corporation Implementing instruction set architectures with non-contiguous register file specifiers
US8201159B2 (en) * 2006-08-04 2012-06-12 International Business Machines Corporation Method and apparatus for generating data parallel select operations in a pervasively data parallel system
CN100555240C (zh) * 2007-01-16 2009-10-28 国际商业机器公司 用于诊断应用程序的方法和系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000122875A (ja) * 1998-10-19 2000-04-28 Internatl Business Mach Corp <Ibm> 例外処理方法およびシステム
US20030028759A1 (en) * 1999-08-13 2003-02-06 J. Arjun Prabhu Exception handling for simd floating point-instructions
JP2006518060A (ja) * 2000-12-27 2006-08-03 インテル・コーポレーション 単一命令多重データ管理のための方法および計算機プログラム
US20090327665A1 (en) * 2008-06-30 2009-12-31 Zeev Sperber Efficient parallel floating point exception handling in a processor

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11886839B2 (en) 2020-01-07 2024-01-30 Fujitsu Limited Non-transitory computer-readable recording medium, function generation method, and information processing device

Also Published As

Publication number Publication date
GB201204358D0 (en) 2012-04-25
JP5583770B2 (ja) 2014-09-03
US8458684B2 (en) 2013-06-04
CN102473104B (zh) 2015-05-20
US20110047359A1 (en) 2011-02-24
WO2011022142A1 (en) 2011-02-24
GB2486117A (en) 2012-06-06
GB2486117B (en) 2017-03-22
CN102473104A (zh) 2012-05-23
DE112010003308T5 (de) 2012-06-21

Similar Documents

Publication Publication Date Title
JP5583770B2 (ja) 最適化simdコードのための動作指示命令の挿入
US20110047358A1 (en) In-Data Path Tracking of Floating Point Exceptions and Store-Based Exception Indication
US8327344B2 (en) Array reference safety analysis in the presence of loops with conditional control flow
US8627043B2 (en) Data parallel function call for determining if called routine is data parallel
US8650240B2 (en) Complex matrix multiplication operations with data pre-conditioning in a high performance computing architecture
US9529574B2 (en) Auto multi-threading in macroscalar compilers
US7380112B2 (en) Processor and compiler for decoding an instruction and executing the decoded instruction with conditional execution flags
US8683185B2 (en) Ceasing parallel processing of first set of loops upon selectable number of monitored terminations and processing second set
US20130151822A1 (en) Efficient Enqueuing of Values in SIMD Engines with Permute Unit
US8762444B2 (en) Fast condition code generation for arithmetic logic unit
US20160321039A1 (en) Technology mapping onto code fragments
US20170090922A1 (en) Efficient Instruction Pair for Central Processing Unit (CPU) Instruction Design
US9262140B2 (en) Predication supporting code generation by indicating path associations of symmetrically placed write instructions
US11226821B2 (en) Computer processor employing operand data with associated meta-data
TW201716993A (zh) 向量資料轉換指令
KR20130097676A (ko) 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제
CN110825437B (zh) 用于处理数据的方法和装置
US7945766B2 (en) Conditional execution of floating point store instruction by simultaneously reading condition code and store data from multi-port register file
US20130067196A1 (en) Vectorization of machine level scalar instructions in a computer program during execution of the computer program
US7010676B2 (en) Last iteration loop branch prediction upon counter threshold and resolution upon counter one
US7120905B2 (en) System and method for transformation of assembly code for conditional execution
US7219336B2 (en) Tracking format of registers having multiple content formats in binary translation
Jeroen van Straten ρ-VEX user manual

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130408

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20140225

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20140311

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140605

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140701

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140716

R150 Certificate of patent or registration of utility model

Ref document number: 5583770

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees