図面 (/)

技術 実行ノード選定プログラム、実行ノード選定方法及び情報処理装置

出願人 富士通株式会社
発明者 櫻井良太
出願日 2017年9月8日 (3年3ヶ月経過) 出願番号 2017-173488
公開日 2019年3月28日 (1年9ヶ月経過) 公開番号 2019-049843
状態 未査定
技術分野 特別なプログラム実行装置 マルチプログラミング
主要キーワード スカラ変数 ネストループ ループ繰り返し 変数アドレス タスク分割 ループ制御変数 転送レイテンシ 開始インデックス
関連する未来課題
重要な関連分野

この項目の情報は公開日時点(2019年3月28日)のものです。
また、この項目は機械的に抽出しているため、正しく解析できていない場合があります

図面 (20)

課題

複数のNUMAノードを有する並列計算機においてリモートアクセスによる性能低下を抑えること。

解決手段

抽出部41aが、タスクを実行する候補となる候補NUMAノードを抽出し、計算部41bが、タスクで使用されるデータについて候補NUMAノードが有するデータのサイズを計算する。そして、決定部41cが、候補NUMAノードが有するデータのサイズとレイテンシテーブルを用いて候補NUMAノードの中からタスクを実行するNUMAノードを決定する。そして、決定部41cは、決定したNUMAノードに所属するスレッドのスレッドIDをタスクプール40cへ登録する。

概要

背景

スレッド並列規格であるOpenMPのタスク構文は、プログラムから任意のブロックをタスクとして切り出し、並列実行させるために使用される。ここで、「スレッド」とは、プログラムの並列実行の単位である。プログラムは、ユーザが指定した数のスレッドによって並列に実行される。プログラムは、C、C++、FORTRAN等の言語で作成される。

コンパイラは、ソースプログラム中にタスク構文を見つけると、タスクに関する処理を行うランタイムルーチン呼び出すI/Fを実行プログラムに挿入する。図19Aは、タスク構文を含むプログラムのコンパイル例を示す図である。図19Aにおいて、ソースファイルは、ソースプログラムを記憶するファイルであり、実行ファイルは、並列列計算機により実行される実行プログラムを記憶するファイルである。ソースプログラムの「#pragma omp task」が{}で囲まれるブロックをタスクとして切り出すことを指示するタスク構文である。

図19Aに示すように、コンパイラは、ソースプログラムから2つのタスクを切り出し、2つのタスク登録I/Fを実行プログラムに挿入する。引数のtask#1及びtask#2はタスクの中身の処理の先頭を示す関数ポインタである。また、コンパイラは、タスク実行I/Fを実行プログラムに挿入する。

図19Bは、図19Aに示した実行プログラムの動作を説明するための図である。図19Bに示すように、タスク登録I/Fが実行されると、タスクの情報がタスクプール登録される(1)。ここで、タスクプールは、実行待ちのタスクの情報のリストであり、関数ポインタ等の情報を保持する。図19Bでは、task#1及びtask#2の情報がタスクプールへ登録される。タスク登録I/Fは、1スレッドで実行される。この時点では、タスクは実行されない。そして、タスク実行I/Fが実行されるとタスクプール内のタスクが全て実行される(2)。タスク実行I/Fは、全スレッドで実行される。

OpenMPプログラムは、NUMA(Non-Uniform Memory Access)環境で実行されることがある。ここで、OpenMPプログラムは、OpenMPに基づくプログラムである。また、NUMAは、コアの各メモリへのアクセスが均一でないアーキテクチャである。NUMAでは、コアとメモリを含むNUMAノードが複数存在し、各NUMAノードはメモリを共有する。

あるコアから見て同一NUMAノードに存在するメモリはローカルメモリと呼ばれ、異なるNUMAノードに存在するメモリはリモートメモリと呼ばれる。また、ローカルメモリへのアクセスはローカルアクセスと呼ばれ、リモートメモリへのアクセスはリモートアクセスと呼ばれる。一般にリモートアクセス時間はローカルアクセス時間より大きい。

タスク構文において、タスクを実行するNUMAノードを指定する機能はなく、タスクがどのNUMAノードで実行されるかはランタイム実装依存である。NUMA環境下でタスクが実行される場合、タスクを実行するNUMAノードとタスクがアクセスするデータが存在するNUMAノードが異なると、データへのアクセスがリモートアクセスとなり、タスクの性能が下がる。

図20は、NUMA環境下でタスクの性能が落ちる場合を説明するための図である。図20において、NUMA#0及びNUMA#1は、インターコネクトで接続されたNUMAノードである。C#0〜C#3は、コアである。cache#0及びcache#1はキャッシュメモリである。cache#0はC#0とC#1で共用され、cache#1はC#2とC#3で共用される。MEM#0及びMEM#1はメモリである。

例えば、タスクを実行するC#0は、ローカルアクセスの場合cache#0を介してMEM#0にアクセスし、リモートアクセスの場合インターコネクトを介してNUMA#1にアクセスする。C#0がMEM#1のデータにアクセスする場合、MEM#1の内容がcache#1に読み出され、インターコネクトを介してcache#0へ格納される。このように、タスクを実行するNUMAノードとタスクがアクセスするデータを記憶するNUMAノードが異なると、常にリモートアクセスが発生するためにタスクの性能が悪くなる。

このため、タスク内で使用する変数を1つ記述する指示節をタスク構文に追加することで、タスク登録時に変数のアドレスから変数が所属するNUMAノードを特定し、特定したNUMAノードでタスクを実行する技術がある。

図21は、指示節を含むタスク構文のコンパイルにより生成される実行プログラムの例を示す図である。図21において、「numa_val(a)」が、タスクがアクセスする変数aを記述する指示節であり、「numa_val(b)」が、タスクがアクセスする変数bを記述する指示節である。

コンパイラは、タスクがアクセスする変数のアドレスを引数に含めてタスク登録I/Fを実行プログラムに挿入する。図21では、「#pragma omp task numa_val(a)」に対応して「タスク登録I/F(task#1,&a)」が挿入される。また、「#pragma omp task numa_val(b)」に対応して「タスク登録I/F(task#1,&b)」が挿入される。「&v」は、変数vのアドレスである。

図22Aは、変数アドレスを引数に含むタスク登録I/Fの動作を説明するための図であり、図22Bは、タスク実行I/Fの動作を説明するための図である。図22Aに示すように、変数アドレスを引数に含むタスク登録I/Fがユーザプログラムから呼び出されて実行されると、変数アドレスを引数として登録用のランタイムルーチンが呼び出される(1)。そして、登録用のランタイムルーチンは、変数アドレスを引数としてノードID返却ルーチンを呼び出す(2)。

