(57)【要約】コンパイル装置（１０）のベクトルロード命令生成部（１２）は、繰り返し計算処理にて要素ａ［ｉ］として用いられる「第１データユニット群」をメモリから１ワード単位でパックした状態で第１ベクトルレジスタにロードする命令を生成する。各データユニットは、（１／２）ｋワードである。ベクトルロード命令生成部（１２）は、要素［ｉ＋２ｋ］として用いられる第２データユニット群を第２ベクトルレジスタにロードする命令を生成する。ベクトルシフトダブル命令生成部（１３）は、第１ベクトルレジスタ及び第２ベクトルレジスタのデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる命令を生成する。
2020116025.tif 000002
【特許請求の範囲】
【請求項１】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理手段を具備し、
前記コンパイル処理手段は、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成するベクトルロード命令生成手段と、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成するベクトルシフト命令生成手段と、
を含む、
コンパイル装置。
【請求項２】
前記コンパイル処理手段は、前記ベクトルロード命令生成手段が前記第１ベクトルロード命令及び前記第２ベクトルロード命令を生成する処理を開始し且つ前記ベクトルシフト命令生成手段が前記第１ベクトルシフトダブル命令を生成する処理を開始する条件が満たされているか否かを判定する条件判定手段をさらに含み、
前記条件は、各計算処理において計算対象となるすべての要素の添え字が連続しているという条件を含む、
請求項１記載のコンパイル装置。
【請求項３】
前記コンパイル処理手段は、前記計算処理がＮ（Ｎは２以上の自然数）回繰り返される場合、前記Ｎ×（１／２）ｋ及びシステムにて許容されている最大ベクトル長のうちで小さい方をベクトル長として選択するためのベクトル長算出命令を生成するベクトル長算出命令生成手段をさらに具備し、
前記ベクトルロード命令生成手段は、それぞれ前記ベクトル長を有する前記第１ベクトルデータ及び前記第２ベクトルデータをロードするための前記第１ベクトルロード命令及び前記第２ベクトルロード命令を生成する、
請求項１又は２に記載のコンパイル装置。
【請求項４】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／２ワード型である場合、前記一連のデータ列を１／２ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項５】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／４ワード型である場合、
前記一連のデータ列を１／４ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令と、
前記一連のデータ列を２／４ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、
前記一連のデータ列を１／４ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、
を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項６】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／８ワード型である場合、
前記一連のデータ列を７／８ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令と、
前記一連のデータ列を６／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、
前記一連のデータ列を５／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、
前記一連のデータ列を４／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋４］に対応する第５ベクトルデータとして、１ワード単位でパックした状態で第５ベクトルレジスタにストアさせる第４ベクトルシフトダブル命令と、
前記一連のデータ列を３／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋５］に対応する第６ベクトルデータとして、１ワード単位でパックした状態で第６ベクトルレジスタにストアさせる第５ベクトルシフトダブル命令と、
前記一連のデータ列を２／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋６］に対応する第７ベクトルデータとして、１ワード単位でパックした状態で第７ベクトルレジスタにストアさせる第６ベクトルシフトダブル命令と、
前記一連のデータ列を１／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋７］に対応する第８ベクトルデータとして、１ワード単位でパックした状態で第８ベクトルレジスタにストアさせる第７ベクトルシフトダブル命令と、
を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項７】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル方法であって、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む、
コンパイル方法。
【請求項８】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理をコンパイル装置に実行させる制御プログラムであって、
前記コンパイル処理は、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む、
制御プログラムを格納する非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンパイル装置、コンパイル方法、及び制御プログラムに関する。
【背景技術】
【０００２】
ソースプログラム内に隣接するメモリアクセス命令が存在するときに重複したメモリアクセスを削減したオブジェクトコードに変換することによって、ベクトル計算機の実行性能を向上させる、コンパイル装置が提案されている（例えば、特許文献１）。特許文献１に開示されているコンパイル装置は、隣接するメモリアクセス命令を１つのメモリアクセス命令に変換する。さらに、該コンパイル装置は、該１つのメモリアクセス命令によってロードされた第１ベクトルレジスタのデータを、スライドさせて第２ベクトルレジスタに格納させる命令を生成する。そして、該コンパイル装置は、第１ベクトルレジスタのデータと第２のベクトルレジスタのデータとの演算を行う命令を生成する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−４８００９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、特許文献１のコンパイラ装置は、第１ベクトルレジスタのデータをスライドさせて第２ベクトルレジスタに格納させる命令を生成しているため、演算に用いる要素が不足する可能性がある（特許文献１の図４参照）。この場合、特許文献１のコンパイラ装置は、不足した要素を補うためロード/ストアや演算のための追加のベクトル命令、または、スカラ命令を生成する必要がある。すなわち、特許文献１のコンパイラ装置は、ソースプログラムの最適化が不十分であり、プログラムを十分に高速化できていない可能性がある。【０００５】
本開示の目的は、プログラムの高速化を実現することができる、コンパイル装置、コンパイル方法、及び制御プログラムを提供することにある。
【課題を解決するための手段】
【０００６】
第１の態様にかかるコンパイル装置は、（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理部を具備し、前記コンパイル処理部は、前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成するベクトルロード命令生成部と、前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成するベクトルシフト命令生成部と、を含む。【０００７】
第２の態様にかかるコンパイル方法は、（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル方法であって、前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む。【０００８】
第３の態様にかかる制御プログラムは、（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理をコンパイル装置に実行させる制御プログラムであって、前記コンパイル処理は、前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む。
【発明の効果】
【０００９】
本開示により、プログラムの高速化を実現することができる、コンパイル装置、コンパイル方法、及び制御プログラムを提供することができる。
【図面の簡単な説明】
【００１０】
【図１】第１実施形態のコンパイル装置の一例を示すブロック図である。
【図２】第２実施形態のコンパイル装置の一例を示すブロック図である。
【図３】第２実施形態の原始プログラムの一例を示す図である。
【図４】第２実施形態のコンパイル装置による、ベクトル化技法を適用可能か否かについての解析処理の一例を示すフローチャートである。
【図５】第２実施形態のコンパイル装置によるベクトル化技法の一例を示すフローチャートである。
【図６】第２実施形態のベクトル化技法によって生成されるオブジェクトコードの一例を示す図である。
【図７】第２実施形態のベクトル化技法にて生成されるベクトルロード命令の説明に供する図である。
【図８】第２実施形態のベクトル化技法にて生成されるベクトルシフトダブル命令の説明に供する図である。
【図９】第２実施形態のベクトル化技法にて生成されるパックドベクトル演算命令の説明に供する図である。
【図１０】１／４ワード型の場合に、第２実施形態のベクトル化技法によって生成されるオブジェクトコードの一例を示す図である。
【図１１】１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるベクトルロード命令の説明に供する図である。
【図１２】１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるベクトルシフトダブル命令の説明に供する図である。
【図１３】１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるパックドベクトル演算命令の説明に供する図である。
【図１４】コンパイル装置のハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１１】
以下、図面を参照しつつ、実施形態について説明する。なお、実施形態において、同一又は同等の要素には、同一の符号を付し、重複する説明は省略される。
【００１２】
＜第１実施形態＞
図１は、第１実施形態のコンパイル装置の一例を示すブロック図である。図１においてコンパイル装置１０は、コンパイル処理部１１を有している。コンパイル処理部１１は、原始プログラム（ソースプログラム）を、オブジェクトコードに変換する。この原始プログラムは、（１／２）ｋワード型の配列ａの要素ａ［ｉ］、要素ａ［ｉ＋１］、及び要素ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する「計算処理」を添え字ｉの値を１つずつずらしながら繰り返し実行するためのプログラムである。ｋは自然数であり、添え字ｉは０以上の整数である。上記の算術計算は、要素ａ［ｉ］と要素ａ［ｉ＋１］とが配列内で隣接しているので、配列の「隣接要素計算」を含んでいる。以下では、上記の繰り返し実行される計算処理を、「繰り返し計算処理」と呼ぶことがある。
【００１３】
コンパイル処理部１１は、第１実施形態の「ベクトル化技法」を実行する。コンパイル処理部１１は、ベクトルロード命令生成部１２と、ベクトルシフトダブル命令生成部１３とを含む。
【００１４】
ベクトルロード命令生成部１２は、繰り返し計算処理にて要素ａ［ｉ］として用いられる「第１データユニット群」をメモリ（図示せず）から１ワード単位でパックした状態で第１ベクトルレジスタにロードするための第１ベクトルロード命令を生成する。各データユニットは、（１／２）ｋワードである。さらに、ベクトルロード命令生成部１２は、繰り返し計算処理にて要素［ｉ＋２ｋ］として用いられる第２データユニット群をメモリ（図示せず）から１ワード単位でパックした状態で第２ベクトルレジスタにロードするための第２ベクトルロード命令を生成する。以下では、上記の「第１データユニット群」及び「第２データユニット群」を、それぞれ、「第１ベクトルデータ」及び「第２ベクトルデータ」と呼ぶことがある。
【００１５】
ベクトルシフトダブル命令生成部１３は、第１ベクトルデータ及び第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせるベクトルシフトダブル命令を生成する。第３ベクトルレジスタにストアされる上記データ列の一部は、要素ａ［ｉ＋１］に対応する「第３ベクトルデータ」である。
【００１６】
以上のように第１実施形態によれば、コンパイル装置１０は、コンパイル処理部１１を有している。コンパイル処理部１１にてベクトルロード命令生成部１２は、繰り返し計算処理にて要素ａ［ｉ］として用いられる「第１データユニット群」をメモリ（図示せず）から１ワード単位でパックした状態で第１ベクトルレジスタにロードするための第１ベクトルロード命令を生成する。各データユニットは、（１／２）ｋワードである。さらに、ベクトルロード命令生成部１２は、繰り返し計算処理にて要素［ｉ＋２ｋ］として用いられる第２データユニット群をメモリ（図示せず）から１ワード単位でパックした状態で第２ベクトルレジスタにロードするための第２ベクトルロード命令を生成する。
【００１７】
このコンパイル装置１０の構成により、第１ベクトルレジスタ及び第２ベクトルレジスタにおける１ワード単位の各レジスタ領域を、パックされた２つのデータユニットによって埋めることができるので、レジスタのリソース利用効率を向上させることができる。
【００１８】
また、コンパイル処理部１１にてベクトルシフトダブル命令生成部１３は、第１ベクトルデータ及び第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせるベクトルシフトダブル命令を生成する。
【００１９】
このコンパイル装置１０の構成により、第１ベクトルデータ及び第２ベクトルデータのそれぞれに含まれるデータユニットと同数のデータユニットを含む第３ベクトルデータを生成することができる。これにより、第１ベクトルデータ、第２ベクトルデータ、及び第３ベクトルデータにおいて、演算に用いる要素に不足が生じることがない。このため、上記の特許文献１のような不足した要素をロードする命令及び該命令によってロードされたデータを演算するスカラ命令を生成する必要がない。この結果として、プログラムの高速化を実現することができる。
【００２０】
＜第２実施形態＞
第２実施形態は、より具体的な実施形態に関する。
【００２１】
＜コンパイル装置の構成例＞
図２は、第２実施形態のコンパイル装置の一例を示すブロック図である。図２においてコンパイル装置２０は、コンパイル処理部２１を有する。コンパイル処理部２１は、第１実施形態のコンパイル処理部１１と同様に、原始プログラム（ソースプログラム）を、オブジェクトコードに変換する。コンパイル処理部１１は、解析部２２と、ベクトル化実行部２３とを有している。
【００２２】
解析部２２は、ループ検出部２２Ａと、ベクトル化可否判定部２２Ｂと、最適化適用可否判定部２２Ｃとを有している。
【００２３】
ループ検出部２２Ａは、原始プログラムにおけるループを検出し、検出されたループ内に上記の様な「計算処理」が含まれているか否かを判定する。
【００２４】
ベクトル化可否判定部２２Ｂは、ループ検出部２２Ａにて検出されたループ内に上記の様な「計算処理」が含まれる場合、ループをベクトル化できるか否かを判定する。「ベクトル化できる条件」としては、例えば、従来の条件、つまり、「ループ内の配列及び変数についての定義及び参照関係にベクトル化を阻害する依存関係がないこと」を用いることができる。
【００２５】
最適化適用可否判定部２２Ｃは、上記の「計算処理」に対して、第２実施形態の「ベクトル化技法」を適用できるか否かを判定する。例えば、最適化適用可否判定部２２Ｃは、次の第１条件、第２条件、及び第３条件のすべてを満たす場合、上記の「計算処理」に対して、第２実施形態の「ベクトル化技法」を適用できると判定する。
（第１条件）配列が（１／２）ｋワード型であること。
（第２条件）１回の繰り返しにおいて、つまり、上記「計算処理」において、計算対象となる配列要素がすべて隣接していること。
（第３条件）１回の繰り返しにおいて、つまり、上記「計算処理」において、計算に用いられる配列要素の数が「ｍ×２ｋ＋１」個であること。ただし、ｍは、任意の自然数である。
【００２６】
原始プログラムが例えば図３に示すプログラムである場合には、ループ検出部２２Ａ及びベクトル化可否判定部２２Ｂの判定は、肯定的な判定となる。さらに、原始プログラムが例えば図１に示すようなプログラムである場合には、最適化適用可否判定部２２Ｃの判定も、肯定的な判定となる。すなわち、図３に示すプログラムは、配列が半ワード型（ｋ＝１）であり、計算対象である配列要素の添え字が、［ｉ］、［ｉ＋１］、［ｉ＋２］、［ｉ＋３］、［ｉ＋４］と１つずつずれている。さらに、図３に示すプログラムは、１回の繰り返しにおいて計算に用いられる配列要素の数が５（＝２×２１＋１）要素である。このため、図３に示すプログラムは、上記の第１条件、第２条件、及び第３条件のすべてを満たす。図３は、第２実施形態の原始プログラムの一例を示す図である。
【００２７】
ベクトル化実行部２３は、ループ検出部２２Ａ、ベクトル化可否判定部２２Ｂ、及び最適化適用可否判定部２２Ｃにて肯定的な判定がなされた原始プログラムに対して、第２実施形態の「ベクトル化技法」を実行する。
【００２８】
ベクトル化実行部２３は、ベクトル長算出命令生成部２３Ａと、ベクトルロード命令生成部１２と、ベクトルシフトダブル命令生成部１３と、パックドベクトル演算命令生成部２３Ｂと、ベクトルストア命令生成部２３Ｃとを有している。
【００２９】
ベクトル長算出命令生成部２３Ａは、「ループ長Ｎ」を取得してＮ×（１／２）ｋを右論理シフト演算によって計算するための、ＳＲＬ(Shift Right Logical)命令を生成する。また、ベクトル長算出命令生成部２３Ａは、システムにて許容されている「最大ベクトル長」を取得するための、ＳＭＶＬ(Store Max Vector Length)命令を生成する。さらに、ベクトル長算出命令生成部２３Ａは、ＳＲＬ命令によって計算した値と「最大ベクトル長」とを比較して小さい方を選択するための、ＭＩＮ(Minimum)命令、及び、選択された値を「ベクトル長」とするための、ＬＶＬ(Load Vector Length)命令を生成する。図３のプログラムの場合、ベクトル長算出命令生成部２３Ａは、ループ長ｎを取得し、ｎ×（１／２）１と最大ベクトル長とを比較して小さい方をベクトル長とする命令群を生成することになる。
【００３０】
ベクトルロード命令生成部１２は、２ｋ個のデータユニット（つまり、１ワードのデータユニット）を１つのパックドデータとしてそれぞれ異なるベクトルレジスタに１ワードベクトルロードするための、（ｍ＋１）個のＶＬＤ(Vector Load)命令を生成する。これらの（ｍ＋１）個のＶＬＤ命令は、メモリ（図示せず）からデータユニットのロードを開始する位置、つまり、「ベクトルロード開始位置」が互いに２ｋ要素（つまり、１ワード分の要素数）ずつずれている。
【００３１】
ベクトルシフトダブル命令生成部１３は、「ベクトルロード開始位置」が最も近いデータユニット群の各ペアに対して「所定シフト量」分シフトするための、（２ｋ−１）個のＶＳＲＤ(Vector Shift Double Right)命令を生成する。上記の「ベクトルロード開始位置」が最も近いデータユニット群の各ペアは、ベクトルロード開始位置が１ワード分の要素数だけずれた、データユニット群の各ペアである。（２ｋ−１）個のＶＳＲＤ命令についての「所定シフト量」は、それぞれ、ｌ×（１／２）ｋワード(ｌは、１から（２ｋ−１）までの自然数)である。
【００３２】
ＶＳＲＤ命令は、次のような命令である。
「ＶＳＲＤ  ％ｖ０，％ｖ１，％ｖ２，Ｓ」
ここで、％ｖ０は、演算結果を書き込む１ワードベクトルレジスタを意味する。％ｖ１，％ｖ２は、演算のオペランドとなるベクトルレジスタを意味する。Ｓは、シフト量を指定する０から(２ワード−１)までのスカラ値である。すなわち、ＶＳＲＤ命令によれば、オペランドである２つのベクトルレジスタを合わせて２ワードデータ（つまり一連のデータ列）とし、該２ワードデータがＳだけ右シフト演算され、得られた２ワードデータの下位側の１ワードの値が演算結果としてベクトルレジスタに書き込まれる。
【００３３】
パックドベクトル演算命令生成部２３Ｂは、ベクトルロードされたベクトルデータ及びベクトルシフトダブルによって生成されたベクトルデータに対して演算を行うための、ＰＶＯＰ(Packed Vector Operation)命令を生成する。ここで、具体的には、生成されるＰＶＯＰ命令は、上記の算術計算の態様に応じた命令となる。例えば、図３に示す原始プログラムの例では、算術計算が要素間の加算であるので、生成されるＰＶＯＰ命令は、具体的には、ＰＶＡＤＤ（Packed Vector ADD）命令となる。
【００３４】
ベクトルストア命令生成部２３Ｃは、ＰＶＯＰ命令による演算結果を、２ｋ要素のパックドデータとして１ワードベクトルストアするための、ＶＳＴ(Vector Store)命令を生成する。
【００３５】
＜コンパイル装置の動作例＞
以上の構成を有するコンパイル装置２０の処理動作の一例について説明する。
【００３６】
〈第２実施形態のベクトル化技法を適用可能か否かについての解析処理〉
図４は、第２実施形態のコンパイル装置による、ベクトル化技法を適用可能か否かについての解析処理の一例を示すフローチャートである。
【００３７】
コンパイル装置２０において解析部２２は、原始プログラムにループが存在するか否かを判定する（ステップＳ１０１）。
【００３８】
原始プログラムにループが存在する場合（ステップＳ１０１ＹＥＳ）、解析部２２は、検出したループ内に計算処理が含まれているか否かを判定する（ステップＳ１０２）。
【００３９】
ループ内に計算処理が含まれている場合（ステップＳ１０３）、解析部２２は、ループをベクトル化できるか否かを判定する（ステップＳ１０４）。上記の通り、「ベクトル化できる条件」としては、例えば、従来の条件、つまり、「ループ内の配列及び変数についての定義及び参照関係にベクトル化を阻害する依存関係がないこと」を用いることができる。
【００４０】
ベクトル化ができると判定した場合（ステップＳ１０４ＹＥＳ）、解析部２２は、計算処理の配列の型が（１／２）ｋワード型であるか否かを判定する（ステップＳ１０５）。
【００４１】
計算処理の配列の型が（１／２）ｋワード型である場合（ステップＳ１０５ＹＥＳ）、解析部２２は、計算処理において計算対象となる配列要素がすべて隣接しているか否かを判定する（ステップＳ１０６）。
【００４２】
計算処理において計算対象となる配列要素がすべて隣接している場合（ステップＳ１０６ＹＥＳ）、解析部２２は、計算処理において計算に用いられる配列要素の数が「ｍ×２ｋ＋１」個であるか否かを判定する（ステップＳ１０７）。
【００４３】
計算処理において計算に用いられる配列要素の数が「ｍ×２ｋ＋１」個である場合（ステップＳ１０７ＹＥＳ）、解析部２２は、原始プログラムに対して第２実施形態のベクトル化技法を適用することを決定する（ステップＳ１０８）。
【００４４】
なお、ステップＳ１０１からステップＳ１０７のいずれかにおいて否定的な判定が為された場合、解析部２２は、例えば従来の最適化を適用することを決定する（ステップＳ１０９）。
【００４５】
〈第２実施形態のベクトル化技法〉
図５は、第２実施形態のコンパイル装置によるベクトル化技法の一例を示すフローチャートである。図５の処理フローは、解析部２２によって原始プログラムに対して第２実施形態のベクトル化技法を適用することを決定された場合にスタートする。
【００４６】
コンパイル装置２０においてベクトル化実行部２３は、ループ長Ｎを取得してＮ×（１／２）ｋを右論理シフト演算によって計算するための、ＳＲＬ命令を生成する（ステップＳ２０１）。原始プログラムが図３に示すプログラムの場合、図６に示されるオブジェクトコードの部分Ｐ６−１の１行目に示される命令が生成されることになる。図６は、第２実施形態のベクトル化技法によって生成されるオブジェクトコードの一例を示す図である。
【００４７】
ベクトル化実行部２３は、システムにて許容されている「最大ベクトル長」を取得するための、ＳＭＶＬ命令を生成する（ステップＳ２０２）。
【００４８】
ベクトル化実行部２３は、ＳＲＬ命令によって計算した値と「最大ベクトル長」とを比較して小さい方を選択するための、ＭＩＮ命令、及び、選択された値を「ベクトル長」とするための、ＬＶＬ命令を生成する（ステップＳ２０３）。原始プログラムが図３に示すプログラムの場合、ステップＳ２０１からステップＳ２０３によって、図６に示されるオブジェクトコードの部分Ｐ６−１が生成されることになる。
【００４９】
ベクトル化実行部２３は、２ｋ個のデータユニットを１つのパックドデータとしてそれぞれ異なるベクトルレジスタに１ワードベクトルロードするための、（ｍ＋１）個のＶＬＤ命令を生成する（ステップＳ２０４）。これらの（ｍ＋１）個のＶＬＤ命令は、メモリ（図示せず）からデータユニットのロードを開始する位置が互いに２ｋ要素（つまり、１ワード分の要素数）ずつずれている。原始プログラムが図３に示すプログラムの場合、図６に示されるオブジェクトコードの部分Ｐ６−２，Ｐ６−５が生成されることになる。図３に示すプログラムでは配列が半ワード型（つまり、ｋ＝１）であり且つ要素の数が５個（つまり、ｍ＝２）であるので、３つのＶＬＤ命令が生成されている。また、ロード命令の対象は、ａ［ｉ］、ａ［ｉ＋２］、及びａ［ｉ＋４］であり、これらのロード開始位置は互いに２要素ずつずれている。例えば、図６に示されるオブジェクトコードの部分Ｐ６−２が実行されると、図７に示されるような処理が実行されることになる。すなわち、「ＶＬＤ  ｖｒｅｇ１，ａ［ｉ］」が実行されることによって、複数のデータユニットａ［０］〜ａ［１１］が、ベクトルロード開始位置をａ［０］とし且つ２つのデータユニットが１つにパックされた状態で、ベクトルレジスタｖｒｅｇ１にロードされる。すなわち、ベクトルレジスタｖｒｅｇ１の１ワード単位の各レジスタ領域の上位領域（Upper領域）にデータユニットａ［０］，ａ［２］，ａ［４］，ａ［６］，ａ［８］，ａ［１０］がロードされ、下位領域（Lower領域）にデータユニットａ［１］，ａ［３］，ａ［５］，ａ［７］，ａ［９］，ａ［１１］がロードされている。また、「ＶＬＤ  ｖｒｅｇ１，ａ［ｉ＋２］」が実行されることによって、複数のデータユニットａ［２］〜ａ［１３］が、ベクトルロード開始位置をａ［２］とし且つ２つのデータユニットが１つにパックされた状態で、ベクトルレジスタｖｒｅｇ２にロードされる。図７は、第２実施形態のベクトル化技法にて生成されるベクトルロード命令の説明に供する図である。
【００５０】
図５の説明に戻り、ベクトル化実行部２３は、「ベクトルロード開始位置」が最も近いデータユニット群の各ペアに対して「所定シフト量」分シフトするための、（２ｋ−１）個のＶＳＲＤ命令を生成する（ステップＳ２０５）。（２ｋ−１）個のＶＳＲＤ命令についての「所定シフト量」は、それぞれ、ｌ×（１／２）ｋワード(ｌは、１から（２ｋ−１）までの自然数)である。原始プログラムが図３に示すプログラムの場合、図６に示されるオブジェクトコードの部分Ｐ６−３，Ｐ６−６が生成されることになる。すなわち、ａ［ｉ］及びａ［ｉ＋２］のペアについて、部分Ｐ６−３が生成され、ａ［ｉ＋２］、及びａ［ｉ＋４］のペアについて、部分Ｐ６−６が生成される。図３に示すプログラムでは配列が半ワード型（つまり、ｋ＝１）であるので、各ペアについて１つのＶＳＲＤ命令が生成され、所定シフト量は１／２ワードとなる。例えば、図６に示されるオブジェクトコードの部分Ｐ６−３が実行されると、図８に示されるような処理が実行されることになる。すなわち、ＶＳＲＤ命令のオペランドであるベクトルレジスタｖｒｅｇ１，ｖｒｅｇ２を合わせて２ワードデータとし、該２ワードデータが１／２ワードだけ右シフト演算され、得られた２ワードデータの下位側の１ワードの値がベクトルレジスタｖｒｅｇ３に書き込まれる。このベクトルレジスタｖｒｅｇ３に書き込まれた複数のデータユニットは、ａ［ｉ＋１］に相当する。図８は、第２実施形態のベクトル化技法にて生成されるベクトルシフトダブル命令の説明に供する図である。
【００５１】
図５の説明に戻り、ベクトル化実行部２３は、ベクトルロードされたベクトルデータ及びベクトルシフトダブルによって生成されたベクトルデータに対して演算を行うための、ＰＶＯＰ命令を生成する（ステップＳ２０６）。原始プログラムが図３に示すプログラムの場合、図６に示されるオブジェクトコードの部分Ｐ６−４，Ｐ６−７が生成されることになる。すなわち、図３に示すプログラムの計算式には加算演算子が４つ含まれるので、４つのＰＶＯＰ命令が生成されている。図６に示されるオブジェクトコードの部分Ｐ６−４，Ｐ６−７が実行されると、図９に示すように、ベクトルレジスタｖｒｅｇ１，ｖｒｅｇ２，ｖｒｅｇ３，ｖｒｅｇ６，ｖｒｅｇ７の１ワード単位の各レジスタ領域における上位領域及び下位領域について別々に加算処理が行われる。図９は、第２実施形態のベクトル化技法にて生成されるパックドベクトル演算命令の説明に供する図である。
【００５２】
図５の説明に戻り、ベクトル化実行部２３は、ＰＶＯＰ命令による演算結果を、２ｋ要素のパックドデータとして１ワードベクトルストアするための、ＶＳＴ命令を生成する（ステップＳ２０７）。図９に示されたＰＶＯＰ命令による演算結果を見ると、各レジスタ領域における上位領域及び下位領域のそれぞれには、上記の「繰り返し計算処理」の各計算処理において得られる計算結果が保持されることがわかる。
【００５３】
なお、以上の説明では、１／２ワード型のケースを例にとって説明を行ったが、当然のことながらこれに限定されるものではなく、１／４ワード型、１／８ワード型についても同様に、上記の「ベクトル化技法」と適用することができる。
【００５４】
例えば、１／４ワード型の場合、図３に示す原始プログラムは、図１０に示すオブジェクトコードに変換される。図１０は、１／４ワード型の場合に、第２実施形態のベクトル化技法によって生成されるオブジェクトコードの一例を示す図である。
【００５５】
具体的には、ステップＳ２０４では、配列が１／４ワード型（つまり、ｋ＝２）であり且つ要素の数が５個（つまり、ｍ＝１）であるので、２つのＶＬＤ命令が生成される。そして、ロード命令の対象は、ａ［ｉ］及びａ［ｉ＋４］であり、これらのロード開始位置は互いに４要素ずれている。これらの２つのＶＬＤ命令が実行されると、図１１に示されるような処理が実行されることになる。すなわち、「ＶＬＤ  ｖｒｅｇ１，ａ［ｉ］」が実行されることによって、複数のデータユニットａ［０］〜ａ［２３］が、ベクトルロード開始位置をａ［０］とし且つ４つのデータユニットが１つにパックされた状態で、ベクトルレジスタｖｒｅｇ１にロードされる。ここで、図１１のベクトルレジスタｖｒｅｇ１における各行は、１ワード単位の「レジスタ領域」に対応し、各行における４つの列のそれぞれは１／４ワードに対応する「部分領域」に対応する。また、「ＶＬＤ  ｖｒｅｇ１，ａ［ｉ＋４］」が実行されることによって、複数のデータユニットａ［４］〜ａ［２７］が、ベクトルロード開始位置をａ［４］とし且つ４つのデータユニットが１つにパックされた状態で、ベクトルレジスタｖｒｅｇ２にロードされる。図１１は、１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるベクトルロード命令の説明に供する図である。
【００５６】
そして、ステップＳ２０５では、ａ［ｉ］及びａ［ｉ＋４］のペアについて、「所定シフト量」がそれぞれ１／４ワード、２／４ワード、３／４ワードである、３つのＶＳＲＤ命令が生成される。ａ［ｉ］及びａ［ｉ＋４］のペアについて「所定シフト量」が３／４ワードであるＶＳＲＤ命令「ＶＳＲＤ  ｖｒｅｇ３，ｖｒｅｇ２，ｖｒｅｇ１，４８」が実行されると、ＶＳＲＤ命令のオペランドであるベクトルレジスタｖｒｅｇ１，ｖｒｅｇ２を合わせて２ワードデータとされる。そして、該２ワードデータが３／４ワードだけ右シフト演算され、得られた２ワードデータの下位側の１ワードの値がベクトルレジスタｖｒｅｇ３に書き込まれる。このベクトルレジスタｖｒｅｇ３に書き込まれた複数のデータユニットは、ａ［ｉ＋１］に相当する。図１２は、１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるベクトルシフトダブル命令の説明に供する図である。
【００５７】
そして、ステップＳ２０６では、ベクトルロードされたベクトルデータ及びベクトルシフトダブルによって生成されたベクトルデータに対して演算を行うための、ＰＶＯＰ命令が生成される。例えば、ａ［ｉ］とａ［ｉ＋４］とのベクトル加算演算は、図１３に示すように、上記の「部分領域」単位で加算されることになる。図１３は、１／４ワード型の場合に、第２実施形態のベクトル化技法にて生成されるパックドベクトル演算命令の説明に供する図である。
【００５８】
このように、ベクトル化実行部２３（ベクトルシフトダブル命令生成部１３）は、配列ａが１／４ワード型である場合、上記一連のデータ列（つまり、上記の２ワードデータ）を３／４ワード分シフトさせて得られたデータ列の一部を、第３ベクトルデータとして第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令と、上記一連のデータ列を２／４ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、上記一連のデータ列を１／４ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、を生成している。
【００５９】
配列ａが１／８ワード型の場合も同様である。すなわち、ベクトルシフトダブル命令生成部１３は、配列ａが１／８ワード型である場合、上記一連のデータ列（つまり、上記の２ワードデータ）を７／８ワード分シフトさせて得られたデータ列の一部を、第３ベクトルデータとして第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令と、上記一連のデータ列を６／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、上記一連のデータ列を５／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、上記一連のデータ列を４／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋４］に対応する第５ベクトルデータとして、１ワード単位でパックした状態で第５ベクトルレジスタにストアさせる第４ベクトルシフトダブル命令と、上記一連のデータ列を３／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋５］に対応する第６ベクトルデータとして、１ワード単位でパックした状態で第６ベクトルレジスタにストアさせる第５ベクトルシフトダブル命令と、上記一連のデータ列を２／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋６］に対応する第７ベクトルデータとして、１ワード単位でパックした状態で第７ベクトルレジスタにストアさせる第６ベクトルシフトダブル命令と、上記一連のデータ列を１／８ワード分シフトさせて得られたデータ列の一部を、要素Ａ［ｉ＋７］に対応する第８ベクトルデータとして、１ワード単位でパックした状態で第８ベクトルレジスタにストアさせる第７ベクトルシフトダブル命令と、を生成している。
【００６０】
＜他の実施形態＞
図１４は、コンパイル装置のハードウェア構成例を示す図である。図１４においてコンパイル装置１００は、プロセッサ１０１と、メモリ１０２とを有している。第１実施形態及び第２実施形態のコンパイル装置１０，２０のコンパイル処理部１１，２１は、プロセッサ１０１がメモリ１０２に記憶されたプログラムを読み込んで実行することにより実現されてもよい。プログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンパイル装置１０，２０に供給することができる。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンパイル装置１０，２０に供給されてもよい。
【００６１】
以上、実施の形態を参照して本願発明を説明したが、本願発明は上記によって限定されるものではない。本願発明の構成や詳細には、発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【００６２】
この出願は、２０１８年１２月７日に出願された日本出願特願２０１８−２２９６９５を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【符号の説明】
【００６３】
１０，２０  コンパイル装置
１１，２１  コンパイル処理部
１２  ベクトルロード命令生成部
１３  ベクトルシフトダブル命令生成部
２２  解析部
２２Ａ  ループ検出部
２２Ｂ  ベクトル化可否判定部
２２Ｃ  最適化適用可否判定部
２３  ベクトル化実行部
２３Ａ  ベクトル長算出命令生成部
２３Ｂ  パックドベクトル演算命令生成部
２３Ｃ  ベクトルストア命令生成部
【図１】
2020116025.tif 000003
【図２】
2020116025.tif 000004
【図３】
2020116025.tif 000005
【図４】
2020116025.tif 000006
【図５】
2020116025.tif 000007
【図６】
2020116025.tif 000008
【図７】
2020116025.tif 000009
【図８】
2020116025.tif 000010
【図９】
2020116025.tif 000011
【図１０】
2020116025.tif 000012
【図１１】
2020116025.tif 000013
【図１２】
2020116025.tif 000014
【図１３】
2020116025.tif 000015
【図１４】
2020116025.tif 000016
【手続補正書】
【提出日】令和3年5月21日(2021.5.21)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理手段を具備し、
前記コンパイル処理手段は、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成するベクトルロード命令生成手段と、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成するベクトルシフト命令生成手段と、
を含む、
コンパイル装置。
【請求項２】
前記コンパイル処理手段は、前記ベクトルロード命令生成手段が前記第１ベクトルロード命令及び前記第２ベクトルロード命令を生成する処理を開始し且つ前記ベクトルシフト命令生成手段が前記第１ベクトルシフトダブル命令を生成する処理を開始する条件が満たされているか否かを判定する条件判定手段をさらに含み、
前記条件は、各計算処理において計算対象となるすべての要素の添え字が連続しているという条件を含む、
請求項１記載のコンパイル装置。
【請求項３】
前記コンパイル処理手段は、前記計算処理がＮ（Ｎは２以上の自然数）回繰り返される場合、前記Ｎ×（１／２）ｋ及びシステムにて許容されている最大ベクトル長のうちで小さい方をベクトル長として選択するためのベクトル長算出命令を生成するベクトル長算出命令生成手段をさらに具備し、
前記ベクトルロード命令生成手段は、それぞれ前記ベクトル長を有する前記第１ベクトルデータ及び前記第２ベクトルデータをロードするための前記第１ベクトルロード命令及び前記第２ベクトルロード命令を生成する、
請求項１又は２に記載のコンパイル装置。
【請求項４】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／２ワード型である場合、前記一連のデータ列を１／２ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項５】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／４ワード型である場合、
前記一連のデータ列を３／４ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令と、
前記一連のデータ列を２／４ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、
前記一連のデータ列を１／４ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、
を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項６】
前記ベクトルシフト命令生成手段は、前記配列Ａが１／８ワード型である場合、
前記一連のデータ列を７／８ワード分シフトさせて得られたデータ列の一部を、前記第３ベクトルデータとして前記第３ベクトルレジスタにストアさせる前記第１ベクトルシフトダブル命令と、
前記一連のデータ列を６／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋２］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第２ベクトルシフトダブル命令と、
前記一連のデータ列を５／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋３］に対応する第４ベクトルデータとして、１ワード単位でパックした状態で第４ベクトルレジスタにストアさせる第３ベクトルシフトダブル命令と、
前記一連のデータ列を４／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋４］に対応する第５ベクトルデータとして、１ワード単位でパックした状態で第５ベクトルレジスタにストアさせる第４ベクトルシフトダブル命令と、
前記一連のデータ列を３／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋５］に対応する第６ベクトルデータとして、１ワード単位でパックした状態で第６ベクトルレジスタにストアさせる第５ベクトルシフトダブル命令と、
前記一連のデータ列を２／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋６］に対応する第７ベクトルデータとして、１ワード単位でパックした状態で第７ベクトルレジスタにストアさせる第６ベクトルシフトダブル命令と、
前記一連のデータ列を１／８ワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋７］に対応する第８ベクトルデータとして、１ワード単位でパックした状態で第８ベクトルレジスタにストアさせる第７ベクトルシフトダブル命令と、
を生成する、
請求項１から３のいずれか１項に記載のコンパイル装置。
【請求項７】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル方法であって、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む、
コンパイル方法。
【請求項８】
（１／２）ｋワード型（ｋは自然数）の配列Ａの要素Ａ［ｉ］、要素Ａ［ｉ＋１］、及び要素Ａ［ｉ＋２ｋ］をオペランドとして含む算術計算を実行する計算処理を添え字ｉ（ｉは０以上の整数）の値を１つずつずらしながら繰り返し実行するための原始プログラムを、オブジェクトコードに変換するコンパイル処理をコンパイル装置に実行させる制御プログラムであって、
前記コンパイル処理は、
前記繰り返される計算処理において前記要素Ａ［ｉ］として用いられ且つ各データユニットが（１／２）ｋワードである第１のデータユニット群をメモリから１ワード単位でパックした状態で第１ベクトルレジスタに第１ベクトルデータとしてロードするための第１ベクトルロード命令、及び、前記繰り返される計算処理において前記要素Ａ［ｉ＋２ｋ］として用いられる第２のデータユニット群を前記メモリから１ワード単位でパックした状態で第２ベクトルレジスタに第２ベクトルデータとしてロードするための第２ベクトルロード命令を生成すること、及び、
前記第１ベクトルデータ及び前記第２ベクトルデータを一連のデータ列として（１／２）ｋワード分シフトさせて得られたデータ列の一部を、前記要素Ａ［ｉ＋１］に対応する第３ベクトルデータとして、１ワード単位でパックした状態で第３ベクトルレジスタにストアさせる第１ベクトルシフトダブル命令を生成すること、を含む、
制御プログラム。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００２１
【補正方法】変更
【補正の内容】
【００２１】
＜コンパイル装置の構成例＞
図２は、第２実施形態のコンパイル装置の一例を示すブロック図である。図２においてコンパイル装置２０は、コンパイル処理部２１を有する。コンパイル処理部２１は、第１実施形態のコンパイル処理部１１と同様に、原始プログラム（ソースプログラム）を、オブジェクトコードに変換する。コンパイル処理部２１は、解析部２２と、ベクトル化実行部２３とを有している。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００２６
【補正方法】変更
【補正の内容】
【００２６】
原始プログラムが例えば図３に示すプログラムである場合には、ループ検出部２２Ａ及びベクトル化可否判定部２２Ｂの判定は、肯定的な判定となる。さらに、原始プログラムが例えば図３に示すようなプログラムである場合には、最適化適用可否判定部２２Ｃの判定も、肯定的な判定となる。すなわち、図３に示すプログラムは、配列が半ワード型（ｋ＝１）であり、計算対象である配列要素の添え字が、［ｉ］、［ｉ＋１］、［ｉ＋２］、［ｉ＋３］、［ｉ＋４］と１つずつずれている。さらに、図３に示すプログラムは、１回の繰り返しにおいて計算に用いられる配列要素の数が５（＝２×２１＋１）要素である。このため、図３に示すプログラムは、上記の第１条件、第２条件、及び第３条件のすべてを満たす。図３は、第２実施形態の原始プログラムの一例を示す図である。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】００３９
【補正方法】変更
【補正の内容】
【００３９】
ループ内に計算処理が含まれている場合（ステップＳ１０２ＹＥＳ）、解析部２２は、ループをベクトル化できるか否かを判定する（ステップＳ１０３）。上記の通り、「ベクトル化できる条件」としては、例えば、従来の条件、つまり、「ループ内の配列及び変数についての定義及び参照関係にベクトル化を阻害する依存関係がないこと」を用いることができる。
【手続補正６】
【補正対象書類名】明細書
【補正対象項目名】００４０
【補正方法】変更
【補正の内容】
【００４０】
ベクトル化ができると判定した場合（ステップＳ１０３ＹＥＳ）、解析部２２は、計算処理の配列の型が（１／２）ｋワード型であるか否かを判定する（ステップＳ１０４）。
【手続補正７】
【補正対象書類名】明細書
【補正対象項目名】００４１
【補正方法】変更
【補正の内容】
【００４１】
計算処理の配列の型が（１／２）ｋワード型である場合（ステップＳ１０４ＹＥＳ）、解析部２２は、計算処理において計算対象となる配列要素がすべて隣接しているか否かを判定する（ステップＳ１０５）。
【手続補正８】
【補正対象書類名】明細書
【補正対象項目名】００４２
【補正方法】変更
【補正の内容】
【００４２】
計算処理において計算対象となる配列要素がすべて隣接している場合（ステップＳ１０５ＹＥＳ）、解析部２２は、計算処理において計算に用いられる配列要素の数が「ｍ×２ｋ＋１」個であるか否かを判定する（ステップＳ１０６）。
【手続補正９】
【補正対象書類名】明細書
【補正対象項目名】００４３
【補正方法】変更
【補正の内容】
【００４３】
計算処理において計算に用いられる配列要素の数が「ｍ×２ｋ＋１」個である場合（ステップＳ１０６ＹＥＳ）、解析部２２は、原始プログラムに対して第２実施形態のベクトル化技法を適用することを決定する（ステップＳ１０７）。
【手続補正１０】
【補正対象書類名】明細書
【補正対象項目名】００４４
【補正方法】変更
【補正の内容】
【００４４】
なお、ステップＳ１０１からステップＳ１０６のいずれかにおいて否定的な判定が為された場合、解析部２２は、例えば従来の最適化を適用することを決定する（ステップＳ１０８）。
【国際調査報告】
2020116025.tif 000017
2020116025.tif 000018
2020116025.tif 000019