(57)【要約】【課題】複数のＮＵＭＡノードを有する並列計算機においてリモートアクセスによる性能低下を抑えること。【解決手段】抽出部４１ａが、タスクを実行する候補となる候補ＮＵＭＡノードを抽出し、計算部４１ｂが、タスクで使用されるデータについて候補ＮＵＭＡノードが有するデータのサイズを計算する。そして、決定部４１ｃが、候補ＮＵＭＡノードが有するデータのサイズとレイテンシテーブルを用いて候補ＮＵＭＡノードの中からタスクを実行するＮＵＭＡノードを決定する。そして、決定部４１ｃは、決定したＮＵＭＡノードに所属するスレッドのスレッドＩＤをタスクプール４０ｃへ登録する。【選択図】図１
2019049843.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
複数のＮＵＭＡノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたＮＵＭＡノードを候補ＮＵＭＡノードとして抽出し、
抽出した候補ＮＵＭＡノード毎に前記データのサイズを計算し、
計算したサイズと候補ＮＵＭＡノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するＮＵＭＡノードを前記候補ＮＵＭＡノードの中から決定する
処理を実行させることを特徴とする実行ノード選定プログラム。
【請求項２】
ランタイムライブラリとして実行され、
前記タスクが使用するデータに関する情報を引数として実行プログラムから呼び出されることを特徴とする請求項１に記載の実行ノード選定プログラム。
【請求項３】
前記タスクが使用するデータに関する情報には、変数の先頭アドレス、変数の型のサイズ、変数の次元数、各次元のサイズが含まれることを特徴とする請求項１又は２に記載の実行ノード選定プログラム。
【請求項４】
前記タスクが使用するデータに関する情報は、前記タスクが使用する複数の変数に関する情報であり、
前記候補ＮＵＭＡノードを抽出する処理は、呼び出された際の引数に含まれる複数の変数がそれぞれ所属するＮＵＭＡノードを前記候補ＮＵＭＡノードとして抽出することを特徴とする請求項２に記載の実行ノード選定プログラム。
【請求項５】
前記複数の変数は、ｎｕｍａ＿ｖａｌ指示節によりソースプログラムで指定されることを特徴とする請求項４に記載の実行ノード選定プログラム。
【請求項６】
コンピュータが、
複数のＮＵＭＡノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたＮＵＭＡノードを候補ＮＵＭＡノードとして抽出し、
抽出した候補ＮＵＭＡノード毎に前記データのサイズを計算し、
計算したサイズと候補ＮＵＭＡノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するＮＵＭＡノードを前記候補ＮＵＭＡノードの中から決定する
処理を実行することを特徴とする実行ノード選定方法。
【請求項７】
複数のＮＵＭＡノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたＮＵＭＡノードを候補ＮＵＭＡノードとして抽出する抽出部と、
前記抽出部により抽出された候補ＮＵＭＡノード毎に前記データのサイズを計算する計算部と、
前記計算部により計算されたサイズと候補ＮＵＭＡノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するＮＵＭＡノードを前記候補ＮＵＭＡノードの中から決定する決定部と
を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行ノード選定プログラム、実行ノード選定方法及び情報処理装置に関する。
【背景技術】
【０００２】
スレッド並列化規格であるＯｐｅｎＭＰのタスク構文は、プログラムから任意のブロックをタスクとして切り出し、並列実行させるために使用される。ここで、「スレッド」とは、プログラムの並列実行の単位である。プログラムは、ユーザが指定した数のスレッドによって並列に実行される。プログラムは、Ｃ、Ｃ＋＋、ＦＯＲＴＲＡＮ等の言語で作成される。
【０００３】
コンパイラは、ソースプログラム中にタスク構文を見つけると、タスクに関する処理を行うランタイムルーチンを呼び出すＩ／Ｆを実行プログラムに挿入する。図１９Ａは、タスク構文を含むプログラムのコンパイル例を示す図である。図１９Ａにおいて、ソースファイルは、ソースプログラムを記憶するファイルであり、実行ファイルは、並列列計算機により実行される実行プログラムを記憶するファイルである。ソースプログラムの「＃ｐｒａｇｍａ  ｏｍｐ  ｔａｓｋ」が｛｝で囲まれるブロックをタスクとして切り出すことを指示するタスク構文である。
【０００４】
図１９Ａに示すように、コンパイラは、ソースプログラムから２つのタスクを切り出し、２つのタスク登録Ｉ／Ｆを実行プログラムに挿入する。引数のｔａｓｋ＃１及びｔａｓｋ＃２はタスクの中身の処理の先頭を示す関数ポインタである。また、コンパイラは、タスク実行Ｉ／Ｆを実行プログラムに挿入する。
【０００５】
図１９Ｂは、図１９Ａに示した実行プログラムの動作を説明するための図である。図１９Ｂに示すように、タスク登録Ｉ／Ｆが実行されると、タスクの情報がタスクプールへ登録される（１）。ここで、タスクプールは、実行待ちのタスクの情報のリストであり、関数ポインタ等の情報を保持する。図１９Ｂでは、ｔａｓｋ＃１及びｔａｓｋ＃２の情報がタスクプールへ登録される。タスク登録Ｉ／Ｆは、１スレッドで実行される。この時点では、タスクは実行されない。そして、タスク実行Ｉ／Ｆが実行されるとタスクプール内のタスクが全て実行される（２）。タスク実行Ｉ／Ｆは、全スレッドで実行される。
【０００６】
ＯｐｅｎＭＰプログラムは、ＮＵＭＡ（Non-Uniform  Memory  Access）環境で実行されることがある。ここで、ＯｐｅｎＭＰプログラムは、ＯｐｅｎＭＰに基づくプログラムである。また、ＮＵＭＡは、コアの各メモリへのアクセスが均一でないアーキテクチャである。ＮＵＭＡでは、コアとメモリを含むＮＵＭＡノードが複数存在し、各ＮＵＭＡノードはメモリを共有する。
【０００７】
あるコアから見て同一ＮＵＭＡノードに存在するメモリはローカルメモリと呼ばれ、異なるＮＵＭＡノードに存在するメモリはリモートメモリと呼ばれる。また、ローカルメモリへのアクセスはローカルアクセスと呼ばれ、リモートメモリへのアクセスはリモートアクセスと呼ばれる。一般にリモートアクセス時間はローカルアクセス時間より大きい。
【０００８】
タスク構文において、タスクを実行するＮＵＭＡノードを指定する機能はなく、タスクがどのＮＵＭＡノードで実行されるかはランタイムの実装依存である。ＮＵＭＡ環境下でタスクが実行される場合、タスクを実行するＮＵＭＡノードとタスクがアクセスするデータが存在するＮＵＭＡノードが異なると、データへのアクセスがリモートアクセスとなり、タスクの性能が下がる。
【０００９】
図２０は、ＮＵＭＡ環境下でタスクの性能が落ちる場合を説明するための図である。図２０において、ＮＵＭＡ＃０及びＮＵＭＡ＃１は、インターコネクトで接続されたＮＵＭＡノードである。Ｃ＃０〜Ｃ＃３は、コアである。ｃａｃｈｅ＃０及びｃａｃｈｅ＃１はキャッシュメモリである。ｃａｃｈｅ＃０はＣ＃０とＣ＃１で共用され、ｃａｃｈｅ＃１はＣ＃２とＣ＃３で共用される。ＭＥＭ＃０及びＭＥＭ＃１はメモリである。
【００１０】
例えば、タスクを実行するＣ＃０は、ローカルアクセスの場合ｃａｃｈｅ＃０を介してＭＥＭ＃０にアクセスし、リモートアクセスの場合インターコネクトを介してＮＵＭＡ＃１にアクセスする。Ｃ＃０がＭＥＭ＃１のデータにアクセスする場合、ＭＥＭ＃１の内容がｃａｃｈｅ＃１に読み出され、インターコネクトを介してｃａｃｈｅ＃０へ格納される。このように、タスクを実行するＮＵＭＡノードとタスクがアクセスするデータを記憶するＮＵＭＡノードが異なると、常にリモートアクセスが発生するためにタスクの性能が悪くなる。
【００１１】
このため、タスク内で使用する変数を１つ記述する指示節をタスク構文に追加することで、タスク登録時に変数のアドレスから変数が所属するＮＵＭＡノードを特定し、特定したＮＵＭＡノードでタスクを実行する技術がある。
【００１２】
図２１は、指示節を含むタスク構文のコンパイルにより生成される実行プログラムの例を示す図である。図２１において、「ｎｕｍａ＿ｖａｌ（ａ）」が、タスクがアクセスする変数ａを記述する指示節であり、「ｎｕｍａ＿ｖａｌ（ｂ）」が、タスクがアクセスする変数ｂを記述する指示節である。
【００１３】
コンパイラは、タスクがアクセスする変数のアドレスを引数に含めてタスク登録Ｉ／Ｆを実行プログラムに挿入する。図２１では、「＃ｐｒａｇｍａ  ｏｍｐ  ｔａｓｋ  ｎｕｍａ＿ｖａｌ（ａ）」に対応して「タスク登録Ｉ／Ｆ（ｔａｓｋ＃１，＆ａ）」が挿入される。また、「＃ｐｒａｇｍａ  ｏｍｐ  ｔａｓｋ  ｎｕｍａ＿ｖａｌ（ｂ）」に対応して「タスク登録Ｉ／Ｆ（ｔａｓｋ＃１，＆ｂ）」が挿入される。「＆ｖ」は、変数ｖのアドレスである。
【００１４】
図２２Ａは、変数アドレスを引数に含むタスク登録Ｉ／Ｆの動作を説明するための図であり、図２２Ｂは、タスク実行Ｉ／Ｆの動作を説明するための図である。図２２Ａに示すように、変数アドレスを引数に含むタスク登録Ｉ／Ｆがユーザプログラムから呼び出されて実行されると、変数アドレスを引数として登録用のランタイムルーチンが呼び出される（１）。そして、登録用のランタイムルーチンは、変数アドレスを引数としてノードＩＤ返却ルーチンを呼び出す（２）。
【００１５】
そして、ノードＩＤ返却ルーチンは、引数の変数アドレスを用いて変数が所属するＮＵＭＡノードを特定し、変数が所属するＮＵＭＡノードＩＤを返却する（３）。ここで、ＮＵＭＡノードＩＤは、ＮＵＭＡノードを識別する識別子である。
【００１６】
そして、登録用のランタイムルーチンは、返却されたＮＵＭＡノードＩＤで特定されるＮＵＭＡノードに含まれるコアに対応するスレッドのスレッドＩＤを全てタスクプールへ関数ポインタとともに登録する（４）。ここで、スレッドＩＤは、スレッドを識別する識別子である。図２２Ａでは、優先実行スレッドＩＤ＿１、優先実行スレッドＩＤ＿２、・・・がＮＵＭＡノードＩＤで特定されるＮＵＭＡノードに含まれるコアに対応するスレッドのスレッドＩＤである。
【００１７】
そして、タスク実行Ｉ／Ｆが実行されると、図２２Ｂに示すように、実行用のランタイムルーチンが呼び出される（１）。実行用のランタイムルーチンは、タスクプールから情報をロードする（２）。そして、実行用のランタイムルーチンは、優先実行スレッドＩＤ＿１のスレッドへタスクを割り当て、割り当てができない場合には、優先実行スレッドＩＤ＿２のスレッドへ割り当てる（３）。
【００１８】
このように、登録用のランタイムルーチンが、引数で指定された変数の所属するＮＵＭＡノードを特定し、特定したＮＵＭＡノードに含まれるコアに対応付けられたスレッドのスレッドＩＤをタスクプールに登録する。したがって、変数が所属するＮＵＭＡノードがタスクを実行することができる。
【００１９】
なお、分散共有メモリ型並列計算機において、最適なデータ分散を実現する並列プログラムを生成し、並列プログラムの処理速度を向上させる技術がある。この技術では、並列化コンパイラの並列化部において、まず、データ分散対象配列検出部が、入力された逐次プログラムから、ループ繰り返し範囲が変数のループ中に参照を有する配列、もしくは配列宣言寸法が変数の配列、もしくは引数配列を検出する。次に、データ分散形状決定部が、この配列をページサイズにブロックサイクリック分散させるデータ分散指示文を生成して挿入する。さらに、データ分散向けループ分散形状決定部が、このデータ分散形状と一致するループ分散形状となるループ分散指示文を生成して挿入する。そして、並列化ループネストマルチスレッド化部が、並列化ループを含むネストループをマルチスレッド化することにより、並列プログラムを生成する。
【００２０】
また、ＮＵＭＡアーキテクチャを採用した共有メモリ型マルチプロセッサ計算機システムを使用するプログラマがソースコードを書き換えることなく、ローカルメモリへアクセスする並列化プログラムを生成するコンパイラがある。このコンパイラは、ローカルメモリにアクセスさせたい配列名と並列化させたい配列の次元がコンパイルオプションとして指定されていた場合に、配列名と配列の次元を配列テーブルに格納する。そして、このコンパイラは、ソースコード内に配列テーブルに格納されている指定した配列をアロケートする処理がある場合に、アロケート処理の直後に指定した配列の初期化ループを追加する。また、このコンパイラは、ソースコード内にあるループに指定した配列がある場合に、指定した次元に使用されている変数と同じ変数をループ制御変数として使用しているループを並列化する。
【００２１】
また、所要の実行性能を容易に得ることができるマルチコア分割のためのコンパイル技術がある。このコンパイル技術は、タスク化指示文を解析し、指定された箇所をタスク化する処理、及び指定されたＣＰＵにタスクを配置する処理を採用する。このコンパイル技術は、ユーザが指定した主要部分のタスク分割指示に従って、タスクを個別ＣＰＵに割当て、マルチコア分割を行う。このコンパイル技術は、割当ＣＰＵの指示のない処理に関しては、主要タスクとの関連を呼出関係や依存関係から判断し、割当ＣＰＵを決定する。このコンパイル技術は、ＣＰＵ分割にあたっては、同一処理の複数ＣＰＵへの処理の複写配置も考慮し、処理速度と資源のバランスを考慮した効率的マルチコアタスク分割を実現する。
【先行技術文献】
【特許文献】
【００２２】
【特許文献１】特開２００１−２９７０６８号公報
【特許文献２】特開２０１２−２２１１３５号公報
【特許文献３】特開２０１０−２０４９７９号公報
【発明の概要】
【発明が解決しようとする課題】
【００２３】
ＮＵＭＡ環境では、メモリが共有されるＮＵＭＡノードの範囲は予め決められている。また、タスクが取り扱うデータが存在するＮＵＭＡノードをプログラム実行前に決めることができる。そこで、タスクが取り扱うデータが複数のＮＵＭＡノードにある場合、最も大きなデータがあるＮＵＭＡノードでタスクを実行することでタスクの性能を向上することが考えられる。
【００２４】
図２３は、最も大きなデータがあるＮＵＭＡノードでのタスク実行を説明するための図である。図２３に示すように、タスクが取り扱うデータがＭＥＭ＃０、ＭＥＭ＃１、ＭＥＭ＃２、ＭＥＮ＃３にそれぞれ５０ＭＢ（メガバイト）、６０ＭＢ、２０ＭＢ、８０ＭＢ存在する。この場合、ＮＵＭＡ＃３でタスクを実行すると最も大きい８０ＭＢのデータにローカルアクセスするため、タスクを実行するＮＵＭＡノードとしてＮＵＭＡ＃３を選択することが考えられる。
【００２５】
しかしながら、ＮＵＭＡノード間のデータ転送では、レイテンシの違いがあるため、ＮＵＭＡ＃３を選択することが最適にならない場合がある。図２４は、ＮＵＭＡノード間の転送レイテンシの一例を示す図である。図２４では、ＮＵＭＡ＃０とＮＵＭＡ＃１の間及びＮＵＭＡ＃２とＮＵＭＡ＃３の間の転送レイテンシは１であり、ＮＵＭＡ＃０とＮＵＭＡ＃２の間及びＮＵＭＡ＃１とＮＵＭＡ＃３の間の転送レイテンシは２である。また、ＮＵＭＡ＃０とＮＵＭＡ＃３の間及びＮＵＭＡ＃１とＮＵＭＡ＃２の間の転送レイテンシは３である。なお、図２４では、転送レイテンシは相対的な値で示され、転送レイテンシが２である場合、転送レイテンシが１である場合と比較してリモートアクセスに要する時間は２倍である。
【００２６】
そして、ＮＵＭＡノード間の転送コストを転送レイテンシ×データサイズと定義する。すると、図２４の場合、タスクをＮＵＭＡ＃３で実行した場合の転送コストは、３×５０ＭＢ（ＮＵＭＡ＃０）＋２×６０ＭＢ（ＮＵＭＡ＃１）＋１×２０ＭＢ（ＮＵＭＡ＃２）＝２９０である。同様に、タスクをＮＵＭＡ＃０で実行した場合の転送コストは３４０であり、タスクをＮＵＭＡ＃１で実行した場合の転送コストは２７０であり、タスクをＮＵＭＡ＃２で実行した場合の転送コストは３６０である。したがって、タスクをＮＵＭＡ＃１で実行することによって、リモートアクセスによる性能低下を最も抑えることができる。
【００２７】
本発明は、１つの側面では、リモートアクセスによる性能低下を最も抑えることができるＮＵＭＡノードをタスクを実行するＮＵＭＡノードとして決定することを目的とする。
【課題を解決するための手段】
【００２８】
１つの態様では、実行ノード選定プログラムは、以下の抽出する処理、計算する処理及び決定する処理をコンピュータに実行させる。抽出する処理は、複数のＮＵＭＡノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたＮＵＭＡノードを候補ＮＵＭＡノードとして抽出する。計算する処理は、抽出された候補ＮＵＭＡノード毎にデータのサイズを計算する。決定する処理は、計算されたサイズと候補ＮＵＭＡノード間でデータを転送する場合のレイテンシを基にタスクを実行するＮＵＭＡノードを候補ＮＵＭＡノードの中から決定する。
【発明の効果】
【００２９】
１つの側面では、本発明は、リモートアクセスによる性能低下を抑えることができる。
【図面の簡単な説明】
【００３０】
【図１】図１は、実施例に係る情報処理装置の機能構成を示す図である。
【図２】図２は、レイテンシ測定方法を説明するための図である。
【図３】図３は、ｎｕｍａ＿ｖａｌ指示節のフォーマットを示す図である。
【図４】図４は、タスク登録Ｉ／Ｆにおいてランタイムルーチンへ渡される引数を示す図である。
【図５】図５は、データサイズテーブルの一例を示す図である。
【図６】図６は、コストテーブルの一例を示す図である。
【図７】図７は、タスク登録Ｉ／Ｆの動作を説明するための図である。
【図８】図８は、タスク登録Ｉ／Ｆの処理のフローを示すフローチャートである。
【図９】図９は、データ量計算処理のフローを示すフローチャートである。
【図１０】図１０は、転送コスト計算処理のフローを示すフローチャートである。
【図１１】図１１は、タスク実行Ｉ／Ｆの処理のフローを示すフローチャートである。
【図１２】図１２は、タスクプールへの登録の説明に用いられる実行装置のハードウェア構成を示す図である。
【図１３】図１３は、図１２に示した実行装置のレイテンシテーブルを示す図である。
【図１４】図１４は、タスクプールへの登録の説明に用いられるプログラムを示す図である。
【図１５】図１５は、図１４に示したプログラムのタスク登録Ｉ／Ｆの引数を示す図である。
【図１６】図１６は、図１５に示した変数について作成されたデータサイズテーブルを示す図である。
【図１７】図１７は、図１３に示したレイテンシテーブルと図１６に示したデータサイズテーブルから計算されたコストテーブルを示す図である。
【図１８】図１８は、登録後のタスクプールを示す図である。
【図１９Ａ】図１９Ａは、タスク構文を含むプログラムのコンパイル例を示す図である。
【図１９Ｂ】図１９Ｂは、図１９Ａに示した実行プログラムの動作を説明するための図である。
【図２０】図２０は、ＮＵＭＡ環境下でタスクの性能が落ちる場合を説明するための図である。
【図２１】図２１は、指示節を含むタスク構文のコンパイルにより生成される実行プログラムの例を示す図である。
【図２２Ａ】図２２Ａは、変数アドレスを引数に含むタスク登録Ｉ／Ｆの動作を説明するための図である。
【図２２Ｂ】図２２Ｂは、タスク実行Ｉ／Ｆの動作を説明するための図である。
【図２３】図２３は、最も大きなデータがあるＮＵＭＡノードでのタスク実行を説明するための図である。
【図２４】図２４は、ＮＵＭＡノード間の転送レイテンシの一例を示す図である。
【発明を実施するための形態】
【００３１】
以下に、本願の開示する実行ノード選定プログラム、実行ノード選定方法及び情報処理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００３２】
まず、実施例に係る情報処理装置の機能構成について説明する。図１は、実施例に係る情報処理装置の機能構成を示す図である。図１に示すように、実施例に係る情報処理装置１は、レイテンシテーブル作成装置２と、コンパイル装置３と、実行装置４とを有する。
【００３３】
レイテンシテーブル作成装置２は、ＮＵＭＡノード間の転送レイテンシを測定し、レイテンシテーブルを作成する。レイテンシテーブルは例えばファイル経由で実行装置４に渡される。レイテンシテーブル作成装置２は、例えば、複数のＮＵＭＡノードを含む並列計算機の構成時にレイテンシテーブルを作成し、ファイルに書き込む。
【００３４】
図２は、レイテンシ測定方法を説明するための図である。図２では、ＮＵＭＡノードｉとＮＵＭＡノードｊとの間の転送レイテンシが測定される。レイテンシテーブル作成装置２は、ＮＵＭＡノードｉのメモリに測定用変数ｆｌａｇを割り当てる。そして、レイテンシテーブル作成装置２は、ｆｌａｇをＮＵＭＡノード間で更新する処理時間をタイマーで測定し、転送レイテンシを求める。
【００３５】
図２に示すように、ＮＵＭＡノードｉに所属するスレッドをｘとし、ＮＵＭＡノードｊに所属するスレッドをｙとする。スレッドｘは、ｆｌａｇ＝１となるまで待機し、ｆｌａｇ＝１となるとｆｌａｇ＝０と書き込み、スレッドｙは、ｆｌａｇ＝０となるまで待機し、ｆｌａｇ＝０となるとｆｌａｇ＝１と書き込む。
【００３６】
ｆｌａｇの初期値を０として、スレッドｙがｆｌａｇを読むと、ｆｌａｇがＮＵＭＡノードｉからＮＵＭＡノードｊへ転送され、ｆｌａｇ＝０であるので、スレッドｙは、ｆｌａｇに１を書き込む（１）。一方、スレッドｘはｆｌａｇ＝１となるまで待機する（２）。スレッドｘがｆｌａｇを読むと、ｆｌａｇがＮＵＭＡノードｊからＮＵＭＡノードｉへ転送され、ｆｌａｇ＝１であるので、スレッドｘは、ｆｌａｇに０を書き込む（３）。一方、スレッドｙはｆｌａｇ＝０となるまで待機する（４）。スレッドｙがｆｌａｇを読むと、ｆｌａｇがＮＵＭＡノードｉからＮＵＭＡノードｊへ転送される。
【００３７】
レイテンシテーブル作成装置２は、このｆｌａｇ更新の処理をタイマーで測定し、処理時間をＮＵＭＡノードｉとＮＵＭＡノードｊの転送レイテンシとする。レイテンシテーブル作成装置２は、このような測定を全てのＮＵＭＡノードの組合せに対して行い、レイテンシテーブルを作成する。また、レイテンシテーブル作成装置２は、転送レイテンシが正整数となるように正規化を行う。なお、ｉ＝ｊの場合、すなわち、同一ＮＵＭＡノード間の転送レイテンシは０である。
【００３８】
コンパイル装置３は、ソースプログラムをコンパイルし、実行プログラムを生成する。実行プログラムは、例えばファイルに出力され、実行装置４によりファイルから読み出されて実行される。ユーザは、タスク内で使用されるデータの各ＮＵＭＡノードへの分散をソースプログラムの中で指定する。
【００３９】
タスク内で使用されるデータの各ＮＵＭＡノードへの分散は、ファーストタッチ（first  touch）により行われる。ファーストタッチとは、変数（データ）に初めてアクセスしたスレッドが所属するＮＵＭＡノードのメモリに変数を割り当てる手法である。ＮＵＭＡノードｉのメモリに変数を割り当てる場合、ユーザは、ＮＵＭＡノードｉに所属するスレッドがその変数に最初にアクセスするようにソースプログラムを記述する。例えば、ＯｐｅｎＭＰｐａｒａｌｌｅｌ構文等でスレッドを複数起動し、各スレッドがそれぞれ初期値の書き込み等を行って変数にアクセスするプログラムが実行されると、変数はそのスレッドが所属するＮＵＭＡノードのメモリに割り当てられる。
【００４０】
また、ユーザは、ソースプログラムにおいて、ｎｕｍａ＿ｖａｌ指示節にタスク内で使用するスカラ変数、部分配列を複数指定する。図３は、ｎｕｍａ＿ｖａｌ指示節のフォーマットを示す図である。図３に示すように、ｎｕｍａ＿ｖａｌ指示節ではｌｉｓｔが指定される。ｌｉｓｔは、リスト数がＮ個のスカラ変数（ｓｃａｌａｒ）又は部分配列（ａｒｒａｙ＿ｓｅｃｔｉｏｎ）から成るリスト（ｖａｌ＿１，ｖａｌ＿２，・・・，ｖａｌ＿Ｎ）である。
【００４１】
部分配列のインデックスは開始インデックスｌｏｗｅｒと配列の長さｌｅｎｇｔｈの［ｌｏｗｅｒ：ｌｅｎｇｔｈ］で指定される。部分配列ａ［ｌｏｗｅｒ：ｌｅｎｇｔｈ］は、要素ａ［ｌｏｗｅｒ］、ａ「ｌｏｗｅｒ＋１」、・・・、ａ［ｌｏｗｅｒ＋ｌｅｎｇｔｈ−１］の部部配列を表す。例えば、部分配列ａ［１０：５］は、ａ［１０］、ａ［１１］、ａ［１２］、ａ［１３］、ａ［１４］を要素とする部分配列である。
【００４２】
部分配列が多次元の場合は、次元数をｄｉｍとすると部分配列はａｒｒａｙ＿ｓｅｃｔｉｏｎ［ｌｏｗｅｒ＿１：ｌｅｎｇｔｈ＿１］［ｌｏｗｅｒ＿２：ｌｅｎｇｔｈ＿２］・・・［ｌｏｗｅｒ＿ｄｉｍ：ｌｅｎｇｔｈ＿ｄｉｍ］で指定される。
【００４３】
コンパイル装置３は、登録Ｉ／Ｆ作成部３１を有する。登録Ｉ／Ｆ作成部３１は、タスク構文をコンパイルしてタスク登録Ｉ／Ｆを実行プログラムに挿入する。登録Ｉ／Ｆ作成部３１は、タスク構文をコンパイルする際は、タスクの関数ポインタｆｕｎｃ、リスト数Ｎ、変数の先頭アドレスａｄｄｒ、変数の型のサイズｓｉｚｅ、変数の次元数ｄｉｍ、各次元のインデックス長ｌｅｎを引数とするタスク登録Ｉ／Ｆを生成する。
【００４４】
図４は、タスク登録Ｉ／Ｆにおいてランタイムルーチンへ渡される引数を示す図である。図４に示すように、タスク登録Ｉ／Ｆにおいてランタイムルーチンへ渡される引数には、タスクの関数ポインタｆｕｎｃ、リスト数Ｎが含まれる。また、タスク登録Ｉ／Ｆにおいてランタイムルーチンへ渡される引数には、各変数について、先頭アドレスａｄｄｒ、型サイズｓｉｚｅ、次元数ｄｉｍ、各次元のインデックス長ｌｅｎ＿１〜ｌｅｎ＿ｄｉｍが含まれる。
【００４５】
実行装置４は、レイテンシテーブルと実行プログラムを例えばファイルから読み込んで実行プログラムを実行する。実行装置４は、記憶部４０と、登録Ｉ／Ｆ実行部４１と、実行Ｉ／Ｆ実行部４２とを有する。
【００４６】
実行装置４は、後述する図１２に一例を示すように、複数のＮＵＭＡノードがインターコネクトで接続されたハードウェア構成を有する。記憶部４０は、いずれかのＮＵＭＡノードのメモリ内の領域である。登録Ｉ／Ｆ実行部４１及び実行Ｉ／Ｆ実行部４２は、記憶部４０と同じＮＵＭＡノードのコアでタスク登録Ｉ／Ｆ及びタスク実行Ｉ／Ｆのランタイムルーチンがそれぞれ実行されることで実現される。
【００４７】
記憶部４０は、タスク登録Ｉ／Ｆ及びタスク実行Ｉ／Ｆのランタイムルーチンが使用するデータを記憶し、データサイズテーブル４０ａ、コストテーブル４０ｂ及びタスクプール４０ｃを記憶する。
【００４８】
データサイズテーブル４０ａは、タスクで使用されるデータについて各ＮＵＭＡノードが記憶するデータのサイズが登録されるテーブルである。図５は、データサイズテーブル４０ａの一例を示す図である。図５に示すように、データサイズテーブル４０ａは、ノードＩＤとデータサイズを対応付ける。ノードＩＤは、タスクが使用するデータを記憶するＮＵＭＡノードを識別する識別子である。データサイズは、対応するＮＵＭＡノードが記憶するデータのサイズである。例えば、ＮＵＭＡノード「０」がタスクに関して記憶するデータのサイズは「ｓ＃０」である。
【００４９】
コストテーブル４０ｂは、タスクを実行するＮＵＭＡノードとデータの転送コストとを対応付けるテーブルである。図６は、コストテーブル４０ｂの一例を示す図である。図６に示すように、コストテーブル４０ｂは、ノードＩＤとコストを対応付ける。ノードＩＤは、タスクを実行するＮＵＭＡノードを識別する識別子である。コストは、対応するＮＵＭＡノードでタスクが実行された場合のデータの転送コストである。例えば、ＮＵＭＡノード「０」でタスクが実行されるとデータの転送コストは「ａａ」である。
【００５０】
タスクプール４０ｃは、実行待ちのタスクに関する情報のリストである。タスクに関する情報には、関数ポインタとタスクを実行するスレッドのスレッドＩＤが含まれる。
【００５１】
登録Ｉ／Ｆ実行部４１は、タスク登録Ｉ／Ｆを実行する。図７は、タスク登録Ｉ／Ｆの動作を説明するための図である。図７に示すように、ユーザプログラムから呼び出されてタスク登録Ｉ／Ｆが実行されると、リスト数、リスト数個の（変数の先頭アドレス、変数の型サイズ、変数の次元数、各次元のインデックス長）を引数として登録用のランタイムルーチンが呼び出される（１）。そして、登録用のランタイムルーチンは、リスト数、リスト数個の（変数の先頭アドレス、変数の型サイズ、変数の次元数、各次元のインデックス長）を引数として転送コスト見積もりルーチンを呼び出す（２）。
【００５２】
そして、転送コスト見積もりルーチンは、引数とレイテンシテーブルを用いてコストテーブル４０ｂを作成し、ＮＵＭＡノード毎の転送コストとして返却する（３）。そして、登録用のランタイムルーチンは、転送コストが低い方から順にＮＵＭＡノードを選択し、選択したＮＵＭＡノードに所属するスレッドＩＤを全てタスクプール４０ｃへ関数ポインタとともに登録する（４）。図７では、優先実行スレッドＩＤ＿１、優先実行スレッドＩＤ＿２、・・・が登録されたスレッドＩＤである。
【００５３】
登録Ｉ／Ｆ実行部４１は、抽出部４１ａと、計算部４１ｂと、決定部４１ｃとを有する。抽出部４１ａは、タスクを実行する候補となる候補ＮＵＭＡノードを抽出する。具体的には、抽出部４１ａは、タスク登録Ｉ／Ｆの引数に含まれる複数の変数がそれぞれ所属するＮＵＭＡノードを候補ＮＵＭＡノードとして抽出する。
【００５４】
計算部４１ｂは、タスクで使用されるデータについて候補ＮＵＭＡノードが有するデータのサイズを計算する。具体的には、計算部４１ｂは、データサイズテーブル４０ａを作成する。
【００５５】
決定部４１ｃは、候補ＮＵＭＡノードが有するデータのサイズとレイテンシテーブルを用いて候補ＮＵＭＡノードの中からタスクを実行するＮＵＭＡノードを決定する。そして、決定部４１ｃは、決定したＮＵＭＡノードに所属するスレッドのスレッドＩＤをタスクプール４０ｃへ登録する。
【００５６】
実行Ｉ／Ｆ実行部４２は、タスク実行Ｉ／Ｆを実行する。タスク実行Ｉ／Ｆは、図２２Ｂに示した動作を行ってタスクを実行する。
【００５７】
次に、タスク登録Ｉ／Ｆの処理のフローについて説明する。図８は、タスク登録Ｉ／Ｆの処理のフローを示すフローチャートである。図８に示すように、登録用のランタイムルーチンは、関数ポインタ、ｎｕｍａ＿ｖａｌで指定される引数をＩ／Ｆを通して受け取る（ステップＳ１）。
【００５８】
そして、登録用のランタイムルーチンは、転送コスト見積もりルーチンを呼び出して、ｎｕｍａ＿ｖａｌで指定されるデータのサイズをＮＵＭＡノード毎に計算するデータ量計算処理を実行する（ステップＳ２）。そして、登録用のランタイムルーチンは、転送コスト見積もりルーチンを呼び出して、転送コストを計算する転送コスト計算処理を実行する（ステップＳ３）。そして、登録用のランタイムルーチンは、タスクプール４０ｃに関数ポインタに対応付けて転送コストの低い順にスレッドＩＤを登録する（ステップＳ４）。
【００５９】
このように、登録用のランタイムルーチンが関数ポインタに対応付けて転送コストの低い順にスレッドＩＤをタスクプール４０ｃに登録するので、情報処理装置１はタスク実行においてリモートアクセスによる性能低下を抑えることができる。
【００６０】
図９は、データ量計算処理のフローを示すフローチャートである。図９に示すように、転送コスト見積もりルーチンは、ｎｕｍａ＿ｖａｌのリストから変数を１つ選ぶ（ステップＳ１１）。そして、転送コスト見積もりルーチンは、変数が所属するＮＵＭＡノードのノードＩＤをｎｏｄｅ＿ｘとする（ステップＳ１２）。転送コスト見積もりルーチンは、変数のアドレスから変数が所属するＮＵＭＡノードを特定してノードＩＤを返却するＮＵＭＡノードＩＤ返却ルーチンを用いてｎｏｄｅ＿ｘを特定する。
【００６１】
そして、転送コスト見積もりルーチンは、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［ｎｏｄｅ＿ｘ］＋＝ｓｉｚｅ＊（ｌｅｎ＿１＊ｌｅｎ＿２＊・・・＊ｌｅｎ＿ｄｉｍ）により、変数が所属するＮＵＭＡノードにおけるデータサイズを更新する（ステップＳ１３）。ここで、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅは、データサイズテーブル４０ａであり、「＊」は乗算を表す。
【００６２】
そして、転送コスト見積もりルーチンは、全変数を処理したか否かを判定し（ステップＳ１４）、未処理の変数がある場合にはステップＳ１１に戻り、全変数を処理した場合には処理を終了する。
【００６３】
図１０は、転送コスト計算処理のフローを示すフローチャートである。図１０に示すように、転送コスト見積もりルーチンは、ｉ＝０とし（ステップＳ２１）、ｉがＮＵＭＡノード数より小さいか否かを判定する（ステップＳ２２）。ここで、ＮＵＭＡノード数は、タスクが使用するデータが割り当てられているＮＵＭＡノードの数である。
【００６４】
そして、ｉがＮＵＭＡノード数より小さい場合には、転送コスト見積もりルーチンは、ｊ＝０とし（ステップＳ２３）、ｊがＮＵＭＡノード数より小さいか否かを判定する（ステップＳ２４）。
【００６５】
そして、ｊがＮＵＭＡノード数より小さい場合には、転送コスト見積もりルーチンは、ｃｏｓｔ＿ｔａｂｌｅ［ｉ］＋＝ｌａｔｅｎｃｙ［ｉ，ｊ］＊ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［ｊ］により、ｉ番目のＮＵＭＡノードの転送コストを更新する（ステップＳ２５）。ここで、ｃｏｓｔ＿ｔａｂｌｅはコストテーブル４０ｂであり、ｌａｔｅｎｃｙはレイテンシテーブルである。
【００６６】
そして、転送コスト見積もりルーチンは、ｊに１を加え（ステップＳ２６）、ステップＳ２４に戻る。また、ｊがＮＵＭＡノード数より小さくない場合には、転送コスト見積もりルーチンは、ｉに１を加え（ステップＳ２７）、ステップＳ２２に戻る。また、ｉがＮＵＭＡノード数より小さくない場合には、転送コスト見積もりルーチンは、処理を終了する。
【００６７】
次に、タスク実行Ｉ／Ｆの処理のフローについて説明する。図１１は、タスク実行Ｉ／Ｆの処理のフローを示すフローチャートである。図１１に示すように、実行用のランタイムルーチンは、タスクプール４０ｃは空か否かを判定し（ステップＳ３１）、タスクプール４０ｃが空である場合には、処理を終了する。
【００６８】
一方、タスクプール４０ｃが空でない場合には、実行用のランタイムルーチンは、タスクプール４０ｃの先頭要素にアクセスし（ステップＳ３２）、優先スレッドＩＤの並びの優先度で、タスクを実行するスレッドを選択してタスクを実行する（ステップＳ３３）。そして、実行用のランタイムルーチンは、タスクの実行後、タスクをタスクプール４０ｃから削除し（ステップＳ３４）、ステップＳ３１に戻る。
【００６９】
このように、実行用のランタイムルーチンが、優先スレッドＩＤの並びの優先度で、タスクを実行するスレッドを選択してタスクを実行するので、情報処理装置１はタスク実行においてリモートアクセスによる性能低下を抑えることができる。
【００７０】
次に、図１２〜図１８を用いてタスクプール４０ｃへの登録例について説明する。図１２は、タスクプール４０ｃへの登録の説明に用いられる実行装置４のハードウェア構成を示す図である。図１２に示すように、実行装置４は、ＮＵＭＡ＃０〜ＮＵＭＡ＃３で表される４つのＮＵＭＡノード４ａを有する。ＮＵＭＡ＃０のノードＩＤは「０」であり、ＮＵＭＡ＃１のノードＩＤは「１」であり、ＮＵＭＡ＃２のノードＩＤは「２」であり、ＮＵＭＡ＃３のノードＩＤは「３」である。４つのＮＵＭＡノード４ａは、インターコネクト５により接続される。
【００７１】
ＮＵＭＡノード＃０は、Ｃ＃０及びＣ＃１で表されるコア４ｂと、ｃａｃｈｅ＃０で表されるキャッシュメモリ４ｃと、ＭＥＭ＃０で表されるメモリ４ｄとを有する。ＮＵＭＡノード＃１は、Ｃ＃２及びＣ＃３で表されるコア４ｂと、ｃａｃｈｅ＃１で表されるキャッシュメモリ４ｃと、ＭＥＭ＃１で表されるメモリ４ｄとを有する。
【００７２】
ＮＵＭＡノード＃２は、Ｃ＃４及びＣ＃５で表されるコア４ｂと、ｃａｃｈｅ＃２で表されるキャッシュメモリ４ｃと、ＭＥＭ＃２で表されるメモリ４ｄとを有する。ＮＵＭＡノード＃３は、Ｃ＃６及びＣ＃７で表されるコア４ｂと、ｃａｃｈｅ＃３で表されるキャッシュメモリ４ｃと、ＭＥＭ＃３で表されるメモリ４ｄとを有する。
【００７３】
Ｃ＃０のコアＩＤは「０」であり、Ｃ＃１のコアＩＤは「１」であり、Ｃ＃２のコアＩＤは「２」であり、Ｃ＃３のコアＩＤは「３」である。Ｃ＃４のコアＩＤは「４」であり、Ｃ＃５のコアＩＤは「５」であり、Ｃ＃６のコアＩＤは「６」であり、Ｃ＃７のコアＩＤは「７」である。コアＩＤとスレッドＩＤは同じである。
【００７４】
コア４ｂは、キャッシュメモリ４ｃからプログラムを読み出して実行する演算処理装置である。キャッシュメモリ４ｃは、メモリ４ｄに格納されたプログラム及びデータの一部を記憶する記憶モジュールである。メモリ４ｄは、プログラムやデータを記憶するＲＡＭ（Random  Access  Memory）である。
【００７５】
コア４ｂにおいて実行されるプログラムは、例えば、コンパイル装置３が出力したファイル経由でＨＤＤ（Hard  Disk  Drive）にインストールされ、ＨＤＤからメモリ４ｄに読み込まれる。あるいは、コア４ｂにおいて実行されるプログラムは、ＤＶＤに記憶され、ＤＶＤから読み出されてメモリ４ｄに読み込まれる。
【００７６】
図１３は、図１２に示した実行装置４のレイテンシテーブルを示す図である。例えば、ＮＵＭＡ＃０とＮＵＭＡ＃１の間の転送レイテンシは「１」であり、ＮＵＭＡ＃０とＮＵＭＡ＃２の間の転送レイテンシは「２」であり、ＮＵＭＡ＃０とＮＵＭＡ＃３の間の転送レイテンシは「３」である。
【００７７】
図１４は、タスクプール４０ｃへの登録の説明に用いられるプログラムを示す図である。図１４において、ａはサイズが１２５００の１次元配列であり、ｂはサイズが１５０００の１次元配列であり、ｃはサイズが５０００の１次元配列であり、ｄはサイズが２００００の１次元配列である。また、「＃ｐｒａｇｍａ  ｏｍｐ  ｐａｒａｌｌｅｌ｛ｓｗｉｔｃｈ  ・・・｝」は、ＮＵＭＡ＃０にａを割り付け、ＮＵＭＡ＃１にｂを割り付け、ＮＵＭＡ＃２にｃを割り付け、ＮＵＭＡ＃３にｄを割り付ける。また、ｎｕｍａ＿ｖａｌ（ａ［０：１２５００］，ｂ［０：１５０００］，ｃ［０：５０００］，ｄ［０：２００００］）はタスクがａ、ｂ、ｃ、ｄを使用することを指定する。また、「＃ｐｒａｇｍａ  ｏｍｐ  ｔａｓｋ  ￥」の「￥」は、行の継続を表す。
【００７８】
図１５は、図１４に示したプログラムのタスク登録Ｉ／Ｆの引数を示す図である。コンパイル装置３は、「＃ｐｒａｇｍａ  ｏｍｐ  ｔａｓｋ  ｎｕｍａ＿ｖａｌ（ａ［０：１２５００］，ｂ［０：１５０００］，ｃ［０：５０００］，ｄ［０：２００００］）をコンパイルして図１５に示す引数を持つタスク登録Ｉ／Ｆを生成する。
【００７９】
登録用のランタイムルーチンは、図１５に示した引数を全て受け取り、どのＮＵＭＡノードにどのくらいデータが割り付いているか計算する。例えば、登録用のランタイムルーチンは、変数ａが割り付けられたＮＵＭＡノードを特定し、割り付けられたデータ量を計算する。
【００８０】
具体的には、登録用のランタイムルーチンは、アドレスからノードＩＤを特定するシステムコール（ｇｅｔ＿ｍｅｍｐｏｌｉｃｙ）に先頭アドレス＆ａ［０］を引数としてコールし、ａが所属するＮＵＭＡノードのノードＩＤを特定する。ここでは、ノードＩＤ「０」が特定される。
【００８１】
データ量は、型サイズ＊（次元１のインデックス長＊・・・＊次元ｄｉｍのインデックス長）で計算できるので、ｓｉｚｅｏｆ（ｉｎｔ）＊１２５００＝４＊１２５００＝５００００バイトとなる。すなわち、変数ａについてはＮＵＭＡノード「０」に５００００バイト割り付けられているので、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［０］＝５００００となる。同様に、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［１］＝６００００、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［２］＝２００００、ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［３］＝８００００となる。図１６は、図１５に示した変数について作成されたデータサイズテーブル４０ａを示す図である。
【００８２】
登録用のランタイムルーチンは、図１３に示したレイテンシテーブルと図１６に示したデータサイズテーブル４０ａからコストテーブル４０ｂを計算する。例えば、ＮＵＭＡ＃０のコストは以下のように計算される。ｃｏｓｔ＿ｔａｂｌｅ［０］＝ｌａｔｅｎｃｙ［０，０］＊ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［０］＋・・・＋ｌａｔｅｎｃｙ［０，３］＊ｄａｔａ＿ｓｉｚｅ＿ｔａｂｌｅ［３］＝０＋１＊６００００＋２＊２００００＋３＊８００００＝３４００００。同様に、ｃｏｓｔ＿ｔａｂｌｅ［１］＝２７００００、ｃｏｓｔ＿ｔａｂｌｅ［２］＝３６００００、ｃｏｓｔ＿ｔａｂｌｅ［３］＝２９００００が計算される。図１７は、図１３に示したレイテンシテーブルと図１６に示したデータサイズテーブル４０ａから計算されたコストテーブル４０ｂを示す。
【００８３】
図１７に基づいて、登録用のランタイムルーチンは、コストが小さい順にＮＵＭＡ＃１、ＮＵＭＡ＃３、ＮＵＭＡ＃０、ＮＵＭＡ＃２の優先度でタスクを実行すると決定する。そして、登録用のランタイムルーチンは、ノードＩＤを引数としてそのＮＵＭＡノードに含まれるスレッドＩＤを全て返すシステムコールを用いて、ＮＵＭＡ＃１に含まれるスレッドＩＤ「２，３」を特定する。同様に、登録用のランタイムルーチンは、ＮＵＭＡ＃３に含まれるスレッドＩＤ「６，７」、ＮＵＭＡ＃０に含まれるスレッドＩＤ「０，１」、ＮＵＭＡ＃２に含まれるスレッドＩＤ「４，５」を特定する。
【００８４】
そして、登録用のランタイムルーチンは、特定したスレッドＩＤを優先度の順に関数ポインタとともにタスクプール４０ｃに登録する。図１８は、登録後のタスクプール４０ｃを示す図である。
【００８５】
上述してきたように、実施例では、抽出部４１ａが、タスクを実行する候補となる候補ＮＵＭＡノードを抽出し、計算部４１ｂが、タスクで使用されるデータについて候補ＮＵＭＡノードが有するデータのサイズを計算する。そして、決定部４１ｃが、候補ＮＵＭＡノードが有するデータのサイズとレイテンシテーブルを用いて候補ＮＵＭＡノードの中からタスクを実行するＮＵＭＡノードを決定する。そして、決定部４１ｃは、決定したＮＵＭＡノードに所属するコアに対応するスレッドのスレッドＩＤをタスクプール４０ｃへ登録する。したがって、登録用のランタイムルーチンは、タスクの実行においてリモートアクセスによる性能低下を抑えることができる。
【００８６】
また、実施例では、抽出部４１ａ、計算部４１ｂ及び決定部４１ｃを含む登録Ｉ／Ｆ実行部４１は登録用のランタイムルーチンを呼び出してタスク登録Ｉ／Ｆを実行し、登録用のランタイムルーチンはタスクが使用する変数のアドレスを引数として受け取る。したがって、抽出部４１ａは、変数のアドレスから変数が割り当てられたＮＵＭＡノードを候補ＮＵＭＡノードとして抽出することができる。
【００８７】
また、実施例では、登録用のランタイムルーチンは、変数の先頭アドレス、変数の型のサイズ、変数の次元数、各次元のサイズを引数として受け取るので、計算部４１ｂは、候補ＮＵＭＡノードが有するデータのサイズを計算することができる。
【００８８】
また、実施例では、抽出部４１ａは、タスク登録Ｉ／Ｆの引数に含まれる複数の変数がそれぞれ所属するＮＵＭＡノードを候補ＮＵＭＡノードとして抽出するので、正確に候補ＮＵＭＡノードを抽出することができる。
【００８９】
また、実施例では、タスク登録Ｉ／Ｆの引数に含まれる複数の変数はｎｕｍａ＿ｖａｌ指示節により指定されるので、ユーザは、タスクの使用する複数の変数をｎｕｍａ＿ｖａｌ指示節に記述することによりリモートアクセスによる性能低下を抑えることができる。
【符号の説明】
【００９０】
１    情報処理装置
２    レイテンシテーブル作成装置
３    コンパイル装置
４    実行装置
４ａ    ＮＵＭＡノード
４ｂ    コア
４ｃ    キャッシュメモリ
４ｄ    メモリ
５    インターコネクト
３１    登録Ｉ／Ｆ作成部
４０    記憶部
４０ａ    データサイズテーブル
４０ｂ    コストテーブル
４０ｃ    タスクプール
４１    登録Ｉ／Ｆ実行部
４１ａ    抽出部
４１ｂ    計算部
４１ｃ    決定部
４２    実行Ｉ／Ｆ実行部
【図１】
2019049843.tif 000003
【図２】
2019049843.tif 000004
【図３】
2019049843.tif 000005
【図４】
2019049843.tif 000006
【図５】
2019049843.tif 000007
【図６】
2019049843.tif 000008
【図７】
2019049843.tif 000009
【図８】
2019049843.tif 000010
【図９】
2019049843.tif 000011
【図１０】
2019049843.tif 000012
【図１１】
2019049843.tif 000013
【図１２】
2019049843.tif 000014
【図１３】
2019049843.tif 000015
【図１４】
2019049843.tif 000016
【図１５】
2019049843.tif 000017
【図１６】
2019049843.tif 000018
【図１７】
2019049843.tif 000019
【図１８】
2019049843.tif 000020
【図１９Ａ】
2019049843.tif 000021
【図１９Ｂ】
2019049843.tif 000022
【図２０】
2019049843.tif 000023
【図２１】
2019049843.tif 000024
【図２２Ａ】
2019049843.tif 000025
【図２２Ｂ】
2019049843.tif 000026
【図２３】
2019049843.tif 000027
【図２４】
2019049843.tif 000028