そして、ノードID返却ルーチンは、引数の変数アドレスを用いて変数が所属するNUMAノードを特定し、変数が所属するNUMAノードIDを返却する(3)。ここで、NUMAノードIDは、NUMAノードを識別する識別子である。

そして、登録用のランタイムルーチンは、返却されたNUMAノードIDで特定されるNUMAノードに含まれるコアに対応するスレッドのスレッドIDを全てタスクプールへ関数ポインタとともに登録する(4)。ここで、スレッドIDは、スレッドを識別する識別子である。図22Aでは、優先実行スレッドID_1、優先実行スレッドID_2、・・・がNUMAノードIDで特定されるNUMAノードに含まれるコアに対応するスレッドのスレッドIDである。

そして、タスク実行I/Fが実行されると、図22Bに示すように、実行用のランタイムルーチンが呼び出される(1)。実行用のランタイムルーチンは、タスクプールから情報をロードする(2)。そして、実行用のランタイムルーチンは、優先実行スレッドID_1のスレッドへタスクを割り当て、割り当てができない場合には、優先実行スレッドID_2のスレッドへ割り当てる(3)。

このように、登録用のランタイムルーチンが、引数で指定された変数の所属するNUMAノードを特定し、特定したNUMAノードに含まれるコアに対応付けられたスレッドのスレッドIDをタスクプールに登録する。したがって、変数が所属するNUMAノードがタスクを実行することができる。

なお、分散共有メモリ並列計算機において、最適なデータ分散を実現する並列プログラムを生成し、並列プログラムの処理速度を向上させる技術がある。この技術では、並列化コンパイラの並列化部において、まず、データ分散対象配列検出部が、入力された逐次プログラムから、ループ繰り返し範囲が変数のループ中に参照を有する配列、もしくは配列宣言寸法が変数の配列、もしくは引数配列を検出する。次に、データ分散形状決定部が、この配列をページサイズにブロックサイクリック分散させるデータ分散指示文を生成して挿入する。さらに、データ分散向けループ分散形状決定部が、このデータ分散形状と一致するループ分散形状となるループ分散指示文を生成して挿入する。そして、並列化ループネストマルチスレッド化部が、並列化ループを含むネストループをマルチスレッド化することにより、並列プログラムを生成する。

また、NUMAアーキテクチャを採用した共有メモリマルチプロセッサ計算機システムを使用するプログラマソースコード書き換えることなく、ローカルメモリへアクセスする並列化プログラムを生成するコンパイラがある。このコンパイラは、ローカルメモリにアクセスさせたい配列名と並列化させたい配列の次元コンパイルオプションとして指定されていた場合に、配列名と配列の次元を配列テーブルに格納する。そして、このコンパイラは、ソースコード内に配列テーブルに格納されている指定した配列をアロケートする処理がある場合に、アロケート処理の直後に指定した配列の初期化ループを追加する。また、このコンパイラは、ソースコード内にあるループに指定した配列がある場合に、指定した次元に使用されている変数と同じ変数をループ制御変数として使用しているループを並列化する。

また、所要実行性能を容易に得ることができるマルチコア分割のためのコンパイル技術がある。このコンパイル技術は、タスク化指示文解析し、指定された箇所をタスク化する処理、及び指定されたCPUにタスクを配置する処理を採用する。このコンパイル技術は、ユーザが指定した主要部分のタスク分割指示に従って、タスクを個別CPUに割当て、マルチコア分割を行う。このコンパイル技術は、割当CPUの指示のない処理に関しては、主要タスクとの関連を呼出関係依存関係から判断し、割当CPUを決定する。このコンパイル技術は、CPU分割にあたっては、同一処理の複数CPUへの処理の複写配置も考慮し、処理速度と資源バランスを考慮した効率的マルチコアタスク分割を実現する。

概要

複数のNUMAノードを有する並列計算機においてリモートアクセスによる性能低下を抑えること。抽出部41aが、タスクを実行する候補となる候補NUMAノードを抽出し、計算部41bが、タスクで使用されるデータについて候補NUMAノードが有するデータのサイズを計算する。そして、決定部41cが、候補NUMAノードが有するデータのサイズとレイテンシテーブルを用いて候補NUMAノードの中からタスクを実行するNUMAノードを決定する。そして、決定部41cは、決定したNUMAノードに所属するスレッドのスレッドIDをタスクプール40cへ登録する。

目的

本発明は、1つの側面では、リモートアクセスによる性能低下を最も抑えることができるNUMAノードをタスクを実行するNUMAノードとして決定することを目的とする

効果

実績

技術文献被引用数
0件
牽制数
0件

この技術が所属する分野

ライセンス契約や譲渡などの可能性がある特許掲載中! 開放特許随時追加・更新中 詳しくはこちら

請求項1

コンピュータに、複数のNUMAノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたNUMAノードを候補NUMAノードとして抽出し、抽出した候補NUMAノード毎に前記データのサイズを計算し、計算したサイズと候補NUMAノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するNUMAノードを前記候補NUMAノードの中から決定する処理を実行させることを特徴とする実行ノード選定プログラム

請求項2

ランタイムライブラリとして実行され、前記タスクが使用するデータに関する情報を引数として実行プログラムから呼び出されることを特徴とする請求項1に記載の実行ノード選定プログラム。

請求項3

前記タスクが使用するデータに関する情報には、変数先頭アドレス、変数の型のサイズ、変数の次元数、各次元のサイズが含まれることを特徴とする請求項1又は2に記載の実行ノード選定プログラム。

請求項4

前記タスクが使用するデータに関する情報は、前記タスクが使用する複数の変数に関する情報であり、前記候補NUMAノードを抽出する処理は、呼び出された際の引数に含まれる複数の変数がそれぞれ所属するNUMAノードを前記候補NUMAノードとして抽出することを特徴とする請求項2に記載の実行ノード選定プログラム。

請求項5

前記複数の変数は、numa_val指示節によりソースプログラムで指定されることを特徴とする請求項4に記載の実行ノード選定プログラム。

請求項6

コンピュータが、複数のNUMAノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたNUMAノードを候補NUMAノードとして抽出し、抽出した候補NUMAノード毎に前記データのサイズを計算し、計算したサイズと候補NUMAノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するNUMAノードを前記候補NUMAノードの中から決定する処理を実行することを特徴とする実行ノード選定方法

