(57)【特許請求の範囲】
【請求項１】
第１の配列に設定された複数の要素それぞれが計算の実行対象か否かを示す複数のマスクを指定する第１のマスク配列を用い、計算実行対象の要素の計算を指示する第１の命令列を含む第１のプログラムを記憶する記憶手段と、
前記第１のマスク配列に示される計算の実行対象か否かの発生パターンが、所定の要素数ごとの第１のパターンの繰り返しの場合、計算の実行対象か否かの発生パターンが前記所定の要素数以上の２のべき乗個の要素数ごとの第２のパターンの繰り返しとなるように前記第１の配列に要素を追加した第２の配列を、第２のプログラムに設定する配列設定手段と、
計算の実行対象ではないことを示すマスクが前記第１のマスク配列に追加された第２のマスク配列であり、前記第２のパターンに含まれる要素数と同数のマスクを含む前記第２のマスク配列を、前記第２のプログラムに設定するマスク配列設定手段と、
前記第２の配列内での要素の順番を示す数値を用いたビットごとの論理積により、前記第２のマスク配列のうちの該要素に適用するマスクを指定し、前記第２の配列に設定された複数の要素のうち、計算の実行対象であることが示されているマスクを適用する要素の計算を指示する第２の命令列を、前記第２のプログラムに設定する命令列設定手段と、
を有する情報処理装置。
【請求項２】
前記配列設定手段は、前記第１の配列が、前記所定の要素数を含む第１次元を有する多次元配列の場合、前記第１の配列の前記第１次元の要素数を、前記第２のパターンの要素数に増やし、要素数を増加させた後の多次元配列を前記第２の配列とする、
請求項１記載の情報処理装置。
【請求項３】
前記マスク配列設定手段は、前記第２の命令列において、計算対象の要素の順番を示す数値から１を減算した値と、前記第２のパターンに含まれる要素数から１を減算した値とのビットごとの論理積に、１を加算した値を、前記第２のマスク配列の添字とする、
請求項１または２記載の情報処理装置。
【請求項４】
前記配列設定手段は、前記第１のパターンに含まれる要素数以上の２のべき乗のうち、最も小さい値を前記第２のパターン内の要素数とする、
請求項１乃至３のいずれかに記載の情報処理装置。
【請求項５】
前記第１のマスク配列のデータ量と前記第２のマスク配列とのデータ量の差を示す第１の差分値と、前記第１の配列のデータ量と前記第２の配列のデータ量との差を示す第２の差分値との大きさを比較して、前記第２のプログラムを生成するか否かを判定する判定手段をさらに有し、
前記配列設定手段、前記マスク配列設定手段、および前記命令列設定手段は、前記第２のプログラムを生成する場合に処理を実行する、
請求項１乃至４のいずれかに記載の情報処理装置。
【請求項６】
コンピュータに、
第１の配列に設定された複数の要素それぞれが計算の実行対象か否かを示す複数のマスクを指定する第１のマスク配列を用い、計算実行対象の要素の計算を指示する第１の命令列を含む第１のプログラムを参照し、前記第１のマスク配列に示される計算の実行対象か否かの発生パターンが、所定の要素数ごとの第１のパターンの繰り返しの場合、計算の実行対象か否かの発生パターンが前記所定の要素数以上の２のべき乗個の要素数ごとの第２のパターンの繰り返しとなるように前記第１の配列に要素を追加した第２の配列を、第２のプログラムに設定し、
計算の実行対象ではないことを示すマスクが前記第１のマスク配列に追加された第２のマスク配列であり、前記第２のパターンに含まれる要素数と同数のマスクを含む前記第２のマスク配列を、前記第２のプログラムに設定し、
前記第２の配列内での要素の順番を示す数値を用いたビットごとの論理積により、前記第２のマスク配列のうちの該要素に適用するマスクを指定し、前記第２の配列に設定された複数の要素のうち、計算の実行対象であることが示されているマスクを適用する要素の計算を指示する第２の命令列を、前記第２のプログラムに設定する、
処理を実行させる変換プログラム。
【請求項７】
コンピュータが、
第１の配列に設定された複数の要素それぞれが計算の実行対象か否かを示す複数のマスクを指定する第１のマスク配列を用い、計算実行対象の要素の計算を指示する第１の命令列を含む第１のプログラムを参照し、前記第１のマスク配列に示される計算の実行対象か否かの発生パターンが、所定の要素数ごとの第１のパターンの繰り返しの場合、計算の実行対象か否かの発生パターンが前記所定の要素数以上の２のべき乗個の要素数ごとの第２のパターンの繰り返しとなるように前記第１の配列に要素を追加した第２の配列を、第２のプログラムに設定し、
計算の実行対象ではないことを示すマスクが前記第１のマスク配列に追加された第２のマスク配列であり、前記第２のパターンに含まれる要素数と同数のマスクを含む前記第２のマスク配列を、前記第２のプログラムに設定し、
前記第２の配列内での要素の順番を示す数値を用いたビットごとの論理積により、前記第２のマスク配列のうちの該要素に適用するマスクを指定し、前記第２の配列に設定された複数の要素のうち、計算の実行対象であることが示されているマスクを適用する要素の計算を指示する第２の命令列を、前記第２のプログラムに設定する、
変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、変換プログラム、及び変換方法に関する。
【背景技術】
【０００２】
ＨＰＣ（High Performance Computing）分野においては、計算機のノード数、およびＣＰＵ（Central Processing Unit）コア数の増加に伴い、ハードウェア性能を引き出すための高並列化が求められている。特に、共有メモリシステムにおけるマルチスレッド環境においては、ＣＰＵコア数と同数のスレッドを生成し、各スレッドをＣＰＵコアと１対１にバインドすることによってハードウェア性能を引き出すことができる。
【０００３】
一般に、共有メモリシステムにおいて多重ループを並列化する場合、最も外側のループ（以降、最外ループと呼ぶ）で並列化すると並列化コストが小さくなり効率が良い。ただし、最外ループの繰り返し数がＣＰＵコア数に満たない場合がある。この場合、最外ループで並列化するとＣＰＵコアを使い切れず、ハードウェア性能を十分に引き出すことができない。このような場合、多重ループを一重化し、ループの繰り返し空間を大きくして並列化する手法が取られる。
【０００４】
多重ループ内の多次元配列のアクセスがメモリ上で連続している場合がある。この場合は、一重化後のループ制御変数を用いた計算式を多次元配列の添字として、多次元配列を一次元配列であるかのようにアクセスすることで、処理をＳＩＭＤ（Single Instruction/Multiple Data）化することが可能である。多次元配列の添字とは、多次元配列における要素の順番を示す数値である。以下、添字を算出する計算式を、添字式と呼ぶ。ＳＩＭＤ化とは、１つの命令を複数のデータに同時に適用して、並列に処理を実行する命令（ＳＩＭＤ命令）を生成することである。プログラムのコンパイル時に命令をＳＩＭＤ化することで、処理の効率化が図れる。
【０００５】
多次元配列のアクセスがメモリ上で連続にならない場合でも、マスクを利用して計算する部分と計算しない部分を切り分けるマスク付きＳＩＭＤ命令により、ＳＩＭＤ化が可能である。アクセス対象の要素ごとのマスクの値（真または偽）は、マスク配列によって表される。
【０００６】
ループを一重化させる技術としては、例えばコンパイル時のループ一重化やループ融合化にともなうマスクデ−タ付きのベクトル演算処理の高速化を図るコンパイル方法が考えられている。また演算対象ループ内で異なる次元や大きさを持つ配列が含まれていても少ないループ数にして配列の高速演算を実現する技術も考えられている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１１−２４２５９８号公報
【特許文献２】特開平１１−２０３２７３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
マスク付きＳＩＭＤ命令を利用する場合、アクセス対象の全要素に１対１で対応するマスクを用意すると、アクセス対象のデータ量が大きいほどマスクのデータ量も大きくなる。マスクのデータ量が過大となると、マスクの記憶のためにメモリ容量が圧迫され、システムの処理効率の低下要因となる。
【０００９】
そこで、マスクのデータ量を削減することが考えられる。例えば、計算する要素と計算しない要素とが、一定パターンで繰り返している場合、繰り返しパターン１回分に対応する小さいサイズのマスクパターンを用意し、そのマスクを繰り返し利用することが考えられる。小さいサイズのマスクパターンを繰り返し利用できれば、マスクのデータ量を削減できる。しかし、小さいサイズのマスクパターンを繰り返し利用する場合、複雑な式で使用するマスクを指定することになる。複雑な式は、マスク付きＳＩＭＤ命令におけるマスク指定として適用することができない。
【００１０】
このように、多次元配列のアクセスがメモリ上で連続にならない場合において、ＳＩＭＤ化の際のマスクのデータ量を削減しようとすると、マスク配列の添字式が複雑になり、マスク付きＳＩＭＤ命令の使用が妨げられてしまう。
【００１１】
１つの側面では、本発明は、マスク付きＳＩＭＤ命令において使用するマスク数を削減することを目的とする。
【課題を解決するための手段】
【００１２】
１つの案では、記憶手段、配列設定手段、マスク配列設定手段、および命令列設定手段を有する情報処理装置が提供される。
記憶手段は、第１の配列に設定された複数の要素それぞれが計算の実行対象か否かを示す複数のマスクを指定する第１のマスク配列を用い、計算実行対象の要素の計算を指示する第１の命令列を含む第１のプログラムを記憶する。配列設定手段は、第１のマスク配列に示される計算の実行対象か否かの発生パターンが、所定の要素数ごとの第１のパターンの繰り返しの場合、計算の実行対象か否かの発生パターンが所定の要素数以上の２のべき乗個の要素数ごとの第２のパターンの繰り返しとなるように第１の配列に要素を追加した第２の配列を、第２のプログラムに設定する。マスク配列設定手段は、計算の実行対象ではないことを示すマスクが第１のマスク配列に追加された第２のマスク配列であり、第２のパターンに含まれる要素数と同数のマスクを含む第２のマスク配列を、第２のプログラムに設定する。命令列設定手段は、第２の配列内での要素の順番を示す数値を用いたビットごとの論理積により、第２のマスク配列のうちの該要素に適用するマスクを指定し、第２の配列に設定された複数の要素のうち、計算の実行対象であることが示されているマスクを適用する要素の計算を指示する第２の命令列を、第２のプログラムに設定する。
【発明の効果】
【００１３】
１態様によれば、マスク付きＳＩＭＤ命令において使用するマスク数を削減することができる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態に係る情報処理装置の機能構成例を示す図である。
【図２】第２の実施の形態のシステム構成例を示す図である。
【図３】第２の実施の形態に用いるプログラム開発装置のハードウェアの一構成例を示す図である。
【図４】プログラム開発装置の機能を示すブロック図である。
【図５】ステンシル計算プログラムの一例を示す図である。
【図６】ステンシル計算のメモリ領域の一例を示す図である。
【図７】マスク生成処理を含むステンシル計算プログラムの一例を示す図である。
【図８】ステンシル計算のメモリ領域のうちのアクセス対象範囲の一例を示す図である。
【図９】ループの回転範囲を制限したステンシル計算プログラムの一例を示す図である。
【図１０】ループの回転範囲を制限したときのアクセス対象範囲に対応するマスクの配列の例を示す図である。
【図１１】繰り返し単位のマスクパターンを利用するステンシル計算プログラムの一例を示す図である。
【図１２】マスクパターンの拡張例を示す図である。
【図１３】拡張したマスクパターンとアクセス対象範囲との関係を示す図である。
【図１４】拡張したマスクパターンを利用するステンシル計算プログラムの例を示す図である。
【図１５】コンパイラの機能を示すブロック図である。
【図１６】マスク利用ループ処理プログラムの生成例を示す図である。
【図１７】判定処理の手順を示すフローチャートである。
【図１８】拡張処理の手順の一例を示すフローチャートである。
【図１９】拡張処理の一例を示す図である。
【図２０】ソースプログラムの修正例を示す図である。
【発明を実施するための形態】
【００１５】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る情報処理装置の機能構成例を示す図である。情報処理装置１０は、記憶手段１１、配列設定手段１２、マスク配列設定手段１３、および命令列設定手段１４を有する。
【００１６】
記憶手段１１は、第１の配列に設定された複数の要素それぞれが計算の実行対象か否かを示す複数のマスクを指定する第１のマスク配列を用い、計算実行対象の要素の計算を指示する第１の命令列を含む第１のプログラム１を記憶する。第１のプログラム１は、例えば、多重ループ処理を含むプログラムにおける多重ループ処理の一重化を実施した後のプログラムである。多重ループ処理を一重化したプログラムであれば、多数のプロセッサコアによる並列処理が可能となる。
【００１７】
配列設定手段１２は、第１のマスク配列に示される計算の実行対象か否かの発生パターンが、所定の要素数ごとの第１のパターンの繰り返しの場合、第１のプログラム１に示された第１の配列を拡張した第２の配列を、第２のプログラム２に設定する。第２の配列は、計算の実行対象か否かの発生パターンが所定の要素数以上の２のべき乗個の要素数ごとの第２のパターンの繰り返しとなるように第１の配列に要素を追加したものである。例えば配列設定手段１２は、第１の配列が、所定の要素数を含む第１次元を有する多次元配列の場合、第１の配列の第１次元の要素数を、第２のパターンの要素数に増やし、要素数を増加させた後の多次元配列を第２の配列とする。また第２のパターン内の要素数は、例えば、第１のパターンに含まれる要素数以上の２のべき乗のうち、最も小さい値である。
【００１８】
マスク配列設定手段１３は、計算の実行対象ではないことを示すマスクが第１のマスク配列に追加された第２のマスク配列であり、第２のパターンに含まれる要素数と同数のマスクを含む第２のマスク配列を、第２のプログラム２に設定する。
【００１９】
命令列設定手段１４は、第２の配列に設定された複数の要素のうち、計算の実行対象であることが示されているマスクを適用する要素の計算を指示する第２の命令列を、第２のプログラム２に設定する。第２のマスク配列のうちの第２の配列内の各要素の適用するマスクは、第２の配列内での要素の順番を示す数値を用いたビットごとの論理積により指定される。例えば命令列設定手段１４は、計算対象の要素の順番を示す数値から１を減算した値と、第２のパターンに含まれる要素数から１を減算した値とのビットごとの論理積に、１を加算した値を、第２のマスク配列の添字とすることで、要素に適用するマスクを特定する。なお、第２のプログラム２において実行される要素の計算は、第１のプログラム１において実行される要素の計算と同じである。
【００２０】
このような情報処理装置１０によれば、第２のプログラムでは、ビットごとの論理積をマスク配列の添字式として、各要素に適用するマスクが指定されている。ビットごとの論理積の添字式であれば、マスク付きＳＩＭＤ命令におけるマスクの指定に使用できる。また第２のプログラム２に設定された第２のマスク配列は、第１の配列のすべての要素に１対１で対応するマスクを用意する場合に比べ、少ないマスク数で済む。すなわち、情報処理装置１０を用いれば、マスク付きＳＩＭＤ命令において使用するマスク数を削減することができる。
【００２１】
なお、情報処理装置１０に、第２のプログラム２を生成するか否かを判定する判定手段（図示せず）をさらに設けてもよい。判定手段は、例えば第１のマスク配列のデータ量と第２のマスク配列とのデータ量の差を示す第１の差分値と、第１の配列のデータ量と第２の配列のデータ量との差を示す第２の差分値との大きさを比較する。そして判定手段は、比較結果に基づいて、第２のプログラム２を生成するか否かを判定する。例えば、判定手段は、第１の差分値が第２の差分値よりも大きいときに、第２のプログラム２を生成すると判定する。これにより、マスクのデータ量の削減により、全体で使用するデータ量が確実に削減する場合にのみ第２のプログラムを生成することができる。
【００２２】
なお、図１に示す配列設定手段１２、マスク配列設定手段１３、命令列設定手段１４、および図示していない判定手段は、例えば情報処理装置１０が有するプロセッサにより実現することができる。また、記憶手段１１は、例えば情報処理装置１０が有するメモリまたはストレージ装置により実現することができる。
【００２３】
また、図１に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第２の実施の形態〕
次に、第２の実施の形態について説明する。第２の実施の形態は、ＨＰＣシステムで並列実行させるプログラムの開発時に、マスク配列の添字式をビット単位の論理積に単純化することで、ＳＩＭＤ命令を有効に利用した効率的なプログラムを生成するものである。また、第２の実施の形態では、ＳＩＭＤ命令を利用できることによる処理効率が確実に向上する場合にのみ、ＳＩＭＤ命令を利用したプログラムを生成するようにする。これにより、ＳＩＭＤ命令を利用できることにしたことにより、却って処理効率が低下してしまうことを抑止できる。
【００２４】
図２は、第２の実施の形態のシステム構成例を示す図である。図２に示すシステムでは、複数の計算ノード３１，３２，・・・が、ネットワーク２０を介して管理ノード３０に接続されている。計算ノード３１，３２，・・・は、管理ノード３０からの指示に従って、ジョブを実行する。実行するジョブには、複数のプロセッサまたはコアが並列で処理を実行する並列ジョブも含まれる。管理ノード３０は、並列ジョブに対しては、計算ノード３１，３２，・・・内の複数のプロセッサまたはコアを割当て、割り当てたプロセッサまたはコアに並列で処理を実行させる。
【００２５】
計算ノード３１，３２，・・・内のプロセッサは、ＳＩＭＤ演算器を有している。ＳＩＭＤ演算器は、ＳＩＭＤ命令を解釈して処理するための回路である。ＳＩＭＤ演算器は、マスク付きＳＩＭＤ命令を解釈できる。使用するマスクは、マスク配列の添字式で指定できる。ただし、ＳＩＭＤ演算器では、マスク配列の添字式として、単純な計算の式しか利用できない。例えばコンピュータの演算処理として、ビット単位の論理和や論理積回路は単純な回路で済むが、除算回路は複雑となる。プロセッサ内の限られた領域にＳＩＭＤ演算器を実装しようとすると、マスク配列の添字式の解釈のために除算回路まで組み込むのは難しい。そのため、計算ノード３１，３２，・・・内のプロセッサは、マスク付きＳＩＭＤ命令のマスクを指定するマスク配列の添字式として、ビット単位の論理積を利用することはできるが、除算を用いることはできない。
【００２６】
ネットワーク２０には、さらにプログラム開発装置１００と端末装置４０が接続されている。プログラム開発装置１００は、計算ノード３１，３２，・・・に実行させるジョブの処理を記述したプログラムを開発するコンピュータである。端末装置４０は、プログラム開発装置１００を用いてプログラムを開発するユーザが使用するコンピュータである。ユーザは、端末装置４０を用いて、高級言語でソースプログラムを作成し、そのソースプログラムをプログラム開発装置１００に送信する。
【００２７】
プログラム開発装置１００はコンパイラを有している。プログラム開発装置１００は、コンパイラを用いて、端末装置４０から受け取ったソースプログラムをコンパイルし、計算ノード３１，３２，・・・のプロセッサが実行できる形式の実行プログラムを出力する。プログラム開発装置１００は、実行プログラムを管理ノード３０に送信し、実行を指示する。すると管理ノード３０により、その実行プログラムに基づく処理を実行するジョブが生成され、ジョブが計算ノード３１，３２，・・・で実行される。
【００２８】
図３は、第２の実施の形態に用いるプログラム開発装置のハードウェアの一構成例を示す図である。プログラム開発装置１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してメモリ１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＭＰＵ（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）などがある。
【００３５】
機器接続インタフェース１０７は、プログラム開発装置１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置２５やメモリリーダライタ２６を接続することができる。メモリ装置２５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ２６は、メモリカード２７へのデータの書き込み、またはメモリカード２７からのデータの読み出しを行う装置である。メモリカード２７は、カード型の記録媒体である。
【００３６】
ネットワークインタフェース１０８は、ネットワーク２０に接続されている。ネットワークインタフェース１０８は、ネットワーク２０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００３７】
以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なお、第１の実施の形態に示した装置も、図３に示したプログラム開発装置１００と同様のハードウェアにより実現することができる。
【００３８】
プログラム開発装置１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。プログラム開発装置１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、プログラム開発装置１００に実行させるプログラムをストレージ装置１０３に格納しておくことができる。プロセッサ１０１は、ストレージ装置１０３内のプログラムの少なくとも一部をメモリ１０２にロードし、プログラムを実行する。またプログラム開発装置１００に実行させるプログラムを、光ディスク２４、メモリ装置２５、メモリカード２７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ストレージ装置１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００３９】
図４は、プログラム開発装置の機能を示すブロック図である。プログラム開発装置１００は、記憶部１１０とコンパイラ１２０とを有する。
記憶部１１０は、ソースプログラム１１１や実行プログラム１１２を記憶する。記憶部１１０は、例えばメモリ１０２またはストレージ装置１０３の記憶領域の一部である。なお、記憶部１１０は、図１に示した記憶手段１１の一例である。
【００４０】
コンパイラ１２０は、高級言語で記述されたソースプログラム１１１をマシン語に翻訳し、プロセッサ１０１が直接実行できる実行プログラム１１２を生成する。コンパイラ１２０は、例えばコンパイル用のプログラムモジュールをプロセッサ１０１に実行させることで実現することができる。
【００４１】
コンパイラ１２０は、実行プログラム１１２を実行する際に使用する予定のコア数に応じて、並列化できるようにソースプログラム１１１をコンパイルする。コンパイラ１２０は、ソースプログラムに多重ループがあり、最外ループの繰り返し回数がコア数に満たない場合、多重ループを一重化する。
【００４２】
なお、多重ループを一重化した場合において、多重ループ内の多次元配列のアクセスがメモリ上で連続にならない場合がある。コンパイラ１２０は、マスク付きＳＩＭＤ命令によるＳＩＭＤ化を行う。メモリアクセスが連続にならない例として、ステンシル計算がある。ステンシル計算とは、多次元配列のある要素の値をこれに隣接する周囲の配列の値を用いて多重ループで求める計算である。
【００４３】
図５は、ステンシル計算プログラムの一例を示す図である。ステンシル計算プログラム５１では、ループ処理が２重となっている。このステンシル計算プログラム５１のループに対して、メモリの連続性を利用した添字計算の単純な一重化を行うためには、ループの回転範囲を配列の宣言範囲に合わせた上で、配列内の要素にマスクをかける。これによって、計算する要素と計算しない要素とを切り分けることができる。
【００４４】
なお、メモリの連続性とは、メモリ上でａ（３０，１）とａ（１，２）が連続していることである。このような連続性が存在することで、ａ（１，２）に対して、ａ（３１，１）としてアクセスできる。
【００４５】
図６は、ステンシル計算のメモリ領域の一例を示す図である。図６にはステンシル計算プログラム５１で定義された配列の宣言範囲４１内の要素のうち、計算対象の要素（白抜きの部分）と計算対象外の要素（網掛けの部分）とを分けて示している。
【００４６】
ステンシル計算プログラム５１を一重化する場合、マスクを利用して計算対象外の要素の計算を抑止することで、メモリへのアクセスを、連続する領域に対して行わせることができる。マスクを利用する場合、プログラム中にマスク生成処理が挿入される。
【００４７】
図７は、マスク生成処理を含むステンシル計算プログラムの一例を示す図である。図７に示すステンシル計算プログラム５２には、マスク生成処理の記述が含まれている。このマスク生成処理では、マスク配列におけるアクセス対象の要素に対応する添字の値として、その要素の計算を実行するか否か（「ｔｒｕｅ」または「ｆａｌｓｅ」）を示すマスクが設定される。このようなマスク生成処理を行うと、計算対象の要素数（３０×２０＝６００個）と同数のマスクが生成される。
【００４８】
何の対策もせずにマスクを生成すると、マスクのデータ量が大きくなりすぎ、メモリ容量を圧迫する場合がある。そこで、マスクのデータ量を削減することが考えられる。例えば図６に示したメモリ領域のうち、左右両端の各一列分の要素は、ループ処理の先頭と最後尾の部分となり、ループ処理から除外することができる。
【００４９】
図８は、ステンシル計算のメモリ領域のうちのアクセス対象範囲の一例を示す図である。図８に示すように、左右両端の各一列分の要素は、ループの回転範囲から除いても、メモリを連続アクセスすることができる。この場合、計算領域４２は太線で囲んだ部分になる。図８に示すように、計算領域４２には、計算対象の要素（白抜きの部分）と計算対象外の要素（網掛けの部分）とが含まれる。ループの回転範囲は、計算範囲を一次元アクセスしたときの３１要素目から５７０要素までになる。
【００５０】
図９は、ループの回転範囲を制限したステンシル計算プログラムの一例を示す図である。図９に示したステンシル計算プログラム５３では、計算のループ回転範囲が図８に示した計算領域４２となっている。この場合、マスクについても計算領域４２に対応するものを生成すればよい。
【００５１】
図１０は、ループの回転範囲を制限したときのアクセス対象範囲に対応するマスクの配列の例を示す図である。ループの回転範囲を制限したときの計算領域４２に対応するマスクを一次元で表すと、図１０の左側のマスクパターン６１となる。図１０の例では、"false"に設定したマスクを網掛けで示している。このマスクパターン６１は、先頭と最後尾の要素のマスクのみを"false"設定したマスクパターン６２を、繰り返し配置したものになっている。
【００５２】
マスクパターン６１内の各マスクの要素番号から１を引いた値を３０で割り、その余りに１を加えた値を、マスクパターン６２の要素番号に対応させることができる。例えば、マスクパターン６１の６１番目の要素は、ｍｏｄ（（６１−１），３０）＋１＝１によって、マスクパターン６２の１番目の要素に対応する。なお「ｍｏｄ（ｘ，ｙ）」は、ｘをｙで除算したときの剰余の算出命令である（ｘ，ｙは、整数）。そこで、マスクパターン６２を利用できるようにステンシル計算プログラムを変形すれば、マスクのデータ量を削減できる。
【００５３】
図１１は、繰り返し単位のマスクパターンを利用するステンシル計算プログラムの一例を示す図である。図１１に示すステンシル計算プログラム５４では、繰り返し単位のマスクパターン６２に対応するマスクを設定している。そして「ｍａｓｋ（ｍｏｄ（ｉｊ−１，３０）＋１）」という添字式により、ループ内でのマスク配列内の要素が指定されている。
【００５４】
このようにして、マスクのデータ量が削減される。例えば図７に示したステンシル計算プログラム５２では、使用するマスク数が６００個である。それに対して、図１１に示したステンシル計算プログラム５４のようにプログラムを変形すると、使用するマスク数は３０個に削減される。
【００５５】
しかし、ステンシル計算プログラム５４では、マスクの使用数を３０個へと大幅に削減できるものの、マスク配列の添字式が「ｍａｓｋ（ｍｏｄ（ｉｊ−１，３０）＋１）」のように割り算を含む式になっている。そのためステンシル計算プログラム５４をコンパイルしたとき、マスク付のＳＩＭＤ命令が使用できない。すなわち、マスクの使用数を削減しようとすると、マスク配列の添字式が複雑になって、マスク付きＳＩＭＤ命令の使用が妨げられてしまう。
【００５６】
そこで、第２の実施の形態におけるコンパイラ１２０は、ステンシル計算プログラム５４をさらに変形し、マスク付きＳＩＭＤ命令の使用を妨げることなく、マスクの使用数を削減できるようにする。具体的には、コンパイラ１２０は、ステンシル計算プログラム５４におけるマスク配列の添字式が複雑にならないようにするために、以下のような工夫を施す。
【００５７】
ステンシル計算プログラム５４では、マスク配列の要素番号ｎ（ｎは１以上の整数）を、マスクパターンの大きさａ（ａは１以上の整数）で割ったときの余りｒ（ｒは１以上の整数）が、マスク配列の添字に現われる。整数ｎを整数で割った時の余りに関しては、以下の関係が成り立つ。
【００５８】
整数ｎを１０のべき乗１０k（ｋは１以上の整数）で割った余りは、ｎを１０進数で表現した時の下ｋ桁である。同様にして、ｎを２のべき乗２kで割った余りは、ｎを２進数で表現した時の下ｋ桁となる。この下ｋ桁は、ｎをビット列で表したときの下位ｋビットである。
【００５９】
また、ｎを２進数で表現したときの下位ｋビットは、ｎと２k−１とのビットの論理積によって求めることができる。つまり、割り算を用いることなく、ｎを２のべき乗２kで割った余りを求めることができる。
【００６０】
このように、マスクパターンの大きさａが２のべき乗であれば、ビットの論理積演算で、マスク配列の要素番号ｎをマスクパターンの大きさａで割った時の余りｒを求めることができる。ビットの論理積のような単純な計算であれば、マスク付きＳＩＭＤ命令においてマスクを指定する添字式として利用可能である。コンパイラ１２０は、このことを利用するために、マスクパターンの大きさａが２のべき乗でなかった場合に、ａよりも大きい２のべき乗数のうちの最小の数まで、マスクパターンの大きさを拡張する。
【００６１】
図１２は、マスクパターンの拡張例を示す図である。マスクパターン６２の要素数は「３０」である。「３０」は２のべき乗ではないため、マスクパターンの拡張が行われる。「３０」よりも大きい２のべき乗のうちの最小の数は「３２（２5）」である。そこで、要素数が「３２」となるようなマスクパターン６３に拡張される。拡張したマスクパターン６３の３１番目と３２番目の要素は、計算しない部分に対応する。すなわち、マスクの値が"false"に設定される。
【００６２】
拡張したマスクパターン６３を繰り返し使用することで、マスクのデータ量が削減される。
図１３は、拡張したマスクパターンとアクセス対象範囲との関係を示す図である。拡張したマスクパターン６３を適用するために、ループ処理で使用する配列の宣言範囲４３も拡張される。そして、拡張された配列の宣言範囲４３の計算領域４４に対して、マスクパターン６３を繰り返し適用することで、ループ処理において計算領域４４内で連続した要素をアクセス対象とすることができる。また、２のべき乗個の要素分のマスクパターン６２を使用することで、マスク配列の添字式としてビットの論理積を用いることができ、ＳＩＭＤ化が可能となる。
【００６３】
図１４は、拡張したマスクパターンを利用するステンシル計算プログラムの例を示す図である。図１４に示すステンシル計算プログラム５５では、配列の宣言範囲が「ａａ（３２，２０），ｂｂ（３２，２０）」に拡張されている。そして、３２個のマスクの値が設定され、ループ処理内では、「ｍａｓｋ（ｉａｎｄ（ｉｊ−１，３１）＋１）」によって、ビットの論理積によって適用するマスクが指定されている。ここで、ｉａｎｄ（ｘ，ｙ）は整数ｘ，ｙが対応するビットの論理積を求めるFortranの組込み関数である。
【００６４】
ステンシル計算プログラム５５では、マスクパターン６３の大きさを２のべき乗に拡張することで、マスク配列の添字式を単純化されている。コンパイラ１２０が、このようなステンシル計算プログラム５５を生成することで、マスク付きＳＩＭＤ命令の使用を妨げずに、マスク配列の使用数が削減できる。
【００６５】
次に、コンパイラ１２０の機能について詳細に説明する。
図１５は、コンパイラの機能を示すブロック図である。図１５には、コンパイラ１２０が有する機能のうち、多重ループの一重化やＳＩＭＤ化を用いたプログラムの最適化機能が示されている。
【００６６】
コンパイラ１２０は、ソースプログラム解析部１２１、判定部１２２、拡張部１２３、および実行プログラム生成部１２４を有する。ソースプログラム解析部１２１は、ソースプログラムを解析する。ソースプログラム解析部１２１は、ソースプログラム内に多重ループがある場合、マスクを用いて多重ループを一重化した、中間表現のプログラム（マスク利用ループ処理プログラム７１）を生成する。生成されたマスク利用ループ処理プログラム７１は、一時的に、記憶部１１０に格納される。
【００６７】
判定部１２２は、要素格納用のメモリ領域およびマスクパターンを拡張するかどうかを判定する。例えば判定部１２２は、要素格納用のメモリ領域およびマスクパターンを拡張することが、処理効率の向上に有効である場合に、拡張を実施すると判定する。具体的には、判定部１２２は、メモリ領域の拡張によって増加するメモリ量とマスク配列の削減によって減少するメモリ量を比較する。マスク配列の削減で減少するメモリ量が、メモリ領域の拡張で増加するメモリ量を上回る場合に、拡張すると判定する。
【００６８】
拡張部１２３は、要素格納用のメモリ領域およびマスクパターンを拡張すると判定された場合、拡張したマスクパターンを利用する、中間表現のプログラム（拡張マスク利用ループ処理プログラム７２）を生成する。生成された拡張マスク利用ループ処理プログラム７２は、一時的に記憶部１１０に格納される。なお、拡張部１２３は、図１に示した配列設定手段１２、マスク配列設定手段１３、および命令列設定手段１４を包含する機能の一例である。
【００６９】
実行プログラム生成部１２４は、マスク利用ループ処理プログラム７１または拡張マスク利用ループ処理プログラム７２に基づいて、マシン語の実行プログラムを生成する。例えば実行プログラム生成部１２４は、要素格納用のメモリ領域およびマスクパターンを拡張すると判定された場合、拡張マスク利用ループ処理プログラム７２に基づいて、マシン語の実行プログラムを生成する。また実行プログラム生成部１２４は、要素格納用のメモリ領域およびマスクパターンを拡張しないと判定された場合、マスク利用ループ処理プログラム７１に基づいて、マシン語の実行プログラムを生成する。
【００７０】
このような構成のコンパイラ１２０により、まず、多重ループを含むソースプログラムから、中間表現であるマスク利用ループ処理プログラム７１が生成される。
図１６は、マスク利用ループ処理プログラムの生成例を示す図である。図１６に示すソースプログラム７３は、図５に示したステンシル計算プログラム５１を一般化したものである。ソースプログラム解析部１２１は、ソースプログラム７３を解析して、マスク利用ループ処理プログラム７１を生成する。マスク利用ループ処理プログラム７１は、ソースプログラム７３と同じ処理を表している。
【００７１】
このマスク利用ループ処理プログラム７１に基づいて、判定部１２２が、要素格納用のメモリ領域およびマスクパターンを拡張するかどうかを判定する。
図１７は、判定処理の手順を示すフローチャートである。以下、図１７に示す処理をステップ番号に沿って説明する。
【００７２】
［ステップＳ１０１］判定部１２２は、計算領域の大きさ（各次元方向の要素数）を示す値「Ｍ×Ｎ」（Ｍ，Ｎは１以上の整数）を取得する。
［ステップＳ１０２］判定部１２２は、配列の種類数を示す値「２」を取得する。
【００７３】
［ステップＳ１０３］判定部１２２は、計算対象の配列１要素あたりのメモリサイズを示す値「４」を取得する。
［ステップＳ１０４］判定部１２２は、マスクパターンの大きさ（要素数）を示す値「Ｍ」を取得する。
【００７４】
［ステップＳ１０５］判定部１２２は、マスク１要素のメモリサイズを示す値「４」を取得する。
［ステップＳ１０６］判定部１２２は、Ｍ以上の２のべき乗のうち最小の値「Ｘ」（Ｘは１以上の整数）取得する。
【００７５】
［ステップＳ１０７］判定部１２２は、マスクパターンの大きさをＭからＸに拡張した場合の計算対象配列の要素数の増加量を、式「（Ｘ−Ｍ）×Ｎ」により計算する。
［ステップＳ１０８］判定部１２２は、マスクパターンの大きさをＭからＸに拡張した場合のマスク配列の要素数の減少量を、式「Ｍ×Ｎ−Ｘ」により計算する。
【００７６】
［ステップＳ１０９］判定部１２２は、増加する計算対象配列のメモリ量を、式「（Ｘ−Ｍ）×Ｎ×４」により計算する。
［ステップＳ１１０］判定部１２２は、減少する計算対象の配列のメモリ量を、式「（Ｍ×Ｎ−Ｘ）×４」により計算する。
【００７７】
［ステップＳ１１１］判定部１２２は、増加する計算対象の配列のメモリ量「（Ｘ−Ｍ）×Ｎ×４」が、減少するマスク配列のメモリ量「（Ｍ×Ｎ−Ｘ）×４」より少ないか否かを判断する。増加する計算対象の配列のメモリ量の方が少なければ、処理がステップＳ１１２に進められる。そうでなければ、処理がステップＳ１１３に進められる。
【００７８】
［ステップＳ１１２］判定部１２２は、領域を拡張すると判定し、判定処理を終了する。
［ステップＳ１１３］判定部１２２は、領域を拡張しないと判定し、判定処理を終了する。
【００７９】
このように、判定部１２２により、計算領域およびマスクパターンを拡張するかどうかが判定される。判定は、領域拡張によって増加するメモリ量とマスク配列の削減によって減少するメモリ量の比較によって行われ、後者が前者を上回る場合に、領域を拡張すると判定される。
【００８０】
領域を拡張すると判定された場合、拡張部１２３により、マスク利用ループ処理プログラム７１の要素格納用のメモリ領域およびマスクパターンが拡張され、拡張マスク利用ループ処理プログラム７２が生成される。
【００８１】
図１８は、拡張処理の手順の一例を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。
［ステップＳ１２１］拡張部１２３は、マスク利用ループ処理プログラム７１内の配列の宣言範囲述を「Ｘ×Ｎ」に拡張されるように修正した記述を、拡張マスク利用ループ処理プログラム７２に追加する。
【００８２】
［ステップＳ１２２］拡張部１２３は、マスク利用ループ処理プログラム７１内のマスクパターンの記述を、拡張したマスクパターンとなるように変更した記述を、拡張マスク利用ループ処理プログラム７２に追加する。変更後のマスクパターンの要素数は「Ｘ」となる。
【００８３】
［ステップＳ１２３］拡張部１２３は、マスク利用ループ処理プログラム７１内のループ回数の記述を、配列の拡張に合わせて修正し、修正した記述を、拡張マスク利用ループ処理プログラム７２に追加する。
【００８４】
［ステップＳ１２４］拡張部１２３は、マスク利用ループ処理プログラム７１内のループ処理内の計算命令を、修正して拡張マスク利用ループ処理プログラム７２に追加する。修正した計算命令では、マスク配列の添字式をビット単位の論理積で表すことで、各要素の適用するマスクが指定される。
【００８５】
このような拡張処理により、マスク利用ループ処理プログラム７１が拡張マスク利用ループ処理プログラム７２に変更される。
図１９は、拡張処理の一例を示す図である。マスク利用ループ処理プログラム７１における「ｒｅａｌ：配列：ａ（Ｍ，Ｎ），ｂ（Ｍ，Ｎ）」の記述は、拡張マスク利用ループ処理プログラム７２において「ｒｅａｌ：配列：ａ（Ｘ，Ｎ），ｂ（Ｘ，Ｎ）」に変更されている。これにより、計算領域が拡張される。
【００８６】
マスク利用ループ処理プログラム７１における「ｌｏｇｉｃａｌ：ｍａｓｋ（Ｍ，Ｎ）」の記述は、拡張マスク利用ループ処理プログラム７２において「ｌｏｇｉｃａｌ：ｍａｓｋ（Ｘ）」に変更されている。これにより、マスク配列が、２のべき乗個（Ｘ）のマスクを含むように拡張される。
【００８７】
マスク利用ループ処理プログラム７１におけるマスクの値を設定する記述は、拡張マスク利用ループ処理プログラム７２において「ｍａｓｋ＝偽」、「ｌｏｏｐ：ｉ：始値＝２：終値＝Ｍ−１」、「ｍａｓｋ（ｉ）＝真」に変更されている。これにより、繰り返し使用されるマスクパターンの各マスクの値が設定される。拡張により追加したマスクの値は「偽」となる。
【００８８】
マスク利用ループ処理プログラム７１における「ｌｏｏｐ：ｉｊ：始値＝１＋Ｍ：終値＝Ｍ＊Ｎ−Ｍ」の記述は、拡張マスク利用ループ処理プログラム７２において「ｌｏｏｐ：ｉｊ：始値＝１＋Ｘ：終値＝Ｘ＊Ｎ−Ｘ」に変更されている。これにより、配列の拡張に応じて、ループ下位数が変更されている。
【００８９】
マスク利用ループ処理プログラム７１では、計算命令は「ｉｆ：ｍａｓｋ（ｉｊ，１）＝＝真：ａ（ｉｊ，１）＝（ｂ（ｉｊ−１−Ｍ，１）＋ｂ（ｉｊ＋１−Ｍ，１）＋ｂ（ｉｊ−１＋Ｍ，１）＋ｂ（ｉｊ＋１＋Ｍ，１））／４」と記述されている。この計算命令は、拡張マスク利用ループ処理プログラム７２では「ｉｆ：ｍａｓｋ（ｉａｎｄ（ｉｊ−１，Ｘ−１）＋１）＝＝真：ａ（ｉｊ，１）＝（ｂ（ｉｊ−１−Ｘ，１）＋ｂ（ｉｊ＋１−Ｘ，１）＋ｂ（ｉｊ−１＋Ｘ，１）＋ｂ（ｉｊ＋１＋Ｘ，１））／４」と変更されている。この計算命令のうち、「ｍａｓｋ（ｉａｎｄ（ｉｊ−１，Ｘ−１）＋１）」が、マスク配列におけるマスクの指定であり、「ｉａｎｄ（ｉｊ−１，Ｘ−１）＋１」が、マスク配列の添字式である。
【００９０】
添字式は、要素番号「ｉｊ」から１を減算した値と、Ｘから１を減算した値とのビットごとの論理積の結果に１を加算する計算を表している。Ｘが「３２」であれば、Ｘから１を減算した値は「３１」となる。「３１」（２5−１）を２進数（ビットごとの「０／１」で表すと「１１１１１」（５個の値「１」のビット列）となる。そのため要素番号「ｉｊ」から１を減算した値とＸから１を減算した値との論理積により、要素番号「ｉｊ」から１を減算した値の下位５ビットが得られる。この５ビットの値は、要素番号「ｉｊ」から１を減算した値を「３２」で除算したときの余りである。「３２」で除算した余りは、「０」〜「３１」の範囲のいずれかの数値となる。この余りに「１」を加算することで、図１２に示すマスクパターン６３の「１」〜「３２」のいずれかのマスクを示す番号が得られる。
【００９１】
このように、第２の実施の形態では、計算領域の大きさを２のべき乗単位に拡張することによって、マスク配列の添字式が単純化される。これにより、マスク配列の使用数の削減とマスク付きＳＩＭＤ命令の使用を両立させることができる。
【００９２】
しかも拡張処理を行うことが、メモリの使用効率を向上させる場合にのみ拡張処理を行うため、拡張処理を行ったために却ってメモリの使用効率が低下するようなことを回避することができる。
【００９３】
［その他の実施の形態］
第２の実施の形態では、中間表現のプログラムを修正することで、マスク配列の使用数の削減とマスク付きＳＩＭＤ命令の使用を両立させているが、ソースプログラムの段階で修正することも可能である。
【００９４】
図２０は、ソースプログラムの修正例を示す図である。図２０に示すように、ソースプログラム７３を修正し、ビット単位の論理和でマスク配列の添字式を表現したソースプログラム７４に修正することもできる。このようなソースプログラム７４のコンパイルを実施すれば、マスク配列の使用数の削減とマスク付きＳＩＭＤ命令の使用を両立させた実行プログラムが生成される。
【００９５】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【００９６】
１  第１のプログラム
２  第２のプログラム
１０  情報処理装置
１１  記憶手段
１２  配列設定手段
１３  マスク配列設定手段
１４  命令列設定手段
【図１】
0006666554.tif 000002
【図２】
0006666554.tif 000003
【図３】
0006666554.tif 000004
【図４】
0006666554.tif 000005
【図５】
0006666554.tif 000006
【図６】
0006666554.tif 000007
【図７】
0006666554.tif 000008
【図８】
0006666554.tif 000009
【図９】
0006666554.tif 000010
【図１０】
0006666554.tif 000011
【図１１】
0006666554.tif 000012
【図１２】
0006666554.tif 000013
【図１３】
0006666554.tif 000014
【図１４】
0006666554.tif 000015
【図１５】
0006666554.tif 000016
【図１６】
0006666554.tif 000017
【図１７】
0006666554.tif 000018
【図１８】
0006666554.tif 000019
【図１９】
0006666554.tif 000020
【図２０】
0006666554.tif 000021