(57)【要約】【課題】同一演算の繰り返し処理を効率的に実行させることができるプログラムを生成する。【解決手段】コード生成装置１０は、複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラムに基づいて第２プログラム２を生成する。第２プログラムには、第１から第３の処理が記述される。第１の処理は、第１演算命令による演算を繰り返す処理である。第２の処理は、マスクビット列３のうち、第１マスクビットに対して真を示す値を設定し、第２マスクビットに対して偽を示す値を設定する処理である。第３の処理は、第１処理で演算をしない余り演算要素に対して第１マスクビットを対応させ、非演算要素に対して第２マスクビットを対応させた第２命令により、余り演算要素と非演算要素とに対して演算を行う処理である。【選択図】図１
2018124877.tif 000002
【特許請求の範囲】
【請求項１】
配列に設定された複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラムを記憶する記憶部と、
前記第１プログラムに基づいて、前記複数の演算要素の数を被除数とし、１つの演算命令の演算対象である要素数を示す演算対象要素数を除数とする、整数の除法による除算の商の回数だけ、前記配列の先頭の演算要素から順に、前記演算対象要素数ずつ第１演算命令による前記演算を繰り返す第１処理、前記演算対象要素数分の複数のマスクビットを含むマスクビット列のうち、前記除算の剰余と同じ数の第１マスクビットに対して真を示す値を設定し、前記マスクビット列の前記第１マスクビット以外の第２マスクビットに対して偽を示す値を設定する第２処理、および前記第１処理で前記演算をしない余り演算要素および演算対象外の非演算要素を含む、前記演算対象要素数分の複数の対象要素のうち、前記余り演算要素に対して前記第１マスクビットを対応させ、前記非演算要素に対して前記第２マスクビットを対応させ、対応するマスクビットの値が真の要素に対する前記演算の結果を出力し、対応するマスクビットの値が偽の要素に対する前記演算の結果を出力しない第２演算命令により、前記複数の対象要素それぞれに対して前記演算を行う第３処理を記述した、第２プログラムを生成する処理部と、
を有するコード生成装置。
【請求項２】
前記第２演算命令は、前記複数の対象要素を第１レジスタに読み込むロード命令と、前記第１レジスタに読み込まれた要素それぞれに前記演算を行い、演算結果を第２レジスタに格納する第３演算命令と、第２レジスタ内の、対応するマスクビットの値が真の要素の演算結果を書き出し、対応するマスクビットの値が偽の要素の演算結果の書き出しを抑止するストア命令である、
請求項１記載のコード生成装置。
【請求項３】
前記ロード命令は、対応するマスクビットの値が真の要素を第１レジスタに読み込み、対応するマスクビットの値が偽の要素の読み込みを抑止する命令である、
請求項２記載のコード生成装置。
【請求項４】
コンピュータが、
配列に設定された複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラムを取得し、
前記第１プログラムに基づいて、前記複数の演算要素の数を被除数とし、１つの演算命令の演算対象である要素数を示す演算対象要素数を除数とする、整数の除法による除算の商の回数だけ、前記配列の先頭の演算要素から順に、前記演算対象要素数ずつ第１演算命令による前記演算を繰り返す第１処理、前記演算対象要素数分の複数のマスクビットを含むマスクビット列のうち、前記除算の剰余と同じ数の第１マスクビットに対して真を示す値を設定し、前記マスクビット列の前記第１マスクビット以外の第２マスクビットに対して偽を示す値を設定する第２処理、および前記第１処理で前記演算をしない余り演算要素および演算対象外の非演算要素を含む、前記演算対象要素数分の複数の対象要素のうち、前記余り演算要素に対して前記第１マスクビットを対応させ、前記非演算要素に対して前記第２マスクビットを対応させ、対応するマスクビットの値が真の要素に対する前記演算の結果を出力し、対応するマスクビットの値が偽の要素に対する前記演算の結果を出力しない第２演算命令により、前記複数の対象要素それぞれに対して前記演算を行う第３処理を記述した、第２プログラムを生成する、
コード生成方法。
【請求項５】
コンピュータに、
配列に設定された複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラムを取得し、
前記第１プログラムに基づいて、前記複数の演算要素の数を被除数とし、１つの演算命令の演算対象である要素数を示す演算対象要素数を除数とする、整数の除法による除算の商の回数だけ、前記配列の先頭の演算要素から順に、前記演算対象要素数ずつ第１演算命令による前記演算を繰り返す第１処理、前記演算対象要素数分の複数のマスクビットを含むマスクビット列のうち、前記除算の剰余と同じ数の第１マスクビットに対して真を示す値を設定し、前記マスクビット列の前記第１マスクビット以外の第２マスクビットに対して偽を示す値を設定する第２処理、および前記第１処理で前記演算をしない余り演算要素および演算対象外の非演算要素を含む、前記演算対象要素数分の複数の対象要素のうち、前記余り演算要素に対して前記第１マスクビットを対応させ、前記非演算要素に対して前記第２マスクビットを対応させ、対応するマスクビットの値が真の要素に対する前記演算の結果を出力し、対応するマスクビットの値が偽の要素に対する前記演算の結果を出力しない第２演算命令により、前記複数の対象要素それぞれに対して前記演算を行う第３処理を記述した、第２プログラムを生成する、
処理を実行させるコード生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コード生成装置、コード生成方法、およびコード生成プログラムに関する。
【背景技術】
【０００２】
最近のプロセッサの多くは、ＳＩＭＤ（Single Instruction Multiple Data）命令を実行できる。ＳＩＭＤ命令は、複数のデータに対する同一演算の並列実行を指示する命令である。以下、ＳＩＭＤ命令による演算対象の個々のデータであるオペランド（ｏｐｒａｎｄ）を「要素」と呼ぶ。また、ＳＩＭＤ命令で演算を行う各要素のデータ長を「ＳＩＭＤ幅」と呼ぶ。
【０００３】
例えばプロセッサは、読み込んだ命令がＳＩＭＤ命令の場合、ＳＩＭＤ命令対応のレジスタ（以下、「ＳＩＭＤレジスタ」と呼ぶ）の容量分の要素をメモリから取り出し、ＳＩＭＤレジスタに格納する。ここで、１つのＳＩＭＤレジスタに格納できる要素の数を「ＳＩＭＤ要素数」と呼ぶ。プロセッサは、ＳＩＭＤレジスタ内の複数の要素それぞれに同一の演算を並列に実行する。そしてプロセッサは、要素単位で、演算結果をメモリに格納する。
【０００４】
このようなＳＩＭＤ命令を利用することで、複数の要素それぞれに同一演算を実行する際に、ＳＩＭＤ要素数分の要素に対する演算を、１回のＳＩＭＤ命令によって並列実行することができる。これにより、同一の演算を実行する複数の要素に対し、１命令で１要素ずつの演算を繰り返す場合に比べて、演算性能が向上する。
【０００５】
処理の効率化技術としては、例えばＤＯループ内のＩＦ文下においてＴＨＥＮ節およびＥＬＳＥ節で行われていた同一の演算を、マスクなしの１回の演算で置き換える技術がある。また多重にネストするＩＦ文を持つプログラムに対してもベクトル演算処理を実行可能にする技術もある。さらに、ＳＩＭＤ化方式による対象データ列が、外側ループに跨った長い連続データ列の一部分である場合に、外側ループを考慮したＳＩＭＤ化変換を実施することにより、端数部分のないＳＩＭＤ化コードを生成する技術もある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平５−１２０３２３号公報
【特許文献２】特開平７−５６８９２号公報
【特許文献３】特開２００９−２６５７０８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＳＩＭＤ命令をサポートするプロセッサは、ＳＩＭＤ化前の繰り返し処理の繰り返し回数（ループ回転数）がＳＩＭＤ要素数の倍数であれば、すべての要素について、ＳＩＭＤ命令によって効率的に演算することができる。他方、ループ回転数がＳＩＭＤ要素数の倍数になっていない場合、プロセッサがＳＩＭＤ命令による演算を繰り返した後、最終的に、ＳＩＭＤ要素数に満たない数（端数）の要素が、未処理の状態で残される。ＳＩＭＤ命令ではＳＩＭＤ要素数分の要素に対して演算が同時に実行されるため、端数の要素に対してＳＩＭＤ命令を適用してしまうと、本来演算対象ではない要素に対しても演算が実施されてしまう。このような演算対象外の要素に対する不要な演算の実行は、プログラムのバグの原因となる。
【０００８】
そこで従来は、コンピュータが、ソースプログラムをコンパイルする際に、ＳＩＭＤ命令を適用できない端数分の要素を検出すると、１命令で１要素ずつ演算処理を実行するように、オブジェクトコードを生成する。すなわち、従来は、端数分の複数の要素について、それらの要素に対して同一の演算を実行するのにもかかわらずＳＩＭＤ命令を適用することができず、同一演算の繰り返し処理の効率化が十分に図られていない。
【０００９】
１つの側面では、本発明は、同一演算の繰り返し処理を効率的に実行させることができるプログラムを生成することを目的とする。
【課題を解決するための手段】
【００１０】
１つの案では、記憶部と処理部とを有するコード生成装置が提供される。記憶部は、配列に設定された複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラムを記憶する。処理部は、第１プログラムに基づいて、複数の演算要素の数を被除数とし、１つの演算命令の演算対象である要素数を示す演算対象要素数を除数とする、整数の除法による除算の商の回数だけ、配列の先頭の演算要素から順に、演算対象要素数ずつ第１演算命令による演算を繰り返す第１処理、演算対象要素数分の複数のマスクビットを含むマスクビット列のうち、除算の剰余と同じ数の第１マスクビットに対して真を示す値を設定し、マスクビット列の第１マスクビット以外の第２マスクビットに対して偽を示す値を設定する第２処理、および第１処理で演算をしない余り演算要素および演算対象外の非演算要素を含む、演算対象要素数分の複数の対象要素のうち、余り演算要素に対して第１マスクビットを対応させ、非演算要素に対して第２マスクビットを対応させ、対応するマスクビットの値が真の要素に対する演算の結果を出力し、対応するマスクビットの値が偽の要素に対する演算の結果を出力しない第２演算命令により、複数の対象要素それぞれに対して演算を行う第３処理を記述した、第２プログラムを生成する。
【発明の効果】
【００１１】
１態様によれば、同一演算の繰り返し処理を効率的に実行させることができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態に係るコード生成装置の機能構成例を示す図である。
【図２】第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。
【図３】ＳＩＭＤ幅とＳＩＭＤ要素数との関係を示す図である。
【図４】ＳＩＭＤ命令の第１の適用例を示す図である。
【図５】ＳＩＭＤ命令の第２の適用例を示す図である。
【図６】ＳＩＭＤ幅ごとの回転数に応じたｎｏＳＩＭＤ率を示す図である。
【図７】ループ処理が多段階になっているプログラムの例を示す図である。
【図８】マスク命令を使用したＳＩＭＤ命令の適用例を示す図である。
【図９】余りＳＩＭＤ化処理の一例を示す図である。
【図１０】ループ処理のＳＩＭＤ化の一例を示す図である。
【図１１】コンピュータが有する機能の一例を示すブロック図である。
【図１２】ループ構成情報の一例を示す図である。
【図１３】ループ出力部の処理の手順の一例を示すフローチャートである。
【図１４】余りループ展開処理の手順の一例を示すフローチャートである。
【図１５】比較命令を用いたマスクビットの値の設定例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
まず、第１の実施の形態について説明する。第１の実施の形態は、同一演算の繰り返し処理を効率的に実行させることが可能なプログラムを生成するためのコード生成方法を、コード生成装置によって実現したものである。なおコード生成装置が実行する処理は、例えばコード生成方法の処理手順が記述されたコード生成プログラムをコンピュータに実行させることで実現することができる。
【００１４】
図１は、第１の実施の形態に係るコード生成装置の機能構成例を示す図である。コード生成装置１０は、例えばコンピュータである。コード生成装置１０は、記憶部１１と処理部１２とを有する。記憶部１１は、例えばメモリまたはストレージ装置である。処理部１２は、例えばプロセッサである。
【００１５】
記憶部１１は、配列に設定された複数の演算要素それぞれに対して同じ演算を行うループ処理の記述を含む第１プログラム１を記憶する。
処理部１２は、第１プログラム１に基づいて第２プログラム２を生成する。第２プログラム２には、第１〜第３処理が記述される。
【００１６】
第１処理は、配列の先頭の演算要素から順に、演算対象要素数ずつ第１演算命令による演算を繰り返す処理である。演算対象要素数は、１つの演算命令の演算対象の要素数である。演算命令がＳＩＭＤ命令であれば、ＳＩＭＤ命令で並列に演算できる要素の数が、演算対象要素数となる。第１演算命令による演算の繰り返し回数は、複数の演算要素の数を被除数とし、演算対象要素数を除数とする、整数の除法による除算の商の回数である。
【００１７】
第２処理は、演算対象要素数分の複数のマスクビットを含むマスクビット列３内のマスクビットに値を設定する処理である。第２処理では、複数の演算要素の数を被除数とし、演算対象要素数を除数とする、整数の除法による除算の剰余と同じ数の第１マスクビットに対して真を示す値を設定する。また第２処理では、マスクビット列３の第１マスクビット以外の第２マスクビットに対して偽を示す値を設定する。
【００１８】
第３処理は、マスクビット列３を用いた第２演算命令により、第１処理で演算をしない余り演算要素および演算対象外の非演算要素を含む、演算対象要素数分の複数の対象要素４ａそれぞれに対して演算を行う処理である。第２演算命令は、対応するマスクビットの値が真の要素に対する演算の結果を出力し、対応するマスクビットの値が偽の要素に対する演算の結果を出力しない演算命令である。第２演算命令では、複数の対象要素４ａのうち、余り演算要素に対して第１マスクビットを対応させ、非演算要素に対して第２マスクビットを対応させる。第２演算命令として、例えばマスク付きＳＩＭＤ命令を用いることができる。
【００１９】
例えば第２演算命令は、ロード命令、第３演算命令、およびストア命令を含む。ロード命令は、複数の対象要素を、第２プログラム２を実行するコンピュータのメモリ４から、そのコンピュータのプロセッサが有する第１レジスタ５に読み込む命令である。第３演算命令は、第１レジスタ５に読み込まれた対象要素それぞれに演算を行い、演算結果を、第２プログラム２を実行するコンピュータのプロセッサが有する第２レジスタ６に格納する命令である。ストア命令は、第２レジスタ６内の、対応するマスクビットの値が真の要素の演算結果を、第２プログラム２を実行するコンピュータのメモリ４に書き出し、対応するマスクビットの値が偽の要素の演算結果の書き出しを抑止する命令である。
【００２０】
第２演算命令に含まれるロード命令は、例えば、対応するマスクビットの値が真の対象要素を第１レジスタ５に読み込み、対応するマスクビットの値が偽の対象要素の読み込みを抑止する命令とすることもできる。
【００２１】
このようなコード生成装置１０によれば、第１プログラム１内のループ処理で演算対象となっているすべての要素を、ＳＩＭＤ命令で並列に演算させることが可能な第２プログラム２が生成される。第２プログラム２を用いれば、コンピュータに、余り演算要素を１回のマスク付きＳＩＭＤ命令で実行させることができ、同一演算の繰り返し処理を効率的に実行させることができる。
【００２２】
また、マスク付きＳＩＭＤ命令に含まれるロード命令として、対応するマスクビットの値が偽のＳＩＭＤ対象要素の読み込みを抑止するような命令を用いることで、演算対象外の非演算要素が未定義の場合であってもエラーを発生させずに済む。すなわち、一般的には、プロセッサが未定義のデータをメモリから読み込もうとすると、エラーが発生する。このようなエラーの発生を抑止することで、コード生成装置１０が生成した第２プログラム２を、多くのコンピュータで利用することができ、第２プログラム２の汎用性が向上する。
【００２３】
〔第２の実施の形態〕
次に、第２の実施の形態について説明する。第２の実施の形態は、ソースプログラムをコンパイラで機械語に翻訳する際に、マスク命令を併用することでＳＩＭＤ命令を有効利用により命令実行回を削減し、性能を向上させるものである。
【００２４】
図２は、第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してメモリ１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro Processing Unit）、またはＤＳＰ（Digital Signal Processor）である。プロセッサ１０１がプログラムを実行することで実現する機能の少なくとも一部を、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現してもよい。またプロセッサ１０１は、ＳＩＭＤレジスタ群１０１ａを有している。ＳＩＭＤレジスタ群１０１ａは、ＳＩＭＤ拡張命令を格納できるだけのデータ幅を有するレジスタの集合である。
【００２５】
メモリ１０２は、コンピュータ１００の主記憶装置として使用される。メモリ１０２には、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ１０２には、プロセッサ１０１による処理に必要な各種データが格納される。メモリ１０２としては、例えばＲＡＭ（Random Access Memory）などの揮発性の半導体記憶装置が使用される。
【００２６】
バス１０９に接続されている周辺機器としては、ストレージ装置１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、機器接続インタフェース１０７およびネットワークインタフェース１０８がある。
【００２７】
ストレージ装置１０３は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置１０３は、コンピュータの補助記憶装置として使用される。ストレージ装置１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置１０３としては、例えばＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）を使用することができる。
【００２８】
グラフィック処理装置１０４には、モニタ２１が接続されている。グラフィック処理装置１０４は、プロセッサ１０１からの命令に従って、画像をモニタ２１の画面に表示させる。モニタ２１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００２９】
入力インタフェース１０５には、キーボード２２とマウス２３とが接続されている。入力インタフェース１０５は、キーボード２２やマウス２３から送られてくる信号をプロセッサ１０１に送信する。なお、マウス２３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００３０】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク２４に記録されたデータの読み取りを行う。光ディスク２４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク２４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００３１】
機器接続インタフェース１０７は、コンピュータ１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置２５やメモリリーダライタ２６を接続することができる。メモリ装置２５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ２６は、メモリカード２７へのデータの書き込み、またはメモリカード２７からのデータの読み出しを行う装置である。メモリカード２７は、カード型の記録媒体である。
【００３２】
ネットワークインタフェース１０８は、ネットワーク２０に接続されている。ネットワークインタフェース１０８は、ネットワーク２０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００３３】
以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なお、第１の実施の形態に示した装置も、図２に示したコンピュータ１００と同様のハードウェアにより実現することができる。
【００３４】
コンピュータ１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。コンピュータ１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ１００に実行させるプログラムをストレージ装置１０３に格納しておくことができる。プロセッサ１０１は、ストレージ装置１０３内のプログラムの少なくとも一部をメモリ１０２にロードし、プログラムを実行する。またコンピュータ１００に実行させるプログラムを、光ディスク２４、メモリ装置２５、メモリカード２７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ストレージ装置１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００３５】
図２に示したコンピュータ１００に、コンパイルプログラムを実行させることで、ＦＯＲＴＲＡＮ、Ｃなどの高級言語で記述されたソースプログラムをコンパイルし、機械語で記述された実行プログラムを出力させることができる。第２の実施の形態では、コンピュータ１００は、ソースプログラムをコンパイルするとき、ＳＩＭＤレジスタ群１０１ａを用いたＳＩＭＤ命令を適用可能なループ処理については、ＳＩＭＤ命令に変換する。なお、ソースプログラムの言語は限定されないが、以下の説明では、ソースプログラムの言語としてＦＯＲＴＲＡＮを用いたものとする。
【００３６】
なお、コンピュータ１００がソースプログラムをコンパイルすることで生成された実行形式のプログラムは、コンピュータ１００で実行できると共に、コンピュータ１００以外のコンピュータでも実行できる。以下の説明では、生成された実行形式のプログラムを、コンピュータ１００自身が実行するものとして説明する。
【００３７】
ＳＩＭＤ命令を実行する場合、プロセッサ１０１は、特定のＳＩＭＤ幅を持つＳＩＭＤ要素単位に演算し、ＳＩＭＤ要素単位に演算結果をメモリ１０２に格納する。ＳＩＭＤ命令を実行するときのＳＩＭＤ要素数は、ＳＩＭＤ幅に応じて決定される。
【００３８】
図３は、ＳＩＭＤ幅とＳＩＭＤ要素数との関係を示す図である。図３の例では、ＳＩＭＤレジスタ３１の容量は３２バイトである。この場合、ＳＩＭＤ幅が１バイトであれば、ＳＩＭＤ要素数は「３２」となる。ＳＩＭＤ幅が４バイトであれば、ＳＩＭＤ要素数は「８」となる。ＳＩＭＤ幅が８バイトであれば、ＳＩＭＤ要素数は「４」となる。
【００３９】
以下の説明では、３２バイトのＳＩＭＤレジスタ３１を用い、ＳＩＭＤ幅８バイト、ＳＩＭＤ要素数「４」のＳＩＭＤ命令を使用するものとする。
図４は、ＳＩＭＤ命令の第１の適用例を示す図である。ＳＩＭＤ命令を適用する場合、コンピュータ１００は、ループ処理のサブルーチン３２を、ＳＩＭＤ命令を適用できるように書き換える。例えば書き換え後のサブルーチン３３では、ループ処理内の加算命令が、配列Ａと配列Ｂとから、要素を４つずつ取得して加算を行う命令「Ｃ（ｉ：ｉ＋３）＝Ａ（ｉ：ｉ＋３）＋Ｂ（ｉ：ｉ＋３）」に書き換えられている（ｉは、１以上の整数）。この命令は、配列Ａのｉ番目からｉ＋３番目の要素それぞれと、配列Ｂのｉ番目からｉ＋３番目の要素それぞれとの和を、配列Ｃのｉ番目からｉ＋３番目の要素に設定することを指示する命令である。書き換え後の命令は、コンパイルによって機械語のＳＩＭＤ命令に置き換えられる。
【００４０】
図４の例は、ループ回転数（ＳＩＭＤ化前のループ処理の繰り返し回数）が、１回のＳＩＭＤ命令で演算可能なＳＩＭＤ要素数の倍数となる場合を想定している。すなわち図４の例は、ループ回転数をＳＩＭＤ要素数で除算したときに余りが出ず、演算対象の要素の端数が生じない場合の例である。
【００４１】
演算対象の要素の端数が生じる場合、コンピュータ１００は、端数の要素を考慮したプログラムの書き換えを行う。
図５は、ＳＩＭＤ命令の第２の適用例を示す図である。図５の例では、元のサブルーチン３２内のループ処理が、書き換え後のサブルーチン３４において２つのループ処理に分かれている。一方が、ＳＩＭＤ命令を適用するループ処理（ＳＩＭＤループ処理）である。他方が、ＳＩＭＤ命令を適用しない処理（ｎｏＳＩＭＤループ処理）である。
【００４２】
書き換え後のサブルーチン３４では、元のサブルーチン３２内のループの繰り返し処理の回数を示す変数「ｘ」の値をＳＩＭＤ要素数「４」で除算したときの商（ｘ／４）が、ＳＩＭＤループ処理の繰り返し回数となる。また書き換え後のサブルーチン３４では、元のサブルーチン３２内のループの繰り返し処理の回数を示す変数「ｘ」の値をＳＩＭＤ要素数「４」で除算したときの剰余（ｘ％４）が、ｎｏＳＩＭＤループ処理の繰り返し回数となる。
【００４３】
サブルーチン３４では、ＳＩＭＤループ処理を終了後にｎｏＳＩＭＤループ処理を実行することで、ＳＩＭＤループ処理においてＳＩＭＤ命令が適用された端数の要素に対して、１要素ずつ演算処理が実行される。
【００４４】
以下、サブルーチン３４に示すようなｎｏＳＩＭＤループ処理を含む形式でコンパイルを行った場合において、ｎｏＳＩＭＤループ処理が処理効率に与える影響について考察する。
【００４５】
ここで元のサブルーチン３２におけるループ処理の繰り返し回数（回転数）と、書き換え後のサブルーチン３４のＳＩＭＤループ処理の繰り返し回数（ＳＩＭＤ処理回数）およびｎｏＳＩＭＤループ処理の繰り返し回数（ｎｏＳＩＭＤ処理回数）との間には、以下の関係がある。
・回転数＝ＳＩＭＤ要素数×ＳＩＭＤ処理回数＋ｎｏＳＩＭＤ処理回数
ｎｏＳＩＭＤ処理回数はＳＩＭＤ要素数未満の値であるため、回転数とＳＩＭＤ要素数が決まることで、ＳＩＭＤ処理回数とｎｏＳＩＭＤ処理回数とも一意に決定される。例えば、回転数が「１１１」であり、ＳＩＭＤ要素数が「４」の場合、ＳＩＭＤ処理回数は「２７」、ｎｏＳＩＭＤ処理回数は「３」となる（１１１＝４×２７＋１×３）。
【００４６】
ＳＩＭＤ命令適用後のＳＩＭＤ処理回数とｎｏＳＩＭＤ処理回数との合計に対するｎｏＳＩＭＤ処理回数の割合（ｎｏＳＩＭＤ率）が小さい程、ＳＩＭＤ命令の適用による演算効率の向上効果が大きいと考えられる。
【００４７】
図６は、ＳＩＭＤ幅ごとの回転数に応じたｎｏＳＩＭＤ率を示す図である。図６に示すように、回転数が十分に大きい場合には、複数の要素に対する演算を同時にできるＳＩＭＤ命令の効果が大きく、かつＳＩＭＤ処理回数がｎｏＳＩＭＤ処理回数よりも大きくなる。そのため、十分な性能向上が見込める。
【００４８】
しかし回転数が少ないとｎｏＳＩＭＤ率が高くなる。またＳＩＭＤ幅が大きいと、ＳＩＭＤ幅が小さい場合よりもｎｏＳＩＭＤ率が高くなる。ｎｏＳＩＭＤ率が高いと、ＳＩＭＤ命令適用によるＳＩＭＤ効果が低くなる。しかもＳＩＭＤ命令を適用する場合、ループ分割による判定文などの処理が追加されるため、ＳＩＭＤ命令を適用することで、ＳＩＭＤ命令を適用しない場合よりも性能が劣化することがある。
【００４９】
特にＳＩＭＤ命令が適用された回転数が少ないループが、上位階層のループから繰り返し呼び出されるようなプログラム構造では、ＳＩＭＤ命令を適用したことによる性能劣化が顕著となる。
【００５０】
図７は、ループ処理が多段階になっているプログラムの例を示す図である。図７の例では、ループ処理３５が、ＳＩＭＤ命令への展開対象である。このループ処理３５は、他のループ処理から繰り返し呼び出される。このようなループ処理３５において、回転数（ｘ）が少なく、ｎｏＳＩＭＤ率が高い場合、ループ処理３５にＳＩＭＤ命令を適用しても、ＳＩＭＤ命令使用による演算処理の並列化のメリットを享受できない。かえって、ループ処理３５にＳＩＭＤ命令を適用すると、ＳＩＭＤ命令を適用しない場合より、ループ分割による分岐命令数増加による性能劣化が発生する可能性がある。
【００５１】
このように、ループ処理をＳＩＭＤループ処理とｎｏＳＩＭＤループ処理とに分割したケースでは、回転数が少ない場合に、ｎｏＳＩＭＤ率が上がり、性能劣化を招く。そこで第２の実施の形態では、マスク命令を使用することで、ｎｏＳＩＭＤループ処理を適用していた処理についてもＳＩＭＤ命令を適用できるようにすることで性能劣化を抑止し、演算の高速化を実現する。
【００５２】
図８は、マスク命令を使用したＳＩＭＤ命令の適用例を示す図である。図５に示した例においてｎｏＳＩＭＤループ処理が適用された余りループ処理について、コンピュータ１００は、マスク付きのＳＩＭＤ命令に変換することで、生成されるプログラムによる演算の効率化を実現する。例えばコンピュータは、ＳＩＭＤ命令によるＳＩＭＤ要素数以下の端数のループ処理（余りループ処理）を、余りＳＩＭＤ化プログラム３６に変換する。余りＳＩＭＤ化プログラム３６は、端数のループ処理を１つのＳＩＭＤ命令に置き換えたものである。以下、余りループ処理を１つのＳＩＭＤ命令に置き換えることを、余りループ処理のＳＩＭＤ化と呼ぶ。
【００５３】
例えばコンピュータ１００は、ＳＩＭＤ命令におけるＳＩＭＤ要素数が「８」の場合には、同一の７つ以下の演算を並列に実行する場合に、余りＳＩＭＤ化プログラム３６に変換する。またコンピュータ１００は、ＳＩＭＤ命令におけるＳＩＭＤ要素数が「４」の場合には、同一の３つ以下の演算を並列に実行する場合に、余りＳＩＭＤ化プログラム３６に変換する。以降の例では、ＳＩＭＤ命令のＳＩＭＤ要素数が「４」であるものとする。
【００５４】
図８の例では、マスク使用ＳＩＭＤ化を行わない場合、ｎｏＳＩＭＤループ処理により、処理を３回繰り返すこととなる。それに対して、余りＳＩＭＤ化プログラム３６に変換することで、余りループ処理を、１回のＳＩＭＤ命令の実行で済ませることができる。
【００５５】
余りＳＩＭＤ化プログラム３６では、マスク命令により、ＳＩＭＤレジスタ内の４要素のうち、有効な要素数を指定する。図８の例では、ＳＩＭＤ命令では４要素に対して同時に演算するが、有効な要素は、先頭から３つの要素である。そのため４番目の要素の結果はメモリ１０２に反映されない。
【００５６】
以下、図９を参照して、余りＳＩＭＤ化プログラム３６に示される命令の内容について説明する。
図９は、余りＳＩＭＤ化処理の一例を示す図である。一般にマスク命令とは、コンパイラの最適化の阻害要因となるプログラムの分岐をなくすために用意されている。マスク命令によって、演算結果を判定する要素と、反映させない要素を区別するためのマスクビット列が生成される。例えばマスク設定命令「ｒｅｐ  ｍａｓｋ  １，３」により、１ビット目から３ビット目に真を示す値「１」を設定し、４ビット目に偽を示す値「０」を設定したマスクビット列４１が生成される。
【００５７】
マスクビット列４１には、左側を先頭として、複数のマスクビットが並べられている。マスクビット列４１の各ビットは、マスクビット列４１を用いた命令によって演算対象となる複数の要素における、同じ順番の要素に１対１で対応する。例えば、マスク付きの命令における演算対象の要素がｉ番目からｉ＋３番目までの４つの要素であるものとする。この場合、マスクビット列４１の左端のビットがｉ番目の要素に対応し、左から２番目のビットがｉ＋１番目の要素に対応し、左から３番目のビットがｉ＋２番目の要素に対応し、右端のビットがｉ＋３番目の要素に対応する。
【００５８】
マスクビット列４１が生成されると、マスク付きロード命令「ｌｏａｄ，ｓ  ａ（ｉ：ｉ＋３），ｍａｓｋ」により、メモリ１０２からＳＩＭＤレジスタ４２に、配列Ａ内の要素が読み込まれる。このときマスクビット列４１が参照され、値が真のビットに対応する要素のみがメモリ１０２から読み込まれる。
【００５９】
次にマスク付きロード命令「ｌｏａｄ，ｓ  ｂ（ｉ：ｉ＋３），ｍａｓｋ」により、メモリ１０２からＳＩＭＤレジスタ４３に、配列Ｂ内の要素が読み込まれる。このときマスクビット列４１が参照され、値が真のビットに対応する要素のみがメモリ１０２から読み込まれる。
【００６０】
さらにＳＩＭＤ命令「ａｄｄ，ｓ  ａ（ｉ：ｉ＋３），ｂ（ｉ：ｉ＋３），ｃ（ｉ：ｉ＋３）」により、変数ｉの値が同じ、配列Ａの要素と配列Ｂの要素の値が加算され、結果が、配列Ｃの要素としてＳＩＭＤレジスタ４４に格納される。そしてマスク付きストア命令「ｓｔｏｒｅ，ｓ  ｃ（ｉ：ｉ＋３），ｍａｓｋ」により、ＳＩＭＤレジスタ４４内の各要素の値が、メモリ１０２に書き込まれる。このときマスクビット列４１が参照され、値が真のビットに対応する要素のみがメモリ１０２に書き込まれる。
【００６１】
このような余りループ処理のＳＩＭＤ化は、以下の２つの技術を利用することで実現されている。
（１）対象外の要素へのアクセスの抑止
余りループＳＩＭＤ化処理で扱う要素数はＳＩＭＤ要素数以下である。ＳＩＭＤ命令を適用する場合、存在しない要素（未定義要素）については処理の対象から除外される。ＳＩＭＤ要素数の単位でメモリ１０２からデータをロードすると、未定義要素が格納されている領域をそのままアクセスしてしまう。そこで第２の実施の形態では、マスク付きロード命令を用い、処理対象の要素のみに絞って要素をロードするように、余りループＳＩＭＤ化を行う。マスク付きロード命令は、ＳＩＭＤの要素のうちマスク指定により処理対象の要素のみを、メモリ１０２からレジスタにロードする命令である。図９の例では、未定義要素の領域のデータをロードしないように、ロード命令時にマスク指定することで、ＳＩＭＤ演算対象とする要素のみアクセスされ、演算対象の領域外へのアクセスが抑止されている。
【００６２】
なお、図９の例では、プロセッサ１０１がマスク付きロード／ストア命令をサポートしている場合を想定している。プロセッサ１０１がマスク付きロード命令をサポートしていない場合、マスク付きロード命令に代えて、領域外アクセスをしても領域外割込みを発生させないロード命令を用いることができる。領域外アクセスをしても領域外割込みを発生させないロード命令は、範囲外アクセスが発生する可能性が高いプリフェッチに用いられており、一般的なプロセッサにおいてサポートされている。
【００６３】
（２）マスクビット列４１の作成
一般的なマスク処理は、分岐削減のために利用される。分岐削減のためのマスク処理では、条件の成立の有無がマスクビットに反映される。余りループ処理のＳＩＭＤ化では、有効な要素についてのみ、明示的に有効であることを示すマスクビットが設定される。すなわち、存在しない要素に対応するマスクビットに偽を示す値「０」を設定することで、マスク付きロード命令により、未定義要素のデータのロードが抑止される。
【００６４】
同様に、偽を示す値「０」が設定されマスクビットに対応する未定義要素は、マスク付きストア命令を用いることで、メモリ１０２への格納対象から除外される。
第２の実施の形態に示すコンピュータ１００は、ソースプログラムのコンパイル時に、余りループ処理のＳＩＭＤ化を行う。例えばコンピュータ１００は、コンパイラの翻訳オプションとして、ＳＩＭＤ命令の適用を指定することができる。また、ソースプログラムに、ＯＣＬ（Object Constraint Language）文またはプラグマ（＃ｐｒａｇｍａ）によって、明示的にＳＩＭＤ命令を適用することを指定することもできる。この場合、コンピュータ１００は、ソースプログラムを解析し、ＳＩＭＤ命令を適用する旨の文を検出すると、ＳＩＭＤ命令を使用したオブジェクトコードを出力する。このとき、余りループ処理についてもＳＩＭＤ命令を適用する。
【００６５】
図１０は、ループ処理のＳＩＭＤ化の一例を示す図である。図１０の例では、コンピュータ１００は、ソースプログラムのＳＩＭＤ命令を適用するサブルーチン３２を、ループ処理をＳＩＭＤループ処理と余りループ処理とに展開したサブルーチン３４を生成する。次にコンピュータ１００は、サブルーチン３４を中間言語のプログラム（中間プログラム）に変換し、その中間プログラムをオブジェクトコードに変換する。
【００６６】
例えばサブルーチン３４内のＳＩＭＤループ処理と余りループ処理とは、中間プログラム５１，５２に変換される。このとき、余りループ処理の中間プログラム５２については、ＳＩＭＤ命令は使用されていない。余りループ処理の中間プログラム５２を解析することで、マスク付きＳＩＭＤ命令を含む余りＳＩＭＤ化プログラム５３が生成される。図１０では、余りＳＩＭＤ化プログラム５３内の命令文を、機械語に１対１で対応する低水準言語で表している。図１０に示す余りＳＩＭＤ化プログラム５３に示す各命令文を機械語に置き換えることで、オブジェクトコードが生成される。
【００６７】
次に、余りループ処理を含めてＳＩＭＤ化を行うためのコンパイラが有する機能について説明する。
図１１は、コンピュータが有する機能の一例を示すブロック図である。コンピュータ１００は、記憶部１１０とコンパイラ１２０とを有する。記憶部１１０は、例えばメモリ１０２またはストレージ装置１０３である。コンパイラ１２０は、コンピュータ１００がコンパイルプログラムを実行することで実現される機能である。
【００６８】
記憶部１１０は、ソースプログラム１１１や、ソースプログラム１１１を翻訳することで生成される機械語プログラム１１２を記憶する。
コンパイラ１２０は、解析部１２１、中間コード変換部１２２、およびコード生成部１２３を有する。
【００６９】
解析部１２１は、ソースプログラム１１１を解析する。解析部１２１は、ソースプログラム１１１内にループ処理を検出すると、ループ構成情報１２１ａを生成する。ループ構成情報１２１ａは、ループ処理をＳＩＭＤ化するか否かを示す情報や、ＳＩＭＤ化に用いるパラメータの値などが含まれる。
【００７０】
中間コード変換部１２２は、解析部１２１による解析結果に基づいて、ソースプログラム１１１を中間コードに変換する。例えば中間コード変換部１２２は、サブルーチン３２（図１０参照）に含まれるループ処理をＳＩＭＤループ処理と余りループ処理とに分け、ＳＩＭＤループ処理を示す中間プログラム５１と、余りループ処理を示す中間プログラム５２とを生成する。
【００７１】
コード生成部１２３は、中間コード変換部１２２によって生成された中間コードに基づいて、機械語のコードを生成する。コード生成部１２３は、ループ出力部１２３ａを有している。ループ出力部１２３ａは、中間コードにおけるループ処理を機械語に変換する。ループ出力部１２３ａは、余りループ展開部１２３ｂを有する。余りループ展開部１２３ｂは、ループ処理のうちの余りループ処理を、ＳＩＭＤ化した機械語に変換する。
【００７２】
なお、図１１に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
図１２は、ループ構成情報の一例を示す図である。ループ構成情報１２１ａは、ソースプログラム１１１内のループ処理を記述した箇所（ループ処理部分５４）を解析することで生成される。ループ構成情報１２１ａには、ＳＩＭＤ対象フラグ、ＳＩＭＤ要素数、制御変数、初期値、終値、増分、変数などの情報が含まれる。ＳＩＭＤ対象フラグは、ＳＩＭＤ化を行うか否かを示すフラグである。例えばＳＩＭＤ化を行う場合、ＳＩＭＤ対象フラグに「ｏｎ」が設定される。ＳＩＭＤ要素数はループ回転数である。制御変数は、演算対象の要素の順番を示す変数である。初期値は、制御変数の初期値である。終値は、制御変数の最大値である。増分は、処理を１ループ分実行した後に制御変数に加算する値である。変数は、演算対象の要素を示す変数または配列である。
【００７３】
次に、ソースプログラム１１１をコンパイル時にループ出力部１２３ａが実行する処理について、詳細に説明する。
図１３は、ループ出力部の処理の手順の一例を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
【００７４】
［ステップＳ１０１］ループ出力部１２３ａは、ソースプログラム１１１を解析することで生成された中間コードに含まれるループ処理のうち、未処理のループ処理部分を１つ抽出する。
【００７５】
［ステップＳ１０２］ループ出力部１２３ａは、抽出したループ処理部分に示される処理がＳＩＭＤ化可能か否かを判断する。例えばループ出力部１２３ａは、抽出したループ処理部分に対応するループ構成情報１２１ａのＳＩＭＤ対象フラグの値が「ｏｎ」であれば、ＳＩＭＤ化可能と判断する。例えば、ループ処理における演算対象となっている複数の要素が、メモリ１０２内の連続領域に格納されている場合、そのループ処理の処理手順が記述されたループ処理部分は、ＳＩＭＤ化可能である。ループ出力部１２３ａは、ＳＩＭＤ化可能な場合、処理をステップＳ１０４に進める。またループ出力部１２３ａは、ＳＩＭＤ化できない場合、処理をステップＳ１０３に進める。
【００７６】
［ステップＳ１０３］ループ出力部１２３ａは、抽出したループ処理部分について、ＳＩＭＤ化せずに、機械語のコードに変換する。その後、ループ出力部１２３ａは、処理をステップＳ１０６に進める。
【００７７】
［ステップＳ１０４］ループ出力部１２３ａは、余りループ処理以外のＳＩＭＤループ処理部分について、ＳＩＭＤ化処理を行う。例えばループ出力部１２３ａは、ループ回数（演算対象の要素数）がコンパイル時には不明の場合、抽出したループ処理部分を、ＳＩＭＤループ処理の記述（ＳＩＭＤ処理部分）と余りループ処理の記述（余りループ処理部分）とに分ける。またループ出力部１２３ａは、ループ回数が固定であるが、演算対象の要素数をＳＩＭＤ幅で除算したときに余りが生じる場合にも、抽出したループ処理部分を、ＳＩＭＤループ処理部分と余りループ処理部分とに分ける。ステップＳ１０４では、ループ出力部１２３ａは、ＳＩＭＤループ処理部分についてのみ、ＳＩＭＤ命令を用いた並列処理を行うループ処理を記述した機械語のコードに変換する。
【００７８】
［ステップＳ１０５］余りループ展開部１２３ｂは、余りループ展開処理を行う。余りループ展開処理の詳細は後述する（図１４参照）。
［ステップＳ１０６］ループ出力部１２３ａは、中間コード内に、未処理のループ処理部分があるか否かを判断する。ループ出力部１２３ａは、未処理のループ処理部分がある場合、処理をステップＳ１０１に進める。またループ出力部１２３ａは、すべてのループ処理部分が処理済みとなったら、処理を終了する。
【００７９】
次に、余りループ展開処理について詳細に説明する。
図１４は、余りループ展開処理の手順の一例を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。
【００８０】
［ステップＳ１１１］余りループ展開部１２３ｂは、余りループ処理部分で演算対象となる要素数（余り要素数）を、変数ｒに設定する命令のオブジェクトコードを生成する。 余り要素数は、ＳＩＭＤ要素数未満の値である。例えば余りループ展開部１２３ｂは、ループ構成情報１２１ａ内の値を用いて、「ｒ＝ｘ−ｖ×（ｘ／ｖ）」の計算処理を命令する機械語のコードを生成する。ここで、ｘはループ回転数である。ｖはＳＩＭＤ要素数である。余りループ処理におけるＳＩＭＤ要素数は、ＳＩＭＤループ処理のＳＩＭＤ要素数と同じ値であり、例えば「４」である。「ｘ／ｖ」は、余りを切り捨てる除算である。
【００８１】
［ステップＳ１１２］余りループ展開部１２３ｂは、変数ｒに示される余り要素数だけ有効とするマスクを設定する命令のオブジェクトコードを生成する。生成されるオブジェクトコードは、例えば、上位から余り要素数分のマスクビットに真を示す値「１」を設定し、残りのビットに偽を示す値「０」を設定したマスクビット列の生成命令（ｍａｓｋｒｅｐ  １，ｒ）に対応する機械語のコードである。
【００８２】
［ステップＳ１１３］余りループ展開部１２３ｂは、マスク付きロード命令のオブジェクトコードを生成する。例えば余りループ展開部１２３ｂは、ステップＳ１１２で生成したオブジェクトコードによって生成されるマスクにおいて、真の値のマスクビットに対応する要素のみをメモリ１０２からロードするロード命令のオブジェクトコードを生成する。このときのロード命令は、マスク付き領域外アクセスをしても割込みを発生させないＳＩＭＤロード命令である。例えば配列Ａと配列Ｂそれぞれから１つずつの要素を用いた演算を行う場合、「ｌｏａｄ，ｓ  ａ（ｉ：ｉ＋３），ｍａｓｋ」と「ｌｏａｄ，ｓ  ｂ（ｉ：ｉ＋３），ｍａｓｋ」との各命令に対応する機械語のコードが生成される。
【００８３】
［ステップＳ１１４］余りループ展開部１２３ｂは、ＳＩＭＤ命令のオブジェクトコードを生成する。例えば「ａｄｄ，ｓ  ａ（ｉ：ｉ＋３），ｂ（ｉ：ｉ＋３），ｃ（ｉ＋３）」の命令に対応する機械語のコードが生成される。
【００８４】
［ステップＳ１１５］余りループ展開部１２３ｂは、マスク付きストア命令のオブジェクトコードを生成する。例えば余りループ展開部１２３ｂは、ステップＳ１１２で生成したコードによって生成されるマスクにおいて、真の値のマスクビットに対応する要素のみをメモリ１０２に格納するマスク付きストア命令の機械語のコードを生成する。例えば「ｍｓｔｏｒｅ，ｓ  ｃ（ｉ：ｉ＋３），ｍａｓｋ」の命令に対応する機械語のコードが生成される。
【００８５】
以上のようにして生成したプログラムを実行することで、余りループ処理についてもＳＩＭＤ命令による効率的な演算が行われる。特にＳＩＭＤ命令に展開されているもののループ回転数が少ないループ処理について、性能を大幅に向上させることができる。またＳＩＭＤ幅が大きい場合、余りループ処理を１回のＳＩＭＤ命令で実行できることで、大幅な性能向上が見込める。
【００８６】
すなわち、従来技術では、ＳＩＭＤ命令に展開されているもののループ回転数が少ないループ処理では、ＳＩＭＤループ処理の割合が低くなる。そのため、ＳＩＭＤ命令による演算処理並列化のメリットを十分に享受できず、ループ分割による分岐命令数が増加することでかえって性能が劣化する場合もある。第２の実施の形態のように余りループ処理についてもＳＩＭＤ化を可能とすることで、ＳＩＭＤ化によって性能が劣化するような副作用は発生せず、安定して性能を向上させることができる。
【００８７】
特に、ＳＩＭＤ命令が適用されたループが上位階層ループから多く呼ばれるプログラム構造では、コンパイル時にループ回転数がわからない。そのためＳＩＭＤ展開せざるを得ず、従来のように、余りループ処理をＳＩＭＤ化できないと、そのことが性能を低下させる大きな原因となる。第２の実施の形態によれば、ループ回転数が少ない場合であっても、ＳＩＭＤ化すれば処理を高速化することができる。
【００８８】
さらに余りループ処理のＳＩＭＤ化による処理効率の向上効果は、ＳＩＭＤ幅が大きいほど大きくなる。技術の進歩に伴いプロセッサのＳＩＭＤ幅は拡張される傾向にあり、余りループ処理のＳＩＭＤ化による処理効率の向上効果は、今後さらに増大することが期待できる。
【００８９】
〔その他の実施の形態〕
マスクビットの値の設定は、比較命令を用いて、有効な要素のみが"真"になるよう設定することもできる。
【００９０】
図１５は、比較命令を用いたマスクビットの値の設定例を示す図である。図１５に示す例ではｆｃｍｐｅｑｄ命令を利用している。この命令は、「ｆｃｍｐｅｑｄ  ｒｅｇ１，ｒｅｇ２，ｒｅｇ３」というように、３つの引数をとる。ｆｃｍｐｅｑｄ命令は、ｒｅｇ１の値とｒｅｇ２の値とを比較して、値が等しい場合にｒｅｇ３に「１」を設定し、値が等しくない場合にｒｅｇ３に「０」を設定する命令である。「ｆｃｍｐｅｑｄ  ｆｔ０，ｆｒ０，ｆｒ４」とすることで、マスクビット列として用いるｆｒ４のすべてのビットに「１」が設定される。
【００９１】
ｅｘｔｍａｓｋ命令は、「ｅｘｔｍａｓｋ  ｒｅｇ１，＃ｘ」というように、２つの引数をとる。ｅｘｔｍａｓｋ命令は、ｒｅｇ１の上位からｘまでを有効な値「１」とし、それ以外は無効な値「０」とする命令である。「ｅｘｔｍａｓｋ  ｆｒ４，＃ｒ」とすることで、ｆｒ４の上位からｒビット目より後のすべてのビットに、無効を示す値「０」が設定される。
【００９２】
また第２の実施の形態では、中間コードからオブジェクト展開時に、余りループ処理のＳＩＭＤ化を行っているが、余りループ処理をＳＩＭＤ命令に置き換える処理のタイミングは、コンパイラの処理における何れのフェーズで実施してもよい。例えば中間コード生成時に、余りループ処理をＳＩＭＤ化させるコードに変換してもよい。
【００９３】
また第２の実施の形態では、ＳＩＭＤ要素長が固定の場合の例を示したが、ＳＩＭＤ要素長が可変でも適用可能である。
また第２の実施の形態ではマスク付きロード命令を利用しているが、マスク付きロード命令をサポートしていないプロセッサも存在する。マスク付きロード命令をサポートしないプロセッサ用にコンパイルをする場合には、マスク付きロード命令の代替として、領域外アクセスをしても割込みを発生させないロード命令を使用することができる。領域外アクセスでも割込みを発生させないロード命令、範囲外アクセスが発生する可能性が高いプリフェッチ命令でも利用されており、一般的なプロセッサがサポートしている。
【００９４】
また第２の実施の形態では、ループ処理で演算対象となる複数の要素について、演算の順番が早い順に、演算処理をＳＩＭＤ命令に変換しているが、逆に、演算の順番が遅い順に、演算処理をＳＩＭＤ命令に変換することも可能である。
【００９５】
また第２の実施の形態では、ソースプログラム中の１つの余りループ処理についてのＳＩＭＤ化について説明したが、ソースプログラム中に、余りループ処理が発生するようなループ処理が複数存在する場合もある。この場合、各ループ処理について、余りループ処理を含めたＳＩＭＤ化を行うことができる。多数の余るループをＳＩＭＤ化することで、生成される実行形式のプログラムによる処理の効率が向上する。
【００９６】
また第２の実施の形態では、ループの階層が１つの場合について説明したが、ループ構造が複数の階層構造になっていても、同様に余るループのＳＩＭＤ化が可能である。
なお、上記第１の実施の形態および第２の実施の形態では、ＳＩＭＤ命令を例として示したが、命令と当該命令の演算対象としてのオペランドである要素との組を複数含むＶＬＩＷ（Very Long Instruction Word）命令にも適用可能である。
【００９７】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【００９８】
１  第１プログラム
２  第２プログラム
３  マスクビット列
４  メモリ
４ａ  対象要素
５  第１レジスタ
６  第２レジスタ
１０  コード生成装置
１１  記憶部
１２  処理部
【図１】
2018124877.tif 000003
【図２】
2018124877.tif 000004
【図３】
2018124877.tif 000005
【図４】
2018124877.tif 000006
【図５】
2018124877.tif 000007
【図６】
2018124877.tif 000008
【図７】
2018124877.tif 000009
【図８】
2018124877.tif 000010
【図９】
2018124877.tif 000011
【図１０】
2018124877.tif 000012
【図１１】
2018124877.tif 000013
【図１２】
2018124877.tif 000014
【図１３】
2018124877.tif 000015
【図１４】
2018124877.tif 000016
【図１５】
2018124877.tif 000017