請求項7

複数のNUMAノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたNUMAノードを候補NUMAノードとして抽出する抽出部と、前記抽出部により抽出された候補NUMAノード毎に前記データのサイズを計算する計算部と、前記計算部により計算されたサイズと候補NUMAノード間でデータを転送する場合のレイテンシを基に前記タスクを実行するNUMAノードを前記候補NUMAノードの中から決定する決定部とを有することを特徴とする情報処理装置

技術分野

0001

本発明は、実行ノード選定プログラム、実行ノード選定方法及び情報処理装置に関する。

背景技術

0002

スレッド並列規格であるOpenMPのタスク構文は、プログラムから任意のブロックをタスクとして切り出し、並列実行させるために使用される。ここで、「スレッド」とは、プログラムの並列実行の単位である。プログラムは、ユーザが指定した数のスレッドによって並列に実行される。プログラムは、C、C++、FORTRAN等の言語で作成される。

0003

コンパイラは、ソースプログラム中にタスク構文を見つけると、タスクに関する処理を行うランタイムルーチン呼び出すI/Fを実行プログラムに挿入する。図19Aは、タスク構文を含むプログラムのコンパイル例を示す図である。図19Aにおいて、ソースファイルは、ソースプログラムを記憶するファイルであり、実行ファイルは、並列列計算機により実行される実行プログラムを記憶するファイルである。ソースプログラムの「#pragma omp task」が{}で囲まれるブロックをタスクとして切り出すことを指示するタスク構文である。

0004

図19Aに示すように、コンパイラは、ソースプログラムから2つのタスクを切り出し、2つのタスク登録I/Fを実行プログラムに挿入する。引数のtask#1及びtask#2はタスクの中身の処理の先頭を示す関数ポインタである。また、コンパイラは、タスク実行I/Fを実行プログラムに挿入する。

0005

図19Bは、図19Aに示した実行プログラムの動作を説明するための図である。図19Bに示すように、タスク登録I/Fが実行されると、タスクの情報がタスクプール登録される(1)。ここで、タスクプールは、実行待ちのタスクの情報のリストであり、関数ポインタ等の情報を保持する。図19Bでは、task#1及びtask#2の情報がタスクプールへ登録される。タスク登録I/Fは、1スレッドで実行される。この時点では、タスクは実行されない。そして、タスク実行I/Fが実行されるとタスクプール内のタスクが全て実行される(2)。タスク実行I/Fは、全スレッドで実行される。

0006

OpenMPプログラムは、NUMA(Non-Uniform Memory Access)環境で実行されることがある。ここで、OpenMPプログラムは、OpenMPに基づくプログラムである。また、NUMAは、コアの各メモリへのアクセスが均一でないアーキテクチャである。NUMAでは、コアとメモリを含むNUMAノードが複数存在し、各NUMAノードはメモリを共有する。

0007

あるコアから見て同一NUMAノードに存在するメモリはローカルメモリと呼ばれ、異なるNUMAノードに存在するメモリはリモートメモリと呼ばれる。また、ローカルメモリへのアクセスはローカルアクセスと呼ばれ、リモートメモリへのアクセスはリモートアクセスと呼ばれる。一般にリモートアクセス時間はローカルアクセス時間より大きい。

0008

タスク構文において、タスクを実行するNUMAノードを指定する機能はなく、タスクがどのNUMAノードで実行されるかはランタイム実装依存である。NUMA環境下でタスクが実行される場合、タスクを実行するNUMAノードとタスクがアクセスするデータが存在するNUMAノードが異なると、データへのアクセスがリモートアクセスとなり、タスクの性能が下がる。

0009

図20は、NUMA環境下でタスクの性能が落ちる場合を説明するための図である。図20において、NUMA#0及びNUMA#1は、インターコネクトで接続されたNUMAノードである。C#0〜C#3は、コアである。cache#0及びcache#1はキャッシュメモリである。cache#0はC#0とC#1で共用され、cache#1はC#2とC#3で共用される。MEM#0及びMEM#1はメモリである。

0010

例えば、タスクを実行するC#0は、ローカルアクセスの場合cache#0を介してMEM#0にアクセスし、リモートアクセスの場合インターコネクトを介してNUMA#1にアクセスする。C#0がMEM#1のデータにアクセスする場合、MEM#1の内容がcache#1に読み出され、インターコネクトを介してcache#0へ格納される。このように、タスクを実行するNUMAノードとタスクがアクセスするデータを記憶するNUMAノードが異なると、常にリモートアクセスが発生するためにタスクの性能が悪くなる。

0011

このため、タスク内で使用する変数を1つ記述する指示節をタスク構文に追加することで、タスク登録時に変数のアドレスから変数が所属するNUMAノードを特定し、特定したNUMAノードでタスクを実行する技術がある。

0012

図21は、指示節を含むタスク構文のコンパイルにより生成される実行プログラムの例を示す図である。図21において、「numa_val(a)」が、タスクがアクセスする変数aを記述する指示節であり、「numa_val(b)」が、タスクがアクセスする変数bを記述する指示節である。

0013

コンパイラは、タスクがアクセスする変数のアドレスを引数に含めてタスク登録I/Fを実行プログラムに挿入する。図21では、「#pragma omp task numa_val(a)」に対応して「タスク登録I/F(task#1,&a)」が挿入される。また、「#pragma omp task numa_val(b)」に対応して「タスク登録I/F(task#1,&b)」が挿入される。「&v」は、変数vのアドレスである。

0014

図22Aは、変数アドレスを引数に含むタスク登録I/Fの動作を説明するための図であり、図22Bは、タスク実行I/Fの動作を説明するための図である。図22Aに示すように、変数アドレスを引数に含むタスク登録I/Fがユーザプログラムから呼び出されて実行されると、変数アドレスを引数として登録用のランタイムルーチンが呼び出される(1)。そして、登録用のランタイムルーチンは、変数アドレスを引数としてノードID返却ルーチンを呼び出す(2)。

0015

そして、ノードID返却ルーチンは、引数の変数アドレスを用いて変数が所属するNUMAノードを特定し、変数が所属するNUMAノードIDを返却する(3)。ここで、NUMAノードIDは、NUMAノードを識別する識別子である。

0016

