(58)【調査した分野】(Int.Cl.,DB名)
【背景技術】
【0002】
古いソフトウェア資産では、複数のタスク(プログラムの実行単位)が並列に動作する状況が想定されていないため、関数をまたいで参照される変数が、グローバル変数として定義されていることがある。グローバル変数は、各タスクで同一のアドレスとなるため、同時に実行可能状態にある複数のタスクが、複数のプロセッサに対称的に割り当てられて実行されるSMP(Symmetric Multi-Processing)環境では、期待しない動作(グローバル変数のデータ不整合)が生じる可能性がある。
【0003】
例えば、
図10にSMP環境に対応しないプログラムの例を示す。func1は、グローバル変数global_numに「1」を設定するプログラムである。func2は、global_numに「1」を加算するプログラムである。test_taskは、func1を実行し、その後、global_numの値を出力し、続いてfunc2を実行し、その後、global_numの値を出力するプログラムである。test_taskを実行すると、「1」が表示され、次に「2」が表示される。
【0004】
図10のプログラムを実行したときに参照されるグローバル変数global_numのアドレスは、コンパイル時に一意に決定する。すると、マルチタスク環境で同時に複数のタスクがtest_taskを実行する場合、それら複数のタスクから、global_numが割り当てられた同一のアドレスへアクセスが発生する。
図11に示すようにAMP(Asymmetric Multi-Processing)環境であれば複数タスクが同一アドレスにアクセスする場合においても同時に処理するプロセッサコアは1つのため、データの不整合は発生しない。しかし、
図12に示すようなSMP環境の場合、複数のプロセッサコアが並列にタスクを実行し、任意のタイミングでglobal_numを書き換えるため、データの不整合が発生し、実行結果が期待値にならない場合がある。
【0005】
一般にSMP環境で実行するプログラムについては、期待しない動作が生じないように設計を行う。例えば、タスク間で共有しないデータを格納する変数については、グローバル変数として定義するのではなく、TLS(Thread Local Storage)やPOSIX Keyを使用し、タスク個別の変数として定義する。あるいは、グローバル変数として定義するのであれば、タスク間で排他制御をするか、TLB(Translation Lookaside Buffer)を使用して、プログラム上のアドレスは共通だが、物理アドレスはタスク別に固有な値として管理し、データの不整合を回避する等の対処を行う。
【0006】
しかし、TLSやPOSIX Keyを使用する方法は、OSやアーキテクチャによって使用できない場合がある。また、排他制御により、グローバル変数に同時にアクセスするタスクを制限する方法の場合、同時に動作可能なタスクが1つとなる。その為、他のタスクはロック取得を待ち待機状態となり、SMP化する意義が失われてしまう。また、TLBを使用する方法は、タスクの切り替えごとにTLB設定の変更、それにともなう命令やキャッシュの同期処理が発生し、プログラムの実行時間に影響が及ぶ可能性がある。
【0007】
また、TLSやPOSIX Keyを使用せずにSMP非対応のプログラムを修正する場合、タスク間でアクセスの競合が発生するグローバル変数をローカル変数として宣言し直す等してデータの不整合を回避する修正を行う必要があるが、グローバル変数が多ければ、確認や修正のコストが増大し、修正が困難となる。
【0008】
関連する技術として、特許文献1では、マルチスレッド上で動作するプログラムのプログラム・コードをロック衝突が少ないプログラム・コードに変換する方法が提案されている。
【発明の概要】
【発明が解決しようとする課題】
【0010】
SMP環境に対応していないプログラムを、修正量と実行時間の増加を抑制しつつ、SMP環境に対応させる方法が求められている。
【0011】
そこでこの発明は、上述の課題を解決する情報処理装置
、実行方法及びプログラムの修正方法を提供することを目的としている。
【課題を解決するための手段】
【0012】
本発明の一態様によれば、情報処理装置は、SMP構成の複数のプロセッサと、グローバル変数を使用するプログラムであって、前記グローバル変数について前記
複数のプロセッサ
のコア数の合計と同数のデータ領域を
、前記グローバル変数の格納領域として確保し、前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサ
のコアの
識別番号を取得し、前記識別番号に対応する前記データ領域にアクセスする処理を含むプログラムと、前記プログラムを前記プロセッサ
のコアの何れかに割り当てて実行するオペレーティングシステム
であって、前記グローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分メモリ上に確保する処理と、前記プログラムを実行するタスクが切り替わるたびに、実行を終了する切替前の前記タスクの実行状態をレジスタからメモリに退避し、実行を開始する切替後の前記タスクの実行状態をメモリからレジスタへ復元するタスク切り替え処理に連動して、切替前の前記タスクを実行していた前記コアの識別番号に対応する前記データ領域に格納されていた前記グローバル変数の値を、切替前の前記タスクに対応する前記固有値格納エリアへ退避し、切替後の前記タスクに対応する前記固有値格納エリアに格納されている前記グローバル変数の値を、切替後の前記タスクを実行する前記コアの識別番号に対応する前記データ領域へ復元する処理と、を行うオペレーティングシステムと、を記憶する記憶部と、を備える。
【0015】
また、本発明の他の一態様によれば、実行方法は、SMP構成の複数のプロセッサによるグローバル変数を利用するプログラムの実行方法であって、
前記プログラムが実行する、前記グローバル変数について前記
複数のプロセッサ
のコア数の合計と同数のデータ領域が前記プログラムからアクセス可能
な前記グローバル変数の格納領域として確保され、実行中の前記プログラムが前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサ
のコアの識別番号を取得し、前記識別番号に対応する前記データ領域にアクセスする処理と、
前記プログラムを前記プロセッサのコアの何れかに割り当てて実行するオペレーティングシステムが実行する、前記グローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分メモリ上に確保する処理と、前記プログラムを実行するタスクが切り替わるたびに、実行を終了する切替前の前記タスクの実行状態をレジスタからメモリに退避し、実行を開始する切替後の前記タスクの実行状態をメモリからレジスタへ復元するタスク切り替え処理に連動して、切替前の前記タスクを実行していた前記コアの識別番号に対応する前記データ領域に格納されていた前記グローバル変数の値を、切替前の前記タスクに対応する前記固有値格納エリアへ退避し、切替後の前記タスクに対応する前記固有値格納エリアに格納されている前記グローバル変数の値を、切替後の前記タスクを実行する前記コアの識別番号に対応する前記データ領域へ復元する処理と、を含む。
【0016】
また、本発明の他の一態様によれば、プログラムの修正方法は、SMP非対応のプログラムをSMP対応のプログラムに修正する修正方法であって、コンピュータが、前記プログラムのグローバル変数について、SMP構成で動作するプロセッサ
のコア数の合計と同数のデータ領域を
前記グローバル変数の格納領域として確保するよう修正するステップと、前記グローバル変数にアクセスする処理を、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサ
のコアの識別番号を取得し、前記識別番号に対応する前記データ領域にアクセスする処理に
前記プログラムを変更するステップと、
前記グローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分メモリ上に確保するよう前記プログラムを実行するオペレーティングシステムを修正するステップと、前記プログラムを実行するタスクが切り替わるたびに、実行を終了する切替前の前記タスクの実行状態をレジスタからメモリに退避し、実行を開始する切替後の前記タスクの実行状態をメモリからレジスタへ復元するタスク切り替え処理に連動して、切替前の前記タスクを実行していた前記コアの識別番号に対応する前記データ領域に格納されていた前記グローバル変数の値を、切替前の前記タスクに対応する前記固有値格納エリアへ退避し、切替後の前記タスクに対応する前記固有値格納エリアに格納されている前記グローバル変数の値を、切替後の前記タスクを実行する前記コアの識別番号に対応する前記データ領域へ復元するよう前記オペレーティングシステムを修正するステップと、を有する。
【発明の効果】
【0017】
本発明によれば、プログラムの実行時間の増加を抑えつつ、少ない修正量で、SMP環境に対応していないプログラムを、SMP環境に対応させることができる。
【発明を実施するための形態】
【0019】
<実施形態>
以下、本発明の一実施形態におけるSMP非対応のプログラムをSMP環境で動作させるための方法について、図面を参照して説明する。
図1は、本発明の一実施形態による演算装置の一例を示す図である。
演算装置1は、プロセッサ(Processor11)とメモリ(DDR RAM12)とを備えるコンピュータである。このほかにも演算装置1は、OS(operating system)等を記憶する図示しない補助記憶装置、入出力インタフェース、通信インタフェースなどを備えていてもよい。
Processor11は、Processor Core111と、内部バス112と、Memory Controller113とを備える。Processor Core111と、Memory Controller113とは、内部バス112で接続されている。
Processor Core111は、4個のプロセッサコア(Processor Core0〜Processor Core3)を含む。プロセッサコアの数は4個に限定されず、2個以上であれば良い。
DDR RAM12は、OS(operating system)を含むプログラム等を格納している。DDR RAM12は、Processor11のMemory Controller113と接続している。Processor Core111は、Memory Controller113を介してDDR RAM12にアクセスすることができる。Processor Core111は、DDR RAM12からプログラムを読み出し実行することで演算処理を行う。
【0020】
DDR RAM12に格納されたOSは、マルチタスクに対応しており、マルチタスクの生成、実行等の機能を備える。また、OSは、SMP環境に対応しており、実行するタスク、プロセッサを適宜切り替える機能を備える。また、OSは、実行するタスクの固有の識別番号(タスクID)を保存するTASK_IDと、タスクを生成し、そのタスクにTASK_IDを割り当てるCREATE_TASK関数と、TASK_IDと実行する関数名とを引数にして、生成したタスクを実行可能状態にするSTART_TASK関数とを備える。また、OSが生成するタスクの上限数はあらかじめ定まっており、その値は、変数MAX_TASKとして取得することができる。生成されるタスクのTASK_IDは、0から順に割り当てられ、タスクを上限数まで生成した場合、最後に生成されたタスクのTASK_IDは、変数MAX_TASK−1で表すことができる。
【0021】
図2〜
図5は、それぞれ、本発明の一実施形態によるSMP対応方法を説明する第1〜第4の図である。
図7は、本発明の一実施形態によるSMP環境へ対応したプログラムの一例を示す図である。
まず、SMP非対応プログラムに対して、グローバル変数global_numを、並列に動作し得るプロセッサコアと同数の要素を持つ配列として定義する。
図1の演算装置1であれば、プロセッサコア数が4なので、global_num[4]として宣言する(
図7のソースコードの1行目)。そして、プロセッサコアごとに配列の要素を割り当てる。例えば、
図2に示すように、global_num[0]をプロセッサコア0、global_num[1]をプロセッサコア1、global_num[2]をプロセッサコア2、global_num[3]をプロセッサコア3にそれぞれ割り当てる。つまり、プロセッサコア0が実行するタスクがglobal_numにアクセスするときは、global_num[0]にアクセスし、global_num[0]に格納されたTask_Value0を読み出したり、更新したりする。他のプロセッサコア1〜3についても同様である。なお、グローバル変数の配列の要素数は、同時に実行可能状態となるタスクの数ではなく、プロセッサコアの数とする。これは、同時に必要となるグローバル変数の数はコア数に依存するためである。
【0022】
上記の割り当てを実現するためにプロセッサコアがタスク実行中にglobal_num[n](n=0〜3)にアクセスした場合、プロセッサコアに割り当てた配列の要素を参照するようSMP非対応プログラムを変更する。例えば、
図7のソースコードのfunc1、func2では、global_num[core_num]に「1」を設定したり、「1」を加算したりしている。これにより、複数のタスクがそれぞれtset_taskを並列に実行した場合、各タスクは、そのタスクを実行するプロセッサコアに対応するglobal_num[n](n=0〜3)を独立して使用する。これにより、プロセッサコアに配列の要素を割り当てることが可能になる。なお、プログラムの中でcore_numを参照することにより、そのプログラムのタスクを実行しているプロセッサコアの番号(0〜3)が取得可能であるとする。
【0023】
図2の例では、プロセッサコア0では、Task0が実行中であり、Task0で実行中のプログラムは、プロセッサコア0の使用エリアであるglobal_num[0]を、Task0固有の値(Task0_Value)として使用する。プロセッサコア1〜3、実行中のタスクTask1〜3、global_num[n](n=1〜3)の関係についても同様である。global_num[n]と使用プロセッサコアと実行タスクとglobal_num[n]の値の関係を
図3の表に示す。
【0024】
このようにSMP非対応プログラム側では、(A1)1つのグローバル変数についてプロセッサコア数分の領域を確保し、(A2)グローバル変数へアクセスする処理を、プロセッサコアに対応する領域へアクセスするようソースコードの変更を行う。
【0025】
そして、OS側では、全タスク分のグローバル変数の値を、タスクごとの専用のメモリ領域(変数格納エリア)に退避し、タスクが実行されると、そのタスク用の変数格納エリアから、プログラム側で宣言したグローバル変数の配列のプロセッサコアに対応する要素に当該変数格納エリアに保存した値を復元し、一方、これまで実行されていたタスクによって演算されたグローバル変数の値は、上記配列のプロセッサコアに対応する要素から、そのタスク用の変数格納エリアに退避するようにして、データの不整合が生じないようにする。例えば、global_num[0]が割り当てられたプロセッサコア0が実行するタスクが切り替わる際に、OSによるタスク切り替え処理の延長上で、新しく実行するタスク固有の値をそのタスク専用の変数格納エリアからglobal_num[0]に復元し、これまで実行されていたタスクのglobal_num[0]の値は、そのタスクの変数格納エリアに退避する機能をOSに追加する。
【0026】
さらに詳しく説明すると、例えば、
図2に例示したプロセッサコアとタスクの関係が
図4に示す状態に変わったとする。具体的には、プロセッサコア2〜3が実行するタスクには変化が無く、プロセッサコア0がTask7を実行し、プロセッサコア1がTask4を実行する状態に遷移したとする。状態遷移後のglobal_num[n]と使用プロセッサコアと実行タスクとglobal_num[n]の値の関係を
図5の表に示す。この場合、OSによるタスク切り替え処理が実行される。タスク切り替え処理は、OSの種類に依存するが、一般的にはレジスタのSave/Restore処理が実行される。すなわち、Task0からTask7に遷移する場合、Task0の実行状態のレジスタをメモリに退避(Save)し、Task7の状態をメモリから読み出してレジスタに復元(Restore)する。このOSが備えるタスク切り替えに連動し、実行状態のタスクがTask0からTask7に遷移する過程で、Task0固有のglobal_num[0]の値をTask0用の変数格納エリアに退避し、Task7固有の値をTask7用の変数格納エリアからglobal_num[0]に復元する処理をOSに追加する。また、タスク固有のglobal_num[n]の値を、タスクごとに保存する変数格納エリアを確保する処理をOSに追加する。
【0027】
図6は、本発明の一実施形態によるメモリ領域の一例を示す図である。
図6にタスク固有のglobal_numの値を保存するための変数格納エリアの一例を示す。
(B1)OSにおいて、例えば、配列TASK_VAL[MAX_TASK]を定義する。タスク固有に扱うグローバル変数は、あらかじめSMP非対応ソースコードを解析して抽出しておく。また、配列TASK_VALを定義する際に指定する要素数は、OSが生成しうるタスク数の上限値(同時に実行可能状態となるタスク数の上限値)であるMAX_TASKとする。これにより、全てのタスクに対して、個別にglobal_numの値を保存するメモリ領域を確保することができる。
【0028】
(B2)また、OSの起動時などに配列TASK_VAL[MAX_TASK]をメモリ領域に確保する処理をOSに追加する。これにより、OSは、各タスクに割り当てられたTASK_IDに基づいて、TASK_VAL[TASK_ID]にアクセスすることで、タスクごとに割り当てられた変数格納エリアを使用することができる。
【0029】
(B3)また、タスク切り替えに伴い、これまで実行されていたタスク(TASK_ID=0とする。)のタスク固有の値を、配列TASK_VALの対応する要素であるTASK_VAL[0]に退避し、切り替え後のタスク(TASK_ID=7とする。)の固有値をTASK_VAL[7]からグローバル変数の配列のタスク切り替えを行うプロセッサコアに対応する要素(例えば、global_num[0])へ復元する機能をOSに追加する。
【0030】
次に
図7を参照して
図10に例示したSMP非対応プログラムからの変更点について説明する。
まず、グローバル変数global_numを、コア数に応じた要素を有する配列として宣言する。また、func1、func2内で、実行中のプロセッサコアに応じたglobal_num[core_num]にアクセスするように変更する。
また、main関数では、一例として、生成できるタスクの上限値MAX_TASKと同数のタスクを生成するようにする(7−1)。各タスクのTASK_IDは、TASK0、TASK1、TASK2、・・・、TASK[MAX_TASK−1]となる。さらに、各タスクが関数test_taskを実行するよう指定し、タスクを起動する(7−2)。これにより、各タスク(TASK_ID=TASK0〜TASK[MAX_TASK−1])が並列に実行可能な状態となる。実際には、プロセッサコア数が4でMAX_TASKが4以上の場合、最大で4個のタスクが並列に動作する状態となる。
【0031】
次に
図8、
図9を参照して、SMP対応済みプログラムが実行される際の動作を説明する。
図8は、一般的なタスク切り替え動作の一例を示すフローチャートである。
比較の為、マルチスレッド対応のOSによる一般的なタスク切り替え処理を説明する。
例えば、プロセッサコア0にて、TASK3が実行されている状態であるとする(ステップS11)。ここで割り込みが発生し、プロセッサコア0が実行するタスクを、TASK3からTASK7へ切り替えるとする。OSは、TASK3の実行時におけるレジスタの情報をメモリの所定の領域に退避し、TASK7に係る実行情報をメモリの所定の領域から読み出してレジスタへ設定する等してタスクの切り替え処理を行う(ステップS12)。そして、プロセッサコア0がTASK7を実行する(ステップS13)。
【0032】
次に本実施形態の機能追加を行ったOSおよびSMP対応済みプログラムによるタスク切り替え動作を説明する。
図9は、本発明の一実施形態によるタスク切り替え動作の一例を示すフローチャートである。
前提として、タスクが実行するプログラムは、SMP対応済みであるとする。例えば、グローバル変数は、プロセッサコア数分の要素を持つ配列として定義され、また、実行中のタスク固有のグローバル変数の値は、配列の対応する要素(プロセッサコアの番号)へ格納するように修正されている。また、OSは、
図6に例示するMAX_TASK分の変数格納エリア(TASK_VAL[MAX_TASK])を備え、タスク切り替えとともにタスク固有の値を変数格納エリアに対して退避、復元する機能を備えている。また、OSの起動時にMAX_TASK分の変数格納エリアがメモリ(DDR RAM12)に確保されているとする。
【0033】
図7のソースコードに例示するようにCREATE_TASKによって生成され、START_TASKによって実行開始されたタスクは、実行可能なプロセッサコアが割り当てられると実行が開始される。TASK3が、例えば、プロセッサコア0に割り当てられ実行中であるとする(ステップS11)。ここで、TASK3からTASK7への切り替えが発生するとする。
【0034】
すると、OSは、まず、TASK3を実行しているプロセッサコアの番号とTASK_IDとを取得する(ステップS121)。この例では、プロセッサコアの番号が0、TASK_IDは3である。より具体的には、OSは、コア番号レジスタをReadし、プロセッサコア番号として「0」を取得する。また、OSは、OS管理情報から実行中タスクのTASK_IDとして「3」を取得する。
【0035】
次にOSは、TASK3固有のグローバル変数の値を変数格納エリアとして確保した配列のTASK_IDに対応する要素へ退避する(ステップS122)。例えば、OSは、プロセッサコア0に対応するglobal_num[0]の値を、TASK3に対応するTASK_VAL[3]へ退避する。より具体的には、OSは、global_num[0]に格納されたデータをTASK_VAL[3]にコピーする。
【0036】
次にOSは、TASK3の実行時におけるレジスタの情報をメモリの所定の領域に退避し、TASK7に係る実行情報をメモリの所定の領域から読み出して、レジスタへ設定する等してタスクの切り替え処理を行う(ステップS12)。
【0037】
次にOSは、TASK7を実行するプロセッサコアの番号とTASK7のTASK_IDとを取得する(ステップS123)。より具体的には、OSは、コア番号レジスタをReadし、プロセッサコア番号「0」を取得し、OS管理情報から次に実行するタスクのTASK_IDとして「7」を取得する。
【0038】
次にOSは、TASK7固有のグローバル変数の値を、変数格納エリアとして確保した配列のTASK_IDに対応する要素から復元する(ステップS124)。具体的には、OSは、TASK7に対応するTASK_VAL[7]に保存された値を、プロセッサコア0に対応するglobal_num[0]へコピーする。タスク固有値のSave/Restore処理が完了すると、OSは、TASK7の実行を開始する(ステップS13)。
【0039】
なお、タスクを実行するプロセッサのコア番号は、プロセッサのアーキテクチャに依存するが、一般的にはプロセッサが備える所定のコア番号レジスタを読み出すことで取得することができる。また、タスクのTASK_IDは、OSが管理するものであり、OSの基本的な機能により取得することができる。
【0040】
図9で説明した処理によれば、
図7に例示するプログラムは、並列に実行されたとしても、まず「1」を表示し、次に「2」を表示するという期待通りの動作を行う。また、本実施形態によるプログラムの修正およびOSであれば、SMP非対応プログラムの修正量が少なく済み、実行時間の増加も最小限に抑えることができる。
【0041】
より具体的には、本実施形態に係るプログラムおよびOSによれば、タスク切り替えに連動してTLBを切り替える手法に比べ、TLB切り替えが発生しないため実行時間の増加を抑えることができる。また、TLS/POSIX Keyを使用する方法では、環境によっては使用できない(サポートされていない)場合があるのに対し、本実施形態に係るプログラムおよびOSの修正方法は、環境による制限を受けることなく適用することができる。また、各プロセッサコアが使用する変数格納エリア(TASK_VAL)が明確なため、必要に応じて別コア(別タスク)の使用エリアへのアクセスが容易である。また、グローバル変数へのアクセスを排他制御する方法では、ロック取得待ち時間が発生しタスクの並列動作が妨げられる(実行時間が増加する)が、本実施形態のOSは、OSのタスク切り替え処理に連動してタスク固有値のSave/Restore処理を行うため、ロック取得待ち時間が発生せずSMP化による高速化の恩恵を受けることができる。
【0042】
また、タスク切り替え処理に連動し、あらかじめ指定したタスク固有値(グローバル変数)のSave/Restoreを行う処理をOSの機能として実装することで、過去資産(SMP非対応プログラム)を流用して作成するプログラムについて、SMPを考慮した根本設計の見直しを行う必要が無い。つまり、グローバル変数の宣言部分と参照部のみの最小限のコード修正でSMPに対応したソフトウェアを作成することができる。例えば、
図9のソースコードを、
図7のソースコードに修正する場合、global_numの宣言をint型変数のからint型の配列に変更する。また、グローバル変数を参照する箇所について、global_numをglobal_num[core_num]に変更するが、これらの修正は、機械的な一括置換によって修正可能であり、容易に修正が完了する。また、この修正を実行する修正用プログラムを作成し、修正用プログラムを実行することによって、グローバル変数の配列宣言、グローバル変数の宣言への参照箇所の修正を行ってもよい。
【0043】
なお、上記の説明では、OS起動時に配列TASK_VALのメモリ領域を確保する例を用いて説明を行ったが、タスク生成時またはタスクの実行開始時に動的にメモリを確保し、確保した領域にタスク固有値を退避する構成でもよい。また、上記の説明では、TASK_VALを配列として定義したが、タスク固有メモリ領域は、TASK_IDをキーに一意にデータ領域を特定できればよいので、例えば、リスト等の他のデータ構造を用いて実現しても良い。また、上記例では、グローバル変数は1つ(global_num)のみであったが、複数のグローバル変数を、
図8に例示するタスク固有メモリ領域にSave/Restoreする構成でもよい。
【0044】
図13は、本発明の一実施形態による情報処理装置の最小構成を示す図である。
図13に示すように情報処理装置100は、少なくとも複数のプロセッサ101と、記憶部102を備える。
複数のプロセッサ101は、SMP構成のプロセッサである。上記の実施形態中のプロセッサコア0〜3は、複数のプロセッサ101の一例である。
記憶部102は、OS103と、プログラム104と、を記憶する。複数のプロセッサ101は、記憶部102からOS103を読み出して実行する。複数のプロセッサ101は、記憶部102からプログラム104を読み出して実行する。
OS103は、マルチタスクおよびSMP環境に対応している。さらにOS103は、グローバル変数の値を記憶する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分だけ備える。そして、OS103は、プログラム104を実行するタスクが切り替わるたびに切り替えに係るタスクに対応する固有値格納エリアと、当該タスクを実行する複数のプロセッサ101のうちの1つに対応するグローバル変数用の領域(プログラム104からアクセス可能な領域)との間で、プログラム104が使用するグローバル変数の値の退避、復元を行う機能を備える。
プログラム104は、グローバル変数を使用するプログラムであって、複数のプロセッサ101によって実行される。プログラム104は、グローバル変数について、複数のプロセッサ101に含まれるプロセッサと同数のデータ領域を確保し、グローバル変数にアクセスする場合、複数のデータ領域のうち当該プログラムのタスクを実行する1つのプロセッサに割り当てられたデータ領域にアクセスする処理を含む。
【0045】
図14は、本発明の一実施形態における情報処理装置のハードウェア構成の一例を示す図である。
コンピュータ900は、CPU901、主記憶装置902、補助記憶装置903、入出力インタフェース904、通信インタフェース905を備える。CPU901は、複数のプロセッサコアを備えている。また、CPU901は、複数のCPUを備えたものとして構成されていてもよい。CPU901はSMP構成のプロセッサである。上述の演算装置1のProcessor11とDDR RAM12は、それぞれCPU901と主記憶装置902に相当する。情報処理装置100は、コンピュータ900に相当する。複数のプロセッサ101はCPU901に、記憶部102は補助記憶装置903に相当する。そして、SMP対応済みのプログラムやOSは、プログラムの形式で補助記憶装置903に記憶されている。CPU901は、プログラムを補助記憶装置903から読み出して主記憶装置902に展開し、当該プログラムに従って上記処理を実行する。また、CPU901は、プログラムに従って、記憶領域を主記憶装置902に確保する。CPU901は、プログラムに従って、処理中のデータを記憶する記憶領域を補助記憶装置903に確保する。
【0046】
なお、少なくとも1つの実施形態において、補助記憶装置903は、一時的でない有形の媒体の一例である。一時的でない有形の媒体の他の例としては、入出力インタフェース904を介して接続される磁気ディスク、光磁気ディスク、CD−ROM、DVD−ROM、半導体メモリ等が挙げられる。また、このプログラムが通信回線によってコンピュータ900に配信される場合、配信を受けたコンピュータ900が当該プログラムを主記憶装置902に展開し、上記処理を実行しても良い。また、当該プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、当該プログラムは、前述した機能を補助記憶装置903に既に記憶されている他のプログラムとの組み合わせで実現するもの、いわゆる差分ファイル(差分プログラム)であっても良い。また、補助記憶装置903は、CPU901、主記憶装置902を備える演算装置とは別体として構成されていてもよい。
【0047】
その他、本発明の趣旨を逸脱しない範囲で、上記した実施の形態における構成要素を周知の構成要素に置き換えることは適宜可能である。また、この発明の技術範囲は上記の実施形態に限られるものではなく、本発明の趣旨を逸脱しない範囲において種々の変更を加えることが可能である。