(57)【要約】  本技術によれば、内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第１のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する。そして、取得された特徴量に基づき、第２のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる。
2014064798.tif 000002
【特許請求の範囲】
【請求項１】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる
処理を、前記プロセッサに実行させるためのプログラム。
【請求項２】
前記特徴量が、前記回数、前記回数の割合、前記回数の平均値、前記回数の割合の平均値、前記回数の最小値、又は前記回数の割合の最小値である
請求項１記載のプログラム。
【請求項３】
前記取得する処理を、前記オブジェクトコードの実行中定期的又は不定期に実行する
請求項１記載のプログラム。
【請求項４】
前記回数についてのデータを、前記プロセッサのカウンタから取得する
請求項１乃至３のいずれか１つ記載のプログラム。
【請求項５】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる
処理を含み、前記プロセッサにより実行される実行制御方法。
【請求項６】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得する手段と、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる手段と、
有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、オブジェクトコードの実行制御技術に関する。
【背景技術】
【０００２】
スーパーコンピュータの進歩と共に、その上で動作するアプリケーションプログラムも複雑化してきている。例えば、空間軸や時間軸に沿って単一の処理内容を繰り返し行う処理（例えば単純なＤＯループ処理）が主流であったが、個々の空間によって処理内容を変えたり、時間進展と共に処理内容を変えたりするようになった。すなわち、繰り返し処理において様々な条件（プログラムコードではＩＦ文に相当）に対応する処理を含むアプリケーションプログラムが開発され、より現実的なシミュレーションをコンピュータ上で実行するようになってきている。そして、このような複雑に動作するアプリケーションプログラムを、高性能なコンピュータ上でいかに高速に動作させるかが１つの課題となっている。【０００３】
ＤＯループ中にＩＦ文が含まれるコードをコンパイラ最適化によって高速化する方法として、述語付き命令（predicated instruction）を用いた高速化手法や、リストベクトルを生成して高速化する手法が存在する。【０００４】
例えば図１Ａに示すようなＩＦ文を含むＤＯループの場合、通常であれば図１Ｂに示すようなコードが生成される。すなわち、ｘ（ｉ）＞０がＴＲＵＥであれば、「ＴＲＵＥ」で囲った部分の命令の実行が行われ、ｘ（ｉ）＞０がＦＡＬＳＥであれば、分岐命令ｆｂｌｅからＬ０のラインにジャンプしてＦＡＬＳＥの場合の命令を実行するようなコードが生成される。一方、述語付き命令を用いる場合には、図１Ｃに示すようなコードが生成される。図１Ｃにおいて点線の四角で示すように、分岐命令は含まれておらず、常にＴＲＵＥの場合の命令及びＦＡＬＳＥの場合の命令が実行され、ｘ（ｉ）＞０がＦＡＬＳＥであればＴＲＵＥについての述語付き「ｓｔｏｒｅ」命令はキャンセルされ且つＴＲＵＥについての演算結果は破棄されるようなコードが生成される。【０００５】
従って、例えばＤＯループ内のＩＦ文についてＦＡＬＳＥの時に何もしないというコードの場合、図２に示すように、ＩＦ文の条件が常に真と判断される場合、すなわち真率（＝ＴＲＵＥについての命令実行回数／ＤＯループの実行回数）が１００％であれば、実行する命令の全てが有効となる。一方、例えば真率が１００％ではないが９０％と高い場合には、実行する命令のうち有効な命令ａは多いが、一部冗長な命令も出てくる。そして、真率が１０％と低くなると、有効な命令が少なくなって、冗長な命令ｂが多くなってしまう。すなわち、真率が高くないと多くの演算結果が破棄されるので高命令実行効率の効果が得られない。【０００６】
この手法によれば、図３Ａに示すようにＤＯループを何度も実行する場合に、真率が高いままでおおよそ一定であれば、全体としても有効な命令の数が多くなって、高速化の効果が得られる。一方、図３Ｂに示すように、真率が低いままでおおよそ一定であれば、全体としても冗長な命令数が多くなって、高命令実行効率の効果が全く得られない。このように真率がおおよそ一定であれば、真率が高い場合には述語付き命令を用いる手法を用いることが有効であるが、図３Ｃに示すように、ＤＯループを繰り返して実行するうちに、途中で真率が大幅に変化するといった状況が発生すると、途中から大幅に命令の実行効率が低下するという問題がある。なお、述語付き命令を用いる場合には、図３Ａ乃至図３Ｃに模式的に示すように、処理時間自体は真率に拘わらず一定であり、演算実行効率が変化することになる。【０００７】
また、図４Ａに示すようなＩＦ文を含むＤＯループであってＴＲＵＥの場合には命令が存在するがＦＡＬＳＥの場合に命令が存在しない場合、リストベクトルを生成する手法によれば、図４Ｂに模式的に示すようなコードが生成される。すなわち、ＩＦ文についての条件が真となるときのインデックスｉをリストベクトルｉｎｄｅｘ（ｊｊｊ）に設定するループについてのコードｃと、リストベクトルｉｎｄｅｘに設定されているインデックスｉについてのみ演算を繰り返すループ（リストベクトルループとも呼ぶ）についてのコードｄとが生成される。すなわち、ＩＦ節とＴＨＥＮ節を分離して、分岐命令のないＴＨＥＮ節を高速化するものである。【０００８】
このようなリストベクトルを生成する手法においては、リストベクトルを生成するコードｃの実行は真率に拘わらず常に行われるが、図５Ａに模式的に示すように、例えば９０％と真率が高ければリストベクトルに含まれるインデックスの数が多くなり、リストベクトルループのための処理時間が長くなる。一方、図５Ｂに模式的に示すように、例えば１０％と真率が低ければリストベクトルに含まれるインデックスの数は少なくなり、リストベクトルループのための処理時間が短くなる。このように、ＩＦ文における条件がＴＲＵＥの場合には命令が存在するがＦＡＬＳＥの場合に命令が存在しない場合、真率が低いほど処理時間が短くなる。このように真率が低い状態で一定であれば、真率が低い場合にはリストベクトルを生成する手法を採用することが効率的であるが、図５Ｃに示すように、初めは真率が低くて効率的な実行が行われていたとしても、途中で真率が高くなるように状況が変化すると、全体として効率的に実行できるわけではない。【０００９】
従来技術は、このような問題に対処するような手法を提示していない。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開昭５９−１６５１４７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
従って、本技術の目的は、一側面によれば、内部に条件分岐を含むループ処理を複数回実行する場合に効率的に演算実行するための技術を提供することである。
【課題を解決するための手段】
【００１２】
本技術に係る実行制御方法は、（Ａ）内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第１のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する処理と、（Ｂ）取得された特徴量に基づき、第２のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる処理とを含む。
【発明の効果】
【００１３】
一側面によれば、内部に条件分岐を含むループ処理を繰り返す場合に効率的に演算実行できるようになる。
【図面の簡単な説明】
【００１４】
【図１Ａ】図１Ａは、ソースコードの一例を示す図である。
【図１Ｂ】図１Ｂは、通常処理のコードの一例を示す図である。
【図１Ｃ】図１Ｃは、述語付き命令を用いたコードの一例を示す図である。
【図２】図２は、真率と実行効率を説明するための図である。
【図３Ａ】図３Ａは、真率と実行効率を説明するための図である。
【図３Ｂ】図３Ｂは、真率と実行効率を説明するための図である。
【図３Ｃ】図３Ｃは、真率と実行効率を説明するための図である。
【図４Ａ】図４Ａは、ソースコードの一例を示す図である。
【図４Ｂ】図４Ｂは、リストベクトルを生成するコードを模式的に示す図である。
【図５Ａ】図５Ａは、真率と処理時間を説明するための図である。
【図５Ｂ】図５Ｂは、真率と処理時間を説明するための図である。
【図５Ｃ】図５Ｃは、真率と処理時間を説明するための図である。
【図６】図６は、実施の形態の前処理について説明するための図である。
【図７】図７は、本実施の形態に係る実行制御の概要を示す図である。
【図８】図８は、本実施の形態に係るコンピュータの構成を示す図である。
【図９】図９は、本実施の形態における処理フローを示す図である。
【図１０】図１０は、実行制御処理の処理フローを示す図である。
【図１１】図１１は、真率調査処理の処理フローを示す図である。
【図１２】図１２は、真率調査結果の一例を示す図である。
【図１３】図１３は、コード決定処理の処理フローを示す図である。
【図１４】図１４は、実行制御処理の処理フローを示す図である。
【図１５】図１５は、変形例に係るオブジェクトコードの一例を示す図である。
【図１６】図１６は、実行制御処理の処理フローの変形例を示す図である。
【図１７】図１７は、変形例の処理時間について説明するための図である。
【図１８】図１８は、ループに２つのＩＦ文を含むソースコードの一例を示す図である。
【図１９】図１９は、ループ分割の一例を示す図である。
【図２０】図２０（ａ）乃至（ｄ）は、ループ分割した場合の処理時間等を説明するための図である。
【図２１】図２１は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１５】
図６を用いて、本技術の実施の形態における前処理の概要を説明する。図６に示すように、本実施の形態に係るランタイムモジュールを利用するユーザは、ソースコード１００において、ＩＦ文を含み且つ高速化を図るべきループの直前に、コンパイラ２００への指示文として「！ｏｃｌ  ｓｅｌｅｃｔ−ｉｆ」文を挿入しておく。本実施の形態では、ＩＦ文の条件が真の場合には演算を行うが、ＩＦ文の条件が偽の場合には演算を行わないような場合を例に説明する。
【００１６】
本実施の形態に係るコンパイラ２００は、このような指示文が挿入されたソースコード１００が入力されると、指示文が挿入されていない部分については通常どおりコンパイルを行う。一方、指示文が挿入されている部分について、コンパイラ２００は、以下のコードを生成する。すなわち、（Ａ）通常どおり条件分岐を行うコードＡと、（Ｂ）述語付き命令を用いたコードＢと、（Ｃ）リストベクトルを生成するコードＣと、（Ｄ）さらにこれらの直前に、以下で説明するランタイムモジュールに対して、ループの識別子（すなわちループＩＤ）とループ内における繰り返し回数とループの実行回数とを含む実行時環境変数をセットする命令「ｓｅｔｅｎｖ（ループＩＤ）」と、（Ｅ）ランタイムモジュールからループＩＤ及びコード種別の設定を受け取る命令「ｇｅｔｅｎｖ（ループＩＤ，コード種別）」とが生成される。
【００１７】
コードＡは、図１Ｂに示すようなコードであって、条件分岐がそのままコード化されたループについてのコードである。また、コードＢは、図１Ｃに示すようなコードであって、述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むようにしたループについてのコードである。より具体的には、述語付き命令を用いて条件分岐の条件が真の場合にのみ真の場合における分岐先演算の演算結果をメモリに書き込むようにしたループについてのコードである。さらに、コードＣは、図４Ｂに示すようなコードであって、条件分岐の条件が真となるループインデックスをリストベクトルとして抽出した上で抽出されたループインデックスのみについて条件分岐の条件が真の場合における分岐先演算を実行するためのコードである。
【００１８】
このようなオブジェクトコード３００の生成は、オブジェクトコード３００を実行するコンピュータと同じコンピュータで行っても良いし、異なるコンピュータで行っても良い。
【００１９】
次に、図７を用いて、このように生成したオブジェクトコード３００の実行制御の概要を説明する。図７における横軸の刻みは、コードＡ乃至Ｃが生成されたループの実行回数を表している。図７の例では、ループそのものが何度も繰り返し実行されるため、ランタイムモジュールは、５回ループを例えば最初はコードＡで実行する間にループ内部のＩＦ文における条件が真である割合、すなわち真率を調査する。この真率調査区間において取得された真率の特徴量（真率の平均値、最小値など）に応じて、真率調査区間終了後、ランタイムモジュールは、コードＢとコードＣとのうちいずれかを実行するように設定する。背景技術の欄にも述べたようにコードＢは真率が高い場合に有効であるから、真率の特徴量が閾値を超えている場合には、コードＢを実行するように設定し、真率の特徴量が閾値以下であれば、コードＣを実行するように設定する。
【００２０】
その後、図７の例では、１５回ループを、設定したコードで実行した後、再度真率調査区間となる。２回目以降の真率調査区間では、本実施の形態では、それまでにコードＣを実行している場合にはそのままコードＣを実行して真率の特徴量を取得する。一方、それまでにコードＢを実行している場合には、真率調査区間ではコードＡを実行して真率の特徴量を取得する。そして、真率調査区間終了後、ランタイムモジュールは、上で述べたように、真率の特徴量が閾値を超える場合には、コードＢを実行するように設定し、真率の特徴量が閾値以下である場合には、コードＣを実行するように設定する。
【００２１】
以上のような処理を、指定されたＤＯループが実行されなくなるまで繰り返す。これによって、ＤＯループの実行を繰り返しているうちに真率が変化した場合においても、非効率なコードを実行し続けることなく、効率的なコードに実行を動的に切り替えることができるようになる。
【００２２】
なお、以下でも述べるが、真率を算出するためのデータを取得するのにコストが大きくかかるようでは高速化の効果を得ることができないので、ＣＰＵが有するハードウエアカウンタを活用する。多くの種類のＣＰＵは、アプリケーションプログラムの実行中にＩＦ文の条件が真の場合の演算を実行した回数やＩＦ文の条件が偽の場合の演算を実行した回数、ループの実行回数、ループ内の繰り返し回数などをカウントすることが可能なハードウエアカウンタを備えている。ランタイムモジュールは、このようなハードウエアカウンタに保持されているカウンタ値を読み出すことで真率算出のためのデータを取得するコストを抑える。
【００２３】
次に、図８を用いて、オブジェクトコード３００を実行するコンピュータ１０００について説明する。コンピュータ１０００は、ＣＰＵ（Central Processing Unit）１１００と、メモリ１２００と、ハードディスクドライブなどのデータ格納部１３００とを有する。
【００２４】
データ格納部１３００は、オブジェクトコード３００とランタイムモジュール４００とのファイルを格納しており、これらはユーザからの指示に応じてメモリ１２００にロードされる。メモリ１２００におけるオブジェクトコード３００のイメージについてはオブジェクトコード１２２０として表し、メモリ１２００におけるランタイムモジュール４００のイメージについてはランタイムモジュール１２１０として表すものとする。ランタイムモジュール１２１０がＣＰＵ１１００により実行されると、ループ特定部１２１１と、真率計算部１２１２と、コード決定部１２１３とが実現される。また、ランタイムモジュール１２１０は、ユーザによる設定データを格納する設定データ格納部１２１４を有する。設定データ格納部１２１４は、真率の特徴量についての閾値、真率調査区間のループ実行回数、真率調査区間の間隔に相当するループ実行回数、真率の特徴量として使用する指標（例えば平均値、最低値など）などの設定データを格納する。オブジェクトコード１２２０は、ユーザにより指定されたループについてコードＡ、コードＢ及びコードＣを含んでいる。
【００２５】
また、ＣＰＵ１１００は、上で述べたように複数のハードウエアカウンタを有しており、ＩＦ文の条件が真の場合のコードを実行した回数をカウントするカウンタ１と、ループの実行回数をカウントするカウンタ２と、ループ内の繰り返し回数をカウントするカウンタ３とを有する。
【００２６】
次に、オブジェクトコード３００の実行時の処理について図９乃至図２０を用いて説明する。まず、ユーザからの指示に応じて、オブジェクトコード３００及びランタイムモジュール４００をデータ格納部１３００からメモリ１２００にロードしてＣＰＵ１１００による実行を開始する（ステップＳ１）。そして、ユーザが指定したループについてのコードを実行する段階になると、ランタイムモジュール１２１０は、実行制御処理を実行する（ステップＳ３）。実行制御処理については、図１０乃至図１４を用いて説明する。
【００２７】
まず、ループ特定部１２１１は、真率調査対象のループが検出されるまで待機する（ステップＳ１１）。図６に模式的に示したように、ｓｅｔｅｎｖ命令に応じてランタイムモジュール１２１０のループ特定部１２１１は、コードの動的切替を実施すべき箇所を実行することを認識し、ループＩＤとループ内における繰り返し回数とループの実行回数とを含む実行環境変数を取得する。
【００２８】
また、ループ特定部１２１１は、ループの実行回数のカウンタ及び真率チェックのカウンタを共に０に初期化する（ステップＳ１３）。初めて検出したループＩＤの場合には、まだどのコードを実行するのが好ましいのかが不明であるから、コード決定部１２１３は、本実施の形態ではコードＡ、すなわち通常処理のコードを実行するように設定を行う（ステップＳ１５）。オブジェクトコード１２２０側では、ｇｅｔｅｎｖ命令で、コードＡの実行指示を特定し、コードＡの実行を開始する。
【００２９】
そして、真率計算部１２１２は、真率チェックのカウンタの値に基づき、真率調査区間が終了したか判断する（ステップＳ１７）。例えば、図７の例では、真率調査区間に相当するループ実行回数は「５」であるから、真率チェックのカウンタのカウンタ値が「５」以上となったか否かを判断する。真率調査区間が終了していない場合には、真率計算部１２１２は、真率調査処理を実行する（ステップＳ１９）。真率調査処理については、図１１及び図１２を用いて説明する。
【００３０】
真率計算部１２１２は、ＣＰＵ１１００のカウンタ１（ＩＦ文の条件が真の場合にカウントアップされるカウンタ）、カウンタ２（ループの実行回数についてのカウンタ）及びカウンタ３（ループの繰り返し回数についてのカウンタ）のカウント値を取得して、メモリ１２００に格納する（ステップＳ４１）。カウンタ１の現在値を取得するため、ループを実行する前に取得する。そして、ループの繰り返し回数がＮであればカウンタ３がＮ増加した後又はカウンタ２が１増加した後（ステップＳ４３）、真率計算部１２１２は、ＣＰＵ１１００のカウンタ１のカウント値を取得し、メモリ１２００に格納する（ステップＳ４５）。そして、真率計算部１２１２は、（ステップＳ４５で取得したカウンタ１のカウント値−ステップＳ４１で取得したカウンタ１のカウント値）／Ｎによって、今回のループの真率を算出し、メモリ１２００に格納する（ステップＳ４７）。そして、真率計算部１２１２は、真率チェックのカウンタを１インクリメントする（ステップＳ４９）。その後、処理は呼び出し元の処理に戻る。
【００３１】
図１０の処理の説明に戻って、処理はステップＳ１９の後にステップＳ１７に戻る。このような真率調査処理を５回繰り返すと、メモリ１２００には、例えば図１２に示すようなデータが得られる。図１２の例では、真率が５回分得られたことになる。なお、条件が真となった回数のデータを保持するようにしても良い。
【００３２】
ステップＳ１７で真率調査区間が終了したと判断された場合、真率計算部１２１２は、真率チェックのカウンタを０に初期化する（ステップＳ２１）。そして、コード決定部１２１３は、真率の調査結果に基づきコード決定処理を実行する（ステップＳ２３）。コード決定処理については、図１３を用いて説明する。
【００３３】
コード決定部１２１３は、真率の特徴量を算出する（図１３：ステップＳ５１）。真率の特徴量は、設定データ格納部１２１４に設定されている種別の特徴量であり、例えば平均値、最小値である。例えば、図１２の例であれば、（ｒ1＋ｒ2＋ｒ3＋ｒ4＋ｒ5）／５によって平均値を算出し、最小値であれば、ｒ1乃至ｒ5のうち最も小さい値を特定する。なお、最小値を採用するのは、リストベクトルを生成するコードＣを実行する方がリスクが低いためである。すなわち、述語付き命令を用いるコードＢを選択して真率が低くなってしまうと、処理時間についてのペナルティが大きいためである。
【００３４】
そして、コード決定部１２１３は、真率の特徴量が、設定データ格納部１２１４に格納されている閾値を超えているか判断する（ステップＳ５３）。真率の特徴量が、閾値を超えている場合には、コードＢ、すなわち述語付き命令を用いるコードを実行するように設定を行う（ステップＳ５７）。オブジェクトコード１２２０側は、設定に応じてコードＢを実行し始める。そして処理は呼び出し元の処理に戻る。
【００３５】
このように真率が高ければ処理時間は変わらないが、演算結果が採用される可能性が高いので、効率的に実行できるようになる。
【００３６】
一方、真率の特徴量が閾値以下であれば、コード決定部１２１３は、コードＣ、すなわちリストベクトルを生成するコードを実行するように設定を行う（ステップＳ５５）。オブジェクトコード１２２０側は、設定に応じてコードＣを実行し始める。そして処理は呼び出し元の処理の処理に戻る。
【００３７】
このように真率が低ければ処理時間を短縮でき、処理の高速化が図られる。
【００３８】
図１０の説明に戻って、ステップＳ２３の後に、述語付き命令を用いるコードＢを実行中であれば（ステップＳ２５：Ｙｅｓルート）、処理は端子Ａを介して図１４の処理に移行する。一方、コードＣを実行中であれば（ステップＳ２５：Ｎｏルート）、真率計算部１２１２は、真率調査タイミングであるか判断する（ステップＳ２７）。これは、実行回数のカウンタのカウント値が、設定データ格納部１２１４に格納されている真率調査区間の間隔（例えば１５）以上となったかを判断する。
【００３９】
真率調査タイミングではない場合には（ステップＳ２７：Ｎｏルート）、ループの繰り返し回数がＮであればカウンタ３がＮ増加した後又はカウンタ２が１増加した後（ステップＳ３１）、真率計算部１２１２は、実行回数のカウンタのカウント値を１インクリメントする（ステップＳ３３）。そして処理はステップＳ２７に戻る。
【００４０】
一方、ループの実行回数が、真率調査区間の間隔（例えば１５）に達して、真率調査タイミングとなれば（ステップＳ２７：Ｙｅｓルート）、真率計算部１２１２は、実行回数のカウンタのカウント値を０に初期化し（ステップＳ２９）、処理はステップＳ１７に戻る。これによって、真率計算を再度行うようにする。
【００４１】
次に図１４の処理の説明に移行して、コードＢを実行中であれば、真率計算部１２１２は、真率調査タイミングであるか判断する（ステップＳ６１）。これは、実行回数のカウンタのカウント値が、設定データ格納部１２１４に格納されている真率調査区間の間隔（例えば１５）以上となったかを判断する。
【００４２】
真率調査タイミングではない場合には（ステップＳ６１：Ｎｏルート）、ループの繰り返し回数がＮであればカウンタ３がＮ増加した後又はカウンタ２が１増加した後（ステップＳ６３）、真率計算部１２１２は、実行回数のカウンタのカウント値を１インクリメントする（ステップＳ６５）。そして処理はステップＳ６１に戻る。
【００４３】
一方、ループの実行回数が、真率調査区間の間隔（例えば１５）に達して、真率調査タイミングとなれば（ステップＳ６１：Ｙｅｓルート）、真率計算部１２１２は、実行回数のカウンタのカウント値を０に初期化し（ステップＳ６７）、処理は図１０のステップＳ１５に戻る。
【００４４】
コードＢを実行中は、ＩＦ文が除去されているので、ＣＰＵ１１００におけるカウンタ１を用いた真率の算出ができない。従って、ステップＳ１５に戻って、通常処理のコードＡの実行を指示することで、真率を算出できるようにする。
【００４５】
このような処理を、オブジェクトコード１２２０の実行が終了するまで繰り返すことで、真率の変動が生じていても、真率に応じたコードを実行することで、演算処理を効率化することができるようになる。
【００４６】
上で述べた例では、条件分岐をそのまま処理するコードＡと、述語付き命令を用いるコードＢと、リストベクトルを生成するコードＣとを生成する処理の例を示したが、図１５に模式的に示すように、コードＡを生成せずに、コードＢ及びコードＣだけを含むオブジェクトコード３００ｂを生成するようにしてもよい。
【００４７】
すなわち、実行制御処理においてコードＡを実行する部分についてはコードＣを実行するようにしてもよい。コードＣを実行すれば、真率を算出することができるので、真率に応じたコードＢとコードＣの動的な切替を実施できる。なお、変更点は、図１０の処理フローにおけるステップＳ１５を、以下のように変更する。すなわち、コード決定部１２１３が、リストベクトルを生成するコードＣを実行するように設定する（図１６：ステップＳ１５ｂ）。
【００４８】
コードＢとコードＣを用いる場合、図１７に模式的に示すように、真率が９０％で高い状態から急に真率が１０％で低い状態に変化すると、コードＢの実行状態からコードＣの実行状態に遷移するものとする。そうすると、処理時間は、コードＣを実行するようになると急激に削減され、効率的な演算実行が行われるようになる。なお、コードＢを実行している間のハッチングは有効な命令の実行の割合を模式的に示すものであり、コードＣを実行している間のハッチングはリストベクトルループの処理時間を模式的に示すものである。
【００４９】
なお、ＤＯループ１回あたりの処理時間をＴｍとし、ＤＯループの全実行回数をａとし、真率Ｔｒｕｅｘの時のＤＯループの実行回数をｂとし、１回あたりのリスト生成の処理時間をαとし、真率Ｔｒｕｅｘ及びＴｒｕｅｙは０以上１以下の実数であるものとする。
【００５０】
このような状態で、ａ回すべてコードＢを実行した場合には、コードＢによる処理時間はａＴｍとなる。また、コードＣによる処理時間は以下のように表される。
ｂ（ＴｒｕｅｘＴｍ＋α）＋（ａ−ｂ）（ＴｒｕｅｙＴｍ＋α）
＝ＴｒｕｅｘｂＴｍ＋ｂα＋ＴｒｕｅｙａＴｍ−ＴｒｕｅｙｂＴｍ＋（ａ−ｂ）α
＝（Ｔｒｕｅｘ−Ｔｒｕｅｙ）ｂＴｍ＋ＴｒｕｅｙａＴｍ＋ａα      （１）
【００５１】
さらに、本実施の形態のように真率Ｔｒｕｅｘの場合にコードＢを実行し、真率Ｔｒｕｅｙの場合にコードＣを実行する場合の処理時間は以下のように表される。
ｂＴｍ＋（ａ−ｂ）（ＴｒｕｅｙＴｍ＋α）
＝ｂＴｍ＋ＴｒｕｅｙａＴｍ−ＴｒｕｅｙｂＴｍ＋（ａ−ｂ）α
＝（１−Ｔｒｕｅｙ）ｂＴｍ＋ＴｒｕｅｙａＴｍ＋（ａ−ｂ）α
＝（（１−Ｔｒｕｅｙ）ｂ＋Ｔｒｕｅｙａ）Ｔｍ＋（ａ−ｂ）α      （２）
【００５２】
ここでａＴｍ＞（２）式となる条件は以下のように表される。
ａＴｍ＞（（１−Ｔｒｕｅｙ）ｂ＋Ｔｒｕｅｙａ）Ｔｍ＋（ａ−ｂ）α
ａＴｍ−（（１−Ｔｒｕｅｙ）ｂ＋Ｔｒｕｅｙａ）Ｔｍ＞（ａ−ｂ）α
（１−Ｔｒｕｅｙ）ａＴｍ−（１−Ｔｒｕｅｙ）ｂＴｍ＞（ａ−ｂ）α
（１−Ｔｒｕｅｙ）（ａ−ｂ）Ｔｍ＞（ａ−ｂ）α
（１−Ｔｒｕｅｙ）Ｔｍ＞α  （３）
【００５３】
さらに、（１）式＞（２）式となる条件は以下のように表される。
（Ｔｒｕｅｘ−Ｔｒｕｅｙ）ｂＴｍ＋Ｔｒｕｅｙａ＋ａα＞（（１−Ｔｒｕｅｙ）ｂ＋Ｔｒｕｅｙａ）Ｔｍ＋（ａ−ｂ）α
ＴｒｕｅｘｂＴｍ−ｂＴｍ＞−ｂα
ｂα＞（１−Ｔｒｕｅｘ）ｂＴｍ
α＞（１−Ｔｒｕｅｘ）Ｔｍ  （４）
【００５４】
従って、（３）式及び（４）式から、以下のような条件が分かる。
（１−Ｔｒｕｅｘ）Ｔｍ＜α＜（１−Ｔｒｕｅｙ）Ｔｍ
【００５５】
なお、図１８のようにループ内にＩＦブロックｘとＩＦブロックｙとが含まれる場合がある。一般的に、ＩＦブロックｘ内の演算と、ＩＦブロックｙ内の演算とに相互依存性がなければ、図１９のようにループ分割される。すなわち、図１９の例では、ＩＦブロックｘについてのループＸと、ＩＦブロックｙについてのループＹとに分割する。このようにすれば、ループＸとループＹとで異なるコードを実行することができるようになる。例えば、ループＸについては真率が高いためコードＢを実行し、ループＹについては真率が低いためコードＣを実行するものである。
【００５６】
さらに、片方のループ又は両方のループで、途中で真率が大きく変化した場合についても、上で述べた処理フローに従ってコードＢとコードＣとを動的に切り替えれば、演算処理を効率的に実行できるようになる。
【００５７】
例えば、図２０（ａ）に示すように、ループＸ及びループＹをコードＢで実行すると、ループＹがきわめて非効率な実行となり処理時間も長くなる。一方、図２０（ｂ）に示すように、ループＸ及びループＹをコードＣで実行すると、ループＸについてはリストベクトルループの処理時間が長くなってしまうので、あまり処理時間を短縮できない。一方、図２０（ｃ）に示すように、真率が例えば９０％と高いループＸについてはコードＢで実行し、真率が例えば１０％と低いループＹについてはコードＣで実行すれば、処理時間が全体として短くなり効率的な演算処理が行われるようになる。同様に、途中で真率が変化して、ループＸについて真率が例えば１０％となり、ループＹについては真率が例えば９０％となったとすると、本実施の形態によればループＸについてコードＣを実行し、ループＹについてはコードＢを実行するようになる。この場合、図２０（ｄ）に示すように、ループの実行回数が同じであれば図２０（ｃ）と処理時間自体は変化しない。但し、動的な切替を実施しなければ、コードＣを実行しているループの方の処理時間が増加してしまう。
【００５８】
以上本技術の実施の形態を説明したが、本技術はこれに限定されない。例えば、処理フローは一例であって、処理結果が変わらない限り、処理順番を入れ替えたり、処理を並列実行させるようにしても良い。また、ランタイムモジュール４００の機能ブロック構成は一例であって、プログラムモジュール構成とは異なる場合もある。
【００５９】
また、上で述べた例では、真率の平均値又は最小値を採用する例を示したが、真率調査区間が短い場合等には、真率そのものに対して閾値を設定するようにしても良い。さらに、ループ内の繰り返し回数が分かっていれば、真率ではなく、特徴量として、条件が真の回数、条件が真の回数の平均値、条件が真の回数の最小値を採用しても良い。
【００６０】
さらに、真率調査区間を定期的に設ける例を示したが、例えば真率が下落している間は真率調査区間の間隔を短くして早期にコードＣの実行に遷移するようにすることも可能である。
【００６１】
なお、図８におけるコンピュータ１０００は、本実施の形態に係る部分のみを示すものであったが、全体としては例えば図２１に示すように、メモリ２５０１とＣＰＵ２５０３とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施の形態における処理を実施するためのプログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータは、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００６２】
以上述べた本実施の形態をまとめると以下のようになる。
【００６３】
本実施の形態に係る実行制御方法は、（Ａ）内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第１のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する処理と、（Ｂ）取得された特徴量に基づき、第２のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる処理とを含む。
【００６４】
このように動的に実行するコードを切り替えることで、条件が真となる回数が動的に変化しても効率的に演算処理を実行できるようになる。
【００６５】
なお、上で述べた特徴量が、上記回数、上記回数の割合、上記回数の平均値、上記回数の割合の平均値、上記回数の最小値、又は上記回数の割合の最小値である場合もある。
【００６６】
さらに、上で述べた取得する処理を、オブジェクトコードの実行中定期的又は不定期に実行するようにしても良い。
【００６７】
さらに、上で述べた回数についてのデータを、上記プロセッサのカウンタから取得するようにしても良い。ハードウエアカウンタによりカウントを行えば、実行制御のための処理のコストを下げることができるようになる。
【００６８】
なお、上記実行制御方法による処理をプロセッサに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【図１Ａ】
2014064798.tif 000003
【図１Ｂ】
2014064798.tif 000004
【図１Ｃ】
2014064798.tif 000005
【図２】
2014064798.tif 000006
【図３Ａ】
2014064798.tif 000007
【図３Ｂ】
2014064798.tif 000008
【図３Ｃ】
2014064798.tif 000009
【図４Ａ】
2014064798.tif 000010
【図４Ｂ】
2014064798.tif 000011
【図５Ａ】
2014064798.tif 000012
【図５Ｂ】
2014064798.tif 000013
【図５Ｃ】
2014064798.tif 000014
【図６】
2014064798.tif 000015
【図７】
2014064798.tif 000016
【図８】
2014064798.tif 000017
【図９】
2014064798.tif 000018
【図１０】
2014064798.tif 000019
【図１１】
2014064798.tif 000020
【図１２】
2014064798.tif 000021
【図１３】
2014064798.tif 000022
【図１４】
2014064798.tif 000023
【図１５】
2014064798.tif 000024
【図１６】
2014064798.tif 000025
【図１７】
2014064798.tif 000026
【図１８】
2014064798.tif 000027
【図１９】
2014064798.tif 000028
【図２０】
2014064798.tif 000029
【図２１】
2014064798.tif 000030
【手続補正書】
【提出日】平成27年5月13日(2015.5.13)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる
処理を、前記プロセッサに実行させるためのプログラム。
【請求項２】
前記特徴量が、前記回数、前記回数の割合、前記回数の平均値、前記回数の割合の平均値、前記回数の最小値、又は前記回数の割合の最小値である
請求項１記載のプログラム。
【請求項３】
前記取得する処理を、前記オブジェクトコードの実行中定期的又は不定期に実行する
請求項１記載のプログラム。
【請求項４】
前記回数についてのデータを、前記プロセッサのカウンタから取得する
請求項１乃至３のいずれか１つ記載のプログラム。
【請求項５】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる
処理を含み、前記プロセッサにより実行される実行制御方法。
【請求項６】
内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第１のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第２のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得する手段と、
取得された前記特徴量に基づき、前記第２のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第３のコードとのうちいずれかをプロセッサに実行させる手段と、
を有する情報処理装置。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００２９
【補正方法】変更
【補正の内容】
【００２９】
そして、真率計算部１２１２は、真率チェックのカウンタの値に基づき、真率調査区間が終了したか判断する（ステップＳ１７）。例えば、図７の例では、真率調査区間に相当するループ実行回数は「５」であるから、真率チェックのカウンタのカウント値が「５」以上となったか否かを判断する。真率調査区間が終了していない場合には、真率計算部１２１２は、真率調査処理を実行する（ステップＳ１９）。真率調査処理については、図１１及び図１２を用いて説明する。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００３６
【補正方法】変更
【補正の内容】
【００３６】
一方、真率の特徴量が閾値以下であれば、コード決定部１２１３は、コードＣ、すなわちリストベクトルを生成するコードを実行するように設定を行う（ステップＳ５５）。オブジェクトコード１２２０側は、設定に応じてコードＣを実行し始める。そして処理は呼び出し元の処理に戻る。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００３８
【補正方法】変更
【補正の内容】
【００３８】
図１０の説明に戻って、ステップＳ２３の後に、述語付き命令を用いるコードＢを実行中であれば（ステップＳ２５：Ｙｅｓルート）、処理は端子Ａを介して図１４の処理に移行する。一方、コードＣを実行中であれば（ステップＳ２５：Ｎｏルート）、真率計算部１２１２は、真率調査タイミングであるか判断する（ステップＳ２７）。これは、ループの実行回数のカウンタのカウント値が、設定データ格納部１２１４に格納されている真率調査区間の間隔（例えば１５）以上となったかを判断する。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】００３９
【補正方法】変更
【補正の内容】
【００３９】
真率調査タイミングではない場合には（ステップＳ２７：Ｎｏルート）、ループの繰り返し回数がＮであればカウンタ３がＮ増加した後又はカウンタ２が１増加した後（ステップＳ３１）、真率計算部１２１２は、ループの実行回数のカウンタのカウント値を１インクリメントする（ステップＳ３３）。そして処理はステップＳ２７に戻る。
【手続補正６】
【補正対象書類名】明細書
【補正対象項目名】００４０
【補正方法】変更
【補正の内容】
【００４０】
一方、ループの実行回数が、真率調査区間の間隔（例えば１５）に達して、真率調査タイミングとなれば（ステップＳ２７：Ｙｅｓルート）、真率計算部１２１２は、ループの実行回数のカウンタのカウント値を０に初期化し（ステップＳ２９）、処理はステップＳ１７に戻る。これによって、真率計算を再度行うようにする。
【手続補正７】
【補正対象書類名】明細書
【補正対象項目名】００４１
【補正方法】変更
【補正の内容】
【００４１】
次に図１４の処理の説明に移行して、コードＢを実行中であれば、真率計算部１２１２は、真率調査タイミングであるか判断する（ステップＳ６１）。これは、ループの実行回数のカウンタのカウント値が、設定データ格納部１２１４に格納されている真率調査区間の間隔（例えば１５）以上となったかを判断する。
【手続補正８】
【補正対象書類名】明細書
【補正対象項目名】００４２
【補正方法】変更
【補正の内容】
【００４２】
真率調査タイミングではない場合には（ステップＳ６１：Ｎｏルート）、ループの繰り返し回数がＮであればカウンタ３がＮ増加した後又はカウンタ２が１増加した後（ステップＳ６３）、真率計算部１２１２は、ループの実行回数のカウンタのカウント値を１インクリメントする（ステップＳ６５）。そして処理はステップＳ６１に戻る。
【手続補正９】
【補正対象書類名】明細書
【補正対象項目名】００４３
【補正方法】変更
【補正の内容】
【００４３】
一方、ループの実行回数が、真率調査区間の間隔（例えば１５）に達して、真率調査タイミングとなれば（ステップＳ６１：Ｙｅｓルート）、真率計算部１２１２は、ループの実行回数のカウンタのカウント値を０に初期化し（ステップＳ６７）、処理は図１０のステップＳ１５に戻る。
【手続補正１０】
【補正対象書類名】明細書
【補正対象項目名】００５３
【補正方法】変更
【補正の内容】
【００５３】
さらに、（１）式＞（２）式となる条件は以下のように表される。
（Ｔｒｕｅｘ−Ｔｒｕｅｙ）ｂＴｍ＋ＴｒｕｅｙａＴｍ＋ａα＞（（１−Ｔｒｕｅｙ）ｂ＋Ｔｒｕｅｙａ）Ｔｍ＋（ａ−ｂ）α
ＴｒｕｅｘｂＴｍ−ｂＴｍ＞−ｂα
ｂα＞（１−Ｔｒｕｅｘ）ｂＴｍ
α＞（１−Ｔｒｕｅｘ）Ｔｍ  （４）
【手続補正１１】
【補正対象書類名】図面
【補正対象項目名】図１Ａ
【補正方法】変更
【補正の内容】
【図１Ａ】
2014064798.tif 000031
【手続補正１２】
【補正対象書類名】図面
【補正対象項目名】図４Ａ
【補正方法】変更
【補正の内容】
【図４Ａ】
2014064798.tif 000032
【国際調査報告】
2014064798.tif 000033
2014064798.tif 000034