そして、登録用のランタイムルーチンは、返却されたNUMAノードIDで特定されるNUMAノードに含まれるコアに対応するスレッドのスレッドIDを全てタスクプールへ関数ポインタとともに登録する(4)。ここで、スレッドIDは、スレッドを識別する識別子である。図22Aでは、優先実行スレッドID_1、優先実行スレッドID_2、・・・がNUMAノードIDで特定されるNUMAノードに含まれるコアに対応するスレッドのスレッドIDである。

0017

そして、タスク実行I/Fが実行されると、図22Bに示すように、実行用のランタイムルーチンが呼び出される(1)。実行用のランタイムルーチンは、タスクプールから情報をロードする(2)。そして、実行用のランタイムルーチンは、優先実行スレッドID_1のスレッドへタスクを割り当て、割り当てができない場合には、優先実行スレッドID_2のスレッドへ割り当てる(3)。

0018

このように、登録用のランタイムルーチンが、引数で指定された変数の所属するNUMAノードを特定し、特定したNUMAノードに含まれるコアに対応付けられたスレッドのスレッドIDをタスクプールに登録する。したがって、変数が所属するNUMAノードがタスクを実行することができる。

0019

なお、分散共有メモリ並列計算機において、最適なデータ分散を実現する並列プログラムを生成し、並列プログラムの処理速度を向上させる技術がある。この技術では、並列化コンパイラの並列化部において、まず、データ分散対象配列検出部が、入力された逐次プログラムから、ループ繰り返し範囲が変数のループ中に参照を有する配列、もしくは配列宣言寸法が変数の配列、もしくは引数配列を検出する。次に、データ分散形状決定部が、この配列をページサイズにブロックサイクリック分散させるデータ分散指示文を生成して挿入する。さらに、データ分散向けループ分散形状決定部が、このデータ分散形状と一致するループ分散形状となるループ分散指示文を生成して挿入する。そして、並列化ループネストマルチスレッド化部が、並列化ループを含むネストループをマルチスレッド化することにより、並列プログラムを生成する。

0020

また、NUMAアーキテクチャを採用した共有メモリマルチプロセッサ計算機システムを使用するプログラマソースコード書き換えることなく、ローカルメモリへアクセスする並列化プログラムを生成するコンパイラがある。このコンパイラは、ローカルメモリにアクセスさせたい配列名と並列化させたい配列の次元コンパイルオプションとして指定されていた場合に、配列名と配列の次元を配列テーブルに格納する。そして、このコンパイラは、ソースコード内に配列テーブルに格納されている指定した配列をアロケートする処理がある場合に、アロケート処理の直後に指定した配列の初期化ループを追加する。また、このコンパイラは、ソースコード内にあるループに指定した配列がある場合に、指定した次元に使用されている変数と同じ変数をループ制御変数として使用しているループを並列化する。

0021

また、所要実行性能を容易に得ることができるマルチコア分割のためのコンパイル技術がある。このコンパイル技術は、タスク化指示文解析し、指定された箇所をタスク化する処理、及び指定されたCPUにタスクを配置する処理を採用する。このコンパイル技術は、ユーザが指定した主要部分のタスク分割指示に従って、タスクを個別CPUに割当て、マルチコア分割を行う。このコンパイル技術は、割当CPUの指示のない処理に関しては、主要タスクとの関連を呼出関係依存関係から判断し、割当CPUを決定する。このコンパイル技術は、CPU分割にあたっては、同一処理の複数CPUへの処理の複写配置も考慮し、処理速度と資源バランスを考慮した効率的マルチコアタスク分割を実現する。

先行技術

0022

特開2001−297068号公報
特開2012−221135号公報
特開2010−204979号公報

発明が解決しようとする課題

0023

NUMA環境では、メモリが共有されるNUMAノードの範囲は予め決められている。また、タスクが取り扱うデータが存在するNUMAノードをプログラム実行前に決めることができる。そこで、タスクが取り扱うデータが複数のNUMAノードにある場合、最も大きなデータがあるNUMAノードでタスクを実行することでタスクの性能を向上することが考えられる。

0024

図23は、最も大きなデータがあるNUMAノードでのタスク実行を説明するための図である。図23に示すように、タスクが取り扱うデータがMEM#0、MEM#1、MEM#2、MEN#3にそれぞれ50MB(メガバイト)、60MB、20MB、80MB存在する。この場合、NUMA#3でタスクを実行すると最も大きい80MBのデータにローカルアクセスするため、タスクを実行するNUMAノードとしてNUMA#3を選択することが考えられる。

0025

しかしながら、NUMAノード間のデータ転送では、レイテンシの違いがあるため、NUMA#3を選択することが最適にならない場合がある。図24は、NUMAノード間の転送レイテンシの一例を示す図である。図24では、NUMA#0とNUMA#1の間及びNUMA#2とNUMA#3の間の転送レイテンシは1であり、NUMA#0とNUMA#2の間及びNUMA#1とNUMA#3の間の転送レイテンシは2である。また、NUMA#0とNUMA#3の間及びNUMA#1とNUMA#2の間の転送レイテンシは3である。なお、図24では、転送レイテンシは相対的な値で示され、転送レイテンシが2である場合、転送レイテンシが1である場合と比較してリモートアクセスに要する時間は2倍である。

0026

そして、NUMAノード間の転送コストを転送レイテンシ×データサイズと定義する。すると、図24の場合、タスクをNUMA#3で実行した場合の転送コストは、3×50MB(NUMA#0)+2×60MB(NUMA#1)+1×20MB(NUMA#2)=290である。同様に、タスクをNUMA#0で実行した場合の転送コストは340であり、タスクをNUMA#1で実行した場合の転送コストは270であり、タスクをNUMA#2で実行した場合の転送コストは360である。したがって、タスクをNUMA#1で実行することによって、リモートアクセスによる性能低下を最も抑えることができる。

0027

本発明は、1つの側面では、リモートアクセスによる性能低下を最も抑えることができるNUMAノードをタスクを実行するNUMAノードとして決定することを目的とする。

課題を解決するための手段

0028

1つの態様では、実行ノード選定プログラムは、以下の抽出する処理、計算する処理及び決定する処理をコンピュータに実行させる。抽出する処理は、複数のNUMAノードを有する並列計算機において並列実行される部分としてソースプログラムから切り出されたタスクが使用するデータが割り付けられたNUMAノードを候補NUMAノードとして抽出する。計算する処理は、抽出された候補NUMAノード毎にデータのサイズを計算する。決定する処理は、計算されたサイズと候補NUMAノード間でデータを転送する場合のレイテンシを基にタスクを実行するNUMAノードを候補NUMAノードの中から決定する。

