JP5186334B2 - 変換装置、プログラムおよび変換方法 - Google Patents

変換装置、プログラムおよび変換方法 Download PDF

Info

Publication number
JP5186334B2
JP5186334B2 JP2008285690A JP2008285690A JP5186334B2 JP 5186334 B2 JP5186334 B2 JP 5186334B2 JP 2008285690 A JP2008285690 A JP 2008285690A JP 2008285690 A JP2008285690 A JP 2008285690A JP 5186334 B2 JP5186334 B2 JP 5186334B2
Authority
JP
Japan
Prior art keywords
variable
value
shared variable
update
processing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2008285690A
Other languages
English (en)
Other versions
JP2010113529A (ja
Inventor
謙 水野
卓也 仲池
武史 小笠原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2008285690A priority Critical patent/JP5186334B2/ja
Publication of JP2010113529A publication Critical patent/JP2010113529A/ja
Application granted granted Critical
Publication of JP5186334B2 publication Critical patent/JP5186334B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

本発明は、プログラムを変換する変換装置、プログラムおよび変換方法に関する。
コンピュータシステムにおいて、複数のスレッドが複数の処理を並列に実行するマルチスレッドが用いられる。マルチスレッドを用いたコンピュータシステムでは、各スレッドが、複数のスレッドが共通に用いる共有変数にアクセスする場合、他のスレッドとの同期をとらなければならない。マルチスレッドにおける同期方法としては、例えば、ロックを使用した排他制御が知られている。しかし、ロックを使用した排他制御では、排他的に実行される処理領域(即ち、クリティカルセクション)が大きくなると、マルチスレッドによる処理の並列性が損なわれ、性能を低下させてしまう。
このような問題を解決する同期機構の一つに、トランザクショナルメモリが存在する。トランザクショナルメモリは、クリティカルセクションをトランザクションとして扱い、トランザクション内のメモリアクセスをアトミックに処理する。即ち、トランザクショナルメモリは、トランザクション内の共有変数に対するメモリアクセスをログし、トランザクション内での共有変数の値の変更を、当該トランザクションがコミットされるまで、他のトランザクションから不可視とする。そして、トランザクショナルメモリは、トランザクションの最後において共有変数に対するアクセスの衝突を確認して、衝突がなければ当該トランザクションをコミットして共有変数の値の変更を反映し、衝突があれば当該トランザクションをロールバックする。
図1は、2つのトランザクションT1、T2が並行して共有変数Vの値をリードモディファイライトした場合の処理の流れを示す。例えば、トランザクションT1内での共有変数Vの値の変更がコミットされ、トランザクションT2がトランザクションT1においてコミットされる前の共有変数Vの値を読んでいる。この場合、トランザクションT1とトランザクションT2との間で共有変数Vに対するメモリアクセスが衝突し、トランザクションT2のコミットが失敗する。コミットに失敗したトランザクションT2は、ロールバックされる。即ち、トランザクションT2は、トランザクション内のメモリアクセスが、トランザクションの開始時の状態に巻き戻されて、再実行される。
ところで、このようなトランザクショナルメモリでは、トランザクション中に変数のカウントのようなリードモディファイライトが存在すると、ロールバックが頻繁に発生する可能性がある。例えば、トランザクションT1およびトランザクションT2が、メソッドM1およびメソッドM2を並列に実行した場合、メソッドM1およびメソッドM2の双方が1つの共有変数に対してリードモディファイライトを行うと、トランザクションT1およびトランザクションT2のどちらか一方がロールバックする。
図2は、エンキュー処理およびデキュー処理を異なるスレッドで実行した場合の処理内容を模式的に示す。エンキュー処理およびデキュー処理は、互いにリストの異なる末端をアクセスする。従って、エンキュー処理およびデキュー処理は、キューが空である場合を除き、並行に実行されてもアクセスが衝突しない。
しかし、キューの長さを管理する共有変数(Size)が存在し、エンキュー処理およびデキュー処理のそれぞれが、共有変数(Size)に対してリードモディファイライトを行っている場合がある。この場合、エンキュー処理およびデキュー処理は、並行に実行されると、当該共有変数(Size)に対するアクセスが衝突して、一方がロールバックされる。
Java(登録商標)で使われている基本ライブラリでは、オブジェクトの状態保持および実行時のプロファイル情報の取得等の目的で、ごく少数の変数に対するリードモディファイライトが多くのメソッド内で行われている。これにより、Java(登録商標)で使われている基本ライブラリでは、トランザクショナルメモリを用いて処理を実行した場合の並列性が阻害されている。例えばJava(登録商標)の標準クラスであるjava.util.LinkedList内には、要素数を保持する変数が存在し、エンキュー処理およびデキュー処理は、この変数の値をインクリメント又はデクリメントする。この結果、エンキュー処理およびデキュー処理は、ロールバックが頻発され、並列性の阻害要因となっている。
上記課題を解決するために、本発明の第1の態様においては、プログラムを変換する変換装置であって、2以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、少なくとも1つのプログラムに含まれる前記共有変数の参照処理を、前記2以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、を備える変換装置を提供する。更に、コンピュータをこのような変換装置として機能させるプログラム及び変換方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではない。また、これらの特徴群のサブコンビネーションもまた、発明となりうる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではない。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図3は、本実施形態に係るコンピュータシステム10の機能構成を示す。コンピュータシステム10は、プログラム格納部12と、変換部14と、実行部16とを備える。
プログラム格納部12は、プログラムを格納する。プログラム格納部12に格納されるプログラムは、一例として、Java(登録商標)のバイト・コードであってよい。プログラム格納部12は、メモリおよびハードディスク等の記憶装置により実現される。
変換部14は、プログラム格納部12に格納されたプログラムを実行部16が実行できる形式のコードに変換する。変換部14は、一例として、実行時に動的に、バイト・コードを実行部16において実行できるコードにコンパイルするJIT(Just−In−Time)コンパイラであってよい。また、変換部14は、インタプリタの場合、これに代えて、最適化処理を行ってコードを実行部16に渡してもよい。変換部14は、CPUがコンパイルプログラムを実行することにより実現される。
実行部16は、変換部14により変換されたコードを実行する。実行部16は、CPUがオペレーションシステムを実行することにより実現される。また、実行部16は、トランザクショナルメモリの機能を有する。これにより、実行部16は、実行しているコードに含まれるトランザクション内のメモリアクセスを、アトミックに処理することができる。
図4は、本実施形態に係る変換装置20の機能構成を示す。変換装置20は、プログラムを変換する。より詳しくは、変換装置20は、互いに並行して実行される複数のプログラムを効率良く動作するようにコード内容を変換する。
変換装置20は、例えば、図1に示された変換部14の機能の一部として用いられる。変換装置20は、メモリ上のプログラムのコード内容をCPUが書き換えることにより、プログラムを変換する。変換装置20は、更新置換部32と、参照置換部34と、代入置換部36とを備える。
更新置換部32は、2以上のプログラムのそれぞれに含まれる共有変数の更新処理を、2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える。これにより、更新置換部32は、それぞれのプログラムに共有変数に対して行われるべき更新処理を固有変数に対して個別に行わせて、2以上のプログラムによる共有変数に対する更新処理が衝突することを回避させる。
なお、ここで、変数の更新処理とは、いわゆるリードモディファイライトをいう。即ち、変数の更新処理は、変数の値を読み出して、読み出した値に対して所定の操作をして、操作して得られた値を変数に書き戻す処理をいう。また、共有変数とは、複数のプログラムによりアクセスがされる変数をいう。また、固有変数とは、1つのプログラムによりアクセスがされる変数をいう。
また、1つのプログラムとは、CPUによる処理単位(例えば、スレッドおよびプロセス)となる一群のコード列であり、例えば、Java(登録商標)等のオブジェクト指向プログラムにおけるメソッドであってよい。例えば、1つのプログラムは、2以上のメソッドの組であってもよい。従って、更新置換部32は、5つのメソッドによる共有変数Aの更新処理を、2つのメソッドによる固有変数A1の更新処理と、3つのメソッドによる固有変数A2の更新処理とに分けて、置き換えを行ってもよい。
また、更新置換部32は、新たなプログラムが追加される毎に、当該新たなプログラムに含まれる更新処理の置き換えを行ってもよい。即ち、新たなプログラムが追加されたことに応じて、更新置換部32は、当該新たなプログラムに含まれる共有変数の更新処理を、当該新たなプログラムに割り当てた固有変数の更新処理に置き換えてよい。
参照置換部34は、少なくとも1つのプログラムに含まれる共有変数の参照処理を、2以上のプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理に置き換える。これにより、参照置換部34は、2以上のプログラムのそれぞれが固有変数に対して個別に行った更新処理の結果を、当該プログラムの呼び出し元に返すことができる。
また、新たなプログラムが追加された場合には、参照置換部34は、共有変数の参照処理を、2以上のプログラムおよび新たなプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理に再度置き換えてよい。また、参照置換部34は、算出処理をプログラムを呼び出す側にインライン展開してもよい。
代入置換部36は、少なくとも1つのプログラムに含まれる共有変数への代入処理を、参照置換部34により置き換えられた算出処理によって算出される共有変数の値が共有変数に代入される値と同一となるようにそれぞれの固有変数の値を設定する設定処理に置き換える。これにより、代入置換部36は、算出処理によって算出される共有変数の値を正しい値とすることができる。
図5は、本実施形態に係る変換装置20の処理フローの一例を示す。変換装置20は、複数のプログラムが与えられ、複数のプログラムが共通して使用する変数(即ち、共有変数)毎に、以下のステップS101からステップS104の処理を実行する。
まず、更新置換部32は、2以上のプログラムが、共有変数に対する分割可能な更新処理を含むか否かを判断する(S101)。変換装置20は、2以上のプログラムが共有変数に対する分割可能な更新処理を含まない場合には、処理を終了する。
共有変数に対する分割可能な更新処理は、一例として、共有変数に対して交換則および結合則を満たしかつ単位元を有する演算を施す更新処理であってよい。例えば、共有変数に対する分割可能な更新処理は、共有変数を読み出して共有変数に値を加えた値を書き戻す処理であってよい。また、例えば、共有変数に対する分割可能な更新処理は、共有変数に値を乗じる更新処理であってよい。
続いて、更新置換部32は、2以上のプログラムが共有変数に対する分割可能な更新処理を含むと判断した場合(S101のYes)、2以上のプログラムのそれぞれに含まれる共有変数の更新処理を行う更新処理コードを、2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理を行う更新処理コードに置き換える(S102)。
更新置換部32は、一例として、共有変数の更新処理が、共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、共有変数の更新処理を、固有変数の更新処理に置き換えてよい。例えば、更新置換部32は、共有変数に値を加える更新処理を、固有変数に値を加える更新処理に置き換えてよい。また、例えば、更新置換部32は、共有変数に値を乗じる更新処理を、固有変数に値を乗じる更新処理に置き換えてよい。
続いて、参照置換部34は、少なくとも1つのプログラムに含まれる共有変数の参照処理を行う参照処理コードを、2以上のプログラムのそれぞれに割り当てた固有変数の値から、共有変数の値を算出して返す算出処理を行う算出処理コードに置き換える(S103)。
参照置換部34は、一例として、更新置換部32により更新処理が置き換えられた共有変数の参照処理を、2以上のプログラムのそれぞれに割り当てられた固有変数の値を演算によって戻り値に反映させる算出処理に置き換えてよい。例えば、更新置換部32が共有変数に値を加える更新処理を固有変数に値を加える更新処理に置き換えた場合において、参照置換部34は、共有変数の参照処理を、それぞれの固有変数の値の合計を算出して返す算出処理に置き換える。また、例えば、更新置換部32が共有変数に値を乗じる更新処理を固有変数に値を乗じる更新処理に置き換えた場合において、参照置換部34は、共有変数の参照処理を、それぞれの固有変数の値の積を算出して返す算出処理に置き換える。
なお、ステップS103において、参照置換部34は、当該共有変数の参照処理がアトミックな処理の中で行われるか否かを判断する。例えば、参照置換部34は、当該共有変数の参照処理がトランザクション内において行われているか否かを判断する。そして、参照置換部34は、アトミックな処理の中で行われない場合には、当該共有変数の参照処理を、それぞれの固有変数の値から、共有変数の値をアトミックに算出して返す算出処理に置き換える。例えば、参照置換部34は、当該共有変数の参照処理がトランザクション外において行われている場合には、新たなトランザクションを作成して、当該共有変数の参照処理を、作成した新たなトランザクション内においてそれぞれの固有変数の値から共有変数の値を算出して返す算出処理に置き換える。なお、アトミックな処理は、ロックを使用した排他制御であってもよい。
続いて、代入置換部36は、少なくとも1つのプログラムに含まれる共有変数への代入処理を行う代入処理コードを、算出処理を行う算出処理コードによって算出される共有変数の値が共有変数に代入される値と同一となるようにそれぞれの固有変数の値を設定する設定処理を行う設定処理コードに置き換える(S104)。
代入置換部36は、一例として、少なくとも1つのプログラムに含まれる共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を単位元に設定する設定処理に置き換えてよい。例えば、参照置換部34が、共有変数の参照処理をそれぞれの固有変数の値の合計を算出して返す算出処理に置き換えた場合において、代入置換部36は、共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を0に設定する設定処理に置き換える。また、例えば、参照置換部34が、共有変数の参照処理をそれぞれの固有変数の値の積を算出して返す算出処理に置き換えた場合において、代入置換部36は、共有変数への代入処理を、一の固有変数の値を共有変数に代入される値に設定し、他の固有変数の値を1に設定する設定処理に置き換える。
なお、ステップS104において、代入置換部36は、当該共有変数への代入処理がアトミックな処理の中で行われるか否かを判断する。例えば、代入置換部36は、当該共有変数への代入処理がトランザクション内において行われているか否かを判断する。そして、代入置換部36は、アトミックな処理の中で行われない場合には、当該共有変数への代入処理を、固有変数の値をアトミックに設定する設定処理に置き換える。例えば、代入置換部36は、当該共有変数への代入処理がトランザクション外において行われている場合には、新たなトランザクションを作成して、当該共有変数への代入処理を、作成した新たなトランザクション内において固有変数の値を設定する設定処理に置き換える。
図6は、本実施形態に係る変換装置20に与えられるプログラムコードの一例を示す。図7は、図6に示されるプログラムコードを変換した後のプログラムコードの一例を示す。
図6に示されるプログラムコードは、エンキュー処理を実行する第1のメソッド101と、デキュー処理を実行する第2のメソッド102と、キューの長さを管理する共有変数(size)の参照処理を実行する第3のメソッド103とを含む。第1のメソッド101は、エンキュー処理を実行するとともに、共有変数(size)の値に1を加える。第2のメソッド102は、デキュー処理を実行するとともに、共有変数(size)の値に−1を加える。第3のメソッド103は、共有変数(size)の値を当該第3のメソッド103の呼び出し元に返す。
図7に示されるプログラムコードは、変換装置20が図6に示されたプログラムコードを変換して生成したコードの一例である。図7に示されるプログラムコードは、第1のメソッド101を変換した第4のメソッド104と、第2のメソッド102を変換した第5のメソッド105と、第3のメソッド103を変換した第6のメソッド106とを含む。
第4のメソッド104は、エンキュー処理を実行するとともに、当該第4のメソッド104に固有の固有変数(size1)の値に1を加える。第5のメソッド105は、デキュー処理を実行するとともに、当該第5のメソッド105に固有の固有変数(size2)の値に−1を加える。第6のメソッド106は、固有変数(size1)と固有変数(size2)とを加算した値を、当該第6のメソッド106の呼び出し元に返す。なお、第6のメソッド106は、現在の実行がトランザクション外での実行の場合には、アトミックに各固有変数の値を取得して、取得した各固有変数の値を加算した結果を呼び出し元に返す。
図8は、図7のプログラムコードを実行した場合の各メソッドの処理内容を模式的に表わす。図8に示されるように、変換装置20は、複数のメソッドによる共有変数(size)に対する更新処理を、それぞれのメソッドの固有変数(size1、size2)に対する更新処理に置き換えた。これにより、変換装置20によれば、複数のメソッドによる共有変数に対する更新処理が衝突することが無くなった。
以上のように、本実施形態に係る変換装置20によれば、互いに並行して実行される複数のプログラムによる共有変数のアクセスの衝突を無くすことができる。これにより、変換装置20によれば、例えばトランザクションのロールバックの頻度を少なくして、プログラムを効率良く動作させることができる。
図9は、本実施形態に係る変換装置20による、トランザクショナルメモリの機能を備える実行部により実行されるJava(登録商標)のプログラムコードの変換手順の一例を示す。なお、本例においては、変換装置20は、クラスロード時においてバイト・コードを書き換える場合に、共有変数に加算演算{++、−−、+=、−=}又は乗算演算{*=}を施す処理コードを、分割可能な処理コードとして変換する。また、本例において、変換装置20は、全てのインスタンス変数に対してアクセッサメソッドを新たに生成して、インスタンス変数へのアクセスを全て新たなに生成したアクセッサメソッドを呼び出すように書き換える。
まず、変換装置20は、ロードしようとしているクラスの全てのインスタンス変数(親クラスから承継したインスタンス変数も含む)に対して、ステップS201の処理を実行する。なお、ステップS201の具体的な処理内容は、図10以降において詳細に説明する。
次に、変換装置20は、ロードしようとしているクラスの中で、インスタンス変数に対して書き込み又は読み込みをする処理を、値を設定するsetterメソッド又は値を取得するgetterメソッドを呼び出す処理に置き換える。これにより、変換装置20は、インスタンス変数へのアクセスを全てアクセッサメソッドを呼び出すように書き換えることができる。
図10は、図9に示されたステップS201の処理を示す。まず、変換装置20は、インスタンス変数毎に、ステップS212、S213およびS214の処理を実行する(S211、S215)。全てのインスタンス変数について、ステップS212〜S214の処理を終えると、処理を図9のステップS202に戻す。
ステップS212において、変換装置20は、当該インスタンス変数に対する、加算演算{++、−−、+=、−=}又は乗算演算{*=}の演算子を使用しているメソッドの数が、2以上含まれているか否かを判断する(S212)。2以上含まれていない場合には(S212のNo)、変換装置20は、当該インスタンス変数に対するgetterメソッドおよびsetterメソッドを作成して(S213)、処理を終了する。
一方、2個以上含まれている場合には(S212のYes)、変換装置20は、ステップS214の、当該インスタンス変数をメソッド固有のインスタンス変数に置き換える処理を実行する。なお、ステップS214の具体的な処理内容は、図11において詳細に説明する。
図11は、図10に示されたステップS214の処理を示す。ステップS214において、まず、更新置換部32は、加算演算{++、−−、+=、−=}又は乗算演算{*=}の演算子が含まれるメソッドと同数の、メソッド毎に異なる新たなインスタンス変数を生成する(S221)。
続いて、更新置換部32は、該当する演算子を含む演算処理について、該当するインスタンス変数を新たなインスタンス変数に置き換える(S222)。この場合において、更新置換部32は、メソッド毎に異なるインスタンス変数に置き換える。更新置換部32は、例えば、所定数個のインスタンス変数を予め準備しておき、予め準備されたインスタンス変数をメソッドのそれぞれに順次に割り当ててよい。
続いて、参照置換部34は、getterメソッドを作成する(S223)。ステップS223において作成されるgetterメソッドは、引数を取らずに、以下の処理を実行する。
ステップS223において作成されるgetterメソッドは、トランザクション内において呼び出された場合、該当する演算子が加算演算{++、−−、+=、−=}であれば、ステップS221で生成した新たなインスタンス変数の全ての値の和を算出して、算出結果を呼び出し元に返す。また、ステップS223において作成されるgetterメソッドは、該当する演算子が乗算演算{*=}であれば、ステップS221で生成した新たなインスタンス変数の全ての値の積を算出して、算出結果を呼び出し元に返す。なお、ステップS223において作成されるgetterメソッドは、該当するインスタンス変数が親クラスで宣言されている場合には、親クラスのgetterメソッドを呼び出した結果の和又は積を算出して、算出結果を呼び出し元に返す。
例えば、参照置換部34は、更新置換部32が所定数個のインスタンス変数を予め準備している場合には、予め準備された所定数個のインスタンス変数の和または積を算出するメソッドを、getterメソッドとして予め準備しておいてもよい。この場合、参照置換部34は、予め準備された所定数個のインスタンス変数のうち、メソッドに割り当てられなかったインスタンス変数に、単位元(加算であれば0、乗算であれば1)を代入する式をgetterメソッドに含める。
また、ステップS223において作成されるgetterメソッドは、トランザクション外において呼び出された場合、新たなトランザクションを作成する。そして、getterメソッドは、作成した新たなトランザクション内において、トランザクション内において呼び出された場合と同様の処理を実行する。
続いて、代入置換部36は、setterメソッドを作成する(S224)。ステップS224で作成されるsetterメソッドは、1つの引数を取り、以下の処理を実行する。
ステップS224において作成されるsetterメソッドは、トランザクション内において呼び出された場合であって、該当するインスタンス変数が親クラスで宣言されている場合には、親クラスのsetterメソッドを同じ引数を渡して呼び出す。そして、ステップS224において作成されるsetterメソッドは、ステップS221で生成した新たなインスタンス変数に、対象としている演算の単位元(即ち、加算演算{++、−−、+=、−=}であれば0、乗算演算{*=}であれば1)を代入する。
また、ステップS224において作成されるsetterメソッドは、トランザクション内において呼び出された場合であって、該当するインスタンス変数が当該クラスで宣言されている場合には、ステップS221で生成した新たなインスタンス変数のうちの一つに、引数の値を代入する。そして、ステップS224において作成されるsetterメソッドは、他の全ての新たなインスタンス変数に、対象としている演算の単位元(即ち、加算演算{++、−−、+=、−=}であれば0、乗算演算{*=}であれば1)を代入する。
また、ステップS224において作成されるsetterメソッドは、トランザクション外において呼び出された場合、新たなトランザクションを作成する。そして、setterメソッドは、作成した新たなトランザクション内において、トランザクション内において呼び出された場合と同様の処理を実行する。
以上のように、変換装置20によれば、複数のメソッドによるインスタンス変数に対する加算演算又は乗算演算の衝突をなくすことができる。これにより、変換装置20によれば、インスタンス変数に対するアクセスの衝突によるトランザクションのロールバックの頻度を少なくすることができる。
なお、以上のような変換を行った場合、インスタンス変数へのアクセスは、setterメソッド又はgetterメソッド経由で行われるので、メソッド呼び出しのオーバーヘッドが発生する。しかし、頻繁に実行されるコードの場合、JITコンパイラが、インライン展開をして最適化をするので、このオーバーヘッドによる影響は小さくなる。
また、ステップS223およびステップS224において、setterメソッド又はgetterメソッドがトランザクション外から呼び出されていた場合、変換装置20は、新たなトランザクションを作成する。ここで、新たなトランザクションを作成しない場合、呼び出し元のプログラムが変数アクセスのアトミック性に依存していると、当該プログラムの挙動が変化してしまう。しかし、呼び出し元のプログラムが変数アクセスのアトミック性に依存していない場合には、変換装置20は、新たなトランザクションの作成を省略することができる。
図12は、本実施形態に係る変換装置20が、左側に示されるプログラムを、トランザクションの作成を省略して右側に示されるプログラムに変換した変換例を示す。図12の左側の変換前のプログラムにおいて、fieldの値が0の状態で、トランザクションおよび排他制御等を用いずに2つのスレッドがそれぞれsetField(1)およびgetField()を実行した場合、getField()が返す値は0又は1のいずれかになる。
一方、図12の右側の変換後のプログラムは、setterメソッド又はgetterメソッド内のトランザクションの作成がされていない。図12の右側の変換後のプログラムは、field1およびfield2の値がそれぞれ2と−2(合計は0)の状態で同じメソッドを呼び出した場合、getField()が返す値は実行の順番によって0,−1,−1,−2の4通りの可能性が発生して、挙動が変化する。
setterメソッド又はgetterメソッド内でのトランザクション作成を省略しなければ、このような現象は発生しない。しかし、プログラムによっては、この現象が生じても正しく動作する場合もある。従って、この現象が問題にならない場合には、変換装置20は、書き換えによって生成したsetterメソッド又はgetterメソッドにおけるトランザクション作成を省略することにより実行時のオーバーヘッドを削減してもよい。
図13は、本実施形態に係るコンピュータ1900のハードウェア構成の一例を示す。本実施形態に係るコンピュータ1900は、ホスト・コントローラ2082により相互に接続されるCPU2000、RAM2020、グラフィック・コントローラ2075、および表示装置2080を有するCPU周辺部と、入出力コントローラ2084によりホスト・コントローラ2082に接続される通信インターフェイス2030、ハードディスクドライブ2040、およびCD−ROMドライブ2060を有する入出力部と、入出力コントローラ2084に接続されるROM2010、フレキシブルディスク・ドライブ2050、および入出力チップ2070を有するレガシー入出力部とを備える。
ホスト・コントローラ2082は、RAM2020と、高い転送レートでRAM2020をアクセスするCPU2000およびグラフィック・コントローラ2075とを接続する。CPU2000は、ROM2010およびRAM2020に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィック・コントローラ2075は、CPU2000等がRAM2020内に設けたフレーム・バッファ上に生成する画像データを取得し、表示装置2080上に表示させる。これに代えて、グラフィック・コントローラ2075は、CPU2000等が生成する画像データを格納するフレーム・バッファを、内部に含んでもよい。
入出力コントローラ2084は、ホスト・コントローラ2082と、比較的高速な入出力装置である通信インターフェイス2030、ハードディスクドライブ2040、CD−ROMドライブ2060を接続する。通信インターフェイス2030は、ネットワークを介して他の装置と通信する。ハードディスクドライブ2040は、コンピュータ1900内のCPU2000が使用するプログラムおよびデータを格納する。CD−ROMドライブ2060は、CD−ROM2095からプログラム又はデータを読み取り、RAM2020を介してハードディスクドライブ2040に提供する。
また、入出力コントローラ2084には、ROM2010と、フレキシブルディスク・ドライブ2050、および入出力チップ2070の比較的低速な入出力装置とが接続される。ROM2010は、コンピュータ1900が起動時に実行するブート・プログラム、および/又は、コンピュータ1900のハードウェアに依存するプログラム等を格納する。フレキシブルディスク・ドライブ2050は、フレキシブルディスク2090からプログラム又はデータを読み取り、RAM2020を介してハードディスクドライブ2040に提供する。入出力チップ2070は、フレキシブルディスク・ドライブ2050を入出力コントローラ2084へと接続すると共に、例えばパラレル・ポート、シリアル・ポート、キーボード・ポート、マウス・ポート等を介して各種の入出力装置を入出力コントローラ2084へと接続する。
RAM2020を介してハードディスクドライブ2040に提供されるプログラムは、フレキシブルディスク2090、CD−ROM2095、又はICカード等の記録媒体に格納されて利用者によって提供される。プログラムは、記録媒体から読み出され、RAM2020を介してコンピュータ1900内のハードディスクドライブ2040にインストールされ、CPU2000において実行される。
コンピュータ1900にインストールされ、コンピュータ1900を変換装置20として機能させるプログラムは、更新置換モジュールと、参照置換モジュールと、代入置換モジュールとを備える。これらのプログラム又はモジュールは、CPU2000等に働きかけて、コンピュータ1900を、更新置換部32、参照置換部34および代入置換部36としてそれぞれ機能させる。
これらのプログラムに記述された情報処理は、コンピュータ1900に読込まれることにより、ソフトウェアと上述した各種のハードウェア資源とが協働した具体的手段である、更新置換部32、参照置換部34および代入置換部36として機能する。そして、これらの具体的手段によって、本実施形態におけるコンピュータ1900の使用目的に応じた情報の演算又は加工を実現することにより、使用目的に応じた特有の変換装置20が構築される。
一例として、コンピュータ1900と外部の装置等との間で通信を行う場合には、CPU2000は、RAM2020上にロードされた通信プログラムを実行し、通信プログラムに記述された処理内容に基づいて、通信インターフェイス2030に対して通信処理を指示する。通信インターフェイス2030は、CPU2000の制御を受けて、RAM2020、ハードディスクドライブ2040、フレキシブルディスク2090、又はCD−ROM2095等の記憶装置上に設けた送信バッファ領域等に記憶された送信データを読み出してネットワークへと送信し、もしくは、ネットワークから受信した受信データを記憶装置上に設けた受信バッファ領域等へと書き込む。このように、通信インターフェイス2030は、DMA(ダイレクト・メモリ・アクセス)方式により記憶装置との間で送受信データを転送してもよく、これに代えて、CPU2000が転送元の記憶装置又は通信インターフェイス2030からデータを読み出し、転送先の通信インターフェイス2030又は記憶装置へとデータを書き込むことにより送受信データを転送してもよい。
また、CPU2000は、ハードディスクドライブ2040、CD−ROMドライブ2060(CD−ROM2095)、フレキシブルディスク・ドライブ2050(フレキシブルディスク2090)等の外部記憶装置に格納されたファイル又はデータベース等の中から、全部又は必要な部分をDMA転送等によりRAM2020へと読み込ませ、RAM2020上のデータに対して各種の処理を行う。そして、CPU2000は、処理を終えたデータを、DMA転送等により外部記憶装置へと書き戻す。このような処理において、RAM2020は、外部記憶装置の内容を一時的に保持するものとみなせるから、本実施形態においてはRAM2020および外部記憶装置等をメモリ、記憶部、又は記憶装置等と総称する。本実施形態における各種のプログラム、データ、テーブル、データベース等の各種の情報は、このような記憶装置上に格納されて、情報処理の対象となる。なお、CPU2000は、RAM2020の一部をキャッシュメモリに保持し、キャッシュメモリ上で読み書きを行うこともできる。このような形態においても、キャッシュメモリはRAM2020の機能の一部を担うから、本実施形態においては、区別して示す場合を除き、キャッシュメモリもRAM2020、メモリ、および/又は記憶装置に含まれるものとする。
また、CPU2000は、RAM2020から読み出したデータに対して、プログラムの命令列により指定された、本実施形態中に記載した各種の演算、情報の加工、条件判断、情報の検索・置換等を含む各種の処理を行い、RAM2020へと書き戻す。例えば、CPU2000は、条件判断を行う場合においては、本実施形態において示した各種の変数が、他の変数又は定数と比較して、大きい、小さい、以上、以下、等しい等の条件を満たすかどうかを判断し、条件が成立した場合(又は不成立であった場合)に、異なる命令列へと分岐し、又はサブルーチンを呼び出す。
また、CPU2000は、記憶装置内のファイル又はデータベース等に格納された情報を検索することができる。例えば、第1属性の属性値に対し第2属性の属性値がそれぞれ対応付けられた複数のエントリが記憶装置に格納されている場合において、CPU2000は、記憶装置に格納されている複数のエントリの中から第1属性の属性値が指定された条件と一致するエントリを検索し、そのエントリに格納されている第2属性の属性値を読み出すことにより、所定の条件を満たす第1属性に対応付けられた第2属性の属性値を得ることができる。
以上に示したプログラム又はモジュールは、外部の記録媒体に格納されてもよい。記録媒体としては、フレキシブルディスク2090、CD−ROM2095の他に、DVD又はCD等の光学記録媒体、MO等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワーク又はインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ1900に提供してもよい。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
特許請求の範囲、明細書、および図面中において示した装置、システム、プログラム、および方法における動作、手順、ステップ、および段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り、任意の順序で実現しうることに留意すべきである。特許請求の範囲、明細書、および図面中の動作フローに関して、便宜上「まず、」、「次に、」等を用いて説明したとしても、この順で実施することが必須であることを意味するものではない。
2つのトランザクションT1、T2が並行して共有変数Vの値をリードモディファイライトした場合の処理の流れを示す。 エンキュー処理およびデキュー処理を異なるスレッドで実行した場合の処理内容を模式的に示す。 本発明の実施形態に係るコンピュータシステム10の機能構成を示す。 本発明の実施形態に係る変換装置20の機能構成を示す。 本発明の実施形態に係る変換装置20の処理フローの一例を示す。 本発明の実施形態に係る変換装置20に与えられるプログラムコードの一例を示す。 図6に示されるプログラムコードを変換した後のプログラムコードの一例を示す。 図7のプログラムコードを実行した場合の各メソッドの処理内容を模式的に表わす。 本発明の実施形態に係る変換装置20による、トランザクショナルメモリの機能を備える実行部により実行されるJava(登録商標)のプログラムコードの変換手順の一例を示す。 図9に示されたステップS201の処理を示す。 図10に示されたステップS214の処理を示す。 本発明の実施形態に係る変換装置20が、左側に示されるプログラムを、トランザクションの作成を省略して右側に示されるプログラムに変換した変換例を示す。 本発明の実施形態に係るコンピュータ1900のハードウェア構成の一例を示す。
符号の説明
10 コンピュータシステム
12 プログラム格納部
14 変換部
16 実行部
20 変換装置
32 更新置換部
34 参照置換部
36 代入置換部
101 第1のメソッド
102 第2のメソッド
103 第3のメソッド
104 第4のメソッド
105 第5のメソッド
106 第6のメソッド
1900 コンピュータ
2000 CPU
2010 ROM
2020 RAM
2030 通信インターフェイス
2040 ハードディスクドライブ
2050 フレキシブルディスク・ドライブ
2060 CD−ROMドライブ
2070 入出力チップ
2075 グラフィック・コントローラ
2080 表示装置
2082 ホスト・コントローラ
2084 入出力コントローラ
2090 フレキシブルディスク
2095 CD−ROM

Claims (14)

  1. プログラムを変換する変換装置であって、
    2以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、
    少なくとも1つのプログラムに含まれる前記共有変数の参照処理を、前記2以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、
    を備える変換装置。
  2. 前記更新置換部は、前記共有変数の更新処理を行う更新処理コードを、前記固有変数の更新処理を行う更新処理コードに置き換え、
    前記参照置換部は、前記共有変数の参照処理を行う参照処理コードを、前記算出処理を行う算出処理コードに置き換える
    請求項1に記載の変換装置。
  3. 前記更新置換部は、前記共有変数の更新処理が前記共有変数に対して交換則および結合則を満たす演算を施すと判断した場合に、前記共有変数の更新処理を、前記固有変数の更新処理に置き換え、
    前記参照置換部は、前記更新置換部により更新処理が置き換えられた前記共有変数の参照処理を、前記2以上のプログラムのそれぞれに割り当てられた前記固有変数の値を前記演算によって戻り値に反映させる前記算出処理に置き換える
    請求項1または2に記載の変換装置。
  4. 少なくとも1つのプログラムに含まれる前記共有変数への代入処理を、前記算出処理によって算出される前記共有変数の値が前記共有変数に代入される値と同一となるようにそれぞれの前記固有変数の値を設定する設定処理に置き換える代入置換部を更に備える請求項1から3のいずれかに記載の変換装置。
  5. 前記更新置換部は、前記共有変数の更新処理が、前記共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、前記共有変数の更新処理を、前記固有変数の更新処理に置き換え、
    前記代入置換部は、少なくとも1つのプログラムに含まれる前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を単位元に設定する前記設定処理に置き換える請求項4に記載の変換装置。
  6. 前記更新置換部は、前記共有変数に値を加える更新処理を、前記固有変数に値を加える更新処理に置き換え、
    前記参照置換部は、前記共有変数の参照処理を、それぞれの前記固有変数の値の合計を算出して返す前記算出処理に置き換える
    請求項4または5に記載の変換装置。
  7. 前記参照置換部が、前記共有変数の参照処理をそれぞれの前記固有変数の値の合計を算出して返す前記算出処理に置き換えた場合において、前記代入置換部は、前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を0に設定する前記設定処理に置き換える請求項6に記載の変換装置。
  8. 前記更新置換部は、前記共有変数に値を乗じる更新処理を、前記固有変数に値を乗じる更新処理に置き換え、
    前記参照置換部は、前記共有変数の参照処理を、それぞれの前記固有変数の値の積を算出して返す前記算出処理に置き換える
    請求項4から7のいずれかに記載の変換装置。
  9. 前記参照置換部が、前記共有変数の参照処理をそれぞれの前記固有変数の値の積を算出して返す前記算出処理に置き換えた場合において、前記代入置換部は、前記共有変数への代入処理を、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を1に設定する前記設定処理に置き換える請求項4から8のいずれかに記載の変換装置。
  10. 前記参照置換部は、前記共有変数の参照処理がアトミックな処理の中で行われるか否かを判断し、アトミックな処理の中で行われない場合に、それぞれの前記固有変数の値から、前記共有変数の値をアトミックに算出して返す前記算出処理に置き換える請求項1から9のいずれかに記載の変換装置。
  11. 前記代入置換部は、前記共有変数への代入処理がアトミックな処理の中で行われるか否かを判断し、アトミックな処理の中で行われない場合に、前記算出処理によって算出される前記共有変数の値が前記共有変数に代入される値と同一となるようにそれぞれの前記固有変数の値をアトミックに設定する設定処理に置き換える請求項4から9のいずれかに記載の変換装置。
  12. 新たなプログラムが追加されたことに応じて、前記更新置換部は、前記新たなプログラムに含まれる共有変数の更新処理を、前記新たなプログラムに割り当てた固有変数の更新処理に置き換え、
    前記参照置換部は、前記共有変数の参照処理を、前記2以上のプログラムおよび前記新たなプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に再度置き換える
    請求項1から11のいずれかに記載の変換装置。
  13. プログラムを変換する変換装置であって、
    2以上のプログラムのそれぞれに含まれる共有変数の更新処理が、前記共有変数に対して交換則および結合則を満たし、かつ単位元を有する演算を施すと判断した場合に、前記共有変数の更新処理を行う更新処理コードを、前記2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理を行う更新処理コードに置き換える更新置換部と、
    少なくとも1つのプログラムに含まれる、前記更新置換部により更新処理が置き換えられた前記共有変数の参照処理を行う参照処理コードを、前記2以上のプログラムのそれぞれに割り当てた前記固有変数の値を前記演算によって戻り値に反映させて返す算出処理を行う算出処理コードであって、前記共有変数の参照処理がアトミックな処理の中で行われない場合には前記算出処理をアトミックに行う算出処理コードに置き換える参照置換部と、
    少なくとも1つのプログラムに含まれる前記共有変数への代入処理を行う代入処理コードを、一の前記固有変数の値を前記共有変数に代入される値に設定し、他の前記固有変数の値を単位元に設定する設定処理を行う設定処理コードであって、前記共有変数への代入処理がアトミックな処理の中で行われない場合には前記代入処理をアトミックに行う設定処理コードに置き換える代入置換部と、
    を備える変換装置。
  14. プログラムを変換する変換装置として、コンピュータを機能させるためのプログラムであって、
    前記コンピュータを、
    2以上のプログラムのそれぞれに含まれる共有変数の更新処理を、前記2以上のプログラムのそれぞれに個別に割り当てた固有変数の更新処理に置き換える更新置換部と、
    少なくとも1つのプログラムに含まれる前記共有変数の参照処理を、前記2以上のプログラムのそれぞれに割り当てた前記固有変数の値から、前記共有変数の値を算出して返す算出処理に置き換える参照置換部と、
    して機能させるプログラム。
JP2008285690A 2008-11-06 2008-11-06 変換装置、プログラムおよび変換方法 Expired - Fee Related JP5186334B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008285690A JP5186334B2 (ja) 2008-11-06 2008-11-06 変換装置、プログラムおよび変換方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008285690A JP5186334B2 (ja) 2008-11-06 2008-11-06 変換装置、プログラムおよび変換方法

Publications (2)

Publication Number Publication Date
JP2010113529A JP2010113529A (ja) 2010-05-20
JP5186334B2 true JP5186334B2 (ja) 2013-04-17

Family

ID=42302042

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008285690A Expired - Fee Related JP5186334B2 (ja) 2008-11-06 2008-11-06 変換装置、プログラムおよび変換方法

Country Status (1)

Country Link
JP (1) JP5186334B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5681473B2 (ja) * 2010-12-15 2015-03-11 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation プログラムの最適化装置、最適化方法および最適化プログラム
JP5218585B2 (ja) * 2011-03-15 2013-06-26 オムロン株式会社 制御装置およびシステムプログラム

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE4445651A1 (de) * 1994-12-21 1996-06-27 Bosch Gmbh Robert Verfahren zur Steuerung von technischen Vorgängen

Also Published As

Publication number Publication date
JP2010113529A (ja) 2010-05-20

Similar Documents

Publication Publication Date Title
US9940229B2 (en) Technologies for persistent memory programming
JP4702962B2 (ja) メモリ制御装置、プログラム及び方法
US9424013B2 (en) System and method for reducing transactional abort rates using compiler optimization techniques
CN107066241B (zh) 用于动态加载基于图的计算的系统和方法
EP2176763B1 (en) Memory transaction grouping
EP0806725B1 (en) Method and apparatus for early insertion of assembler code for optimization
US10169092B2 (en) System, method, program, and code generation unit
US8286152B2 (en) Systems, methods, and computer products for just-in-time compilation for virtual machine environments for fast application startup and maximal run-time performance
US7730463B2 (en) Efficient generation of SIMD code in presence of multi-threading and other false sharing conditions and in machines having memory protection support
US9292446B2 (en) Speculative prefetching of remote data
US10372509B2 (en) Composable and cancelable dataflow continuation passing
US8499298B2 (en) Multiprocessing transaction recovery manager
US8006238B2 (en) Workload partitioning in a parallel system with hetergeneous alignment constraints
KR20040094888A (ko) 단일 스레드 응용을 지원하기 위한 시간-멀티플렉스된스펙큘레이티브 멀티 스레딩
JP5186334B2 (ja) 変換装置、プログラムおよび変換方法
JP5181183B2 (ja) 変換装置、サーバシステム、変換方法およびプログラム
Groves Verifying Michael and Scott's lock-free queue algorithm using trace reduction
CN112114817B (zh) 基于cobol语言的数据字典字段信息获取方法及装置
US8701119B1 (en) Parsing XML in software on CPU with multiple execution units
EP2176761B1 (en) Object model for transactional memory
US20200174810A1 (en) Method and apparatus for interpreting bytecode instruction stream
US20130166887A1 (en) Data processing apparatus and data processing method
Bugerya et al. Parallelization of implementations of purely sequential algorithms
JP7393404B2 (ja) コンパイル方法、コンパイル装置、電子デバイス、記憶媒体及びプログラム
US20050251795A1 (en) Method, system, and program for optimizing code

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110908

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120731

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20120801

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120815

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130108

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130121

R150 Certificate of patent (=grant) or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20160125

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees