(57)【特許請求の範囲】
【請求項１】
ディジタル処理装置であって、
演算のためのレジスタと、
前記レジスタに結合されたプロセッサと、
前記プロセッサからアクセス可能に保管され、前記プロセッサに、
（ｉ）単一の前記レジスタに、マルチビット・データ要素である少なくとも第１要素と第２要素とを格納させ、
（ｉｉ）格納させた要素ごとの容量を示すビット数に、前記マルチビット・データ要素が受ける演算の結果を格納するために必要になる追加の容量を示すビット数を加えて、格納させた要素の容量をそれぞれ追加させ、
（ｉｉｉ）前記マルチビット・データ要素によって表現される数であって絶対値が最大の負の数が、容量を追加させた要素によって表現できる数であって絶対値が最大の負の数より、２の補数表現で１つ大きいかどうかを判定させ、大きくない場合に、要素の容量を示すビット数に追加のビット数を加えて、それぞれの要素の容量をさらに追加させ、
（ｉｖ）単一の前記レジスタ内のすべての要素を同時に操作させ、前記操作の後に、下位の前記第１要素の符号ビットを上位の前記第２要素の最下位ビットに加算させるさらなる処理をさせるプログラムと、を備えるディジタル処理装置。
【請求項２】
ディジタルデータを処理するプロセッサと、前記プロセッサのためのオブジェクトコードを生成するコンパイラとを含むディジタル処理装置であって、
前記コンパイラは、所定のソースコードを受け取り、プロセッサが単一のレジスタ内の複数のマルチビット・データ要素を同時に処理できるようにするオブジェクトコードを出力し、
前記オブジェクトコードの論理は、
（ｉ）単一の前記レジスタに、マルチビット・データ要素である少なくとも第１要素と第２要素とを格納することと、
（ｉｉ）格納した要素ごとの容量を示すビット数に、前記マルチビット・データ要素が受ける演算の結果を格納するために必要になる追加の容量を示すビット数を加えて、格納した要素の容量をそれぞれ追加することと、
（ｉｉｉ）前記マルチビット・データ要素によって表現される数であって絶対値が最大の負の数が、容量を追加させた要素によって表現できる数であって絶対値が最大の負の数より、２の補数表現で１つ大きいかどうかを判定し、大きくない場合に、要素の容量を示すビット数に追加のビット数を加えて、それぞれの要素の容量をさらに追加することと、
（ｉｖ）単一の前記レジスタ内のすべての要素を同時に操作し、前記操作の後に、下位の前記第１要素の符号ビットを上位の前記第２要素の最下位ビットに加算するさらなる処理をすることと、を含む、ディジタル処理装置。
【請求項３】
前記第１要素は、第１データ・セットから供給され、前記第２要素は、前記第１データ・セットと異なる第２データ・セットから供給される、請求項２に記載のディジタル処理装置。
【請求項４】
前記要素ごとの容量を示すビット数は、前記コンパイラに指定するのに使用されるコンパイラ・ディレクティブ、構成ファイル、または変数定義によって定義される、請求項２または３に記載のディジタル処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータ・レジスタ内でデータを並列に処理するシステム、方法、およびコンパイラに関する。
【０００２】
【従来の技術】
コンピュータ・プロセッサは、コンピュータ・プログラムによって供給される命令に従って、さまざまなレジスタを介してデータ要素を処理することによって機能する。レジスタは、２のべきの容量を有する。たとえば、レジスタは、８ビットの容量を有することができ、単一の処理サイクルに、要素内に８ビットまでを有するデータ要素を処理することができる。１例として、８ビット・レジスタは、単一のサイクルで４ビット・データ要素を処理することができる。もちろん、レジスタは、通常は、８ビットより大きいサイズを有する、すなわち、レジスタは、１６ビット、３２ビット、または６４ビットなどの容量を有することができる。レジスタによって行われる動作のタイプの非制限的な例示的な例には、定数による乗算、加算、減算、論理左シフト、論理右シフト、ＡＮＤ、およびＯＲ演算が含まれる。
【０００３】
データ要素を処理した後に、そのデータ要素を、さらなる処理のために別のレジスタに送ることができ、あるいは、保管するか出力することができる。例を示すと、プリンタの分野で、サーバ・マイクロプロセッサが、コンピュータ・プログラムに従って、そのさまざまなレジスタを介して入力データ・ストリームを処理し、いわゆるＪＰＥＧフォーマットの圧縮イメージ・データのデータ・ストリームをプリンタ・プロセッサに出力することができ、このプリンタ・プロセッサが、適当にデータを操作して、イメージを印刷する方法をプリンタ装置に指示する。
【０００４】
プロセッサ自体は、機械語の形の命令を実行し、機械語は、どのレジスタを介してどのデータ要素を処理するかに関する低水準命令である。しかし、ほとんどのソフトウェアが、Ｃなどの高水準プログラミング・コードで記述され、高水準プログラミング・コードは、人間可読であり、比較的短いすばやく記述されるコマンドを使用して比較的複雑な処理動作を実施するという長所を有する。コンパイラは、高水準プログラミング・コードを受け取り、多数の選択肢の中から、それをアセンブリ言語にマッピングする最適の形を判断し、マッピングをアセンブラに渡し、アセンブラが、アセンブリ言語を、プロセッサによって可読のいわゆる機械語にマッピングする。高水準言語は、たとえば、拡張またはマクロを伴う、ＣまたはＣ＋＋プログラミング言語とすることができ、低水準言語は、拡張またはマクロの一部を解釈され、除去されたＣとすることができる。あるいは、低水準言語を、機械語またはアセンブリ言語とすることができる。時々、プログラマは、プログラムのうちで他の部分より頻繁に実行される部分を、低水準言語で直接に記述することを選択する場合がある。記述が面倒ではあるが、これらの、コードのいわゆる「手細工の」部分は、高水準言語コンパイラによって変換される必要がなく、したがって、ランタイムのより高速の処理が容易になる。
【０００５】
しかし、プロセッサが、機械コードをコンパイラからまたは手細工のプログラムから直接に受け取るかに無関係に、本発明では、しばしばレジスタ空間が浪費されているというクリティカルな観察を行う。具体的に言うと、上で示したように、レジスタが、すべての処理サイクルにその全容量まで使用されない可能性がある。たとえば、１６ビット容量のレジスタが、４ビット・データ要素の処理に使用される時に、１サイクルあたりレジスタの１２ビットが浪費される。これによって、処理時間が遅くなり、追加のデータ・キャッシング要件（および付随するキャッシュ・ミスの問題）が生じ、一般に、プロセッサ機能を完全に活用することができない。したがって、本発明では、単一サイクルに１レジスタ内で複数のデータ要素が処理される場合に有効になるはずのプロセッサ性能の潜在的な改良が認識されている。
【０００６】
本発明では、さらに、特に、正の値だけではなく、正と負の両方（すなわち「符号付き」）の値が処理される場合に、処理中にレジスタ容量を超えるかデータを破壊するかあるいはその両方の可能性のために、上の認識を実施することが自明ではないことが理解されている。言い換えると、本発明で使用される時の「符号付き」データ要素は、非負になるように制限されないデータ要素であり、複数の符号付きデータ要素を単一のレジスタを介して単一の処理サイクルに処理することが望ましい。さらに、本発明では、堅牢さのために、プロセッサが、レジスタごとに所定のビット・サイズだけの複数のデータ要素を受け入れるように製造業者によって制限されるのではなく、特定のアプリケーションで指示される可能性があるので、プログラマが、レジスタが受け入れることができるさまざまなデータ要素ビット・サイズを定義できる柔軟性を有することが望ましいことが理解されている。上に記した観察が行われたので、本発明では、本明細書に記載の解決策を提供する。
【０００７】
さらに、本発明では、コンパイラを使用して上の認識を実施できることが理解されている。
【０００８】
【発明が解決しようとする課題】
【０００９】
【課題を解決するための手段】
本明細書の発明的ステップに従って汎用コンピュータをプログラムして、複数のマルチビット符号付きデータ要素の単一レジスタでの使用を可能にする。本発明は、コンピュータなどのディジタル処理装置によって使用され、本発明の論理を実行するためにディジタル処理装置によって実行可能な命令のプログラムを有形に実施する、製造品（機械構成要素）として実施することもできる。本発明は、ディジタル処理装置に本明細書の発明的方法ステップを実行させるクリティカルな機械構成要素で実現される。
【００１０】
したがって、汎用コンピュータに、少なくとも第１レジスタ内で少なくとも第１および第２の符号付きマルチビット・データ要素を確立するために方法動作を行う論理が含まれる。この論理は、複数の要素を同時に処理する。
【００１１】
望まれる場合に、要素を互いに独立にすることができる。第１要素を第１データ・セットから供給することができ、第２要素を第２データ・セットから供給することができ、あるいは、両方の要素を同一のデータ・セットの異なる部分から供給することができる。レジスタ自体は、加算器、乗算器、またはシフタを含むがこれに制限されない計算サブシステムに内容を渡すことができ、データ要素に対して同時に実行される動作は、定数または既知の精度の変数による乗算、加算、または論理左シフトとすることができるが、これに制限はされない。
【００１２】
さらに、より大きいデータ要素をレジスタの間で分割し、処理の後に再結合することができる。すなわち、第１要素を、第２レジスタ内で確立される関連する第２部分要素を有する第１部分要素とすることができ、第１および第２の部分要素が、処理の後に結合される。
【００１３】
以下でさらに示すように、データ要素によって表現できる最大の負の数が、それぞれの精度で表現できる最大の負の数より１つ大きくなるように、それぞれの精度が、単一サイクル中にレジスタ内で処理されるデータ要素ごとにレジスタ内で割り振られる。これには、［−２Ｎ−１＋１］から［＋２Ｎ−１−１］までに基づくデータ要素の精度限界の判定を含めることができ、このＮは、データ要素のビット数である。
【００１４】
さらに、好ましい実施形態では、実行の前に、論理によって、所望の精度を達成するために乗算定数に必要な正味のビット数が判定される。その後、正味のビット数および乗算定数を使用して、精度の正味のビット数が判定される。レジスタ内の空間が、精度判定に従って割り振られる。
【００１５】
レジスタごとに複数の符号付きデータ要素の空間を割り振ることによってレジスタをセットアップしたならば、精度の正味のビット数に従って複数のデータ要素を個々のレジスタにパックすることによって、データ要素の処理を実行する。各レジスタのすべてのデータ要素が、同一のオペランドを使用して同時に操作される。その後、データ要素が、さらなる処理、保管、または出力のために渡される。
【００１６】
１つのレジスタ内の第１および第２のデータ要素が、互いに独立にされる時に、この論理では、第１要素の符号ビットを第２要素の最下位ビットに加える。代替案では、この論理によって実施される方法に、第１および第２の要素の符号ビットをマスクすることと、符号ビットをレジスタに加算することと、各要素の符号ビットの位置の値を破棄することが含まれる。
【００１７】
さらに、以下でさらに示すように、データ要素が０付近に含まれるかどうかを判定することができる。また、第１レジスタ内で、第２レジスタにパックされたデータ要素の符号ビットを保存し、その後、算術右シフトを行うことに従うデータ要素からシフト・アウトされる少なくとも１つの最下位ビットを０にすることによって、算術右シフトを実行することができる。第１レジスタ内の符号ビットが、第２レジスタ内のデータ要素に復元される。さらに、算術等価性を、単一の処理サイクル中に単一のレジスタ内の少なくとも２つのデータ要素に対して確認することができる。一般に、算術比較は、１要素ごとに１サイクルで行うことができる。
【００１８】
もう１つの態様では、コンピュータ・プログラム装置に、ディジタル処理装置によって読み取ることができるコンピュータ・プログラム・ストレージ・デバイスが含まれる。プログラムは、プログラム・ストレージ・デバイス上にあり、プログラムには、マルチビット符号付きデータ要素を処理する方法動作を実行するためにディジタル処理装置によって実行可能な命令が含まれる。プログラムには、少なくとも第１および第２のデータ要素を単一のレジスタにパックするコンピュータ可読コード手段が含まれる。コンピュータ可読コード手段は、要素を同時に処理する。
【００１９】
もう１つの態様では、プロセッサに、少なくとも第１および第２のレジスタが含まれる。少なくとも第１および第２の符号付きマルチビット・データ要素が、第１レジスタ内にあり、プロセッサが、１つのオペランドを使用して第１および第２のデータ要素に対して同時に動作する。
【００２０】
もう１つの態様では、コンピュータ実施される方法に、第１プログラムに関して、それぞれの第１および第２の符号付きデータ要素を保持するために単一のレジスタ内で割り振られる第１および第２の精度を判定することが含まれる。要素は、レジスタにパックされ、その後、操作される。第２のプログラムに関して、それぞれの第３および第４の符号付きデータ要素を保持するために単一のレジスタ内で割り振られる第３および第４の精度が判定される。第１および第３の精度または第２および第４の精度もしくはその両方を、互いに異なるものとすることができる。第３および第４の要素は、レジスタにパックされ、操作される。
【００２１】
したがって、汎用コンピュータに、高水準コードを受け取り、低水準コードを出力して、プロセッサが単一レジスタ内の複数のマルチビット・データ要素を同時に処理できるようにするコンパイラが含まれる。コンパイラによって出力される低水準コードの論理には、少なくとも第１レジスタ内で少なくとも第１および第２の符号付きマルチビット・データ要素を確立することと、要素を同時に処理することが含まれる。これらのパックされた要素の精度によって、そのパッキング構成が決定される。この開示では、「入力精度」が、同時演算の前の個々のデータ要素の初期精度を指すのに使用され、「出力精度」が、同時演算が完了する前の個々のデータ要素の最終的な最大精度を指すのに使用される。
【００２２】
好ましい実施形態では、データをパックする命令および同時演算の命令を生成する前に、コンパイラが、フラグまたは構成状態にアクセスして、出力精度がプログラマまたはコンパイラのどちらによって入力精度から計算されるかを決定することができる。プログラマによって決定される場合に、出力精度を、コンパイラ・ディレクティブによって、変数定義によって、または構成ファイルによってコンパイラに指定することができる。対照的に、出力精度がコンパイラによって入力精度から決定される時には、コンパイラが、データに対して実行される演算の数およびタイプをカウントし、加算または減算のそれぞれについて１ビットだけ入力精度を増やし、乗算演算に対応するのに十分なビット数だけ入力精度を増やし、データ要素によって表現することができる最大の大きさの負の数が、出力精度で表現することができる最大の負の数より１つ大きいことを保証するのに必要な時に、１ビットだけ入力精度を増やす。
【００２３】
コンパイラは、実行されるプログラムの必要によって要求される場合に、処理後に要素が互いに独立になるようにするための動作を行うコードも生成する。これを行うために、コンパイラは、コンパイラ・ディレクティブまたは特定の高水準言語（ＨＬＬ）構文にアクセスして、要素を互いに独立にするかどうかすなわち、要素をアンパックする時を判断する。
【００２４】
もう１つの態様では、コンピュータ・プログラム・デバイスに、ディジタル処理装置によって読み取ることができるコンピュータ・プログラム・ストレージ・デバイスが含まれる。コンパイラ・プログラムは、プログラム・ストレージ・デバイス上にある。コンパイラ・プログラムには、マルチビット符号付きデータ要素を処理するためにディジタル処理装置によって実行可能な低水準コードを生成する命令が含まれる。コンパイラ・プログラムには、少なくとも第１および第２のデータ要素を単一のレジスタにパックする低水準コードを出力するコンピュータ可読コード手段が含まれる。また、コンパイラ・プログラムに、要素を同時に処理する低水準コードを出力するコンピュータ可読コード手段が含まれる。
【００２５】
もう１つの態様では、方法に、コンパイラ用の少なくとも１つのコンパイラ・ディレクティブを定義することが含まれる。このコンパイラ・ディレクティブによって、少なくとも、データ要素の初期精度、共通のレジスタにパックされ、互いに同時にアルゴリズムによって操作されるるそれぞれのデータ要素の複数のデータ・ソース、またはコンパイラによって読み取られるコードの所定の部分をコンパイルしない命令が含まれる。
【００２６】
構造および動作に関する本発明の詳細は、添付図面を参照して最もよく理解することができ、図面では、類似する符号が類似する部分を指す。
【００２７】
【発明の実施の形態】
まず図１から３を参照すると、全般的に符号１０によって示される、プロセッサの単一レジスタごとに複数の符号付き独立マルチビット・データ要素の同時処理を可能にするシステムが示されている。図１から３には、本発明によって提供される処理効率を活用できるさまざまな非制限的な形が示されている。たとえば、図１では、ソフトウェア実施されるコンパイラ１１にアクセスできるサーバ・マイクロプロセッサ１２が、たとえばイメージを表す「ＴＩＦＦ」フォーマットで、単一ソース入力データ・ストリームを受け取り、このプロセッサが、本発明の利益なしの場合より「ｍ」倍高速にデータ・ストリームを処理して、たとえばＪＰＥＧフォーマットの圧縮イメージ・データを出力するが、この「ｍ」は、レジスタごとの毎秒のデータ要素に関して以下でさらに定義される。ＪＰＥＧデータが、プリンタ・マイクロプロセッサ１４に送られ、プリンタ・マイクロプロセッサ１４は、プリンタ装置１６に、イメージを印刷するように指示する。本発明が、イメージ・データだけではなくすべてのタイプのデータに全般的に適用されることと、本発明が、単一プロセッサ・システムまたは複数プロセッサ・システムに適用されることを理解されたい。たとえば、本発明は、データ通信および処理、音声圧縮、誤り訂正コーディング、複数チャネル分解などに適用される。以下で、より少数のプロセッサを使用して並列処理を実行することができるので、コスト／電力／サイズ／重量を減らすことができる。
【００２８】
図１および２に、コンパイラ１１にアクセスできるサーバ・マイクロプロセッサを示す。このコンパイラが、他の場所に存在することができ、最終的な機械でのみ、実行のためにマイクロプロセッサにコードをロードする必要があることを理解されたい。図２に、システム１０の利点をさらに活用して、サーバ・マイクロプロセッサが、第１および第２のデータ・ソースからの２つの独立のデータ・ストリームを同時に処理して、それぞれの第１および第２の出力ストリームを単一のプリンタ・マイクロプロセッサ１８またはそれぞれの第１および第２のプリンタ・マイクロプロセッサ１８および２０に出力できることを示す。各プリンタ・マイクロプロセッサ１８および２０が、それ自体のプリンタ装置（図２には装置２２だけを図示）を制御することができ、あるいは、単一のプリンタ・マイクロプロセッサが、２つのプリンタ装置を制御することができる。どの場合でも、異なるイメージ（異なるデータ・ストリームの例）または同一イメージ（データ・ストリーム）の異なる部分を、システム１０によって同時に処理でき、処理コードの核を未変更のままにすることができる。
【００２９】
図３に、マイクロプロセッサ１２Ａおよび１４Ａの間のネットワーク・リンク上の帯域幅を節約するために、パックされたイメージ・データ出力１および２を、サーバ・マイクロプロセッサ１２Ａから、データをアンパックするようにプログラムされたプリンタ・マイクロプロセッサ１４Ａに送ることができることを示す。この場合に、たとえば、データ出力１および２は、それぞれのプリンタ装置１６Ａのそれぞれのカラー・エンジンに送られる２つの色成分とすることができる。
【００３０】
１つの所期の実施形態では、プロセッサ１２を、米国ニューヨーク州アーモンクのInternationalBusiness Machines Corporation（ＩＢＭ）社によって製造されるパーソナル・コンピュータとすることができ、あるいは、プロセッサ１２を、付随するＩＢＭ  Ｎｅｔｗｏｒｋ  Ｓｔａｔｉｏｎｓを伴うＡＳ４００などの商標の下で販売されるコンピュータを含む、任意のコンピュータとすることができる。あるいは、プロセッサ１２を、Ｕｎｉｘ（Ｒ）サーバ、ＯＳ／２サーバ、Ｗｉｎｄｏｗｓ（Ｒ）ＮＴサーバ、ＩＢＭワークステーション、またはＩＢＭラップトップ・コンピュータとすることができる。さらに、本発明のレジスタを実施するプロセッサを、ディジタル信号プロセッサ（ＤＳＰ）、特殊化されたハードウェア、処理サブシステムおよび演算論理装置（ＡＬＵ）の標準ライブラリを中心として作られたチップとすることができる。用語「コンピュータ・レジスタ」は、本明細書では、これらのデータ処理ユニットのすべてのレジスタを指すのに使用される。
【００３１】
本発明のアーキテクチャの上の概要を念頭において、本発明の論理が、以下で述べる流れ図に従って、図１に示されたアーキテクチャで実行されることを理解されたい。本明細書の流れ図は、コンピュータ・プログラム・ソフトウェアまたはプログラミング・ステップあるいはその両方で実施される本発明の論理の構造を示す。当業者は、これらの流れ図が、コンピュータ・プログラム・コード要素または電子論理回路など、本発明に従って機能する論理要素の構造を示すことを諒解するであろう。明らかに、本発明は、ディジタル処理装置（すなわちコンピュータ）に、示されるものに対応する機能ステップのシーケンスを実行するように指示する形の論理要素を翻訳する機械構成要素によってその本質的な実施形態で実行される。
【００３２】
言い換えると、論理の諸部分を、一連のコンピュータ可読命令としてプロセッサ１２によって実行されるコンパイラ・プログラム１１によって実施することができる。これらの命令は、たとえば、プロセッサ１２のＲＡＭ内、プロセッサ１２のハード・ディスクまたは光ディスク・ドライブに常駐することができ、あるいは、命令を、ＤＡＳＤアレイ、磁気テープ、電子読取専用メモリ、または他の適当なデータ・ストレージ・デバイスに保管することができる。
【００３３】
図４を参照すると、プロセッサ１２のレジスタ２４が、概略的に示されている。この例では、レジスタ２４が、１６ビット・レジスタであり、レジスタ２４に、第１および第２のデータ要素２６および２８が含まれる。本明細書の図についてレジスタに関して使用される用語「左」および「右」は、図４の順序および表記と一致する形で使用される。最下位ビットおよび最上位ビットの代替レジスタ順序付けは、別の規則を必要とする。
【００３４】
図４に示された例示的実施形態について、第１の（左端の）データ要素２６に、２つのガード・ビットおよび８つのデータ・ビットが含まれ、したがって、データ要素２６は、１０の全体的な「精度」を有し、第２の（左から）データ要素２８は、２つのガード・ビットと４つのデータ・ビットを有し、したがって、６の精度を有する。２の補数の計算を対象とする本発明によれば、左端のガード・ビットは、要素の符号を一意に記述するという点で、「符号ビット」である。
【００３５】
本発明の原理によれば、レジスタ２４を、「ｍ」個のデータ要素を保持するのに十分に大きい任意のサイズとすることができ、データ要素は、同一サイズまたは異なるサイズとすることができることを理解されたい。したがって、本発明のレジスタは、２つの１６ビット・データ要素を保持する３２ビット・レジスタとすることができ、３つ以上のＮビット要素を保持することができ、あるいは、４つの１６ビット要素を保持する６４ビット・レジスタとすることができる。どの場合でも、各データ要素２６および２８は、正または負のいずれかとすることができるマルチビット要素であり、したがって、「符号付き」要素であり、データ要素２６および２８のサイズは、プロセッサ１２の製造中に単一の所定のサイズに制限されるのではなく、特定のアプリケーションに応じてプログラマによって定義可能である。さらに、レジスタ２４が、要素をストアし、適当な時に、データ要素を、加算器、乗算器、またはシフタを含むがこれに制限されない計算サブシステムに送ることを理解されたい。
【００３６】
図５に、開発の４段階が企図されていることを示す。本発明によれば、コンパイラ１１は、論理を行うことができ、あるいは、原出願に開示されているように、論理の諸部分を人間のプログラマが行うことができる。第１ステップであるブロック３０は、アルゴリズム設計であり、ここでは、検討中の特定のプロセスが、本発明に従うことができるかどうかを判定する。コンパイラ１１によって行われる時に、以下で詳細に述べるブロック３０のステップは、コンパイラ１１が、Ｃなどの高水準コードを読み取り、それを低水準コードに変換する方法を決定することに対応する。
【００３７】
ブロック３２に示された第２段階は、プログラム初期設定であり、ここでは、レジスタでの本発明の実施の詳細が、コンパイラ１１によって決定され、コンパイラ１１が、適当な初期化コードを生成する。その後、レジスタ・セットアップが、ブロック３３で行われ、ここで、コンパイラが、入力データをターゲット・プロセッサ・レジスタにパックするコードを生成する。第４段階は、ブロック３４に示された実行であり、ここで、生成されたコードが、人間のオペレータ、自動スクリプト・プログラム、または生成されたコードを実行させる他の手段によって、ターゲット・プロセッサ上で実行される。これらの段階のすべてを、以下でさらに述べるが、ブロック３２、３３、および３４は、本発明に従ってコンパイラ１１が実際に高水準言語をアセンブリ言語にする方法を表す。上で注記したように、コンパイラは、代替案では、普通のコンパイラによってコンパイルできる普通の高水準言語命令を生成することができる。
【００３８】
特に第１段階（アルゴリズム設計）に関して、図８を参照する。ブロック３６から開始して、元のデータ要素のそれぞれによって指示される必要な精度に必要なビット数を判定する。その後、ブロック３８で、操作されるデータ要素ごとに、その要素が受ける演算のそれぞれに必要になる可能性がある精度の追加ビット数を判定する。たとえば、２つの要素の加算によって、入力要素より１ビット大きい出力要素がもたらされる可能性がある。
【００３９】
ブロック３８から、論理は判断菱形４０に移動し、ここで、ブロック３８で割り振られた精度が最大の負の数の規則を満足するかどうかを判定する。「最大の負の数」は、最大の絶対値を有する負の数を意味する。具体的に言うと、判断菱形４０で、データ要素によって表現できる最大の負の数が、それぞれの精度で表現できる最大の負の数、たとえばＮビットによる２の補数表現で−２Ｎ−１より１つ大きいかどうかを判定する。そうでない場合には、ブロック４２で、精度の追加ビットをその要素について割り振る。ブロック４４で、要素の最適パックのために十分な空間が、レジスタ内で割り振られる、すなわち、最小量の未使用のレジスタ容量が達成されるように、他の要素と共にレジスタに同時に保持される使用可能なデータ要素を用いて、使用可能なレジスタを最も効率的に満たす方法を判定する。たとえば、最大で６つの追加演算を受ける８ビットの元のデータ要素について、その要素に割り当てられる精度は、（８＋６）＝１４である。
【００４０】
図７に、プログラム初期化論理を示す。判断菱形４５．１で、等価性比較が行われるかどうかを判定する。そうである場合には、ブロック４５．２で、等価性比較の項を要素位置合わせでパックする、すなわち、互いに比較される項が、それぞれのレジスタの同一のレジスタ位置にパックされる。図７の流れには、判断菱形４５．３で、次に、範囲比較が行われるかどうかを判定し、そうである場合に、ブロック４５．４でそのような比較のそれぞれの下限を判定することも示されている。その後、ブロック４５．５で、下限項を、要素位置合わせでブロック４５．５でパックする。ブロック４５．５から、論理はブロック４５．６に移って、比較の範囲をパックする。
【００４１】
ブロック４５．６から、またはテストが否定の時の判断菱形４５．３から、論理は、判断菱形４６．６５に流れ、要素の符号位置を既知にする必要があるかどうかを判定する。そうである場合には、ブロック４５．７で、以下でさらに述べるように符号ビット位置をマスクするためのマスクを生成する。ブロック４５．７から、またはテストが否定の時の判断菱形４６．６５から、論理は判断菱形４５．８にながれ、論理右シフト動作が事項されるかどうかを判定する。そうである場合には、ブロック４５．９で、以下でさらに述べるようにシフトされたビット位置をクリアするマスクを生成する。
【００４２】
特に第１段階（アルゴリズム設計）に関して、図６を参照すると、その最初の部分（ブロック３９まで）は、人間のプログラマによって行われる論理を表す。ブロック３５で開始して、コンパイルされるプログラムが、高水準言語で記述される。ブロック３５．１で、プログラムのうちで、以下の開示によって「並列化」できる部分を識別する。ブロック３５．２に移って、コンパイラ・ディレクティブをプログラムに挿入し、「並列化可能」部分を識別する。
【００４３】
例として、以下で述べる図１０から１２に、たとえば複数の異なるイメージに対して同一のアルゴリズムを実行して並列に印刷するなど、複数の独立のデータ・ストリームに対する同時動作を提供するさまざまな実行論理を示す。そうである場合には、コンパイラ１１は、アルゴリズム呼出し点およびアルゴリズム定義で、これが発生することを知らなければならず、コンパイラ・ディレクティブが、これをコンパイラ１１に伝えるのに使用される。下記は、そのようなディレクティブの例である。
/* アルゴリズムの呼出しの点 */
#begin parallel_algorithm_calls
signal_processing_algorithm(data_pointer_1);
signal_processing_algorithm(data_pointer_2);
signal_processing_algorithm (data_pointer_3);
signal_processing_algorithm(data_pointer_4);
#end parallel_algorithm_calls
/* アルゴリズム定義の点 */
#parallel_algorithm
void_signal_processing_algorithm (int*data_pointer)
{
/* ... */
}
【００４４】
インライン並列化可能計算は、同一の形で、たとえばコンパイラ・ディレクティブ内の指定によって、指定することができる。もう１つのコンパイラ・ディレクティブを定義して、コンパイラ１１が、たとえばコードが既にプログラマによって「手細工」されている（機械語で）場合など、プログラマが最適化されないことを望むコードに対して並列化最適化論理を実行しないようにすることができる。ループに適用されるそのようなディレクティブの例を、下に示す。
#begin optimization_keepout
while (condition) {
/* ... */
}
#end optimization_keepout
【００４５】
次に、ブロック３６で、各元のデータ要素によって指示される必要な精度のために必要なビット数を判定する、すなわち、入力精度を、操作される要素ごとに判定する。判断菱形３７で、コンパイラが出力精度を判定するかどうかを判定し、そうである場合に、ブロック３８．４で、プログラマが、コンパイラ・ディレクティブを使用するか、適当な変数型を定義するか、構成ファイルを使用することによって、入力精度を指定する。以下に、例示的なコンパイラ・ディレクティブを示す。本明細書に示された例のすべてで、「Ｃ」プログラミング言語の構文が使用されるが、他のプログラミング言語への拡張は、当業者に明白であろう。拡張を行うことができる他のプログラミング言語には、ＦＯＲＴＲＡＮ、Ｐａｓｃａｌ、Ａｄａ、およびＪａｖａ（Ｒ）を含めることができるが、これに制限はされない。たとえば、コンパイラがサポートするディレクティブが、下に示された例示的構文を有する場合に、プログラマが、元の精度を定義するために次のようにコンパイラ・ディレクティブを記述して、９ビットの固定小数点変数を定義することができる。
#fixed_precision 9
int variable_name
あるいは、コンパイラが、次の例に示されるものなどの変数宣言構文をサポートする場合には、新しい整数型を「ｆｉｘｅｄ  （９）変数名」として定義することによって、同等に上のステップを行うことができる。上で述べたように、元の精度を定義する第３の形は、変数のスコープ、名前、および選択された値の精度を指定する構成ファイルをコンパイル時にインクルードすることである。
【００４６】
その一方で、コンパイラ１１が出力精度を判定しない場合には、プログラマがそれを行わなければならず、したがって、この場合には、論理が判断菱形３７からブロック３８に進む。ブロック３８では、操作されるデータ要素ごとに、その要素が受ける演算のそれぞれに必要になる可能性がある精度の追加ビット数を判定する。たとえば、２つの要素を足し合わせることによって、入力要素より１ビット長い出力要素がもたらされる可能性がある。
【００４７】
ブロック３８から、論理は判断菱形３８．１に移り、ブロック３８で割り振られた精度が、最大の負の数の規則を満足するかどうかを判定する。「最大の負の数」は、最大の絶対値を有する負の数を意味する。具体的に言うと、判断菱形３８．１で、データ要素によって表現できる最大の負の数が、それぞれの精度で表現できる最大の負の数、たとえばＮビットの２の補数表現で−２Ｎ−１より１つ大きいかどうかを判定する。そうでない場合には、ブロック３８．２で、その要素のために精度の追加のビットを割り振る。ブロック３８．３で、結果の出力精度が、コンパイラ・ディレクティブ、変数型、または構成ファイルの形で指定される。
【００４８】
出力精度がコンパイラによって決定される時に、このシステムは、プログラマが出力精度を決定する時よりプログラマ・エラーに対して堅牢であることをここで注記することが適当である。しかし、出力精度がプログラマによって決定される時に、コンパイラ１１は、２つの選択肢を有する。まず、コンパイラは、精度のランタイム検査を実行する命令を生成して、アンダーフロー（おそらくは最大の大きさの負の数の出現を含む）およびオーバーフローが発生せず、発生した場合にはラップまたは飽和をもたらすことを保証することができる。その代わりに、コンパイラ１１が、プログラマが十分な精度を正しく提供したと仮定することができ、これは、ランタイム検査より少ない実行サイクルを消費するという利点を有するが、レジスタ全体の内容を破壊する可能性がある、オーバーフローおよびアンダーフローを潜在的に許容するという短所を有する。したがって、本明細書で想像されるように、プログラマは、コンパイラに、実装を検証するためにランタイム検査を実行する命令を生成させるというより低速だがより堅牢な方法を使用することができ、その後、実行検証後の後続のコンパイル中にランタイム検査を無効にして、実行を高速化することができる。
【００４９】
どの場合でも、ブロック３８．３からの出力精度またはブロック３８．４からの入力精度が、コンパイラ１１に送られ、図５の残りは、コンパイラ１１の論理を表す。ブロック３９で、コンパイラ１１が、上で述べたファイルを読み取る。ブロック３９．１で、より上位のコードを分析するか、コンパイラ・ディレクティブを読み取ることによって、すべての並列化ディレクティブを識別する。判断菱形４０に進んで、コンパイラ１１は、出力精度を判定する（たとえば演算をカウントすることによって）必要があるかどうかを判定する。コンパイラは、コンパイラ・ディレクティブ、フラグ、または構成ファイルにアクセスすることによって、この判定を行う。テストが肯定である場合には、ブロック４１．１で、並列に操作される要素の入力精度を読み取り、ブロック４１．２で、コンパイラ１１が、本質的に、状態３８．１、３８．２、および３８．３に関して上で述べた論理を繰り返して、出力精度を生成する。逆に、コンパイラ１１が要素の出力精度を判定しない場合には、これは、ブロック３８．３からの出力精度が、ブロック４１．３で読み取られることを意味する。
【００５０】
ブロック４２に進んで、並列に処理される変数をグループ化する。次に、ブロック４３で、コンパイラ１１が、要素の最適パックのためにレジスタ内で十分な空間を割り振る、すなわち、最小の量の未使用レジスタ容量が達成されるように、他の要素と共に１レジスタに同時に保持される使用可能なデータ要素を用いてターゲット・プロセッサの使用可能なレジスタを最も効率的に満たす方法を判定する。たとえば、最大６つの追加の演算を受ける８ビットの元のデータ要素の密なパックについて、その要素に割り振られる精度は、（８＋６）＝１４になる。ブロック４４．１で、以下で説明する「並列化」方法を実施する生成された命令にアクセスし、ブロック４４．２で、プログラムの非並列化可能部分をコンパイル／変換する。ブロック４４．３で、結果の低水準コードを、以下で説明するように要素を並列に処理するためのプロセッサでの実行のために出力する。
【００５１】
図７に、コンパイラによって実行され、コンパイラ１１によって出力される低水準コードで実施されるプログラム初期化論理を示す。判断菱形４５．１で、コンパイラが、等価性比較が行われるかどうかを判定する。そうである場合には、コンパイラは、ブロック４５．２で、要素位置合わせで等価性比較項をパックするコードを生成する、すなわち、互いに比較される項が、同一のレジスタ位置で、それぞれのレジスタ、定数、または変数にパックされる。図６の流れには、判断菱形４５．３で、範囲比較が行われるかどうかをコンパイラが判定することも示されており、そうである場合には、コンパイラが、そのような比較のそれぞれの下限を判定するか、コンパイラが、そのような比較のそれぞれの下限を判定するコードを生成するかのいずれかが行われ、これは、ブロック４５．４によって判定される。その後、ブロック４５．５で、コンパイラが、下限項を要素位置合わせでパックするコードを生成する。ブロック４５．５から、論理はブロック４５．６に移り、コンパイラが、比較の範囲をパックするコードを生成する。
【００５２】
ブロック４５．６から、またはテストが否定である時の判断菱形４５．３から、論理は、判断菱形４５．６５にながれ、要素の符号位置を既知にする必要があるかどうかを判定する。そうである場合には、ブロック４５．７で、コンパイラが、以下でさらに説明する、符号ビット位置をマスクするマスクを生成する。ブロック４５．７から、またはテストが否定である時の判断菱形４５．６５から、論理は判断菱形４５．８に流れ、論理右シフト演算が実行されるかどうかを判定する。そうである場合には、ブロック４５．９で、コンパイラが、以下でさらに述べるように、シフトされたビット位置をクリアするマスクを生成する。
【００５３】
図９に、コンパイラ１１の出力コードによって行われるレジスタ・セットアップ論理を示す。具体的に言うと、残りの図の論理は、コンパイラ１１によって生成されるコードによって行われることを理解されたい。ブロック４６で開始して、「ｍ」個の値を有するレジスタについて、ｍ番目の値を、その右の値の幅すなわち１、…、（ｍ−１）個の値の幅だけ左にシフトする（やはり、図４に示された方向に関して）。ブロック４８で、ブロック４６でシフトされた値を含む要素を、指定されたレジスタに加算する。ブロック５０は、ブロック４６および４８の処理が、レジスタにパックされるすべての要素がレジスタに加算されるまでループすることを示す。この論理は、状態５５で終了する。元の要素を、本来、自然に要素として異なるレジスタ内で処理される副要素に分割し、その後、処理の後に再結合できることを理解されたい。たとえば、特定のプロセスが必要とする可能性がある、２つの完全なデータ要素と２組の余分な精度が、１つのレジスタにおさまらない場合に、１つの完全な要素と部分的要素を２組の余分な精度と共に１つのレジスタを介して処理することができ、残りの副要素をターゲット・プロセッサの別のレジスタを介して処理することができる。入力データ要素のすべてが、正であることが既知であり、既にガード・ビットなしでパックされている時に、パック処理を、より単純にすることができ、１つおきの要素を選択し、データ要素の入力精度と等しいガード・ビットを有する２つのレジスタに結果を残す、シフト演算およびマスク演算からなるものとすることができる。
【００５４】
本発明によって処理されるすべてのデータ要素について上の条件が満たされる時に、前に借りが発生しなかった、左に（図４に示された例示的レジスタ２４に関して）伝播する繰上りは、絶対に発生することができない。これは望ましい。というのは、前の借りがない左に伝搬する繰上りが、そうでなければ、隣接する要素への要素オーバーフローを示すからである。さらに、最大の負のテストを満足することによって、借りが、アンダーフロー状態での借りに続くことだけができることが保証される。というのは、影響される要素のすぐ右の要素からの符号反転に必要な借りが提供されるからである。どの処理サイクルにも、多くとも１つの借りがレジスタ内の各要素から発生し、借りが、隣接する（右に）要素の符号ビット（符号ビットは要素の最上位ビットである）での「１」ビットの存在によって示されることになる。
【００５５】
レジスタ・セットアップ処理が完了したならば、図１０に示された論理を実行することによって入力データ・ストリームを処理することができ、図１０の論理では、コンパイラが、本明細書に示された論理の低水準コードを生成する。ブロック５６で、データ要素が、上で述べた空間割振りに従ってプロセッサ１２のレジスタにパックされる。具体的に言うと、複数のマルチビット符号付きデータ要素が、ブロック５６で、プロセッサ１２の少なくとも１つのレジスタにパックされる。その後、各処理サイクルに、複数のデータ要素を保持するレジスタのそれぞれで、データ要素が、同一の演算すなわち、プログラムによって実施される演算によって、同時に処理される。１サイクル演算には、２つのレジスタの加算／減算、即値の加算／減算、論理左シフト、単一の値または既知の精度の変数による正または負の乗算、等価性演算、符号ビットとのＡＮＤ演算、および符号ビットとのＯＲ演算が含まれる。また、レジスタの最上位（左端）ビット内の要素の算術比較を、単一サイクル内に所定の数に対して実行することができ、レジスタ内の下位要素のような比較は、比較の後に最上位ビットを破棄することができる場合に、別のレジスタまたは同一のレジスタ内でそれらをコピーし、最上位ビットにシフトするための余分なサイクルを必要とする。算術右シフト、論理右シフト、いくつかの比較、および否定のすべてが、余分のサイクルを必要とするが、すべての要素について複数サイクルで達成することができる。互いに比較されるか、互いに加算されるか、互いから減算される、別々のレジスタ内の要素について、対応する要素が、位置合せされなければならない、すなわち、第２レジスタ内の第２要素と比較、加算、または減算される、第１レジスタ内の第１要素は、第１レジスタ内で、第２レジスタ内で第２要素が占めるのと同一のレジスタ位置を占めなければならない。
【００５６】
同時演算の後に、論理は、判断菱形５９にながれ、要素を分割しなければならないかどうかを判定する。具体的に言うと、同時に操作される、単一レジスタ内の要素を、上で述べたコンパイラ・ディレクティブによる定義通りに、または並列実行ブロックの終りに、互いに独立にする必要がある場合がある。コンパイラが生成したコードでは、同時演算を実行するコードの後に、要素を分割する必要がある場合に、コンパイラが、分割を実行する低水準コードを挿入しなければならない。この論理は、判断菱形５９に反映され、これは、単一レジスタ内のパックされた独立の要素を同時に操作する命令が生成された後に、以下で述べる図１１または１２の論理に従ってそれらの要素を互いに分離する命令が生成される。一般に、独立の要素について、論理はブロック６２に移り、１レジスタ内の処理されたデータ要素を、分割し、別のレジスタまたはストレージに送る。ブロック６４で、大きい要素の副要素であったすべての要素を、互いに再結合する。ブロック６４から、またはレジスタ内のパックされた要素が互いに独立である必要がない場合の判断菱形５９から、ブロック６６で、要素が、保管、出力、またはさらなる処理のために送られる。
【００５７】
図１１から１５に、コンパイラ１１の出力で実施される本発明のさまざまな好ましい詳細を示す。図１１を参照すると、レジスタ内の要素を互いに独立にする第１の論理フローを見ることができる。ブロック６８で開始されて、図１０のブロック５８で要素を操作した後に、左端要素（やはり図４の例示的レジスタ２４に関して）の符号ビットを、左に直接隣接する要素の最下位ビットに加算する。ブロック７０は、１レジスタに３つ以上の要素が含まれる時に、ブロック６８のステップを再帰的に行い、効果的に要素の間のすべての借りを除去することを示す。
【００５８】
代替案では、図１２の論理を呼び出して、要素を独立にすることができる。図１２のブロック７２から開始して、レジスタ内の要素を処理の後に互いに完全に独立にしなければならず、要素の符号ビットの次のビットが符号ビットと同一である（符号ビットを犠牲にすることができることを意味する）時には、レジスタ内の符号ビットのすべてを選択するマスクを、レジスタのコピーに適用し、ブロック７４でレジスタに加算する。これによって、繰上りまたは借りが来るまですべての符号ビットがクリアされ、ある要素のクリアされた符号ビット位置に、右に隣接する近傍から繰上りおよび借りが取り込まれる。「符号ビットをマスクする」は、レジスタと、符号ビットの位置に「１」、それ以外の位置に「０」を有するパターンとのビット単位のＡＮＤを実行することを意味する。左端の要素の符号ビットのマスクおよび破棄は、左端の要素が、その左に相互作用すべき他の要素を有しないので、行うことも行わないこともできる。
【００５９】
その後、ブロック７６で、要素を渡す前に、各要素の左端（または前の符号ビット）の値を破棄または無視する。上の動作は、データ要素ごとの精度の減少をもたらすが、これによって、図１１に示された再帰的方法より少ないサイクルで要素が互いに独立になり、符号ビット位置の壊されたデータが破棄される。破棄は、比較のためのレジスタ内の左位置調整の一部としての余分な左シフトによって、または各破壊されたビットを選択的に除くマスクによって、行うことができる。
【００６０】
図１３を参照すると、データ要素が０付近に含まれるかどうかを判定する（たとえば０へのＪＰＥＧ量子化のため）、コンパイラが生成した低水準コードで実施される論理が示されている。ブロック８０で、範囲のパックされた下限を、１サイクルでレジスタから減算する。判断菱形８２に移って、テストされる要素（すなわち、比較される要素）の符号ビットを、上で述べた原理に従って犠牲にすることができるかどうかを判定する。そうである場合には、ブロック８４で、上で述べた符号ビット・マスクを加算して、符号ビットをマスクする。その後、ブロック８８で、テストされている要素を、単一の論理テストでそれぞれの範囲と比較する。精度の余分な未使用のビットが、データ要素のために提供されたので、符号ビットは、各要素の左端から２番目の位置に存在する。処理は、すべての要素が比較されるまで、ブロック８８からブロック８４にループする。
【００６１】
対照的に、判断菱形８２でのテストが否定の時には、ブロック８６で、符号ビットを隣接する要素に加算する。その後、ブロック８８で、テストされている要素を単一の論理テストで上限と比較し、すべての要素が比較されるまで、ブロック８６および８８の処理がループする。
【００６２】
図１３の議論に関連して、ブロック８８の比較の後に、要素を、０にマスクするか１時に１つ左にシフトし、その結果、比較が必ずレジスタ内の左端のマスクされない要素について境界に対して行われるようにする。
【００６３】
図１４に、算術右シフトの、コンパイラが生成する低水準コードで実施される論理を示す。ブロック９２で開始して、各要素の符号ビットを、別のレジスタに保存する。ブロック９４に移って、上で図１１および１２を使用して開示したように、要素を独立にし、ブロック９６で、１位置の算術右シフトを行う。次に、ブロック９７で、レジスタ内の要素の符号ビット位置を、１サイクルでクリアする。ブロック９８で、各要素の符号ビットを、レジスタとＯＲをとり、ブロック９６および９８のステップを、ブロック９９に示されているようにシフトが完了するまで繰り返す。判断菱形９９の判定で、さらに演算が実行される場合には、新しい符号ビットを右から左へ１つずつ減算し、レジスタ全体に波及させることによって、パックされたフォーマットを復元することができる。これは、図１４に示されているように、ブロック９９．２で符号ビットをそれ自体に加算し、ブロック９９．３で符号ビットと要素のＯＲをとることによって行われる。
【００６４】
図１５に、算術比較を行うための精度の余分なビットを使用する方法を示す。ブロック１００で開始して、本発明は、４ビット要素ｘｘｘ０の値を、正しい値として定義し、ｘｘｘｘ１の値を、右調整値の符号ビットが値から借りられたことを示すように定義する。ブロック１０２で、値を精度の余分なビットと比較する。
【００６５】
本発明の上で説明した目的を完全に達成することができる特定のシステム、方法、およびコンパイラ技術を図示し、説明したが、それが本発明の現在の好ましい実施形態であり、したがって、本発明によって広義に意図される主題の表現であることと、本発明の範囲が、当業者に明白になる他の実施形態を完全に含むことと、本発明の範囲が、単数形の要素への言及が「少なくとも１つの」を意味する請求項以外の何物によっても制限されないことを理解されたい。当業者に既知であるか後に既知になる、上で説明した好ましい実施形態の要素の構造的同等物および機能的同等物のすべてが、参照によって本明細書に明白に組み込まれ、請求項によって含まれることが意図されている。さらに、装置または方法が、本発明によって解決が求められる各すべての問題に対処する必要はなく、それが請求項に含まれる必要はない。さらに、この開示の要素、構成要素、または方法ステップのどれもが、要素、構成要素、または方法ステップが請求項に明示的に記載されているかどうかに無関係に、公共に供することを意図されていない。
【図面の簡単な説明】
【図１】本発明のシステムを示す概略図である。
【図２】代替システムを示す概略図である。
【図３】もう１つの代替システムを示す概略図である。
【図４】データ・レジスタ内の複数の独立のビットを表す概略図である。
【図５】本発明の全体的な論理を示す流れ図である。
【図６】現在の規則をあるプロセスについて満たすことができることを検証するプログラマ／コンパイラ論理を示す流れ図である。
【図７】プログラム初期化論理を示す流れ図である。
【図８】現在の規則をあるプロセスについて満たすことができることを検証する論理を示す流れ図である。
【図９】レジスタ・セットアップ論理を示す流れ図である。
【図１０】全体的な実行論理を示す流れ図である。
【図１１】単一のレジスタ内で独立の要素を実施する代替論理フローを示す流れ図である。
【図１２】単一のレジスタ内で独立の要素を実施する代替論理フローを示す流れ図である。
【図１３】要素が０付近に含まれるかどうかを判定する論理を示す流れ図である。
【図１４】算術右シフトの論理を示す流れ図である。
【図１５】算術比較の論理を示す流れ図である。
【図１】
0004677172.tif 000002
【図２】
0004677172.tif 000003
【図３】
0004677172.tif 000004
【図４】
0004677172.tif 000005
【図５】
0004677172.tif 000006
【図６】
0004677172.tif 000007
【図７】
0004677172.tif 000008
【図８】
0004677172.tif 000009
【図９】
0004677172.tif 000010
【図１０】
0004677172.tif 000011
【図１１】
0004677172.tif 000012
【図１２】
0004677172.tif 000013
【図１３】
0004677172.tif 000014
【図１４】
0004677172.tif 000015
【図１５】
0004677172.tif 000016