発明の効果

0029

1つの側面では、本発明は、リモートアクセスによる性能低下を抑えることができる。

図面の簡単な説明

0030

図1は、実施例に係る情報処理装置の機能構成を示す図である。
図2は、レイテンシ測定方法を説明するための図である。
図3は、numa_val指示節のフォーマットを示す図である。
図4は、タスク登録I/Fにおいてランタイムルーチンへ渡される引数を示す図である。
図5は、データサイズテーブルの一例を示す図である。
図6は、コストテーブルの一例を示す図である。
図7は、タスク登録I/Fの動作を説明するための図である。
図8は、タスク登録I/Fの処理のフローを示すフローチャートである。
図9は、データ量計算処理のフローを示すフローチャートである。
図10は、転送コスト計算処理のフローを示すフローチャートである。
図11は、タスク実行I/Fの処理のフローを示すフローチャートである。
図12は、タスクプールへの登録の説明に用いられる実行装置ハードウェア構成を示す図である。
図13は、図12に示した実行装置のレイテンシテーブルを示す図である。
図14は、タスクプールへの登録の説明に用いられるプログラムを示す図である。
図15は、図14に示したプログラムのタスク登録I/Fの引数を示す図である。
図16は、図15に示した変数について作成されたデータサイズテーブルを示す図である。
図17は、図13に示したレイテンシテーブルと図16に示したデータサイズテーブルから計算されたコストテーブルを示す図である。
図18は、登録後のタスクプールを示す図である。
図19Aは、タスク構文を含むプログラムのコンパイル例を示す図である。
図19Bは、図19Aに示した実行プログラムの動作を説明するための図である。
図20は、NUMA環境下でタスクの性能が落ちる場合を説明するための図である。
図21は、指示節を含むタスク構文のコンパイルにより生成される実行プログラムの例を示す図である。
図22Aは、変数アドレスを引数に含むタスク登録I/Fの動作を説明するための図である。
図22Bは、タスク実行I/Fの動作を説明するための図である。
図23は、最も大きなデータがあるNUMAノードでのタスク実行を説明するための図である。
図24は、NUMAノード間の転送レイテンシの一例を示す図である。

0031

以下に、本願の開示する実行ノード選定プログラム、実行ノード選定方法及び情報処理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。

0032

まず、実施例に係る情報処理装置の機能構成について説明する。図1は、実施例に係る情報処理装置の機能構成を示す図である。図1に示すように、実施例に係る情報処理装置1は、レイテンシテーブル作成装置2と、コンパイル装置3と、実行装置4とを有する。

0033

レイテンシテーブル作成装置2は、NUMAノード間の転送レイテンシを測定し、レイテンシテーブルを作成する。レイテンシテーブルは例えばファイル経由で実行装置4に渡される。レイテンシテーブル作成装置2は、例えば、複数のNUMAノードを含む並列計算機の構成時にレイテンシテーブルを作成し、ファイルに書き込む。

0034

図2は、レイテンシ測定方法を説明するための図である。図2では、NUMAノードiとNUMAノードjとの間の転送レイテンシが測定される。レイテンシテーブル作成装置2は、NUMAノードiのメモリに測定用変数flagを割り当てる。そして、レイテンシテーブル作成装置2は、flagをNUMAノード間で更新する処理時間をタイマーで測定し、転送レイテンシを求める。

0035

図2に示すように、NUMAノードiに所属するスレッドをxとし、NUMAノードjに所属するスレッドをyとする。スレッドxは、flag=1となるまで待機し、flag=1となるとflag=0と書き込み、スレッドyは、flag=0となるまで待機し、flag=0となるとflag=1と書き込む。

0036

flagの初期値を0として、スレッドyがflagを読むと、flagがNUMAノードiからNUMAノードjへ転送され、flag=0であるので、スレッドyは、flagに1を書き込む(1)。一方、スレッドxはflag=1となるまで待機する(2)。スレッドxがflagを読むと、flagがNUMAノードjからNUMAノードiへ転送され、flag=1であるので、スレッドxは、flagに0を書き込む(3)。一方、スレッドyはflag=0となるまで待機する(4)。スレッドyがflagを読むと、flagがNUMAノードiからNUMAノードjへ転送される。

0037

レイテンシテーブル作成装置2は、このflag更新の処理をタイマーで測定し、処理時間をNUMAノードiとNUMAノードjの転送レイテンシとする。レイテンシテーブル作成装置2は、このような測定を全てのNUMAノードの組合せに対して行い、レイテンシテーブルを作成する。また、レイテンシテーブル作成装置2は、転送レイテンシが正整数となるように正規化を行う。なお、i=jの場合、すなわち、同一NUMAノード間の転送レイテンシは0である。

0038

コンパイル装置3は、ソースプログラムをコンパイルし、実行プログラムを生成する。実行プログラムは、例えばファイルに出力され、実行装置4によりファイルから読み出されて実行される。ユーザは、タスク内で使用されるデータの各NUMAノードへの分散をソースプログラムの中で指定する。

0039

タスク内で使用されるデータの各NUMAノードへの分散は、ファーストタッチ(first touch)により行われる。ファーストタッチとは、変数(データ)に初めてアクセスしたスレッドが所属するNUMAノードのメモリに変数を割り当てる手法である。NUMAノードiのメモリに変数を割り当てる場合、ユーザは、NUMAノードiに所属するスレッドがその変数に最初にアクセスするようにソースプログラムを記述する。例えば、OpenMPparallel構文等でスレッドを複数起動し、各スレッドがそれぞれ初期値の書き込み等を行って変数にアクセスするプログラムが実行されると、変数はそのスレッドが所属するNUMAノードのメモリに割り当てられる。

0040

また、ユーザは、ソースプログラムにおいて、numa_val指示節にタスク内で使用するスカラ変数部分配列複数指定する。図3は、numa_val指示節のフォーマットを示す図である。図3に示すように、numa_val指示節ではlistが指定される。listは、リスト数がN個のスカラ変数(scalar)又は部分配列(array_section)から成るリスト(val_1,val_2,・・・,val_N)である。

0041

部分配列のインデックス開始インデックスlowerと配列の長さlengthの[lower:length]で指定される。部分配列a[lower:length]は、要素a[lower]、a「lower+1」、・・・、a[lower+length−1]の部部配列を表す。例えば、部分配列a[10:5]は、a[10]、a[11]、a[12]、a[13]、a[14]を要素とする部分配列である。

