(57)【特許請求の範囲】
【請求項１】
データ処理システムにおいて、据え置かれた例外条件を示すインデータ・パス特殊例外値についてチェックするための命令をコードに挿入するための方法であって、
前記データ処理システムのプロセッサが、コンパイラを実行することにより、第１のコードの一部分を分析して、指定の非投機的動作を実行し、動作指示命令へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第１のコード内の前記指定の非投機的動作を実行している少なくとも１つの非投機的命令を識別することと、
前記プロセッサが、コンパイラを実行することにより、前記第１のコード内の指定の非投機的動作を実行している前記少なくとも１つの非投機的命令を前記動作指示命令で置換することと、
前記プロセッサが、コンパイラを実行することにより、前記第１のコード内の前記少なくとも１つの非投機的命令の前記置換に基づいて第２のコードを生成すること
を含む、方法。
【請求項２】
前記動作指示命令が、メモリへの保管動作を実行し、インデータ・パス特殊例外値がある場合にそれに対応する例外条件を示す保管指示命令、ベクトル入力をあるベクトル・レジスタから他のベクトル・レジスタに移動し、インデータ・パス特殊例外値がある場合にそれに対応する例外条件を示す移動指示命令、または入力ベクトルについて計算動作を実行し、ベクトル出力を生成し、インデータ・パス特殊例外値がある場合にそれに対応する例外条件を示す計算指示命令のうちの１つである、請求項１記載の方法。
【請求項３】
前記第１のコードが単一命令多重データ（ＳＩＭＤ）コードを含む、請求項１記載の方法。
【請求項４】
前記第１のコードの前記一部分を分析することが、前記第１のコードの前記一部分の依存グラフを分析して、そのノードに対応する命令に関する置換として動作指示命令を挿入できる前記依存グラフ内のノードを識別することを含む、請求項１記載の方法。
【請求項５】
前記第１のコードの前記一部分を分析することが、前記ノードに対応する前記命令のベクトル出力レジスタがチェック可能であるかまたはチェック不能であるかを判断することをさらに含み、
ベクトル出力レジスタの各スロットに保管された各値がチェック可能である場合に、前記ベクトル出力レジスタがチェック可能であり、
値が正であり、実際に計算された浮動小数点値である場合、または前記値が例外条件を引き起こさないことが保証されている場合に、前記値がチェック可能であり、
値が前記データ処理システムのメモリの記憶イメージまたは前記第１のコードの決定プロセスに影響を与えるか、あるいは前記値を使用する次の計算が前記記憶イメージまたは決定プロセスに影響を与える場合に、前記値が正である、請求項４記載の方法。
【請求項６】
前記少なくとも１つの非投機的命令を前記動作指示命令で置換することが、前記第１のコードの前記一部分の前記依存グラフ内のノードであって、前記第１のコードの前記一部分の前記ベクトル出力レジスタの正浮動小数点値が前記インデータ・パス特殊例外値についてチェックされる前記ノードにおいて前記動作指示命令を挿入することを含む、請求項５記載の方法。
【請求項７】
前記少なくとも１つの非投機的命令を前記動作指示命令で置換することが、前記第１のコードの前記一部分の前記依存グラフ内の計算が実行される各ノードにおいて前記動作指示命令を挿入することを含む、請求項５記載の方法。
【請求項８】
前記第１のコードの前記一部分を分析することが、
その出力ベクトル・レジスタがチェック可能である命令に関連する少なくとも１つのノードが前記依存グラフ内に存在するかどうかを判断することと、
その出力ベクトル・レジスタがチェック可能である命令に関連する少なくとも１つのノードが前記依存グラフ内に存在しないと判断したことに応答して、前記依存グラフ内の少なくとも１つのノードが、その出力ベクトル・レジスタがチェック可能出力ベクトル・レジスタに変換可能である命令に関連する変換可能ノードであるかどうかを判断することと、
前記少なくとも１つの変換可能ノードに関連する前記命令の前記出力ベクトル・レジスタがチェック可能であるように、前記少なくとも１つの変換可能ノードに関連する前記命令を変換すること
をさらに含む、請求項５記載の方法。
【請求項９】
前記少なくとも１つの変換可能ノードに関連する前記命令を変換することが、前記出力ベクトル・レジスタ内の非チェック可能値をマスキングすることを含む、請求項８記載の方法。
【請求項１０】
前記少なくとも１つの変換可能ノードに関連する前記命令を変換することが、前記出力ベクトル・レジスタがチェック可能値のみを保管するようにループ・ピーリングを実行することを含む、請求項８記載の方法。
【請求項１１】
前記少なくとも１つの変換可能ノードに関連する前記命令の前記変換に関連するコストがしきい値を上回るかどうかを判断することと、
前記コストが前記しきい値を上回ることに応答して、前記少なくとも１つの変換可能ノードに関連する前記命令の前記変換を実行しないこと
をさらに含む、請求項８記載の方法。
【請求項１２】
前記コストが前記しきい値を上回る場合に、前記第２のコードのベクトル化が少なくとも部分的に戻される、請求項１１記載の方法。
【請求項１３】
前記データ処理システムが、投機的命令が例外条件を生成したことに応答して、例外処理を開始せずに、前記インデータ・パス特殊例外値をベクトル出力レジスタに保管するように構成される、請求項１記載の方法。
【請求項１４】
前記少なくとも１つの非投機的命令を前記動作指示命令で置換することが
、前記第１のコードの前記一部分の前記依存グラフ内のノードであって、比較動作が実行される前記ノードにおいて前記動作指示命令を挿入することを含む、請求項４記載の方法。
【請求項１５】
前記インデータ・パス特殊例外値が、非数値（ＮａＮ）値、正の無限大値、または負の無限大値のうちの少なくとも１つである、請求項１記載の方法。
【請求項１６】
前記動作指示命令によって識別される前記インデータ・パス特殊例外値が、前記第２のコードが実行されるコンピューティング・デバイスの構成設定によって制御され、前記構成設定が前記ＮａＮ値、正の無限大値、または負の無限大値のうちの１つまたは複数を前記動作指示命令による識別のために使用可能であるものとして指定する、請求項１５記載の方法。
【請求項１７】
前記第２のコードを生成することが、前記動作指示命令によって後でチェックされる対応するベクトル・レジスタのベクトル要素にインデータ・パス特殊例外値を挿入することにより例外を据え置く投機的命令を前記第２のコード内で生成することを含む、請求項１記載の方法。
【請求項１８】
割り込みがベクトル出力レジスタ内のチェック可能値または非チェック可能値によるものであるかどうかを検出する割り込みハンドラを提供することであって、前記割り込みがチェック可能値によるものであることに応答して前記割り込みハンドラが前記割り込みを処理するための動作を実行し、前記割り込みが非チェック可能値によるものであることに応答して前記割り込みハンドラが前記割り込みを無視すること
をさらに含む、請求項５記載の方法。
【請求項１９】
コンピュータ・プログラムであって、前記コンピュータ・プログラムが、コンピューティング・デバイス上で実行されると、
第１のコードの一部分を分析して、指定の非投機的動作を実行し、動作指示命令へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第１のコード内の前記指定の非投機的動作を実行している少なくとも１つの非投機的命令を識別することと、
前記第１のコード内の指定の非投機的動作を実行している前記少なくとも１つの非投機的命令を前記動作指示命令で置換することと、
前記少なくとも１つの非投機的命令の前記置換に基づいて第２のコードを生成すること
を前記コンピューティング・デバイスに実行させる、コンピュータ・プログラム。
【請求項２０】
データ処理システムにおいて、据え置かれた例外条件を示す特殊値についてチェックするための命令をコードに挿入するための方法であって、
前記データ処理システムのプロセッサにより、第１のコードを分析して、指定の非投機的動作を実行し、動作指示命令へのベクトル・レジスタ入力のベクトル・スロット内に存在するインデータ・パス特殊例外値に対応する任意の例外条件を示すための指示動作をさらに実行する前記動作指示命令による置換の候補である前記第１のコード内の前記指定の非投機的動作を実行している少なくとも１つの非投機的命令を識別することと、
前記プロセッサにより、前記第１のコード内の指定の非投機的動作を実行している前記少なくとも１つの非投機的命令を前記動作指示命令で置換することと、
前記プロセッサにより、前記少なくとも１つの非投機的命令の前記置換に基づいて第２のコードを生成することと、
前記データ処理システムの前記プロセッサまたは他のプロセッサ内であるいは他のコンピューティング・デバイス内で前記第２のコードを実行することと、
例外ハンドラを呼び出さずに、例外条件を示す特殊値を使用して前記第２のコード内の投機的命令の実行中に前記例外条件を追跡することと、
前記特殊値を検出し、前記指示動作を実行するために、前記第２のコード内の前記動作指示命令を実行することであって、前記指示動作により前記例外ハンドラが呼び出されること
を含む、方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、一般に、改良されたデータ処理装置および方法に関し、より具体的には、最適化単一命令多重データ（ＳＩＭＤ：Single Instruction Multiple Data）コードのための動作指示（operation-and-indicate）命令の挿入のためのメカニズムに関する。
【背景技術】
【０００２】
本発明は米国エネルギー省によって授与された契約書第Ｂ５５４３３１号に基づく米国政府の援助によりなされたものである。米国政府は本発明に対し一定の権利を有している。
【０００３】
マルチメディア拡張（ＭＭＥ）は、汎用マイクロプロセッサに対する追加として最も人気のあるものの１つになっている。既存のマルチメディア拡張は、パックされた固定長ベクトルをサポートする単一命令多重データ（ＳＩＭＤ）パス・ユニットとして特徴付けることができる。マルチメディア拡張のための従来型のプログラミング・モデルは、（インライン）アセンブリまたは高水準プログラミング言語に埋め込まれた組み込み関数のいずれかを使用する明示ベクトル・プログラミング（explicit vector programming）であった。明示ベクトル・プログラミングは、時間がかかり、誤りがちなものである。将来有望な代替策は、標準的な高水準言語で作成されたプログラムからＳＩＭＤコードを自動的に生成するためにベクトル化技術を活用することである。
【０００４】
数十年前に従来型のベクトル・プロセッサのためにベクトル化が幅広く研究されたが、２つのアーキテクチャ間にはいくつかの根本的な違いがあるため、ＳＩＭＤアーキテクチャのためのベクトル化は新しい問題を提起した。２つのタイプのベクトル化を区別するために、後者はＳＩＭＤベクトル化またはＳＩＭＤ化（SIMDization）という。このような根本的な違いの１つはメモリ・ユニットから生じている。典型的なＳＩＭＤプロセッサのメモリ・ユニットは、従来型のベクトル・プロセッサより幅広いスカラ・プロセッサのメモリ・ユニットに似ている。特定のＰｏｗｅｒＰＣ（商標）マイクロプロセッサ（ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社製）上で検出されるＶＭＸ命令セットでは、たとえば、ロード命令は１６バイトの境界合わせされたメモリから１６バイトの連続メモリをロードし、その命令内のメモリ・アドレスの最後の４ビットを無視する。同じことが保管命令にも適用される。
【０００５】
最近、プログラムからＳＩＭＤ並行処理を自動的に抽出するためのコンパイラ技法に対する関心が急上昇した。この急増は、マルチメディア・プロセッサおよびハイパフォーマンス・コンピューティングにおけるＳＩＭＤアーキテクチャの普及の増加によって駆り立てられたものである。これらのプロセッサは、複数の機能ユニット、たとえば、浮動小数点ユニット、固定小数点ユニット、整数ユニットなどを有し、これらのユニットはユニプロセッサのパフォーマンスを強化するために同じマシン・サイクルで２つ以上の命令を実行することができる。これらのプロセッサの機能ユニットは典型的にパイプライン化される。
【０００６】
ＳＩＭＤ並列処理を抽出するためにループについてコンパイラベースの変換を実行する際に、配列参照の安全性を保証することが重要である。すなわち、ＳＩＭＤアーキテクチャによる実行のためにソース・コードのコンパイル中に、コンパイラは、ＳＩＭＤアーキテクチャによる実行のために並列化することができるコードの一部分を決定することを含む、様々な最適化を実行することができる。この並列化は、典型的に、コードのその部分をベクトル化、またはＳＩＭＤベクトル化、あるいはＳＩＭＤ化することを含む。このような最適化の１つは、パイプライン化された機能ユニットが遭遇する分岐予測ミス（branch misprediction）の不利益を回避するために、コード内の分岐をプレディケートされた動作（predicated operation）に変換することを含む。この最適化は、分岐条件に対応するブール・プレディケート（Boolean predicate）をセットアップするために比較命令を使用して、ソース・コード内の条件付き分岐をプレディケート動作（predicate operation）を有するプレディケートされたコード（predicatedcode）に変換することを含む。したがって、プレディケートとは、この時点で命令を保護するものであり、一般に「ｉｆ変換（if-conversion）」というプロセスであり、プレディケートの値に応じて命令を実行するかまたは無効にする。
【０００７】
手短に言えば、従来型のｉｆ変換によって生成されたプレディケートされたコードは、２つの相互排他的な実行パスから命令を実行し、２つの相互排他的なパスのうちの１つに対応する命令を抑制することにより、直線的コードを生成する。これらの相互排他的な実行パスのうちの１つが選択されたパスに対応しない場合、このパスが様々な望ましくない誤った実行結果、特に、不適切なメモリ参照を生成することは極めて一般的である。したがって、「ｉｆ変換」により非選択のプレディケートされた命令の無効化、特に、ｉｆ変換されたコード内のメモリ参照命令がなければ、「ｉｆ変換」の結果、誤った実行が行われる可能性がある。
【０００８】
Gschwind他による「SynergisticProcessing in Cell’s Multicore Architecture」（IEEEMicro、２００６年３月）では、データ並列ＳＩＭＤアーキテクチャに関するコンパイルのためにますます広範に採用されているデータ並列ｉｆ変換の概念を紹介している。従来型のスカラｉｆ変換とは異なり、データ並列ｉｆ変換は、典型的に、Gschwind他により２００６年８月４日に出願され、同時係属かつ本出願人に譲渡された米国特許出願公報第ＵＳ２００８００３４３５７Ａ１号「Method and Apparatus for Generating Data Parallel Select Operationsin a Pervasively Data Parallel System」に記載されているように、多くのＳＩＭＤアーキテクチャによってサポートされるデータ並列選択によるコード生成を目標にしている。というのは、データ並列ＳＩＭＤアーキテクチャは、典型的に、プレディケートされた実行を提供しないからである。
【０００９】
したがって、従来型のｉｆ変換は、相互排他的なパスのうちのどちらかに対応する各命令の実行または非実行を示すプレディケートで各命令を保護する。Ｇｓｃｈｗｉｎｄ他の特許出願公報に記載されているデータ並列選択によるデータ並列ｉｆ変換は、プレディケートなしで両方のパスからの命令を実行し、データ並列選択命令を使用して、まさにそれが元のソース・コード内で取られたパスに対応するときに、コンパイルされたコード内で無条件に実行されたパスに対応する結果を選択する。したがって、取られたパスの情報に基づいて結果選択を実装するためにデータ並列選択を使用することができるが、データ並列選択によるデータ並列ｉｆ変換は命令を無効にするように適合されない。これは、ベクトル命令が、その結果ベクトルの一部が選択されないときに、その結果ベクトルの他の一部が選択され、従来型の命令プレディケーションを非実用的なものにする可能性があるからである。
【００１０】
従来型のｉｆ変換と、データ並列選択動作を使用するデータ並列ｉｆ変換との違いは、ＱＰＸアセンブリ言語で示されている以下のコード例に関して容易に理解できるであろう。
ａ［ｉ］＝ｂ［ｉ］／＝０？１／ｂ［ｉ］：ＤＥＦＡＵＬＴ；
【００１１】
従来型のｉｆ変換は、以下の形式でこのコードを実装するであろう。
【数１】
0005583770.tif 000002
【００１２】
上記で分かるように、その命令を実行してはならいことをプレディケート条件が示している場合、結果ならびに例外などのすべての関連する副作用が抑制される。ＦＲＥは、単一結果を生成することになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。
【００１３】
次に、たとえば、模範的な４要素ベクトルについてデータ並列選択を活用することによるデータ並列ｉｆ変換とＳＩＭＤベクトル化によって生成されたコードについて考慮する。
【数２】
0005583770.tif 000003
【００１４】
この例によれば、ＱＶＦＲＥ命令はプレディケートされず、必ず結果を書き込む。上記の通り、ＦＲＥ命令は、単一結果を生成するのでその結果を書き込むことになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。ＦＲＥ命令とは異なり、ＱＶＦＲＥ命令は、ベクトルａ［ｉ：ｉ＋３］に書き戻される０、１、２、３、または４つの結果を生成することができる。しかし、結果が使用されるかどうかに関する知識はＱＶＦＲＥ命令にとって使用可能ではなく、したがって、正しい１組の例外を生成することができない。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】米国特許出願公報第ＵＳ２００８００３４３５７Ａ１号
【特許文献２】米国特許出願第１２／２５０５７５号
【非特許文献】
【００１６】
【非特許文献１】Gschwind他による「Synergistic Processing in Cell’sMulticore Architecture」（IEEEMicro、２００６年３月）
【非特許文献２】Gibbs他による「IBM eServer BladeCenter JS20 PowerPC 970 Programming Environment」というレッドブック（２００５年１月）
【発明の概要】
【発明が解決しようとする課題】
【００１７】
したがって、ＳＩＭＤプロセッサ・アーキテクチャで実行するためのＳＩＭＤ化コードを生成するためにコンパイラによって使用されるデータ並列ｉｆ変換により、スプリアス・エラーを回避するために例外が抑制される。しかし、例外生成であっても、アプリケーションの挙動を保存できることは重要である。
【課題を解決するための手段】
【００１８】
例示的な一実施形態では、データ処理システムにおいて、ベクトル化コードの実行時の例外を追跡し指示するために指示された命令を挿入するための方法が提供される。この方法は、データ処理システムのプロセッサ上で実行されるコンパイラにおいて、第１のコードの一部分を受信することを含む。この方法は、プロセッサ上で実行されるコンパイラにより、第１のコードの一部分を分析して、指定の非投機的動作を実行し、置換動作指示命令へのベクトル・レジスタ入力内に存在する特殊例外値に対応する任意の例外条件を示すための指示動作をさらに実行する置換動作指示命令による置換の候補である第１のコード内の指定の非投機的動作を実行している少なくとも１つの非投機的命令を識別することをさらに含む。また、この方法は、プロセッサ上で実行されるコンパイラにより、第１のコード内の指定の非投機的動作を実行している少なくとも１つの非投機的命令を置換動作指示命令で置換することも含む。その上、この方法は、プロセッサ上で実行されるコンパイラにより、少なくとも１つの非投機的命令の置換に基づいて第２のコードを生成することを含む。このデータ処理システムは、例外処理を開始せずに、投機的命令が例外条件を生成したことに応答して、特殊例外値をベクトル出力レジスタに保管するように構成される。
【００１９】
他の例示的な諸実施形態では、コンピュータ可読プログラムを有するコンピュータ使用可能媒体またはコンピュータ可読媒体を含むコンピュータ・プログラム（computer program product）が提供される。このコンピュータ可読プログラムは、コンピューティング・デバイス上で実行されると、この例示的な実施形態の方法に関して上記で概略を述べた動作のうちの様々な動作およびその組み合わせをそのコンピューティング・デバイスに実行させる。
【００２０】
さらに他の例示的な実施形態では、システム／装置が提供される。このシステム／装置は、１つまたは複数のプロセッサと、１つまたは複数のプロセッサに結合されたベクトル・レジスタ・ファイルとを含むことができる。この１つまたは複数のプロセッサは、この例示的な実施形態の方法に関して上記で概略を述べた動作のうちの様々な動作およびその組み合わせをこの１つまたは複数のプロセッサに実行させるように構成される。
【００２１】
本発明の上記その他の特徴および利点は、本発明の実施形態例に関する以下の詳細な説明に記載されるか、またはその詳細な説明を考慮すれば当業者にとって自明なものになる。
【００２２】
本発明ならびにその好ましい使用態様と追加の目的および利点は、添付図面に併せて読んだときに例示的な諸実施形態に関する以下の詳細な説明を参照することにより最もよく理解されるであろう。
【図面の簡単な説明】
【００２３】
【図１】例示的な諸実施形態の模範的な諸態様を実装可能なチップ上の異種マルチプロセッサ・システムのブロック図の例である。
【図２】いくつかの例示的な諸実施形態によってなされた改良点の考察のために示された既知のプロセッサ・アーキテクチャのブロック図である。
【図３】例示的な諸実施形態の模範的な諸態様を実装可能な、図２に示されているプロセッサ・アーキテクチャの変更形式の模範的な図である。
【図４】例示的な一実施形態により例外値がそのベクトル要素内に保管されており、伝搬される１つまたは複数のベクトル要素について操作するデータ並列選択動作の実行を示す図の例である。
【図５】例示的な一実施形態により例外値がそのベクトル要素内に保管されており、伝搬される１つまたは複数のベクトル要素について操作するデータ並列選択動作の実行を示す図の例である。
【図６】例示的な一実施形態による保管指示（store-and-indicate）命令を示す図の例である。
【図７】例示的な一実施形態によるコンパイラの模範的なブロック図である。
【図８】例示的な一実施形態により失われた例外条件を検出するために除数レジスタ上のオーバフローのテストを実行可能な１組の条件を示す図の例である。
【図９】例示的な一実施形態によりオーバフローからＮａＮへの変更条件（overflow-to-NaNchange condition）を検出するためにオペランド・レジスタ上のオーバフローのテストを実行可能な１組の条件を示す図の例である。
【図１０】例示的な一実施形態によりベクトル要素の値を設定するための動作例の概略を示す流れ図である。
【図１１】例示的な一実施形態により例外を生成するための動作例の概略を示す流れ図である。
【図１２】例示的な一実施形態によりコンパイラによりＳＩＭＤベクトル化コードに指示命令を挿入するための動作例の概略を示す流れ図である。
【図１３】例示的な一実施形態の基準によりチェック可能ＳＩＭＤコード部分とチェック不能ＳＩＭＤコード部分との違いを示す図の例である。
【図１４】例示的な一実施形態の基準によりチェック可能ＳＩＭＤコード部分とチェック不能ＳＩＭＤコード部分との違いを示す図の例である。
【図１５】例示的な一実施形態の基準によりチェック可能ＳＩＭＤコード部分とチェック不能ＳＩＭＤコード部分との違いを示す図の例である。
【図１６】例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【図１７】例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【図１８】例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【図１９】他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【図２０】他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【図２１】他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。
【発明を実施するための形態】
【００２４】
例示的な諸実施形態は、浮動小数点例外および保管ベースの例外指示のインデータ・パス（in-data path）追跡のためのメカニズムを提供する。例示的な諸実施形態のメカニズムにより、命令などの投機的実行中など、例外条件に遭遇したときに特殊値がベクトル要素に保管される。実行スレッドの一部としての命令の投機的実行は、コードの実行中にそのスレッドの結果が必要になる場合、すなわち、投機的状態から結果が使用される非投機的状態へとスレッドが遷移する場合により良いパフォーマンスを達成するように、その結果が後で必要になる場合もあれば必要にならない場合もあるスレッドの早期実行が行われるという最適化技法である。例示的な諸実施形態の特殊値は、例外条件を示すが、対応する例外ハンドラを呼び出すものではない。これらの特殊値は、コンピュータ・プログラムの実行により、ならびに、たとえば、保管動作またはベクトル内のデータをそのベクトル・レジスタから他のベクトル・レジスタに移動するための移動動作などの非投機的命令を介するなど、ベクトルがメモリに固定（persist）されるまで、ベクトルを有するプロセッサ・アーキテクチャにより、伝搬される。このような非投機的命令が実行されると、実際の例外が生成され、適切な例外処理が実行される。このようにして、実行パイプライン内のあるポイントで例外条件を検出することができ、投機的命令または１組の命令の実行が非投機的になることなどにより、例外条件がコンピュータ・プログラムの実行に実際に影響を及ぼすときに処理されるように例外をトリガするように、例外条件検出および例外処理が相互に切り離される。
【００２５】
例示的な諸実施形態のメカニズムは、好ましくは、ソース・コードを、ベクトル化命令、たとえば、単一命令多重データ（ＳＩＭＤ）命令を実行できる１つまたは複数のプロセッサ上で実行するためのコードに変換するコンパイラに併せて実装される。例示的な諸実施形態のメカニズムにより、ソース・コード、たとえば、スカラ・コードをＳＩＭＤベクトル化コードに変換する際に、例外条件の発生を識別する特殊値の使用を利用するために、移動指示（move-and-indicate）、保管指示などの動作指示命令（まとめて「指示（indicate）」命令という）がコード内の適切な位置に挿入される。コンパイラは、以下に定義するように関心のある値がチェック可能であるかまたはチェック不能であるかに基づいて、１つまたは複数の方法により適切な挿入ポイントを決定する。ある方法では、チェック不能であるＳＩＭＤコードの一部分をマスキング・メカニズムの使用によりチェック可能ＳＩＭＤコードに変換することができる。また、ある方法では、関心のある値、たとえば、関心のある複数の値の配列を伴うすべての計算の後に指示命令を挿入することができる。他の方法では、それぞれの生（live）出力値をテストするように最小数のチェック命令が適切な位置に挿入され、ここで、値が最終的にコードの記憶イメージまたは決定プロセスに影響を与える（あるいは次の計算がその結果を使用して、最終的にコードの記憶イメージまたは決定プロセスに影響を与えることになる）場合にその値は生である。
【００２６】
ＳＩＭＤ対応プロセッサが提供されるデータ処理システムの一例は、ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社から入手可能なセル・ブロードバンド・エンジン（ＣＢＥ：Cell Broadband Engine）である。以下の説明では例示的な諸実施形態のメカニズムを実装するためにＣＢＥアーキテクチャを使用すると想定することになるが、本発明はＣＢＥアーキテクチャでの使用に限定されないことを認識されたい。それとは反対に、例示的な諸実施形態のメカニズムは、コンパイラによって実行される変換とともに配列参照安全分析を使用できる任意のアーキテクチャで使用することができる。ＣＢＥアーキテクチャは、例示的な諸実施形態のメカニズムを使用することができ、例示的な諸実施形チアのメカニズムに関していかなる制限も明記または暗示することを意図しない、１つのタイプのデータ処理システムの一例としてのみ、以下に提供される。
【００２７】
当業者であれば認識するように、本発明は、システム、方法、またはコンピュータ・プログラムとして実施することができる。したがって、本発明の諸態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、またはソフトウェアとハードウェアの諸態様を組み合わせた実施形態の形を取ることができ、いずれも一般に本明細書では「回路」、「モジュール」、または「システム」と呼ぶことができる。さらに、本発明の諸態様は、コンピュータ使用可能プログラム・コードがそこに実施されている任意の１つまたは複数のコンピュータ可読媒体に実施されたコンピュータ・プログラムの形を取ることができる。
【００２８】
１つまたは複数のコンピュータ可読媒体の任意の組み合わせを使用することができる。このコンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読記憶媒体にすることができる。コンピュータ可読記憶媒体は、たとえば、電子、磁気、光、電磁、赤外線、または半導体のシステム、装置、またはデバイス、あるいは上記の任意の適切な組み合わせにすることができるが、これらに限定されない。コンピュータ可読媒体のより具体的な例（非網羅的リスト）としては、１つまたは複数のワイヤを有する電気接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、消去可能プログラマブル読み取り専用メモリ（ＥＰＲＯＭまたはフラッシュ・メモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み取り専用メモリ（ＣＤ−ＲＯＭ）、光学記憶装置、磁気記憶装置、または上記の任意の適切な組み合わせを含むであろう。本明細書では、コンピュータ可読記憶媒体は、命令実行システム、装置、またはデバイスによりあるいはそれに関連して使用するためのプログラムを収容または保管することができる任意の有形媒体にすることができる。
【００２９】
コンピュータ可読信号媒体は、たとえば、ベースバンド内でまたは搬送波の一部として、コンピュータ可読プログラム・コードがそこに実施された伝搬データ信号を含むことができる。このような伝搬信号は、電磁、光、またはこれらの任意の適切な組み合わせを含むがこれらに限定されない様々な形のいずれかを取ることができる。コンピュータ可読信号媒体は、コンピュータ可読記憶媒体ではなく、命令実行システム、装置、またはデバイスによりあるいはそれに関連して使用するためのプログラムを伝達、伝搬、または移送することができる任意のコンピュータ可読媒体にすることができる。
【００３０】
コンピュータ可読媒体上に実施されたコンピュータ・コードは、無線、有線、光ファイバ・ケーブル、無線周波（ＲＦ）など、またはこれらの任意の適切な組み合わせを含むがこれらに限定されない任意の適切な媒体を使用して伝送することができる。
【００３１】
本発明の諸態様に関する動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（ＴＭ）、Ｓｍａｌｌｔａｌｋ（ＴＭ）、Ｃ＋＋などのオブジェクト指向プログラミング言語ならびに「Ｃ」プログラミング言語または同様のプログラミング言語などの従来のプロシージャ型プログラミング言語を含む１つまたは複数のプログラミング言語の任意の組み合わせで作成することができる。このプログラム・コードは、完全にユーザのコンピュータ上で、一部分はユーザのコンピュータ上で、スタンドアロン・ソフトウェア・パッケージとして、一部分はユーザのコンピュータ上でかつ一部分はリモート・コンピュータ上で、あるいは完全にリモート・コンピュータまたはサーバ上で実行することができる。後者のシナリオでは、リモート・コンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）または広域ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークによりユーザのコンピュータに接続される場合もあれば、外部コンピュータに対して（たとえば、インターネット・サービス・プロバイダを使用してインターネットにより）接続が行われる場合もある。
【００３２】
本発明の例示的な諸実施形態による方法、装置（システム）、およびコンピュータ・プログラムの流れ図あるいはブロック図またはその両方に関連して、本発明の諸態様について以下に説明する。流れ図あるいはブロック図またはその両方の各ブロックならびに流れ図あるいはブロック図またはその両方の複数ブロックの組み合わせは、コンピュータ・プログラム命令によって実装可能であることが理解されるであろう。これらのコンピュータ・プログラム命令は、マシンを生産するために汎用コンピュータ、専用コンピュータ、またはその他のプログラマブル・データ処理装置のプロセッサに提供することができ、コンピュータまたはその他のプログラマブル・データ処理装置のプロセッサを介して実行される命令は流れ図あるいはブロック図またはその両方の１つまたは複数のブロックに指定された機能／行為を実装するための手段を作成する。
【００３３】
また、これらのコンピュータ・プログラム命令は、特定の方法で機能するよう、コンピュータ、その他のプログラマブル・データ処理装置、またはその他のデバイスに指示することができるコンピュータ可読媒体に保管することもでき、コンピュータ可読媒体に保管された命令は流れ図あるいはブロック図またはその両方の１つまたは複数のブロックに指定された機能／行為を実装する命令を含む装置（article of manufacture）を生産する。
【００３４】
また、このコンピュータ・プログラム命令は、コンピュータ、その他のプログラマブル・データ処理装置、またはその他のデバイス上にロードして、一連の動作ステップをコンピュータ、その他のプログラマブル装置、またはその他のデバイス上で実行させ、コンピュータによって実行されるプロセスを生産することもでき、コンピュータまたはその他のプログラマブル装置上で実行される命令は流れ図あるいはブロック図またはその両方の１つまたは複数のブロックに指定された機能／行為を実装するためのプロセスを提供する。
【００３５】
図面内の流れ図およびブロック図は、本発明の様々な諸実施形態によるシステム、方法、およびコンピュータ・プログラムについて可能な実装例のアーキテクチャ、機能、および動作を例示している。この点に関しては、流れ図またはブロック図内の各ブロックは、指定の論理機能（複数も可）を実装するための１つまたは複数の実行可能命令を含む、コードのモジュール、セグメント、または一部分を表すことができる。また、いくつかの代替実装例では、ブロック内に示された機能は図面内に示された順序から外れて行われる可能性があることに留意されたい。たとえば、連続して示されている２つのブロックは、関係する機能に応じて、実際にはほぼ同時に実行される場合もあれば、ときには逆の順序で実行される場合もある。また、ブロック図あるいは流れ図またはその両方の各ブロックならびにブロック図あるいは流れ図またはその両方の複数ブロックの組み合わせは、指定の機能または行為を実行する専用ハードウェアベースのシステム、あるいは専用ハードウェアとコンピュータ命令の組み合わせによって実装可能であることにも留意されるであろう。
【００３６】
図１は、本発明の諸態様を実装可能なデータ処理システムの模範的なブロック図である。図１に示されている模範的なデータ処理システムはセル・ブロードバンド・エンジン（ＣＢＥ）データ処理システムの一例である。本発明の好ましい諸実施形態の説明ではＣＢＥが使用されるが、以下の説明を読んだときに当業者にとって容易に明らかになるように、本発明はこのようなものに限定されない。
【００３７】
図１に示されているように、ＣＢＥ１００は、プロセッサ（ＰＰＵ）１１６とそのＬ１およびＬ２キャッシュ１１２および１１４を有するパワー・プロセッサ・エレメント（ＰＰＥ）１１０と、それぞれがそれ専用の協同プロセッサ・ユニット（ＳＰＵ：synergistic processor unit）１４０〜１５４、メモリ・フロー制御１５５〜１６２、ローカル・メモリまたはストア（ＬＳ）１６３〜１７０、および、たとえば、直接メモリ・アクセス（ＤＭＡ）、メモリ管理ユニット（ＭＭＵ）、およびバス・インターフェース・ユニットの組み合わせにすることができるバス・インターフェース・ユニット（ＢＩＵユニット）１８０〜１９４を有する複数の協同プロセッサ・エレメント（ＳＰＥ：synergistic processor element）１２０〜１３４とを含む。広帯域内部エレメント相互接続バス（ＥＩＢ）１９６、バス・インターフェース・コントローラ（ＢＩＣ）１９７、およびメモリ・インターフェース・コントローラ（ＭＩＣ）１９８も設けられている。
【００３８】
ローカル・メモリまたはローカル・ストア（ＬＳ）１６３〜１７０は、物理的にはＳＰＵ１４０〜１５４に結合された小型メモリとして設けることができる大型メモリ・マップの非コヒーレント・アドレス可能部分である。ローカル・ストア１６３〜１７０は異なるアドレス・スペースにマッピングすることできる。これらのアドレス領域は非別名構成（non-aliased configuration）で連続している。ローカル・ストア１６３〜１７０は、以下により詳細に記載するＳＰＵ識別レジスタを介するなど、そのアドレス位置により、それに対応するＳＰＵ１４０〜１５４およびＳＰＥ１２０〜１３４に関連付けられている。このシステム内のすべてのリソースは、ローカル・ストア１６３〜１７０が安全な動作モードに置かれていない間はローカル・ストアとの間で読み取り／書き込みを行う能力を有し、その（安全な動作モード）場合、その関連ＳＰＵだけがローカル・ストア１６３〜１７０またはローカル・ストア１６３〜１７０の指定の保護部分にアクセスすることができる。
【００３９】
ＣＢＥ１００は、図１に描写されているエレメントのそれぞれを単一のマイクロプロセッサ・チップ上に設けることができるような、１チップ上のシステム（system-on-a-chip）にすることができる。その上、ＣＢＥ１００は、ＳＰＵのそれぞれがシステム内の他のＳＰＵのそれぞれから異なる命令を受信する可能性がある異種処理環境である。その上、ＳＰＵ用の命令セットはＰＰＵのものとは異なり、たとえば、ＰＰＵは縮小命令セット・コンピュータ（ＲＩＳＣ）ベースの命令を実行することができ、ＳＰＵはベクトル命令を実行する。ＣＢＥアーキテクチャの他の態様では、ＰＰＵはパワー命令セット・アーキテクチャ（ＩＳＡ）データ並列ＳＩＭＤ拡張をサポートする。
【００４０】
ＳＰＥ１２０〜１３４は、ＥＩＢ１９６を介して相互にならびにＬ２キャッシュ１１４に結合される。加えて、ＳＰＥ１２０〜１３４はＥＩＢ１９６を介してＭＩＣ１９８およびＢＩＣ１９７に結合される。ＭＩＣ１９８は共用メモリ１９９への通信インターフェースを提供する。ＢＩＣ１９７はＣＢＥ１００とその他の外部バスおよびデバイスとの間の通信インターフェースを提供する。
【００４１】
ＰＰＥ１１０はデュアル・スレッドＰＰＥ１１０である。このデュアル・スレッドＰＰＥ１１０と８つのＳＰＥ１２０〜１３４との組み合わせにより、ＣＢＥ１００は１０個の同時スレッドと１２８個を超える未処理のメモリ要求を処理できるようになる。ＰＰＥ１１０は、計算作業負荷のほとんどを処理する他の８つのＳＰＥ１２０〜１３４用のコントローラとして動作する。ＰＰＥ１１０を使用して従来のオペレーティング・システムを実行することができるが、ＳＰＥ１２０〜１３４は、たとえば、ベクトル化浮動小数点コード実行を実行する。
【００４２】
ＳＰＥ１２０〜１３４は、協同プロセッサ・ユニット（ＳＰＵ）１４０〜１５４と、メモリ・フロー制御ユニット１５５〜１６２と、ローカル・メモリまたはストア１６３〜１７０と、インターフェース・ユニット１８０〜１９４とを含む。ローカル・メモリまたはストア１６３〜１７０は、模範的な一実施形態では、ＰＰＥ１１０にとって可視であり、ソフトウェアによって直接アドレス指定することができる、２５６ＫＢの命令およびデータ・メモリを含む。
【００４３】
ＰＰＥ１１０は、小型プログラムまたはスレッドをＳＰＥ１２０〜１３４にロードし、複雑な動作の各ステップを処理するためにＳＰＥをひとまとめにつなぐことができる。たとえば、ＣＢＥ１００を取り入れたセットトップ・ボックスは、ＤＶＤの読み取り、ビデオおよびオーディオのデコード、ならびにディスプレイのためのプログラムをロードすることができ、データは、最終的に出力ディスプレイ上に表示されるまでＳＰＥからＳＰＥへと渡されることになるであろう。４ＧＨｚでは、各ＳＰＥ１２０〜１３４は理論上３２ＧＦＬＯＰＳのパフォーマンスを示し、ＰＰＥ１１０は同様のレベルのパフォーマンスを有する。
【００４４】
メモリ・フロー制御ユニット（ＭＦＣ）１５５〜１６２は、このシステムの残りの部分およびその他のエレメントへのＳＰＵ用のインターフェースとして機能する。ＭＦＣ１５５〜１６２は、メイン・ストレージとローカル・ストレージ１６３〜１７０との間のデータ転送、保護、および同期のための１次メカニズムを提供する。論理的にはプロセッサ内の各ＳＰＵについて１つのＭＦＣが存在する。実装例によっては、複数のＳＰＵ間で単一ＭＦＣのリソースを共用することができる。このような場合、そのＭＦＣについて定義されたすべての機構およびコマンドは、各ＳＰＥ用のソフトウェアにとって独立したものに見えなければならない。ＭＦＣを共用することの効果は、実装依存の機構およびコマンドに限定される。
【００４５】
図１のデータ処理システム１００により、プロセッサ１０６は、整数（スカラ）と浮動小数点（ベクトル）の両方の命令を処理し、両方のタイプのデータについて操作するための機構を有することができる。しかし、例示的な諸実施形態により、プロセッサ１０６は、浮動小数点専用ＳＩＭＤ命令およびデータとしてＳＩＭＤ命令およびデータを処理するためのハードウェア機構を有することができる。スカラ機構は、整数処理に使用され、浮動小数点専用ＳＩＭＤアーキテクチャに併せて、とりわけ、ループ制御およびメモリ・アクセス制御に使用される。
【００４６】
図２は、例示的な諸実施形態によってなされた改良点の考察のために示されたプロセッサ・アーキテクチャのブロック図である。図２に示されている特定のプロセッサ・アーキテクチャは、ニューヨーク州アーモンクのインターナショナル・ビジネス・マシーンズ社から入手可能で、Gibbs他による「IBM eServer BladeCenter JS20 PowerPC970 Programming Environment」というレッドブック（２００５年１月、www.redbooks.ibm.com/redpapers/pdfs/redp3890.pdfで入手可能）に記載されているＰｏｗｅｒＰＣ（ＴＭ）９７０マイクロプロセッサ用のものである。
【００４７】
図２に示されているように、このプロセッサ・アーキテクチャは、命令キャッシュ２０２と、命令取り出しユニット２０４と、命令デコード・ユニット２０６と、ディスパッチ・バッファ２０８とを含む。命令は、命令取り出しユニット２０４によって命令キャッシュ２０２から取り出され、命令デコード・ユニット２０６に提供される。命令デコード・ユニット２０６は、命令をデコードし、デコードした命令をディスパッチ・バッファ２０８に提供する。デコード・ユニット２０６の出力は、レジスタ・マップ２１０とグローバル完了テーブル２１２の両方に提供される。レジスタ・マップ２１０は、汎用レジスタ（ＧＰＲ）、浮動小数点レジスタ（ＦＰＲ）、ベクトル・レジスタ・ファイル（ＶＲＦ）などのうちの１つまたは複数にマッピングする。次に命令は、命令デコード・ユニット２０６およびレジスタ・マップ２１０のデコードおよびマッピングによって決定された命令タイプに応じて、発行待ち行列（issue queue）２２０〜２３２のうちの適切なものに提供される。発行待ち行列２２０〜２３２は、実行ユニット２４０〜２５８のうちの様々なものに入力を提供する。実行ユニット２４０〜２５８の出力はレジスタ・ファイル２６０〜２７２のうちの様々なものに送られる。命令で使用するためのデータは、データ・キャッシュ２８０を介して入手することができる。
【００４８】
特に注目すべきことは、プロセッサ内に浮動小数点、ベクトル、および固定小数点、または整数用の個別の発行待ち行列および実行ユニットが存在することが描写されたアーキテクチャで分かることである。図示の通り、浮動小数点レジスタ・ファイル２６４への出力ポートを有する２つの浮動小数点実行ユニット２４４〜２４６への２つの出力ポートを有する単一の浮動小数点ユニット（ＦＰＵ）発行待ち行列２２４が存在する。単一のベクトル置換（vector permute）発行待ち行列２２６は、ベクトル・レジスタ・ファイル（ＶＲＦ）２６６にアクセスするためのポートを有するベクトル置換実行ユニット２４８への単一出力ポートを有する。ベクトル演算論理装置（ＡＬＵ）発行待ち行列２２８は、ベクトル・レジスタ・ファイル２６８にアクセスするためのポートを有するベクトルＡＬＵ２５０に命令を発効するために１つの発行ポートを有する。これらの発行待ち行列、実行ユニット、およびレジスタ・ファイルはいずれもリソース、面積、およびパワーを消費するものであることを認識されたい。
【００４９】
いくつかの例示的な諸実施形態により、浮動小数点専用ＳＩＭＤアーキテクチャ用のメカニズムを提供する際に、これらの発行ユニット２２４〜２２８、実行ユニット２４４〜２５０、およびレジスタ・ファイル２６４〜２６８は、単一の発行待ち行列、実行ユニット、およびレジスタ・ファイルで置き換えられる。図３は、いずれかの例示的な実施形態による代替プロセッサ・アーキテクチャを示す模範的な図である。図３に示されているプロセッサ・アーキテクチャは、図２に示されているＰｏｗｅｒＰＣ（ＴＭ）９７０アーキテクチャの変更形式のものであり、したがって、図２と同様の要素が同様の参照番号とともに示されている。この変更されたアーキテクチャ例は一例に過ぎず、その他のプロセッサ・アーキテクチャに実装される発行ユニット、実行ユニット、およびレジスタ・ファイルの数を削減するために、このようなその他のアーキテクチャに対して同様の変更を行うことができることを認識されたい。したがって、例示的な諸実施形態のメカニズムは、ＰｏｗｅｒＰＣ（商標）９７０アーキテクチャの変更形式における実装に限定されない。
【００５０】
図３に示されているように、図３に示されている変更されたアーキテクチャでは、発行ユニット２２４〜２２８が単一のクワッド処理（quad-processing）実行ユニット（ＱＰＵ）発行ユニット３１０で置き換えられている。その上、実行ユニット２４４〜２５０は単一のクワッド処理実行ユニット（ＱＰＵ）３２０で置き換えられている。さらに、レジスタ・ファイル２６４〜２６８は単一のクワッドベクトル・レジスタ・ファイル（ＱＲＦ）３３０で置き換えられている。クワッド処理ユニット（ＱＰＵ）は単一命令で最高４つのデータ要素を同時に実行できるので、この変更されたアーキテクチャは、プロセッサの設計を単純化しながら、リソース使用量、使用面積、および電力使用量を削減するだけでなく、プロセッサのパフォーマンスも向上させる。
【００５１】
図３の変更されたプロセッサ・アーキテクチャは依然としてスカラ整数を処理する固定小数点ユニット（ＦＸＵ）を有することに留意されたい。このようなスカラ整数は主としてループ反復などの制御動作に使用される。その他の命令はいずれも浮動小数点またはベクトル・フォーマットのものである。具体的には、ＶＭＸ命令セットの実行対象が浮動小数点と整数の混合であるのとは異なり、ＱＰＸ命令は一般に浮動小数点データのみについて操作し、特に算術演算を実行する。整数型データのみの記憶は、このような整数をロードして保管するためにまたは浮動小数点状況および制御レジスタ（ＦＰＳＣＲ）との間で制御ワードを移動するために、整数フォーマットへのデータの変換に関連付けられている。整数の算術、論理演算、およびその他のこのような演算の必要性を考慮せずに、浮動数の表現および処理のために最適化された適切な内部表現を選択することができるので、動作を浮動小数点専用フォーマットに削減することにより、浮動小数点処理の効率が大幅に高められる。
【００５２】
例示的な一実施形態により、浮動小数点専用ＳＩＭＤ  ＩＳＡでは、従来の既知のＩＳＡで必要とされるように、比較結果、ブール演算、選択動作、およびデータの境界あわせの記憶のために整数のコード化をサポートするための要件がまったくない。浮動小数点（ＦＰ）専用ＳＩＭＤ  ＩＳＡにより、実質的にすべてのデータを浮動小数点データとして保管することができる。したがって、図３のベクトル・レジスタ・ファイル３３０には１つのタイプのデータのみが保管される。
【００５３】
例示的な一実施形態により、ＦＰ専用ＳＩＭＤ  ＩＳＡは、浮動小数点ベクトル同士を比較し、比較結果をベクトル・レジスタ・ファイル３３０の浮動小数点ベクトル・レジスタに保管する能力を提供する。その上、ＦＰ専用ＳＩＭＤ  ＩＳＡは選択動作およびブール演算のためのコード化方式を提供し、その方式により浮動小数点データ表現を使用して選択動作およびブール論理演算を実行することができる。
【００５４】
例示的な一実施形態では、ＦＰ専用ＳＩＭＤ  ＩＳＡは、ＱＰＵ３２０によるクワッド実行のために、４つの要素を有するＦＰ専用倍精度ＳＩＭＤベクトル、すなわち、クワッドベクトルを使用する。単精度ＳＩＭＤベクトルは、ロードおよび保管動作中に倍精度との間で自動的に変換される。本明細書では倍精度ベクトルＳＩＭＤ実装例について説明するが、例示的な諸実施形態はこのようなものに限定されず、例示的な諸実施形態の精神および範囲を逸脱せずに、単精度、拡張精度、３倍精度、および１０進浮動小数点専用ＳＩＭＤを含むがこれらに限定されないその他の精度を使用することもできる。
【００５５】
例示的な一実施形態では、ＦＰ専用ＳＩＭＤ  ＩＳＡを実装するための例示的な実施形態のメカニズムは主としてＱＰＵ３２０内の論理素子として提供される。メモリ・ユニットＬＳ１およびＬＳ２のうちの１つまたは複数のいずれか適切な方に追加のロジックを提供することができる。他の例示的な諸実施形態では、例示的な諸実施形態のメカニズムは、図３に示されている複数の要素間に分散されるなど、図３に示されている変更されたアーキテクチャの他の要素内に、あるいは図３に示されている１つまたは複数の要素に結合された１つまたは複数の専用論理素子内に、ロジックとして実装することができる。例示的な諸実施形態の実装の一例を提供するために、本明細書のために、他に指示のない限り、例示的な諸実施形態のメカニズムがＱＰＵ３２０内にロジックとして実装されると想定される。ＱＰＵ３２０内のロジックの例示的な一実施形態のより詳細な説明については、ＱＰＵ３２０アーキテクチャに関する仕様を提供する付録Ａを参照されたい。
【００５６】
例示的な諸実施形態のＦＰ専用ＳＩＭＤ  ＩＳＡの一部として、ＦＰベクトル同士を比較し、比較結果をＦＰベクトル・レジスタ・ファイル３３０に保管する能力が提供される。選択した比較は、ブール値に対応するＦＰ値を使用してコード化される。たとえば、例示的な一実施形態では、「真（TRUE）」の出力の場合、すなわち、比較の条件が満たされ、「真」の結果が生成された場合、その出力は１．０というＦＰ値として表される。「偽（FALSE）」の出力の場合、すなわち、比較の条件が満たされず、「偽」の出力が生成された場合、その出力は−１．０というＦＰ値として表される。比較の条件が満たされたかどうかに基づいてこのようなＦＰ値を生成する関数としては、２つのＦＰ値を比較して、それらが等しいかどうかを判断するＱＶＦＣＭＰＥＱ関数、２つのＦＰ値を比較して、第１のＦＰ値が第２のＦＰ値より大きいかどうかを判断するＱＶＦＣＭＰＧＴ関数、および２つのＦＰ値を比較して、第１のＦＰ値が第２のＦＰ値より小さいかどうかを判断するＱＶＦＣＭＰＬＴ関数を含む。加えて、「非数値（Not a Number）」（ＮａＮ）条件についてテストするためにテスト関数、すなわち、ＱＶＴＳＴＮＡＮが提供される。これらの関数の出力は、真の場合の１．０または偽の場合の−１．０のいずれかである。
【００５７】
これらの比較関数に加えて、例示的な諸実施形態のＦＰ専用ＳＩＭＤ  ＩＳＡには一致選択（matching select）機能が設けられている。このクワッドベクトル浮動小数点選択またはＱＶＦＳＥＬ関数は、ｑｖｆｓｅｌ  ＱＲＴ，ＱＲＡ，ＱＲＣ，ＱＲＢというフォーマットを有する。このクワッドベクトル浮動小数点選択関数により、レジスタＱＲＡの各ダブルワード・スロット内の浮動小数点オペランドが値ゼロと比較され、真または偽の値を決定する。オペランドがゼロより大きいかまたはゼロに等しい（すなわち、真である）場合、レジスタＱＲＴの対応するスロットはレジスタＱＲＣの内容に設定される。オペランドがゼロより小さいかまたはＮａＮである場合、レジスタＱＲＴはレジスタＱＲＢの内容に設定される。この比較はゼロの符号を無視し、すなわち、＋０．０を−０．０に等しいものと見なす。したがって、この一致選択関数の任意の正の比較結果により、ＱＲＴレジスタの浮動小数点ＳＩＭＤベクトル要素はＱＲＣレジスタの対応する浮動小数点ＳＩＭＤベクトル要素を取る。そうではなく、任意の負またはＮａＮ値により、ＱＲＴレジスタの浮動小数点ＳＩＭＤベクトル要素はＱＲＢレジスタ内の対応する浮動小数点ＳＩＭＤベクトル要素の値を取ることになる。
【００５８】
例示的な一実施形態により、入力および出力表現として真および偽の明確な定義が使用され、ここで、出力表現（すなわち、計算の結果として真または偽を表すために生成される値）は入力表現として使用される真および偽の値の範囲のサブセットである。具体的には、表１に示されている表現が使用される。
【表１】
0005583770.tif 000004
【００５９】
例示的な一実施形態の一態様によれば、このように選択した入出力表現によって未定義挙動が解消される。例示的な一実施形態の他の態様によれば、このような選択により、浮動小数点数としてコード化されたブール値を保管し、比較およびブール演算を実行する能力を提供しない少なくとも１つのレガシー命令セットによる浮動小数点符号に基づくレガシー「選択」関数と「選択」関数との互換性も提供される。例示的な一実施形態のさらに他の態様によれば、このような選択により、ブール入力オペランドを読み取る命令への入力として使用されるときに、ブール値のデコードが単純化される。
【００６０】
その上、例示的な諸実施形態のＦＰ専用ＳＩＭＤ  ＩＳＡにより、クワッドベクトル浮動小数点論理関数は、ベクトル出力が生成されるように定義される。たとえば、ＡＮＤ、ＯＲ、ＸＯＲ、ＮＡＮＤなどの演算に関する論理関数は、ＦＰ専用ＳＩＭＤ  ＩＳＡブール値に関して定義され、たとえば、真の場合は１．０であり、偽の場合は−１．０である。たとえば、ＡＮＤ演算は、１．０  ＡＮＤ  １．０の結果、１．０が出力され、そうではない場合、少なくとも１つの負のオペランドとのＡＮＤの出力が−１．０になるように、ＦＰ専用ＳＩＭＤ  ＩＳＡによって定義される。
【００６１】
一般に、本発明の一実施形態によりＳＩＭＤベクトルの各ベクトル位置に関する模範的なＦＰブールＡＮＤの演算は、表２の通りに記述することができる。
【表２】
0005583770.tif 000005
【００６２】
同様に、ＯＲ演算の場合、ＦＰ専用ＳＩＭＤ  ＩＳＡは、１．０  ＯＲ  １．０、−１．０  ＯＲ  １．０、および１．０  ＯＲ  −１．０の結果、１．０が出力され、−１．０  ＯＲ  −１．０の出力が−１．０になるように定義する。
【００６３】
一般に、本発明の一実施形態によりＳＩＭＤベクトルの各ベクトル位置に関する模範的なＦＰブールＯＲの演算は、表３の通りに記述することができる。
【表３】
0005583770.tif 000006
【００６４】
当業者であれば、同様に、上記に含まれる教示によりしかも本発明の範囲内で、真および偽という値について定義された１組の入力および出力表現に基づいて他のブール関数を定義することができるであろう。
【００６５】
本発明の模範的な一実施形態により、「ｆｌｏｇｉｃａｌ」命令が提供される。「ｆｌｏｇｉｃａｌ」命令は４ビットを使用して「真理値表」をコード化するものであり（すなわち、最高２つの入力を有する任意のブール論理関数のコード化）、それにより、浮動小数点値としてコード化された２つのブール・オペランドを使用して、この表へのインデックスを付け、ブール結果を入手する。次に、ブール結果は、例示的な諸実施形態のメカニズムにより浮動小数点（ＦＰ）ブール値としてコード化され、レジスタ・ファイルに保管される。ＳＩＭＤベクトル・アーキテクチャでは、「ｆｌｏｇｉｃａｌ」命令はベクトル「ｑｖｆｌｏｇｉｃａｌ」命令である。このような場合、各スロット内のブール値は、各ベクトル位置に関してＦＰブールとしてコード化された出力結果を独立して導出するために、独立して使用される。
【００６６】
図３において上述したＳＩＭＤアーキテクチャで使用可能なＦＰ専用ＳＩＭＤ  ＩＳＡの詳細は、２００８年１０月１４日に出願され、本出願人に譲渡された同時係属米国特許出願第１２／２５０５７５号「Floating Point Only Single Instruction Multiple Data Instruction SetArchitecture」に示されている。
【００６７】
もう一度、図１を参照すると、ＣＢＥ１００のＳＰＥ１２０〜１３４あるいはＰＰＥ１１０またはその両方は、図３に示されているようにＦＰ専用ＳＩＭＤアーキテクチャを利用することができ、たとえば、ＳＩＭＤ命令などのベクトル命令を使用することができる。代わって、プロセッサがベクトル要素を有するベクトル命令を使用する他のＳＩＭＤアーキテクチャを使用することもできる。したがって、ソース・コードから並列処理を抽出し、この並列処理を利用するようにソース・コードを再構成または変換することにより、ＰｏｗｅｒＩＳＡまたはＦＰ専用ＳＩＭＤ  ＩＳＡ拡張によりこれらのＳＰＥ１２０〜１３４またはＰＰＥ１１０上で実行するためにコンパイラによってソース・コードを最適化することができる。ＳＩＭＤベクトル化コードへの変換ならびに最適化についてソース・コードを分析する際に、コンパイラは「ｉｆ変換」動作を実行することができる。たとえば、前述の通り、データ並列ｉｆ変換メカニズムおよびデータ並列選択動作を使用して、このようなｉｆ変換を実行することができる。
【００６８】
上述の通り、ＳＩＭＤ対応プロセッサ上で実行するために、コードがＳＩＭＤ化、すなわち、ベクトル化されると、通常、元のプレディケートされたコードにとって問題ではない問題が例外処理時に発生する。上記の通り、プレディケートされたコード命令は、単一結果を生成するのでその結果を書き込むことになるかまたは単一結果を書き込まず、前者の場合、単一結果が書き込まれ、適切であれば例外が発生し、後者の場合、結果が書き込まれず、いかなる例外も発生しない。しかし、ＳＩＭＤベクトル化命令では、これらの命令は、特定の結果が使用されるかどうか、すなわち、値が投機的であるかどうかを把握せずに複数の結果を生成することができ、したがって、生成すべき正しい１組の例外が何であるかを判断することができない。したがって、既知のＳＩＭＤアーキテクチャでは、いずれかの例外が可能になり、その場合、プロセッサによって実際に実行されない実行パス、すなわち、結果的にサイクルが浪費される投機的実行パスでもスプリアス例外を生成し処理することができ、あるいは例外が抑制され、問題が発生したことはかなり後に判断され、デバッギング・メカニズムのために複雑なトレースバック動作が必要になる。
【００６９】
しかし、例示的な諸実施形態のメカニズムでは、データ並列ｉｆ変換ループについて適切な１組の例外を決定できないことにより例外を抑制しなければならない代わりに、例示的な諸実施形態のメカニズムがデータフロー主導方法で例外条件についてベクトル要素ごとの追跡（per-vector element tracking）を行う。このベクトル要素ごとの追跡により、例外が特殊な認識可能文字またはビット・パターンとしてベクトル要素に記録され、その特殊な認識可能文字またはビット・パターンは、ＳＩＭＤベクトル化コードの実行時にどの実行パスが取られたかが判断されるときなどに、関連の例外処理が実行されている例外を生成するために後で使用することができる。換言すれば、投機的データを非投機的なものにする保管命令または移動命令による場合など、投機的実行パス内の例外は、その投機的実行パスが非投機的になるポイントまで据え置かれる。
【００７０】
その上、例示的な諸実施形態は、例外情報を伝搬し廃棄する（supersede）能力を提供する。すなわち、その例外を含む実行パスが取られたかどうかが判断されるまで、例外情報を伝搬することができる。異なる実行パスが取られた場合、例外を廃棄することができ、すなわち、特殊文字またはビット・パターンを無視することができ、例外処理を必要とする例外を生成することができない。代わって、特殊文字またはビット・パターンがベクトル要素に保管されているベクトル要素を実行パスが含む場合、その実行パスがもはや本質的に投機的ではないと判断されるときに対応する例外を生成し、例外処理を実行することができる。
【００７１】
たとえば、上述のようなデータ並列選択動作では、そのデータ並列選択動作が複数のパスからの結果を結合することに留意されたい。例外値を示す特殊文字またはビット・パターンを有するベクトル要素をデータ並列選択動作で選択しないことにより、そのベクトル・スロットについて設定された結果例外からその例外が消滅する。このようにして、データフローに基づいて各ベクトル・スロットについて例外が伝搬される。
【００７２】
さらに、例示的な諸実施形態のメカニズムは、ベクトル例外情報をベクトル要素に保管し、保管指示命令あるいは移動指示命令またはその両方などの特定の動作によって例外を発生して、適切な例外ハンドラに実行を転送する能力を提供する。例示的な諸実施形態のこのようなメカニズムでは、切り離しによるこのような例外を追跡するために提供されたメカニズムにより、例外の認識が例外の実際の処理から本質的に切り離される。
【００７３】
例示的な一実施形態では、この例示的な実施形態のメカニズムが浮動小数点数のコード化を活用して、オーバフロー条件および違法操作に関する例外を診断し追跡する。この例示的な実施形態は、米国電気電子学会（ＩＥＥＥ）値を使用して例外条件を示し、たとえば、無限大はオーバフロー条件を表し、ＮａＮ（非数値）値は違法操作を示す。対応する例外が発生した場合、これらのＩＥＥＥ値はデータ要素の代わりにベクトル要素に保管される。次にこれらのＩＥＥＥ値は、ベクトル要素が固定されるまで、たとえば、保管されるかあるいはあるレジスタから他のレジスタに移動されるまで、ベクトル要素として伝搬される。ベクトル要素内のこれらの特殊なＩＥＥＥ値を識別し、対応する例外ハンドラによる処理のために対応する例外を生成するために、特殊な保管指示命令あるいは移動指示命令またはその両方が提供される。したがって、実行フロー中にこれらの保管指示命令または移動指示命令に遭遇しない場合、これらの例外は生成されない。
【００７４】
例示的な諸実施形態のメカニズムにより、コンパイラがコードを最適化して変換する場合、そのコンパイラは、ｉｆ命令をデータ並列選択動作に変換すること、すなわち、ＦＰ指向データ並列ｉｆ変換を実行することにより、データ並列ｉｆ変換を実行してＳＩＭＤ  ＩＳＡまたは浮動小数点専用ＳＩＭＤ  ＩＳＡを実装する。その上、ベクトル要素に関連する計算の結果、例外が生成されるときに、コンパイラは、このようなデータ並列選択動作のベクトル要素に例外値、すなわち、特殊文字またはビット・パターンを保管するためのサポートを提供する。これらの特殊文字、値、またはビット・パターンは、直ちに例外を生成するわけではなく、ベクトル要素に対応する実行パスまたはデータ・パスがその状態を投機的状態から非投機的状態に変換することによって固定されるように選択された場合、例外が生成されたものと思われ、その後、生成されるはずであることを示すだけである。したがって、計算の結果、オーバフロー条件が発生した場合、このデータ・パスまたは実行パスをたどった場合にオーバフロー例外が発生するはずであることを示すために、対応するベクトル要素は無限大値、ビット・パターンなどを保管する。その上、計算の結果、違法操作が行われた場合、このデータ・パスまたは実行パスをたどった場合に違法操作例外が発生するはずであることを示すために、ＮａＮ値、ビット・パターンなどが対応するベクトル要素に保管される。データ値の代わりにこのような値をベクトル要素に保管するためのこのようなサポートは、たとえば、図３のＱＰＵ３２０に設けることができる。
【００７５】
図４および図５は、例示的な一実施形態により例外値がそのベクトル要素内に保管されている１つまたは複数のベクトル要素について操作するデータ並列選択動作を示す図の例である。図４はデータ並列選択動作を実装するコードの一例であり、図５は図４のコードのグラフィカル表現であり、例示的な諸実施形態により、コード内の命令の結果として生成されるベクトル値と、これらのベクトル値がどのように変化するかを示している。図４に示されているコードの場合のデータ並列選択動作は「ＱＶＦＳＥＬ」命令であり、これは、たとえば、上述の通りのコンパイラ最適化によりコード４Ａに挿入することができる。図５は、例外をスロー（throw）させるのではなく、データ並列選択動作がどのように例示的な諸実施形態の特殊コードを伝搬することができ、コードの実行がその実行パスまたはデータ・パスをたどらない場合に結果的に例外がスローされる可能性のある条件を無視するためにデータ並列選択動作をどのように使用できるかを示している。図５はさらに、非投機的命令が選択された実行パス内にある特殊コードをメモリ、ベクトル・レジスタなどに固定させ、それにより、その後、例外をスローさせ、例外処理を呼び出させるまで、このような特殊コードがどのように伝搬されるかを示している。図４および図５は、例示的な諸実施形態の動作を説明するときに本明細書でまとめて参照する。
【００７６】
図４および図５に示されている命令は、これらの命令の結果がメモリに固定されるかまたはそうではなく非投機的命令実行の一部として他のベクトル・レジスタに固定されるまで、投機的状態で実行されるものと想定されることに留意されたい。本明細書に明記された例示的な諸実施形態の例では、このような非投機的命令は、以下により詳細に述べる保管命令および移動命令を含む。
【００７７】
図４および図５に示されているように、ＳＩＭＤベクトル化コードのこの部分の場合、クワッドベクトル・ロード浮動小数点データ（ＱＶＬＦＤ）命令４１０は、４つのデータ値を１つのベクトル・レジスタの４つのスロットにロードするものであり、ベクトルＱＢＩの第１の組の値をロードする。図５に示されているように、描写されている例では、ベクトル・レジスタに書き込まれるＱＢＩ用の４つの値は｛ｂ０，０，ｂ２，０｝である。クワッドベクトル浮動小数点逆数値は、ＱＶＦＲＥ命令４２０の実行によって生成され、その結果、値｛１／ｂ０，ＮＡＮ，１／ｂ２，ＮＡＮ｝が得られる。非数値（ＮＡＮ）値は０の逆数、すなわち、１／０によって生成され、ＩＥＥＥ規格ではこれは非数値の値を生成する。典型的に、このようなＮＡＮ結果が生成されると、エラーが報告され、すなわち、例外がスローされ、これによりコードの実行が例外ハンドラに分岐され、この例外ハンドラは例外タイプを処理するために定義済み動作を実行する。命令４２０の実行は投機的であるので、ベクトル・レジスタ内のＮＡＮ値のいずれかが実際に非投機的命令によって命令またはベクトル・レジスタに固定される保証はなく、したがって、例外ハンドラへの分岐の結果、プロセッサ・サイクルおよびリソースが浪費されることになる。
【００７８】
しかし、例示的な諸実施形態のメカニズムにより、例外ハンドラによる処理を必要とする例外を直ちに生成するのではなく、実際の例外値、この場合はＮＡＮがメモリに固定され、あるベクトル・レジスタから他のベクトル・レジスタに移動されるか、そうではなく非投機的命令によって使用されるまで、例外は一時的に抑制されるかまたは据え置かれる。したがって、例外値は、例外がスローされ、例外処理が呼び出される状況において非投機的命令によって使用されるまで、実行フローにより伝搬されるだけである。例外値が非投機的命令によってまったく使用されない場合、例外はまったくスローされず、実行フローに対して否定的な影響を与えることはない。
【００７９】
図４および図５に示されている例に戻ると、ＱＶＬＦＤ命令４１０によってロードされたベクトルはクワッドベクトル浮動小数点比較（ＱＶＦＣＭＰ）命令４３０にも入力され、この命令はベクトル内のスロットの値をゼロ値ベクトル、すなわち、｛０，０，０，０｝と比較する。本質的に、ＱＶＦＣＭＰ命令４３０は、ロードされたベクトル｛ｂ０，０，ｂ２，０｝内の値が非ゼロであるかどうかを判断する。非ゼロである場合、真値が生成され、そうではない場合、偽値が生成される。次に、ベクトル｛ｂ０，０，ｂ２，０｝内の各ベクトル値に関する「真」または「偽」値は、この場合、ベクトル｛ｔ，ｆ，ｔ，ｆ｝に保管される。このベクトルは、ＱＶＦＲＥ命令４２０から出力されたベクトル｛１／ｂ０，ＮＡＮ，１／ｂ２，ＮＡＮ｝とともに、データ並列選択命令であるＱＶＦＳＥＬ命令４４０に入力される。第３のベクトル｛ｄ，ｄ，ｄ，ｄ｝は、デフォルト値を提供するためにＱＶＦＳＥＬ命令４４０への入力として提供される。
【００８０】
ＱＶＦＣＭＰ命令４３０は本質的に、ＱＶＦＲＥ命令４２０のために結果的にＮＡＮ値になるときに、ロードされたベクトル｛ｂ０，０，ｂ２，０｝内のゼロ値をマスキングするためのマスク・ベクトル｛ｔ，ｆ，ｔ，ｆ｝を生成する。すなわち、ＱＶＦＳＥＬ命令４４０は、ＱＶＦＳＥＬ命令４４０に伝搬されるベクトル｛１／ｂ０，ＮＡＮ，１／ｂ２，ＮＡＮ｝内の各スロットについて、ベクトル｛１／ｂ０，ＮＡＮ，１／ｂ２，ＮＡＮ｝からの値またはデフォルト・ベクトル｛ｄ，ｄ，ｄ，ｄ｝からのデフォルト値のいずれを選択すべきかを判断する。この判断は、ＱＶＦＣＭＰ命令４３０の出力ベクトル、すなわち、この例では｛ｔ，ｆ，ｔ，ｆ｝の対応するスロットに真値が存在するかどうかに基づいて行われる。したがって、３つのベクトル｛１／ｂ０，ＮＡＮ，１／ｂ２，ＮＡＮ｝、｛ｄ，ｄ，ｄ，ｄ｝、および｛ｔ，ｆ，ｔ，ｆ｝について操作するＱＶＦＳＥＬ命令４４０の結果として、ベクトル値｛１／ｂ０，ｄ，１／ｂ２，ｄ｝が生成される。ＮＡＮ値はもはや実行フローのこの時点では問題ではないことが分かるであろう。既知のメカニズムのようにＱＶＦＲＥ命令４２０の動作に基づいて例外が生成された場合、例外値はいずれにしても使用されないので、例外処理は、コンピュータ・コードの最終的な実行フローに影響を及ぼさない例外条件を処理し、リソースおよびプロセッサ・サイクルを浪費させているものと思われる。クワッドベクトル保管浮動小数点データ（ＱＶＳＴＦＤ）命令を使用してベクトルをメモリに固定することなどにより、これがコードの最終出力であり、ベクトル値｛１／ｂ０，ｄ，１／ｂ２，ｄ｝が非投機的命令によって使用される場合、いかなる例外もスローされないものと思われ、したがって、例外処理が回避される。というのは、非投機的命令によって使用されるベクトルは、処理を必要とする例外またはエラー条件を示す特殊例外値を含まないからである。
【００８１】
しかし、描写された例では、ベクトル値｛１／ｂ０，ｄ，１／ｂ２，ｄ｝は最終結果ではなく、その代わりに、ベクトル｛ｃ０，ｃ１，ＮＡＮ，ｃ３｝をロードする他のクワッドベクトル・ロード浮動小数点データ命令４５０の出力に加えられる。クワッドベクトル加算（ＱＶＡＤＤ）命令４６０はベクトル｛ｃ０，ｃ１，ＮＡＮ，ｃ３｝をベクトル｛１／ｂ０，ｄ，１／ｂ２，ｄ｝に加え、その結果、ベクトル出力｛１／ｂ０＋ｃ０，ｄ＋ｃ１，ＮＡＮ，ｄ＋ｃ３｝が得られる。このベクトル出力は非投機的クワッドベクトル保管浮動小数点データ（ＱＶＳＴＦＤ）命令４７０に提供され、この命令はベクトル出力｛１／ｂ０＋ｃ０，ｄ＋ｃ１，ＮＡＮ，ｄ＋ｃ３｝をメモリに固定する。この時点で非投機的命令４７０は特殊例外条件値ＮＡＮを有するベクトルを使用しているので、エラーが報告され、すなわち、例外がスローされ、その結果、エラー条件を処理するためのルーチン、すなわち、例外ハンドラへ実行フローが分岐される。したがって、ＱＶＦＲＥ命令４２０からの出力内のＮＡＮ値の結果として、ＱＶＳＴＦＤ命令４７０によって受信される最終出力に例外が発生しなかったが、ＱＶＬＦＤ命令４５０の出力内のＮＡＮ値によって例外値が非投機的命令４７０まで実行フローを伝搬し、それにより、据え置かれた例外がスローされる。
【００８２】
上記の通り、既知のシステムでは、ＱＶＬＦＤ命令４５０がＮＡＮ結果を生成すると直ちに、例外がスローされたものと思われ、例外ハンドラへの実行の分岐が実行されたものと思われる。しかし、例示的な諸実施形態では、描写されている例のＱＶＦＳＥＬ命令４４０の場合のようにそれが廃棄されるか、または非投機的命令によって使用されるまで、ＮＡＮ値が伝搬され、それにより、例外がスローされる。これにより、例外処理が必要であると判断されるまで例外の処理を据え置くことができ、例外が実行フローに影響を及ぼさないインスタンスでは例外を廃棄することができる。
【００８３】
もう一度、図３に関連して説明すると、上述のメモリ・ベクトル動作、たとえば、ロードおよびストアは、ベクトル・レジスタ・ファイル３３０からの値の書き込みおよび読み取りにより、図３のロード／ストア・ユニットＬＳ１  ２５４およびＬＳ２  ２５８によって実行できることを認識されたい。計算など、その他の非メモリ・ベクトル動作は、クワッド処理ユニット（ＱＰＵ）発行ユニット３１０およびＱＰＵ３２０により実行することができ、結果はベクトル・レジスタ・ファイル３３０に書き込まれる。コンパイラはコンピュータ・コードを最適化しＳＩＭＤベクトル化することができ、据え置かれた例外処理により例外値を伝搬するためのメカニズムは図３のプロセッサ・アーキテクチャのこれらのメカニズムによって実行されるコンパイル済みコード内で実行される。
【００８４】
したがって、例外を生成し、プログラムの実行によって実際にたどられない実行パス内でこれらの例外を処理しなければならないのではなく、例示的な諸実施形態のメカニズムは、例外の実際の処理から例外条件の識別を切り離し、プログラムの実行フローが実際に遭遇する例外条件のみが実際に処理される。その結果、プログラムの実行に実際に影響を及ぼさない例外を処理するときにプロセッサ・サイクルが浪費されない。
【００８５】
この切り離しを提供するために、上記の通り、例外条件の検出に応答してベクトル要素内に特殊値を設定するためのサポートが提供される。その上、プログラムの実行中にベクトル内のこれらの特殊値に遭遇する場合、すなわち、そのベクトル要素を伴うデータ並列選択動作などによりデータ・パスまたは実行パスが選択される場合、このような特殊値を認識し、適切な例外を生成するための特殊命令が提供される。これらの特殊命令は、例示的な一実施形態では、保管指示命令および移動指示命令である。コンパイラは、ＳＩＭＤベクトル化実行のためにコードの元の一部分を最適化し変換するときに、コードの元の一部分の通常の保管または移動命令をこのような保管指示または移動指示動作で置き換えることができる。
【００８６】
例示的な諸実施形態では保管指示命令および移動指示命令が使用されるが、例示的な諸実施形態はこのようなものに限定されないことを認識されたい。むしろ、いずれの非投機的命令もその非投機的命令の対応するＸ指示（X-and-indicate）バージョンを有することができ、ここで「Ｘ」はその非投機的命令によって実行される何らかの動作である。保管指示命令および移動指示命令は、例示的な諸実施形態により例外指示を提供するために使用可能なタイプの非投機的命令の例に過ぎない。
【００８７】
図６は、例示的な一実施形態による保管指示命令を示す図の例である。図６に示されているように、図６でクワッドベクトル保管浮動小数点単一インデックス付き指示命令という保管指示命令は、クワッドベクトル・レジスタＱＲＳのベクトル要素のうちの複数バイトが非数値（ＮａＮ）または無限大（Ｉｎｆ）値を示すかどうかを判断する。図６において特に注目すべきことは、クワッドベクトル保管浮動小数点単一インデックス付き指示命令は、クワッドベクトル保管浮動小数点単一インデックス付き指示命令、クワッドベクトル・レジスタ入力ベクトルＱＲＳ、ならびに命令の結果用の有効アドレスを計算するために使用される値を保持するスカラ・レジスタＲＡおよびＲＢの識別子としてその命令を認識するためにプロセッサ・アーキテクチャによって使用されるコード３１を含む。
【００８８】
描写されている例では、クワッドベクトル・レジスタＱＲＳの第１のベクトル要素はバイト０：７に対応し、第２のベクトル要素はバイト８：１５に対応し、第３のベクトル要素はバイト１６：２３に対応し、第４のベクトル要素はバイト２４：３１に対応する。これらのベクトル要素のいずれかがＮＡＮ値またはＩＮＦ値を示す場合、ＱＰＵ例外が示される。保管指示命令は図６に示されているが、ベクトル要素内のＮＡＮ値およびＩＮＦ値についてこのようなチェックを実行する同様の移動指示命令を提供できることに留意されたい。
【００８９】
図６に示されているように、これらのチェックは、対応する値ＱＰＵ＿ｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿ＮａＮまたはＱＰＵ＿ｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿Ｉｎｆｉｎｉｔｙが適切な値に設定されている場合のみ実行される。これらの値は、たとえば、図３のＱＰＵ３２０の適切な制御レジスタに設定することができる。これらの制御レジスタ内の値は、ＱＰＵ３２０がＮａＮまたは無限大値についてモニターし、それらを使用して例外を追跡するかどうかを示すことができる。これらの値が制御レジスタに設定されている場合のみ、図３のＱＰＵ３２０は実際に、ベクトル要素内の例外条件を示す特殊例外値を保管し、保管指示命令または移動指示命令によりベクトル要素内のこれらの特殊値に関するチェックを実行する機能を実行することになる。
【００９０】
図７は、例示的な一実施形態によるコンパイラの模範的なブロック図である。図７に示されているように、コンパイラ６１０は、そのコンパイラ６１０が構成される対象である例示的な諸実施形態により分析される元のソース・コード６２０を受信する。すなわち、コンパイラ６１０は、ＳＩＭＤまたはＦＰ専用ＳＩＭＤベクトル化実行のために変更可能な条件付き制御フローを含むループを有するソース・コード６２０の一部分を識別する。ソース・コード６２０のこのような一部分は、ベクトル要素に対応するデータ・パスまたは実行パスが選択され、ベクトル要素の値が保管または移動された場合のみ、例外条件値をベクトル要素に保管し例外を生成するための例示的な諸実施形態のメカニズムを実装するデータ並列選択動作を使用して、データ並列「ｉｆ」変換によって変換することができる。コンパイラ６１０は、元のソース・コード６２０の保管命令あるいは移動命令またはその両方を、ベクトル要素内のこのような例外条件値を認識し、それに応じて命令を生成する保管指示命令あるいは移動指示命令またはその両方で置き換えることができる。他の例示的な諸実施形態では、他のタイプの非投機的命令を、Ｘ指示タイプの動作をサポートするように変更されたこれらの命令の対応するバージョンで置き換えることができ、その場合、非投機的命令はその通常の動作を実行するが、次にそのアーキテクチャで可能になっており、Ｘ指示タイプの命令への入力内に存在することが判明している例外条件の指示も提供する。
【００９１】
コンパイラによって実行された最適化および変換の結果は、例示的な諸実施形態の最適化および変換を実装する最適化／変換済みコード６３０である。次に、この最適化／変換済みコード６３０はリンカ６４０に提供され、そのリンカは、一般に当技術分野で既知の通り、リンカ動作を実行し、それにより実行可能コード６５０を生成する。実行可能コード６５０は次にプロセッサ６６０によって実行することができ、そのプロセッサは、たとえば、図１のＣＢＥ１００または他のデータ処理システム・アーキテクチャのプロセッサにすることができる。
【００９２】
例外条件が失われる可能性があるかあるいは保管指示命令または移動指示命令が実行される前に例外条件が変更される可能性があるインスタンスが存在することに留意されたい。望ましいときにこのような条件についてテストするために図３のＱＰＵ３２０内でテストを提供することができる。たとえば、無限大値（ＩＮＦ）を有するベクトル要素が入力されるが、計算の出力が「０」である条件が発生する可能性がある。このような条件を検出する必要がある場合、ＱＰＵ３２０はオーバフロー条件について除数をチェックすることができ、すなわち、ＱＰＵ３２０はＩｎｆという特殊値について除数レジスタをチェックするためのロジックを有することができる。このような特殊値が検出された場合、プログラムの実行がこのような条件に遭遇したときにオーバフロー例外が依然として生成される可能性がある。図８は、例示的な一実施形態により失われた例外条件を検出するために除数レジスタ上のオーバフローのテストを実行可能な１組の条件を示す図の例である。図８から分かるように、除数が「ＩＮＦ」という値を有し、オペランドが−１、−０、０、または１である場合、この条件が発生する。
【００９３】
例外が失われる可能性がある他の条件は、オーバフロー条件（ＩＮＦ）が違法操作条件（ＮＡＮ）に変換される場合の条件である。このような状況は、計算がＩＮＦ−ＩＮＦ、０＊ＩＮＦ、またはその他のタイプのこの種の計算を含むときに発生する。多くの場合、例外が存在することを検出するだけで十分であり、制御レジスタ値ＱＰＵ＿ｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿ＮａＮおよびＱＰＵ＿ｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿Ｉｎｆｉｎｉｔｙの設定によって両方のタイプの例外が可能になる場合のように、例外がオーバフロー例外であるかまたは違法操作例外であるかは重要ではない。しかし、１つのタイプの例外のみが可能である場合のように、その他のインスタンスでは、例外のタイプ同士を区別することが重要である場合もある。このような状況では、オーバフロー例外が違法操作例外に変換される可能性がある場合の条件についてテストすることは重要である。
【００９４】
このようなテストが必要である場合、ＱＰＵ３２０には、オーバフロー値についてオペランドあるいは除数レジスタまたはその両方をチェックするためのロジックを設けることができる。図９は、例示的な一実施形態によりオーバフローからＮａＮへの変更条件を検出するためにオペランド・レジスタ上のオーバフローのテストを実行可能な１組の条件を示す図の例である。図９に示されているように、加算動作または減算動作の場合、オーバフロー条件についてオペランドおよび除数レジスタ値をチェックすることができ、どちらもＩＮＦ値を有する場合、図９に示されているように、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。その上、乗算動作の場合、除数レジスタがオーバフロー値であり、オペランド・レジスタが０という値を有する場合、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。同様に、除算動作の場合、除数レジスタがオーバフロー値を有し、オペランド・レジスタがオーバフロー値を有する場合、他の方法で示された違法操作例外の代わりに、オーバフロー例外が生成される可能性がある。
【００９５】
図１０は、例示的な一実施形態によりベクトル要素の値を設定するための動作例の概略を示す流れ図である。図１０に示されているように、動作は、ターゲット・ベクトルのベクトル要素について操作を実行することによって始まる（ステップ８１０）。計算中に例外条件に遭遇したかどうかについて判断が行われる（ステップ８２０）。遭遇しなかった場合、計算結果のデータ値がベクトル要素に保管される（ステップ８３０）。例外条件に遭遇した場合、例外ハンドラを呼び出さずに、その例外条件に対応する特殊例外値がベクトル要素に保管される（ステップ８４０）。使用中の命令セット・アーキテクチャにより、保管／移動動作に遭遇するかまたは特殊例外値を廃棄するまで、特殊例外値がベクトル要素でプロセッサ・アーキテクチャ中に伝搬される（ステップ８５０）。いくつかのインスタンスでは、特殊例外値の伝搬がこの値の廃棄を含む可能性があり、例外値が本質的に実行フローで消滅することに留意されたい。たとえば、上述の通り、例外条件がマスキングされるかまたは非投機的命令によって使用されないインスタンスでは、図４および図５の例で上述したデータ並列選択命令により、例外値が伝搬を終了する。
【００９６】
ベクトル要素が存在するベクトルをターゲットとするコンピュータ・プログラムの実行中に保管指示命令または移動指示命令などの非投機的命令に遭遇したかどうかについて判断が行われる（ステップ８６０）。遭遇しなかった場合、例外条件は無視される（ステップ８８０）。保管指示命令または移動指示命令に遭遇した場合、例外が生成され、例外ハンドラに送信される（ステップ８７０）。その後、動作は終了する。
【００９７】
図１１は、例示的な一実施形態により例外を生成するための動作例の概略を示す流れ図である。図１１に示されているように、動作は、ベクトルについて保管指示命令または移動指示命令が実行されることから始まる（ステップ９１０）。制御レジスタに対応するｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿ＮａＮ値が設定されているかどうかについて判断が行われる（ステップ９２０）。設定されている場合、そのベクトルのベクトル要素のいずれかがＮＡＮ値を有するかどうかについて判断が行われる（ステップ９３０）。有する場合、違法操作例外が生成され、適切な例外ハンドラに実行が分岐される（ステップ９４０）。
【００９８】
そうではない場合、あるいはｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿ＮａＮ値が制御レジスタに設定されていない場合、ｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿Ｉｎｆ値が対応する制御レジスタに設定されているかどうかについて判断が行われる（ステップ９５０）。設定されている場合、そのベクトルのいずれかのベクトル要素がＩＮＦ値を有するかどうかについて判断が行われる（ステップ９６０）。有する場合、オーバフロー例外が生成され、実行は対応する例外ハンドラに分岐する（ステップ９７０）。その後、ベクトル要素がＩｎｆ値を持たない場合、あるいはｅｎａｂｌｅ＿ｉｎｄｉｃａｔｅ＿Ｉｎｆ値が制御レジスタに設定されていない場合、そのベクトルは保管／移動され（ステップ９８０）、動作は終了する。
【００９９】
ＮＡＮ値およびＩＮＦ値は、おそらく例外処理を必要とする例外条件を識別するために例示的な諸実施形態のメカニズムによって使用可能な特殊例外値の例としてのみ使用されることに留意されたい。例示的な実施形態の精神および範囲を逸脱せずに、命令の投機的実行中に遭遇した例外条件を示すために使用可能な任意の他のタイプの特殊インジケータ値について、同様の動作を実行することができる。
【０１００】
したがって、例示的な諸実施形態は、例外条件を検出し、例外ハンドラを直ちに呼び出さずにベクトルの対応するベクトル要素の一部として例外条件を示す特殊例外値を伝搬するためのメカニズムを提供する。コンピュータ・プログラムの実行の一部として実際に特殊例外値に遭遇した場合のみ、対応する例外が生成され、実行が例外ハンドラに分岐される。このようにして、例外条件の検出と例外の処理は相互に切り離され、コンピュータ・プログラムによって取られる実際の実行パスの一部ではない実行の分岐内の例外条件を無視することができる。例示的な諸実施形態のメカニズムによりＳＩＭＤ化コードは例外を可能にすることでき、コンピュータ・プログラムの実行パスが実際にたどらない実行の分岐内のスプリアス例外および例外処理が最小限になる。
【０１０１】
上記の例示的な諸実施形態は、コンパイラによって既存の保管命令または移動命令を保管指示命令または移動指示命令に変換させるものとして記載されている。しかし、コンパイラがすべての保管命令または移動命令を保管指示命令または移動指示命令に変換する必要はないことを認識されたい。それとは反対に、他の例示的な諸実施形態により、コンパイラには、保管命令または移動命令が保管指示命令または移動指示命令に変換されるコード内の適切な位置を選択するためのロジックを設けることができる。その上、上記の通り、例示的な諸実施形態は保管指示命令または移動指示命令のみに限定されず、むしろ、コンパイラは任意のＸ指示タイプの命令を使用することができ、ここでＸは実行すべき何らかの動作であり、たとえば、加算指示（add-and-indicate）などである。したがって、コンパイラはソース・コード、たとえば、スカラ・コードをＳＩＭＤベクトル化コードに変換しているので、コンパイラ内に設けられたロジックに基づいてこのようなＸ指示タイプの命令のために適切な位置を選択することができる。
【０１０２】
例示的な諸実施形態のメカニズムにより、ソース・コード、たとえば、スカラ・コードをＳＩＭＤベクトル化コードに変換する際に、例外条件の発生を識別する特殊値の使用を利用するために、移動指示、保管指示などのＸ指示命令（まとめて「指示」命令という）がコード内の適切な位置に挿入される。コンパイラは、以下に定義するように関心のある値がチェック可能であるかまたはチェック不能であるかに基づいて、１つまたは複数の方法により適切な挿入ポイントを決定する。ある方法では、チェック不能であるＳＩＭＤコードの一部分をマスキング・メカニズムの使用によりチェック可能ＳＩＭＤコードに変換することができる。また、ある方法では、関心のある値、たとえば、関心のある値の配列を伴うすべての計算の後に指示命令を挿入することができる。他の方法では、それぞれの生出力値をテストするように最小数のチェック命令が適切な位置に挿入され、ここで、値が最終的にコードの記憶イメージまたは決定プロセスに影響を与える（あるいは次の計算がその結果を使用して、最終的にコードの記憶イメージまたは決定プロセスに影響を与えることになる）場合にその値は生である。
【０１０３】
コンパイラによって最適化されコンパイルされているコード内でこのようなＸ指示命令を挿入する場所を決定するときにコンパイラによって使用可能なロジックの実施形態例を例示するために、まず、ロジックの概略フローについて説明し、このフローで概略を示したそれぞれの動作の詳細についてはその後、提供する。このフローおよびその後の詳細はＸ指示タイプの命令の挿入に使用可能なロジックの一例に過ぎず、例示的な諸実施形態の精神および範囲を逸脱せずに、例示的な諸実施形態のメカニズムを実装するその他のロジックをコンパイラが使用できることを認識されたい。
【０１０４】
図１２は、例示的な一実施形態によりコンパイラによりＳＩＭＤベクトル化コードに指示命令を挿入するための動作例の概略を示す流れ図である。図１２の動作は、コンパイラによってチェックすべきコードの所与の一部分についてコンパイラによって依存グラフ（dependence graph）が生成されているものと想定する。コードのこの一部分は、コンパイラが操作することができる、基本ブロック、ステートメント、式、または任意のその他の単位の作業またはコードにすることができる。コンパイラによってチェックすべきコードの一部分に関する依存グラフをコンパイラが生成することは、一般に当技術分野で既知であり、したがって、本明細書では詳細な説明を提供しない。一般に当技術分野で既知の通り、依存グラフはノードおよびノード間の弧を含み、弧はコードの一部分同士、たとえば、他の命令に依存する命令同士の依存関係を表す。
【０１０５】
図１２に示されているように、コンパイラによってチェックすべき作業単位について、コンパイラによってチェックする必要がある１組の値について判断が行われる（ステップ１０１０）。チェックする必要がある各値について、依存グラフを分析して、同等の適用範囲（equivalent coverage）、すなわち、その値を伴うグラフの各ノードにおけるチェックと同等のチェックを実行可能な位置を提供する依存グラフ内の１組の位置、すなわち、ノードを決定する（ステップ１０２０）。
【０１０６】
たとえば、非数値（ＮＡＮ）例外の検出を希望する場合の「ｃ［ｉ］＝（ａ［ｉ］＋ｂ［ｉ］）＋１」という計算について考慮する。これを実行するために、ａ［ｉ］によって生成される入力値がＮＡＮではないことをチェックしなければならない。したがって、メモリからのａ［ｉ］値をレジスタ・ファイルにロードするロード動作の結果をチェックできるであろう。しかし、ある数値をＮＡＮ値に加えてもＮＡＮが生成される場合、「ａ［ｉ］＋ｂ［ｉ］」の結果をチェックすると、（ａ［ｉ］がＮＡＮを生成するかどうかをチェックするという見地から）同等の適用範囲が提供される。実際に、「ａ［ｉ］＋ｂ［ｉ］」をチェックすることは、ｂ［ｉ］値がＮＡＮであるかどうかもチェックするので、より有益である。これを拡張してみると、ａ［ｉ］の値をチェックするために、「ａ［ｉ］」、「ａ［ｉ］＋ｂ［ｉ］」、「ａ［ｉ］＋ｂ［ｉ］＋１」という位置をチェックすることは同等である。このような場合、このような位置はいずれも同等であり、「ｂ［ｉ］」の値もチェックするので、第２または第３の位置をチェックすることは明らかに有益である。「ａ［ｉ］＋ｂ［ｉ］＋１」の計算値をメモリ位置「ｃ［ｉ］」に保管することを保管指示に変換することができるので、最後の位置のチェックは最も安価である。
【０１０７】
作業単位が１つのステートメントより大きい場合、同等の位置が複数のステートメントに及ぶ可能性がある。ステートメント「ｃ［ｉ］＝（ａ［ｉ］＋ｂ［ｉ］）＋１」の後に他のステートメント「ｄ［ｉ］＝ｃ［ｉ］＋ｅ［ｉ］」が無条件に続く場合について考慮する。このような場合、ａ［ｉ］がＮＡＮであるかどうかをチェックするために同等の位置として「ｃ［ｉ］」および「ｃ［ｉ］＋ｄ［ｉ］」を加えることができる。
【０１０８】
これらの識別された位置のうちの１つまたは複数をチェックできるかどうかについて判断が行われる（以下の「チェック可能」値または位置の定義を参照）（ステップ１０３０）。チェックできる場合、これらのチェック可能位置のうちの最良のものが選択される（ステップ１０４０）。
【０１０９】
識別された位置にチェック可能位置がまったくない場合（ステップ１０３０）、チェック可能形式に変換可能な位置が１つまたは複数存在するかどうかについて判断が行われる（ステップ１０５０）。存在する場合、このようなチェックに最良の位置が選択され（ステップ１０６０）、たとえば、その位置にある出力レジスタのレジスタ値のチェック不能部分を安全な値でマスキングし、ループ・ピーリング（loop peeling）などを実行することにより、その位置のチェック不能部分がチェック可能部分から分離されるように、その位置が変換される（ステップ１０７０）。動作１０４０または１０７０の後、選択された位置に動作指示命令（単純に「指示」命令ともいう）が挿入される（ステップ１０８０）。この指示命令は本質的に例外条件を示す特殊値の有無をチェックするものであり、この例外条件は前の計算のために発生した可能性があるが、このような例外処理は前述の方法で据え置かれている。このような特殊値が存在する場合、例外はＸ指示命令によって示され、例外処理を開始することができる。
【０１１０】
チェック可能位置がまったく存在せず、一部分がチェック可能になるように変換可能な位置もまったく存在しない場合、その値に対応する値計算はスカラとしてマークされる（ステップ１０９０）。作業単位内の他の値をチェックする必要があるかどうかについて判断が行われる（ステップ１０９５）。必要がある場合、動作はステップ１０２０に戻り、次に選択された値について動作を繰り返す。必要がない場合、動作は終了する。上記の実施形態では、ステップ１０５０は、変換可能な位置が少なくとも１つ存在するかどうかを判断することに留意されたい。そうであれば、コードをチェック可能なものにするようにコードが変換されることになる。他の実施形態では、ステップ１０５０は、そのコードを有利に変換できるかどうかもチェックする。実際に、それをチェック可能なものにするようにＳＩＭＤコードを変換する追加コストがそのステートメントをＳＩＭＤ化することの利益を超える可能性がある場合もある。このような場合、コードをＳＩＭＤコードに変換するより、単純にステップ１０９０に進むことを選ぶ方が有益である可能性がある。
【０１１１】
上述の通り、どこに指示命令を挿入すべきかを決定するときにコンパイラによって行われる主な判断の１つは、依存グラフ内のどの位置がチェック可能であるかどうかを判断することである。依存グラフ内のある位置が「チェック可能」であるかどうかを判断する際に、コンパイラは、依存グラフ内のその位置について結果として得られるＳＩＭＤベクトル出力値を保管するレジスタを調べ、レジスタに保管された値が「チェック可能」であるかどうかを判断する。（１）ベクトル・レジスタのあるスロット内の値が、生である浮動小数点値を含み、その値が実際に計算された場合、あるいは（２）その値が、例外を引き起こさないことが保証されている浮動小数点表現を有するものであることが分かっている場合、その値はチェック可能である。上記の（１）に関しては、前述の通り、浮動小数点値が最終的に記憶イメージ、すなわち、メモリに保管されたデータに影響を与えるか、またはコードの決定プロセスに影響を与える、たとえば、コードの実行中にどの実行分岐が取られるかに影響を与える場合に、その浮動小数点値は「生」である。代わって、次の依存計算がその値を使用し、その計算が記憶イメージまたは決定プロセスに影響を与える場合、その値も「生」であると見なされる。また、その値は実際に計算しなければならず、すなわち、レジスタにコピーまたは移動してはならないが、実際には計算の結果である。このため、たとえば、計算にスプライスされるように単純にメモリから読み取られるデータは除外される。
【０１１２】
上記の（２）に関しては、ユーザまたはコンパイラは、特定の値を例外を引き起こさないことが保証されているものとして指定することができる。たとえば、コンパイラは特定の複数組の大きい値をゼロに設定することができる。このような場合、コンパイラは、このような複数組の大きい値についてゼロ値が例外を引き起こさないことを示すことができる。したがって、このような値がＳＩＭＤベクトル・レジスタ・スロット内にある場合、この値はチェック可能であると見なすことができる。同様に、ユーザは、特定の値を例外を引き起こさないものとして指定することができ、このような値に遭遇した場合、この値は同様にチェック可能にすることができる。たとえば、計算は、既知の値で満たされた小さい係数表からのデータを含むことができる。たとえば、計算は、ｓｉｎ（ｘ）値を繰り返し使用することができ、ここで、ｘは１０度の倍数である。ユーザは、ｓｉｎ（０）値、ｓｉｎ（１０）値、・・・ｓｉｎ（３５０）値を事前計算し、その結果を小さい配列に保管し、ｓｉｎ（ｘ）を毎回計算する代わりに、この配列についてこのような値を読み取ることができる。ユーザはこの表を完全に管理しており、その値が−１．０〜＋１．０の間にあることを把握しているので、ユーザはこの表がＮＡＮ、負の無限大、または正の無限大にならないことが保証されていることをコンパイラに対して（コンパイラへのディレクティブ、プラグマ、コンパイラ・フラグ、またはその他の情報交換手段を介して）断言することができる。
【０１１３】
ＳＩＭＤベクトル・レジスタ自体は、そのスロットのそれぞれがチェック可能である浮動小数点値、すなわち、「生」であり、実際に計算されたかまたは例外を生成しないものであると分かっている浮動小数点値を保管する場合、チェック可能であると見なされる。たとえば、前述のアーキテクチャ例では、各ＳＩＭＤベクトル・レジスタは４つのスロットまたは値で構成されている。このようなアーキテクチャでは、４つのスロットのそれぞれは、上記で明記されたチェック可能の定義に基づいてチェック可能である値を保管しなければならない。
【０１１４】
図１３〜図１５は、例示的な一実施形態の基準によりチェック可能ＳＩＭＤコード部分とチェック不能ＳＩＭＤコード部分との違いを示す図の例である。図１３に示されている第１の例では、コンパイラによってチェックされている作業単位またはコードの一部分は、ステートメントｄ［ｉ］＝（ａ［ｉ］＞０．０）？ｂ［ｉ］：ｃ［ｉ］である。一般に当技術分野で既知の方法で、このステートメントのコンパイルを実行しているときにコンパイラによって生成されるように、このステートメントの結果として得られる依存グラフが図１３に示されている。しかし、例示的な諸実施形態のメカニズムにより、依存グラフのノードは、作業単位の値に関して、すなわち、この例ではコンパイラによってチェックされているステートメントに関して、チェック可能および非チェック可能（non-checkable）に分類することができる。
【０１１５】
図１３に示されているように、ａ［ｉ］と値「０．０」との比較に基づいて、値ａ［ｉ］がコードの決定プロセス、すなわち、ＳＩＭＤコード内の「選択」動作に影響を及ぼすという点で、依存グラフの一部分１１２０内の命令の出力はチェック可能である。本質的に、ａ［ｉ］と０．０との比較はマスクを形成し、以下の「選択」命令により、マスクの値が１である場合に第１の値、たとえば、ｂ［ｉ］が取られ、マスクの値が０である場合に第２の値、たとえば、ｃ［ｉ］が取られる。その結果、保管命令ｓｔ  ｄ［ｉ］内の値は値ａ［ｉ］の影響を受け、したがって、生であり、実際に選択命令によって計算される。
【０１１６】
これに反して、依存グラフの一部分１１１０内のｂ［ｉ］およびｃ［ｉ］のロードのためのロード命令の出力は、これらのロードの結果が実際に何らかの方法で使用されるという保証がまったくないので、チェック不能である。これらのロードによって生成された値の１つが使用されるが、コンパイル時にはコンパイラはどの値が使用されるかを把握できず、すなわち、実行中のいずれかのときに、ｂ［ｉ］またはｃ［ｉ］のいずれかを使用できるのかあるいは使用できないのかを把握できないことが分かっている。したがって、これらの値は、その現行状態ではコンパイラによってチェック不能である。
【０１１７】
他の一例として、ステートメントｄ［２ｉ］＝ａ［ｉ］＋ｂ［ｉ］について考慮するが、ＳＩＭＤベクトル・レジスタｄ［ｉ］１１３０のスロットに関するレジスタ値および依存グラフ１１２５が図１４に示されている。図１４に示されているように、本明細書に提供されているチェック可能の定義に基づいて、依存グラフ１１２０の一部分１１４０はチェック可能であり、依存グラフ１１２０の一部分１１５０はチェック不能である。値ａ［ｉ］およびｂ［ｉ］は保管命令ｓｔ  ｄ［ｉ］によって保管された値に影響を及ぼすように使用され、すなわち、それらは生であり、メモリに保管された値ｄ［ｉ］に影響を及ぼすように使用される値は加算命令（add instruction）によって計算されることが分かっているので、一部分１１４０はチェック可能である。ｄ［ｉ］を保管するときにロード命令ｌｄ  ｄ［ｉ］の結果のすべてが使用されることが保証されていないので、一部分１１５０はチェック不能である。これはベクトル・レジスタｄ［ｉ］１１３０の例に示されており、ここでｉ＝０である場合に、スロット０内の第１の値は値ａ［０］＋ｂ［０］である。ｉ＝１であるときに、ステートメントの値はｄ［２］＝ａ［１］＋ｂ［１］であり、したがって、スロットｄ［２］は値ａ［１］＋ｂ［１］を保管するように更新されるので、スロット１内の第２の値はｌｄ  ｄ［ｉ］命令によってこのスロットにロードされた元のｄ［ｉ］値である、同様に、スロットｄ［３］の場合、保管される値はｌｄ  ｄ［ｉ］命令によってロードされた元の値である。このため、アンパック命令（unpack instruction）は、ｌｄ  ｄ［ｉ］命令（実際に値を計算せず、単に値をロードするだけのものである）を介してロードされた値と、加算命令からのベクトルａ［ｉ］およびｂ［ｉ］に基づいて計算された値の両方を結合する。何らかの値はチェック可能であり、他の値はチェック不能であるので、すべてのスロットにチェック可能値を保管させなければならないチェック可能レジスタの定義により、アンパック命令の結果はチェック不能である。その結果、保管命令ｓｔ  ｄ［ｉ］はチェック不能である。しかし、命令ｌｄ  ｄ［ｉ］によってロードされたｄ［ｉ］内のすべての値が例外を生成しないことが保証された値であると判断された場合、これは変わる可能性がある。
【０１１８】
図１５は、例示的な諸実施形態によりチェック可能ＳＩＭＤコードおよびチェック不能ＳＩＭＤコードの他の例を示している。図１５に示されている例は、読み取り変更書き込み（read-modify-write）動作である（ｉ＝０；ｉ＜６５；ｉ＋＋）ａ［ｉ＋２］＝ｂ［ｉ＋１］＋ｃ［ｉ＋３］というステートメントに関するものである。図１５に示されているように、入力ベクトルはａ［ｉ］、ｂ［ｉ］、およびｃ［ｉ］であり、ここで、ベクトル値ａ［ｉ］はメモリ１１６０から読み取られ、ｂ［ｉ＋１］＋ｃ［ｉ＋３］という加算によって変更され、メモリ１１６０に書き戻される。ＳＩＭＤアーキテクチャはこの例では４つのスロットのベクトルについて操作するので、値ａ［２］が読み取り変更書き込み動作の対象である場合、ａ［２］に対応する値を取り出すためにベクトル・ロード動作１１６２が実行される。これは、メモリ１１６０から値［ａ０，ａ１，ａ２，ａ３］を読み取ることを含む。ａ［２］という値は上記のステートメントにおけるｉ＝０という値に対応し、［＊，＊，ｂ１＋ｃ３，ｂ２＋ｃ４］という値を保管するために評価されるものである。この２つのベクトルは選択動作１１６４に入力され、この選択動作は、出力ベクトル・レジスタ１１６６の各スロットについて、ベクトル・ロード命令１１６２によってロードされた元の値またはステートメントによって計算された新しい値のいずれかを選択する。この場合、動作は値ａ［２］に対する読み取り変更書き込み動作であるので、出力ベクトル・レジスタ１１６６の最初の２つのスロットについて元の値ａ０およびａ１が選択され、出力ベクトル・レジスタ１１６６の最後の２つのスロットについて計算値ｂ１＋ｃ３およびｂ２＋ｃ４が選択される。
【０１１９】
元の値ａ０およびａ１が実際に使用されるかどうかをコンパイラは前もって把握していないので、これらの値はチェック不能であり、これらの値は実際に計算されず、むしろ、メモリからロードされるだけである。したがって、これらの値ａ０およびａ１は上記で明記された定義に基づく「生」ではなく、したがって、チェック不能である。これに反して、計算値ｂ１＋ｃ３およびｂ２＋ｃ４は、計算され、記憶イメージに影響を与えるという点でチェック可能であり、したがって、「生」である。
【０１２０】
上記の通り、ＳＩＭＤベクトル・レジスタがチェック可能であるためには、ベクトル・レジスタのスロットに保管されたすべての値がチェック可能でなければならない。したがって、出力ベクトル・レジスタ１１６６の少なくとも１つの値がチェック不能であるので、すなわち、値ａ０およびａ１を保管するスロットがチェック不能であるので、出力ベクトル・レジスタ１１６６はチェック不能である。しかし、ベクトル保管命令１１７０の場合、その値がメモリ１１６０に書き込まれるベクトル・レジスタは、そのベクトル・レジスタの各スロットがステートメントに応じて計算された値を保管し、したがって、「生」値を保管するという点でチェック可能である。
【０１２１】
図１２に概略が示されている動作に戻ると、上述の通り、この動作は同等の適用範囲を提供する位置を決定するものである。これらの位置のうち、いずれかがチェック可能であるかどうか、すなわち、対応する命令の出力レジスタがチェック可能であるかどうかが判断される。このような判断を行う際に、コンパイラのロジックが上記で明記された基準を使用して、対応する命令の出力レジスタがチェック可能であるかどうかを判断することができる。コンパイラは、このような基準を使用して識別されたそれぞれの位置を分析し、どの位置がチェック可能であるかを判断することができる。
【０１２２】
図１２に示されているように、いずれの位置もチェック不能である場合、いずれかの位置をチェック可能位置に変換できるかどうかについて判断が行われる。本質的に、この判断は、出力レジスタを分析して、その出力レジスタ内のスロットのいずれかがチェック可能であるかどうかを判断するものである。チェック可能である場合、チェック可能である出力レジスタ内のスロットが識別され、出力レジスタ内の非チェック可能スロットをマスキングするためのマスクを生成することができる。出力レジスタ内の非チェック可能スロットは、例外を生成しないことが分かっている値、たとえば、０値または例外を生成しない他の安全値でこれらの値を置き換えることにより、マスキングすることができる。このマスクは、以下に記載する通り、挿入されたＸ指示命令によって実行されるチェック動作を実行する前に適用することができる。また、このマスクは、Ｘ指示命令の動作のために適用することができる。しかし、その計算のためにコンパイラによって後で使用されるレジスタの値は変更されないので、このマスキング動作はアプリケーションの挙動を変更するものではない（Ｘ指示動作によって生成される可能性のある例外は除く）。換言すれば、チェックすべきレジスタについて、Ｘ指示動作によってのみ使用される他のベクトル・レジスタでは（それを安全値で置き換えることにより）非チェック可能値がマスキングされる。このチェックが保管指示動作によって実行される場合、マスキングされた値は、元のプログラムによってまったく読み取られないメモリ位置に保管される。たとえば、メモリ・スタック上のメモリ位置はこのような目的のためにのみ予約することができる。移動指示動作が使用される場合、たとえば、レジスタＹに位置するマスキングされた値は、同じレジスタＹ（または現在使用されていない任意の他のレジスタ）に移動することができる。その動作が何であれ、目標はアプリケーションによって現在使用されていないメモリまたはレジスタをターゲットにすることであり、したがって、いずれにしてもアプリケーションの挙動を変更することはない（ＮＡＮ、無限大、または例外によってチェックされるその他の値の存在により起こりうる例外の生成は除く）。したがって、このようにして、そうでなければ非チェック可能な位置をＸ指示命令の挿入のためにチェック可能位置に変換することができる。
【０１２３】
この場合も、図１２に示されているように、少なくとも１つのチェック可能位置、またはチェック可能位置に変換できる位置が存在する場合、Ｘ指示命令の挿入のために最良の位置の選択が実行される。挿入のための最良の位置の選択は、特定のレベルの望ましい例外適用範囲（exception coverage）に依存する。すなわち、第１のレベルの例外適用範囲では、スプリアス例外のない低オーバヘッドが達成されるが、部分的な例外適用範囲のみが達成され、すなわち、アンダフローおよびオーバフロー条件の部分検出が提供されるが、ＮＡＮ条件の完全な適用範囲が提供される。第２のレベルの例外適用範囲では、完全な例外適用範囲とともにスプリアス例外のないより高いオーバヘッドも達成される。さらに、第３のレベルの例外適用範囲では、最初の２つのレベルの例外適用範囲のいずれかが達成され、おそらくスプリアス例外はソフトウェアで矯正される。これら３つのレベルの例外適用範囲のそれぞれによるＸ指示命令の挿入のための最良位置の選択については、図１６〜図１８および図１９〜図２１に関連して以下により詳細に説明する。
【０１２４】
図１６〜図１８は、例示的な一実施形態により指示命令を挿入するための挿入位置を示す図の例である。この例示的な実施形態では、第１のレベルの例外適用範囲が使用され、すなわち、部分的な例外適用範囲のみが存在する。この例示的な実施形態により、それぞれの生出力値をテストするために最小数のＸ指示命令が挿入される。この例示的な実施形態の一部として、Ｘ指示命令の挿入のために最良の位置（複数も可）を選択することは、計算内に各チェック可能ベクトル・レジスタを検出した後、計算によって計算されるそれぞれの生出力レジスタ値をテストする最小数の位置を検出することと、対応するＸ指示命令、たとえば、保管指示、移動指示、加算指示、またはその命令に対応するその他のＸ指示命令を識別された位置で挿入することを含む。
【０１２５】
それぞれの生出力レジスタ値をテストするために最小数の位置を選択することは、たとえば、Ｘ指示命令によってチェックされずにいかなる追加の計算も保管命令に達することができないように、１つまたは複数のチェック可能位置を選択することを含むことができる。作業単位の実行中にできるだけ早く、または追加のオーバヘッド・コストが最小金額になるようなポイントで、このような値を捕捉することが望ましい。これは、作業単位内に複数のステートメントが存在するとき、たとえば、コンパイラが基本ブロックなどについて操作しているときに、さらに緩和することができる。たとえば、コンパイラは、ベクトルａ［ｉ］の値を設定する命令、たとえば、ａ［ｉ］＝．．．と、ベクトル値ａ［ｉ］を使用する命令、たとえば、．．．＝．．．ａ［ｉ］．．．とを含む基本ブロックについて機能しているものと想定する。このような場合、例外を示す特殊値を保管している第１の命令のａ［ｉ］は、第２の命令のａ［ｉ］も結果的に例外を示す特殊値になり、たとえば、第１の命令のＮＡＮ値により第２の命令のＮＡＮ値が発生することを暗示するので、コンパイラは第２の命令に対応する位置にＸ指示命令を挿入することだけが必要である。
【０１２６】
もう一度、図１６〜図１８を参照すると、図１６は、この第１のレベルの例外適用範囲によるＸ指示命令の挿入に関する第１の例を示している。この第１の例は、ステートメントｄ［ｉ］＝（ａ［ｉ］＞０．０）？ｂ［ｉ］：ｃ［ｉ］に関するものである。図１６に示されているように、前述の基準に基づいて、一部分１２１０はチェック不能であり、一部分１２２０はチェック可能である。挿入されたＸ指示命令によってすべての生出力値をチェックできる、依存グラフ内で最も早い挿入位置は、保管命令ｓｔ  ｄ［ｉ］である。すなわち、作業単位、この場合はステートメント内のすべての生値が存在する依存グラフ内の第１のノードは、記憶イメージを変更する際に使用される生値が選択される選択動作の後である。したがって、この場合、元の保管命令を置換するために保管ノード位置に保管指示命令を挿入することができる。この例では、可能なＮＡＮ数について「ａ［ｉ］」の値もチェックしなければならないことに留意されたい。このチェックの理由は、比較動作（ここでは、大なりまたは「＞」など）が、その入力のいずれかがＮＡＮである場合に偽値を返すものとして定義されていることである。したがって、「ａ［ｉ］」値内の例外の有無をチェックしない場合、ベクトル・レジスタの所与のスロット内にＮＡＮ値が存在する場合、そのスロットについて必ず「ｃ［ｉ］」値を選択することになるであろう。「ｃ［ｉ］」値はＮＡＮではない可能性があるので、保管指示が実行されているときに「ｃ［ｉ］」値の有無をチェックしても、「ａ［ｉ］」値内に存在したＮＡＮは明らかにならないであろう。したがって、この例の場合、ＮＡＮについて「ａ［ｉ］」値をチェックしなければならない。
【０１２７】
図１７は、ステートメント例ｄ［２ｉ］＝ａ［ｉ］＋ｂ［ｉ］に関するＸ指示命令の挿入の第２の例を示している。上記で指定したこれらの条件の定義に基づいて、このステートメントに関する依存グラフの一部分１２３０はチェック可能であり、一部分１２４０はチェック不能である。この例では、すべての生値をチェックできる依存グラフ内の第１の位置は加算命令である。その結果、元の加算命令の置換の際にこのノードに加算指示命令を挿入することができる。加算指示命令が欠落しているプラットフォームでは、追加の移動指示を使用することができ、加算動作の結果について指示動作を使用するという目的のみのために、加算の結果を保持するレジスタが他の未使用のレジスタ（後で使用されないもの）に移動する。同様に、同じく加算動作の結果について指示動作を使用するという目的のみのために、加算の結果を未使用のメモリ位置に保管するために保管指示も使用できるであろう。
【０１２８】
図１８は、ステートメントｄ［２ｉ］＝ａ［ｉ］＋ｂ［ｉ］およびｅ［ｉ］＝ｄ［ｉ］＋１．０からなる基本ブロック例に関するＸ指示命令の挿入の第３の例を示している。図１８に示されているように、基本ブロック内の第１のステートメントに関する依存グラフは図１７に示されているものと同じであり、したがって、同じチェック可能部分１２３０と非チェック可能部分１２４０を有する。第２のステートメントに関する依存グラフは完全にチェック可能である。しかし、第１のステートメントの依存グラフの加算ノードにＸ指示命令を挿入しなければならないのではなく、第２のステートメントは第１のステートメントの結果を使用し、したがって、第１のステートメントによって生成された例外条件を示す任意の特殊値が第２のステートメントに渡されるので、第２のステートメントの依存グラフにＸ指示命令を挿入することによって第２のステートメントの実行時にこれらの特殊値の有無をチェックすれば十分である。描写されている例では、基本ブロックのすべての生値を収集するためにＸ指示命令を挿入するために最適な場所は、第２のステートメントの依存グラフ内の保管命令ｓｔ  ｅ［ｉ］である。
【０１２９】
したがって、第１のレベルの例外適用範囲に基づいて、最小数のＸ指示命令がコードに挿入される。これにより、コードはそのコードの実行時間に関してより効率的なものになるが、何らかの例外条件は部分的にしか検出できなくなる。これをさらに例示するために、以下の表について考慮する。
【表４】
0005583770.tif 000007
【０１３０】
ほとんどの演算の場合、正または負の無限大である入力の結果、演算の出力が正または負の無限大あるいは非数値（ＮＡＮ）になる可能性があることがこの表から分かる。たとえば、加算動作、たとえば、「ｃ［ｉ］＝（ａ［ｉ］−１）＋（ｂ［ｉ］−１）」について考慮する。上記のルール３により、無限大に有限正数Ｎを加えると無限大が得られ、同様に、上記のルール４により、無限大に無限大を加えても無限大が得られる。しかし、上記のルール１３により、正の無限大に負の無限大を加えると、その結果はＮＡＮになる。したがって、適切な例外が報告されることをユーザが期待している場合、すなわち、無限大数に遭遇したときに無限大例外を報告し、ＮＡＮ数に遭遇したときにＮＡＮ例外を報告するようユーザがプログラムに期待している場合、実際に「（ａ［ｉ］−１）」が正の無限大であった可能性があり、「（ｂ［ｉ］−１）」が負の無限大であった可能性があるときに、保管指示動作はＮＡＮを報告する可能性があるので、保管されている値（上記の例では「ｃ［ｉ］」）をチェックするのでは十分ではない。したがって、このような場合に例外を正確に報告するために、（非常に大きい有限数に加算すると、その結果、正の無限数表現が生成される可能性があるので）動作の出力に加えて、（ＮＡＮあるいは正／負の無限大またはその両方がまったくないことを確認するために）加算動作への入力をチェックしなければならない。これをＮＡＮのみのチェックと対照させる。いずれかの入力がＮＡＮである加算の結果、ＮＡＮ数が得られるので、値が上記の例で「ｃ［ｉ］」に保管されているときに、加算後に例外の有無をチェックすれば十分である。
【０１３１】
上述の通り、完全な例外適用範囲が存在する、すなわち、例示的な諸実施形態のメカニズムによってすべてのアンダフローおよびオーバフロー例外条件が検出される、第２のレベルの例外適用範囲も可能である。この第２のレベルの例外適用範囲により、アンダフロー、オーバフロー、またはＮＡＮ条件を生成する可能性のある各計算後に例外条件を示す特殊値のチェックが実行される。たとえば、算術演算はこのような特殊例外条件および値を生成することができるが、選択、境界合わせ、比較などのその他の動作および論理演算はこのような特殊例外および値を生成しない。
【０１３２】
図１９〜図２１は、第２のレベルの例外適用範囲が望ましい、他の例示的な実施形態により指示命令を挿入するための挿入位置を示す図の例である。図１９〜図２１に示されている例は図１６〜図１８に示されているものと同じステートメントおよび基本ブロックに関するものであり、したがって、依存グラフは同じである。その上、図１９ではステートメントが計算を伴わず、図２０の例ではこの第２のレベルの例外適用範囲に基づいて挿入が実行される「加算」計算ポイントがその基準に基づいて第１のレベルの例外適用範囲について挿入が実行されるものと同じポイントであるので、図１９および図２０の結果、Ｘ指示命令の挿入のために同様の挿入ポイントが得られる。違いは図２１に示されている例に現れ、図１８に示されている１つの挿入ポイントの代わりに、２つの挿入ポイントが存在する。第１の依存グラフには計算が存在するので、Ｘ指示命令を追加するための追加の挿入ポイントは第１の依存グラフ内の「加算」命令ノードで識別され、第２の挿入ポイントは第１のレベルの例外適用範囲の実施形態と同様に保管ｓｔ  ｅ［ｉ］になる。
【０１３３】
上述の通り、作業単位、たとえば、ステートメント、基本ブロックなどの依存グラフに、チェック可能な位置がまったくない状況では、非チェック可能位置をチェック可能位置に変換するために何らかの変換を実行することができる。上述の通り、ある変換は、マスクを使用してベクトル・レジスタ内のチェック不能値をマスキングし、次にその他の値をチェックすることである。他の変換は、チェック不能値のＳＩＭＤベクトル化を使用不可にすることと、１つのループを複数のループに分割して、チェック可能ステートメントとチェック不能ステートメントを１つにまとめることを含むことができる。たとえば、ループ・ピーリング動作を使用して、チェック可能値を含むループの反復からチェック不能値を含むループの反復をピーリングすることができる。このような状況は、上記の図１５に描写されているように、ループの始めあるいは終わりまたはその両方に読み取り変更書き込みが存在するときに発生する可能性がある。
【０１３４】
第３のレベルの例外適用範囲では、最初の２つのレベルの例外適用範囲のいずれかを使用し、チェック不能値が滅多に除外されないことが分かっているかどうかについて経験的判断で増強することができる。すなわち、チェック不能値を投機的にチェックし、最初の場所でチェックされなかったはずの値をチェックすることにより、実際の例外が発生したかどうかまたは例外がスプリアス例外であるかどうかを検出するカスタム無効値例外ハンドラを使用することができる。後者の場合、ベクトル出力レジスタは無効値例外ハンドラによってチェック可能なものとして処理することができる。そうではない場合、チェック不能値の結果、実際の例外が発生する場合、ベクトル出力レジスタのチェック不能部分は、このベクトル出力レジスタ上の命令のスカラおよびＳＩＭＤ実行がＳＩＭＤからスカラ実行に変換されたときに処理される。
【０１３５】
無効値例外ハンドラは、このような例外がどこで発生するかを検出し、レジスタ内のどの例外をスプリアスとして無視することができ、どれを無視できないかを判断するためのマスクを計算することができる。次に、無効値例外ハンドラは、例外がスプリアスであった場合にアプリケーションに戻り、例外がスプリアスではなかった場合に例外を報告することができる。上記で考慮したものと同じ例、すなわち、「ｃ［ｉ］＝（ａ［ｉ］−１）＋（ｂ［ｉ］−１）」について考慮する。上述の通り、すべての正および負の無限大が報告される第２のレベルの例外適用範囲を提供するために、「ａ［ｉ］−１」が正の無限大になり、「ｂ［ｉ］−１」が負の無限大になる（逆もまた同様である）可能性がある場合ではないことをチェックするように、２つの移動指示動作が挿入されている。負の無限大に正の無限大を加えるとＮＡＮが得られ、その結果、正または負の無限大とは異なる例外が発生するので、このケースについてテストが必要であることを想起されたい。次に、加算への入力の一方が正の無限大であり、加算へのもう一方の入力が負の無限大であるケースは実際に非常に稀なものであるとさらに想定する。このような場合、「ａ［ｉ］−１」および「ｂ［ｉ］−１」の演算後にこのようなチェックを追加せず、保管指示によって結果をチェックすることのみを決定することができる。次に、ＮＡＮ例外に遭遇していると想定すると、ａ［ｉ］またはｂ［ｉ］のいずれか／両方がＮＡＮであるため、あるいは負の無限大に正の無限大を加えたために、例外が生成されたかどうかは分からない。このような場合、第３のレベルの例外適用範囲では、例外ハンドラが計算を再現し、各ステップ後に正の無限大、負の無限大、またはＮＡＮ数が計算されるのかどうかを判断する。したがって、このような方式では、例外が始まるのは非常に稀であると想定して、かなり低いコストで同じレベルの例外報告レベルを達成することができる。
【０１３６】
ソース・コードまたはソース・コードの少なくとも一部分のコンパイルを開始する前に、望ましい特定のレベルの例外適用範囲を構成パラメータとしてコンパイラに渡すことができることに留意されたい。たとえば、ユーザは、パラメータの値をコンパイラに渡すことにより、望ましい例外適用範囲のレベルを指定することができ、その後、コンパイラは、そのパラメータに基づいてコンパイラによって処理される作業単位に適用すべき適切なロジックを選択することができる。代わって、コンパイラは、所定のしきい値に比較して作業単位について予測されたかまたは経験的に判断された実行時間に基づいて、どのレベルの例外適用範囲を使用すべきかを動的に選択することができる。たとえば、コンパイラは、元のスカラ・コードと比較して変更されたＳＩＭＤコードを実行するために必要なプロセッサ・サイクル数を推定することができ、その差が所定のしきい値より大きい場合、たとえば、パーセンテージの差が受け入れ可能なパーセンテージより大きい場合、プロセッサ・サイクル効率がより高い結果を達成することが期待される、異なるレベルの例外適用範囲を使用することができる。
【０１３７】
したがって、例示的な諸実施形態のメカニズムにより、コンパイラは、スカラ実行のために作成された元のソース・コードを最適化しコンパイルする際に、上記の様々な例外据え置きメカニズムならびに据え置かれた例外条件が発生していることを示す特殊値のチェックに適した場所でのＸ指示命令の挿入を使用して、元のソース・コードをＳＩＭＤベクトル化コードに変換することができる。コンパイラは、コードの最適パフォーマンスを達成するために上記の様々なメカニズムのうちのいずれか１つまたは組み合わせを使用することができる。特に、コンパイラは、据え置かれた例外を示す特殊値の有無をチェックするためにＸ指示命令を挿入するための作業単位内の挿入ポイントを選択するために、図１２〜図２１に関して上記で概略を示したメカニズムのうちの１つまたは複数を実装するロジックを使用することができる。このような挿入ポイントの選択では、上記で明記された「生」値ならびに「チェック可能」値および「チェック不能」値または「非チェック可能」値の定義を使用する。
【０１３８】
上記の通り、例示的な諸実施形態は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態、またはハードウェアとソフトウェアの両方の要素を含む実施形態の形を取ることができることを認識されたい。一実施形態例では、例示的な諸実施形態のメカニズムは、ファームウェア、常駐ソフトウェア、マイクロコードなどを含むがこれらに限定されないソフトウェアまたはプログラム・コードで実装される。
【０１３９】
プログラム・コードの保管あるいは実行またはその両方に適したデータ処理システムは、システム・バスを介して記憶素子に直接または間接的に結合された少なくとも１つのプロセッサを含むことになる。記憶素子としては、プログラム・コードの実際の実行中に使用されるローカル・メモリと、大容量記憶装置と、実行中に大容量記憶装置からコードを取り出さなければならない回数を削減するために少なくとも何らかのプログラム・コードの一時記憶を提供するキャッシュ・メモリとを含むことができる。
【０１４０】
入出力またはＩ／Ｏ装置（キーボード、ディスプレイ、ポインティング・デバイスなどを含むがこれらに限定されない）は、直接あるいは介在する入出力コントローラを介してシステムに結合することができる。データ処理システムが介在する私設網または公衆網を介してその他のデータ処理システムあるいはリモート・プリンタまたは記憶装置に結合された状態になれるようにするために、ネットワーク・アダプタもシステムに結合することができる。モデム、ケーブル・モデム、およびイーサネット・カードは、現在使用可能なタイプのネットワーク・アダプタのうちのいくつかに過ぎない。
【０１４１】
本発明の説明は、例示および解説のために提示されたものであり、網羅するためまたは開示された形式に本発明を限定するためのものではない。多くの変更および変形は当業者にとって明白になるであろう。この実施形態は、本発明の原理、実用的な適用例を最も良く説明するため、ならびにその他の当業者が企図された特定の用途に適した様々な変更を含む様々な実施形態について本発明を理解できるようにするために、選択され記載されたものである。
【図１】
0005583770.tif 000008
【図２】
0005583770.tif 000009
【図３】
0005583770.tif 000010
【図４】
0005583770.tif 000011
【図５】
0005583770.tif 000012
【図６】
0005583770.tif 000013
【図７】
0005583770.tif 000014
【図８】
0005583770.tif 000015
【図９】
0005583770.tif 000016
【図１０】
0005583770.tif 000017
【図１１】
0005583770.tif 000018
【図１２】
0005583770.tif 000019
【図１３】
0005583770.tif 000020
【図１４】
0005583770.tif 000021
【図１５】
0005583770.tif 000022
【図１６】
0005583770.tif 000023
【図１７】
0005583770.tif 000024
【図１８】
0005583770.tif 000025
【図１９】
0005583770.tif 000026
【図２０】
0005583770.tif 000027
【図２１】
0005583770.tif 000028