0042

部分配列が多次元の場合は、次元数をdimとすると部分配列はarray_section[lower_1:length_1][lower_2:length_2]・・・[lower_dim:length_dim]で指定される。

0043

コンパイル装置3は、登録I/F作成部31を有する。登録I/F作成部31は、タスク構文をコンパイルしてタスク登録I/Fを実行プログラムに挿入する。登録I/F作成部31は、タスク構文をコンパイルする際は、タスクの関数ポインタfunc、リスト数N、変数の先頭アドレスaddr、変数の型のサイズsize、変数の次元数dim、各次元のインデックス長lenを引数とするタスク登録I/Fを生成する。

0044

図4は、タスク登録I/Fにおいてランタイムルーチンへ渡される引数を示す図である。図4に示すように、タスク登録I/Fにおいてランタイムルーチンへ渡される引数には、タスクの関数ポインタfunc、リスト数Nが含まれる。また、タスク登録I/Fにおいてランタイムルーチンへ渡される引数には、各変数について、先頭アドレスaddr、型サイズsize、次元数dim、各次元のインデックス長len_1〜len_dimが含まれる。

0045

実行装置4は、レイテンシテーブルと実行プログラムを例えばファイルから読み込んで実行プログラムを実行する。実行装置4は、記憶部40と、登録I/F実行部41と、実行I/F実行部42とを有する。

0046

実行装置4は、後述する図12に一例を示すように、複数のNUMAノードがインターコネクトで接続されたハードウェア構成を有する。記憶部40は、いずれかのNUMAノードのメモリ内の領域である。登録I/F実行部41及び実行I/F実行部42は、記憶部40と同じNUMAノードのコアでタスク登録I/F及びタスク実行I/Fのランタイムルーチンがそれぞれ実行されることで実現される。

0047

記憶部40は、タスク登録I/F及びタスク実行I/Fのランタイムルーチンが使用するデータを記憶し、データサイズテーブル40a、コストテーブル40b及びタスクプール40cを記憶する。

0048

データサイズテーブル40aは、タスクで使用されるデータについて各NUMAノードが記憶するデータのサイズが登録されるテーブルである。図5は、データサイズテーブル40aの一例を示す図である。図5に示すように、データサイズテーブル40aは、ノードIDとデータサイズを対応付ける。ノードIDは、タスクが使用するデータを記憶するNUMAノードを識別する識別子である。データサイズは、対応するNUMAノードが記憶するデータのサイズである。例えば、NUMAノード「0」がタスクに関して記憶するデータのサイズは「s#0」である。

0049

コストテーブル40bは、タスクを実行するNUMAノードとデータの転送コストとを対応付けるテーブルである。図6は、コストテーブル40bの一例を示す図である。図6に示すように、コストテーブル40bは、ノードIDとコストを対応付ける。ノードIDは、タスクを実行するNUMAノードを識別する識別子である。コストは、対応するNUMAノードでタスクが実行された場合のデータの転送コストである。例えば、NUMAノード「0」でタスクが実行されるとデータの転送コストは「aa」である。

0050

タスクプール40cは、実行待ちのタスクに関する情報のリストである。タスクに関する情報には、関数ポインタとタスクを実行するスレッドのスレッドIDが含まれる。

0051

登録I/F実行部41は、タスク登録I/Fを実行する。図7は、タスク登録I/Fの動作を説明するための図である。図7に示すように、ユーザプログラムから呼び出されてタスク登録I/Fが実行されると、リスト数、リスト数個の(変数の先頭アドレス、変数の型サイズ、変数の次元数、各次元のインデックス長)を引数として登録用のランタイムルーチンが呼び出される(1)。そして、登録用のランタイムルーチンは、リスト数、リスト数個の(変数の先頭アドレス、変数の型サイズ、変数の次元数、各次元のインデックス長)を引数として転送コスト見積もりルーチンを呼び出す(2)。

0052

そして、転送コスト見積もりルーチンは、引数とレイテンシテーブルを用いてコストテーブル40bを作成し、NUMAノード毎の転送コストとして返却する(3)。そして、登録用のランタイムルーチンは、転送コストが低い方から順にNUMAノードを選択し、選択したNUMAノードに所属するスレッドIDを全てタスクプール40cへ関数ポインタとともに登録する(4)。図7では、優先実行スレッドID_1、優先実行スレッドID_2、・・・が登録されたスレッドIDである。

0053

登録I/F実行部41は、抽出部41aと、計算部41bと、決定部41cとを有する。抽出部41aは、タスクを実行する候補となる候補NUMAノードを抽出する。具体的には、抽出部41aは、タスク登録I/Fの引数に含まれる複数の変数がそれぞれ所属するNUMAノードを候補NUMAノードとして抽出する。

0054

計算部41bは、タスクで使用されるデータについて候補NUMAノードが有するデータのサイズを計算する。具体的には、計算部41bは、データサイズテーブル40aを作成する。

0055

決定部41cは、候補NUMAノードが有するデータのサイズとレイテンシテーブルを用いて候補NUMAノードの中からタスクを実行するNUMAノードを決定する。そして、決定部41cは、決定したNUMAノードに所属するスレッドのスレッドIDをタスクプール40cへ登録する。

0056

実行I/F実行部42は、タスク実行I/Fを実行する。タスク実行I/Fは、図22Bに示した動作を行ってタスクを実行する。

0057

次に、タスク登録I/Fの処理のフローについて説明する。図8は、タスク登録I/Fの処理のフローを示すフローチャートである。図8に示すように、登録用のランタイムルーチンは、関数ポインタ、numa_valで指定される引数をI/Fを通して受け取る(ステップS1)。

0058

そして、登録用のランタイムルーチンは、転送コスト見積もりルーチンを呼び出して、numa_valで指定されるデータのサイズをNUMAノード毎に計算するデータ量計算処理を実行する(ステップS2)。そして、登録用のランタイムルーチンは、転送コスト見積もりルーチンを呼び出して、転送コストを計算する転送コスト計算処理を実行する(ステップS3)。そして、登録用のランタイムルーチンは、タスクプール40cに関数ポインタに対応付けて転送コストの低い順にスレッドIDを登録する(ステップS4)。

0059

このように、登録用のランタイムルーチンが関数ポインタに対応付けて転送コストの低い順にスレッドIDをタスクプール40cに登録するので、情報処理装置1はタスク実行においてリモートアクセスによる性能低下を抑えることができる。

0060

図9は、データ量計算処理のフローを示すフローチャートである。図9に示すように、転送コスト見積もりルーチンは、numa_valのリストから変数を1つ選ぶ(ステップS11)。そして、転送コスト見積もりルーチンは、変数が所属するNUMAノードのノードIDをnode_xとする(ステップS12)。転送コスト見積もりルーチンは、変数のアドレスから変数が所属するNUMAノードを特定してノードIDを返却するNUMAノードID返却ルーチンを用いてnode_xを特定する。

0061

そして、転送コスト見積もりルーチンは、data_size_table[node_x]+=size*(len_1*len_2*・・・*len_dim)により、変数が所属するNUMAノードにおけるデータサイズを更新する(ステップS13)。ここで、data_size_tableは、データサイズテーブル40aであり、「*」は乗算を表す。

0062

そして、転送コスト見積もりルーチンは、全変数を処理したか否かを判定し(ステップS14)、未処理の変数がある場合にはステップS11に戻り、全変数を処理した場合には処理を終了する。

0063

図10は、転送コスト計算処理のフローを示すフローチャートである。図10に示すように、転送コスト見積もりルーチンは、i=0とし(ステップS21)、iがNUMAノード数より小さいか否かを判定する(ステップS22)。ここで、NUMAノード数は、タスクが使用するデータが割り当てられているNUMAノードの数である。

0064

そして、iがNUMAノード数より小さい場合には、転送コスト見積もりルーチンは、j=0とし(ステップS23)、jがNUMAノード数より小さいか否かを判定する(ステップS24)。

0065

そして、jがNUMAノード数より小さい場合には、転送コスト見積もりルーチンは、cost_table[i]+=latency[i,j]*data_size_table[j]により、i番目のNUMAノードの転送コストを更新する(ステップS25)。ここで、cost_tableはコストテーブル40bであり、latencyはレイテンシテーブルである。

0066

そして、転送コスト見積もりルーチンは、jに1を加え(ステップS26)、ステップS24に戻る。また、jがNUMAノード数より小さくない場合には、転送コスト見積もりルーチンは、iに1を加え(ステップS27)、ステップS22に戻る。また、iがNUMAノード数より小さくない場合には、転送コスト見積もりルーチンは、処理を終了する。

0067

次に、タスク実行I/Fの処理のフローについて説明する。図11は、タスク実行I/Fの処理のフローを示すフローチャートである。図11に示すように、実行用のランタイムルーチンは、タスクプール40cは空か否かを判定し(ステップS31)、タスクプール40cが空である場合には、処理を終了する。

0068

一方、タスクプール40cが空でない場合には、実行用のランタイムルーチンは、タスクプール40cの先頭要素にアクセスし(ステップS32)、優先スレッドIDの並びの優先度で、タスクを実行するスレッドを選択してタスクを実行する(ステップS33)。そして、実行用のランタイムルーチンは、タスクの実行後、タスクをタスクプール40cから削除し(ステップS34)、ステップS31に戻る。

0069

このように、実行用のランタイムルーチンが、優先スレッドIDの並びの優先度で、タスクを実行するスレッドを選択してタスクを実行するので、情報処理装置1はタスク実行においてリモートアクセスによる性能低下を抑えることができる。

0070

次に、図12図18を用いてタスクプール40cへの登録例について説明する。図12は、タスクプール40cへの登録の説明に用いられる実行装置4のハードウェア構成を示す図である。図12に示すように、実行装置4は、NUMA#0〜NUMA#3で表される4つのNUMAノード4aを有する。NUMA#0のノードIDは「0」であり、NUMA#1のノードIDは「1」であり、NUMA#2のノードIDは「2」であり、NUMA#3のノードIDは「3」である。4つのNUMAノード4aは、インターコネクト5により接続される。

0071

NUMAノード#0は、C#0及びC#1で表されるコア4bと、cache#0で表されるキャッシュメモリ4cと、MEM#0で表されるメモリ4dとを有する。NUMAノード#1は、C#2及びC#3で表されるコア4bと、cache#1で表されるキャッシュメモリ4cと、MEM#1で表されるメモリ4dとを有する。

0072

NUMAノード#2は、C#4及びC#5で表されるコア4bと、cache#2で表されるキャッシュメモリ4cと、MEM#2で表されるメモリ4dとを有する。NUMAノード#3は、C#6及びC#7で表されるコア4bと、cache#3で表されるキャッシュメモリ4cと、MEM#3で表されるメモリ4dとを有する。

0073

C#0のコアIDは「0」であり、C#1のコアIDは「1」であり、C#2のコアIDは「2」であり、C#3のコアIDは「3」である。C#4のコアIDは「4」であり、C#5のコアIDは「5」であり、C#6のコアIDは「6」であり、C#7のコアIDは「7」である。コアIDとスレッドIDは同じである。

0074

コア4bは、キャッシュメモリ4cからプログラムを読み出して実行する演算処理装置である。キャッシュメモリ4cは、メモリ4dに格納されたプログラム及びデータの一部を記憶する記憶モジュールである。メモリ4dは、プログラムやデータを記憶するRAM(Random Access Memory)である。

0075

コア4bにおいて実行されるプログラムは、例えば、コンパイル装置3が出力したファイル経由でHDD(Hard Disk Drive)にインストールされ、HDDからメモリ4dに読み込まれる。あるいは、コア4bにおいて実行されるプログラムは、DVDに記憶され、DVDから読み出されてメモリ4dに読み込まれる。

0076

図13は、図12に示した実行装置4のレイテンシテーブルを示す図である。例えば、NUMA#0とNUMA#1の間の転送レイテンシは「1」であり、NUMA#0とNUMA#2の間の転送レイテンシは「2」であり、NUMA#0とNUMA#3の間の転送レイテンシは「3」である。

0077

図14は、タスクプール40cへの登録の説明に用いられるプログラムを示す図である。図14において、aはサイズが12500の1次元配列であり、bはサイズが15000の1次元配列であり、cはサイズが5000の1次元配列であり、dはサイズが20000の1次元配列である。また、「#pragma omp parallel{switch ・・・}」は、NUMA#0にaを割り付け、NUMA#1にbを割り付け、NUMA#2にcを割り付け、NUMA#3にdを割り付ける。また、numa_val(a[0:12500],b[0:15000],c[0:5000],d[0:20000])はタスクがa、b、c、dを使用することを指定する。また、「#pragma omp task ¥」の「¥」は、行の継続を表す。

0078

図15は、図14に示したプログラムのタスク登録I/Fの引数を示す図である。コンパイル装置3は、「#pragma omp task numa_val(a[0:12500],b[0:15000],c[0:5000],d[0:20000])をコンパイルして図15に示す引数を持つタスク登録I/Fを生成する。

0079

登録用のランタイムルーチンは、図15に示した引数を全て受け取り、どのNUMAノードにどのくらいデータが割り付いているか計算する。例えば、登録用のランタイムルーチンは、変数aが割り付けられたNUMAノードを特定し、割り付けられたデータ量を計算する。

0080

具体的には、登録用のランタイムルーチンは、アドレスからノードIDを特定するシステムコール(get_mempolicy)に先頭アドレス&a[0]を引数としてコールし、aが所属するNUMAノードのノードIDを特定する。ここでは、ノードID「0」が特定される。

0081

データ量は、型サイズ*(次元1のインデックス長*・・・*次元dimのインデックス長)で計算できるので、sizeof(int)*12500=4*12500=50000バイトとなる。すなわち、変数aについてはNUMAノード「0」に50000バイト割り付けられているので、data_size_table[0]=50000となる。同様に、data_size_table[1]=60000、data_size_table[2]=20000、data_size_table[3]=80000となる。図16は、図15に示した変数について作成されたデータサイズテーブル40aを示す図である。

0082

登録用のランタイムルーチンは、図13に示したレイテンシテーブルと図16に示したデータサイズテーブル40aからコストテーブル40bを計算する。例えば、NUMA#0のコストは以下のように計算される。cost_table[0]=latency[0,0]*data_size_table[0]+・・・+latency[0,3]*data_size_table[3]=0+1*60000+2*20000+3*80000=340000。同様に、cost_table[1]=270000、cost_table[2]=360000、cost_table[3]=290000が計算される。図17は、図13に示したレイテンシテーブルと図16に示したデータサイズテーブル40aから計算されたコストテーブル40bを示す。

0083

図17に基づいて、登録用のランタイムルーチンは、コストが小さい順にNUMA#1、NUMA#3、NUMA#0、NUMA#2の優先度でタスクを実行すると決定する。そして、登録用のランタイムルーチンは、ノードIDを引数としてそのNUMAノードに含まれるスレッドIDを全て返すシステムコールを用いて、NUMA#1に含まれるスレッドID「2,3」を特定する。同様に、登録用のランタイムルーチンは、NUMA#3に含まれるスレッドID「6,7」、NUMA#0に含まれるスレッドID「0,1」、NUMA#2に含まれるスレッドID「4,5」を特定する。

0084

そして、登録用のランタイムルーチンは、特定したスレッドIDを優先度の順に関数ポインタとともにタスクプール40cに登録する。図18は、登録後のタスクプール40cを示す図である。

0085

上述してきたように、実施例では、抽出部41aが、タスクを実行する候補となる候補NUMAノードを抽出し、計算部41bが、タスクで使用されるデータについて候補NUMAノードが有するデータのサイズを計算する。そして、決定部41cが、候補NUMAノードが有するデータのサイズとレイテンシテーブルを用いて候補NUMAノードの中からタスクを実行するNUMAノードを決定する。そして、決定部41cは、決定したNUMAノードに所属するコアに対応するスレッドのスレッドIDをタスクプール40cへ登録する。したがって、登録用のランタイムルーチンは、タスクの実行においてリモートアクセスによる性能低下を抑えることができる。

0086

また、実施例では、抽出部41a、計算部41b及び決定部41cを含む登録I/F実行部41は登録用のランタイムルーチンを呼び出してタスク登録I/Fを実行し、登録用のランタイムルーチンはタスクが使用する変数のアドレスを引数として受け取る。したがって、抽出部41aは、変数のアドレスから変数が割り当てられたNUMAノードを候補NUMAノードとして抽出することができる。

0087

また、実施例では、登録用のランタイムルーチンは、変数の先頭アドレス、変数の型のサイズ、変数の次元数、各次元のサイズを引数として受け取るので、計算部41bは、候補NUMAノードが有するデータのサイズを計算することができる。

0088

また、実施例では、抽出部41aは、タスク登録I/Fの引数に含まれる複数の変数がそれぞれ所属するNUMAノードを候補NUMAノードとして抽出するので、正確に候補NUMAノードを抽出することができる。

実施例

0089

また、実施例では、タスク登録I/Fの引数に含まれる複数の変数はnuma_val指示節により指定されるので、ユーザは、タスクの使用する複数の変数をnuma_val指示節に記述することによりリモートアクセスによる性能低下を抑えることができる。

0090

1情報処理装置
2レイテンシテーブル作成装置
3コンパイル装置
4実行装置
4aNUMAノード
4bコア
4cキャッシュメモリ
4dメモリ
5インターコネクト
31登録I/F作成部
40 記憶部
40a データサイズテーブル
40bコストテーブル
40cタスクプール
41 登録I/F実行部
41a 抽出部
41b 計算部
41c 決定部
42 実行I/F実行部

ページトップへ

この技術を出願した法人

この技術を発明した人物

ページトップへ

関連する挑戦したい社会課題

関連する公募課題

ページトップへ

技術視点だけで見ていませんか?

この技術の活用可能性がある分野

分野別動向を把握したい方- 事業化視点で見る -

ページトップへ

おススメ サービス

おススメ astavisionコンテンツ

新着 最近 公開された関連が強い技術

この 技術と関連性が強い技術

関連性が強い 技術一覧

この 技術と関連性が強い人物

関連性が強い人物一覧

この 技術と関連する社会課題

関連する挑戦したい社会課題一覧

この 技術と関連する公募課題

関連する公募課題一覧

astavision 新着記事

サイト情報について

本サービスは、国が公開している情報(公開特許公報、特許整理標準化データ等)を元に構成されています。出典元のデータには一部間違いやノイズがあり、情報の正確さについては保証致しかねます。また一時的に、各データの収録範囲や更新周期によって、一部の情報が正しく表示されないことがございます。当サイトの情報を元にした諸問題、不利益等について当方は何ら責任を負いかねることを予めご承知おきのほど宜しくお願い申し上げます。

主たる情報の出典

特許情報…特許整理標準化データ(XML編)、公開特許公報、特許公報、審決公報、Patent Map Guidance System データ