JP2018124892A - 情報処理装置、方法、及びプログラム - Google Patents

情報処理装置、方法、及びプログラム Download PDF

Info

Publication number
JP2018124892A
JP2018124892A JP2017018270A JP2017018270A JP2018124892A JP 2018124892 A JP2018124892 A JP 2018124892A JP 2017018270 A JP2017018270 A JP 2017018270A JP 2017018270 A JP2017018270 A JP 2017018270A JP 2018124892 A JP2018124892 A JP 2018124892A
Authority
JP
Japan
Prior art keywords
information
program
cache
access
thread
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.)
Pending
Application number
JP2017018270A
Other languages
English (en)
Inventor
正樹 新井
Masaki Arai
正樹 新井
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2017018270A priority Critical patent/JP2018124892A/ja
Publication of JP2018124892A publication Critical patent/JP2018124892A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

【課題】マルチスレッドプログラムにおいて、並列処理の実行方法毎に、キャッシュメモリへのアクセスに関するプロファイル情報を高速で取得する技術を提供する。【解決手段】情報処理装置10は、第1変換部11と、計測部12と、第2変換部13と、生成部14と、取得部15とを含む。第1変換部は、対象プログラムのプログラム情報を、イベントカウント情報生成プログラムに変換する。計測部は、イベントカウント情報生成プログラムを実行し、イベント(キャッシュメモリへのアクセス)カウント情報を生成する。第2変換部は、対象プログラムのプログラム情報を、イベント行列情報生成プログラムに変換する。生成部14は、複数の異なる並列実行方法毎に、イベント行列情報生成プログラムを実行し、イベント行列情報を生成する。取得部は、イベント行列情報の各要素が示すキャッシュメモリへのアクセスの成否に関連するプロファイル情報を生成する。【選択図】図1

Description

開示の技術は、情報処理装置、情報処理方法、及び情報処理プログラムに関する。
従来、プログラム実行時のキャッシュメモリへのアクセスに関するプロファイル情報を取得する技術が存在する。
例えば、判定対象データに対応するキャッシュセットが、予め選択されたキャッシュセットであるか否かを判定し、選択されたキャッシュセットに対応するメモリ領域のアドレス情報を記憶するシステムが提案されている。このシステムは、キャッシュセットが予め選択されたキャッシュセットであると判定された場合、キャッシュメモリへのヒット又はミスの何れが生じたかを判断する。そして、ミスが生じたと判断された場合に、ミスの回数を示すヒット変数を更新しかつキャッシュメモリのアドレス情報を記憶し、ヒットが生じたと判断された場合に、ヒットの回数を示すヒット変数を更新する。
また、現在のプロセッサは複数のコアを持ち、複数のコアが共有して使用するキャッシュメモリが存在する。例えば、High Performance Computing(HPC)アプリケーションプログラムなどのように、複数のコアを使用して並列処理を実行するマルチスレッドプログラムでは、キャッシュメモリを有効利用することがプログラムを高速に実行するために必要である。
また、特に、HPCアプリケーションプログラムのようなマルチスレッドプログラムは、一般に一つのループを並列化することが多い。各ループのイタレーションを並列に実行する方法は、使用するスレッド数、ループのイタレーションをグループ化する場合のサイズであるチャンクサイズ、及びスレッドをスケジュールする方法の種類(例えば、static、dynamicなど)の3つのパラメータで決まる。すなわち、パラメータとして、より良いスレッド数、チャンクサイズ、及びスケジュール方法の種類を探すことが性能向上に重要となる。これらのパラメータを変更することで、マルチスレッドプログラムを実行した場合に、マルチスレッドが共有するキャッシュメモリ上で発生するキャッシュミスの回数は変化する。キャッシュミスは、HPCアプリケーション分野のプログラムでは大きな性能低下の要因であるため、キャッシュミスを低減するようにパラメータの値を求めることは重要なチューニング方針である。
特開2009−139506号公報
しかし、大規模HPCアプリケーションプログラムの実行時間は一般に長時間であるため、キャッシュメモリの利用状況のプロファイル情報を取得するためには長時間実機を利用する必要がある。
また、現在利用されているキャッシュの利用状況の調査方法は、CPUに内蔵のレジスタを利用するもので、キャッシュミスの回数のカウントなどの単純なデータを取得することは可能である。しかし、CPUの内蔵レジスタを利用する手法では、上述したようなループの並列実行方法のパラメータを考慮したプロファイル情報などのように、マルチスレッドプログラムにおけるキャッシュメモリの利用状況のプロファイル情報は取得することはできない。また、CPUのシミュレータや専用のツールを使って詳細なプロファイル情報を取得する手法を使う場合、普通にプログラムを実行するより、はるかに長い実行時間を要するという問題がある。
さらに、大規模HPCアプリケーションプログラムの開発では、プログラムを開発する計算機と実際に動作させる計算機とが異なるという状況が有り得る。この場合、開発に利用する計算機と実際に動作させる計算機とでキャッシュメモリの構成が異なる可能性がある。その場合、開発に利用する計算機上で、CPUに内蔵のレジスタを利用してプロファイル情報を取得する方法では、実際の計算機におけるキャッシュの正確な利用状況を調査することはできない。
開示の技術は、一つの側面として、マルチスレッドプログラムにおいて、並列処理の実行方法毎に、キャッシュメモリへのアクセスに関するプロファイル情報を高速で取得することを目的とする。
一つの態様として、生成部が、複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、並列処理についての複数の異なる実行方法毎に生成する。そして、取得部が、前記実行方法の各々について、前記生成部で生成された行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を生成する。
一つの側面として、マルチスレッドプログラムにおいて、並列処理の実行方法毎に、キャッシュメモリへのアクセスに関するプロファイル情報を高速で取得することができる。
本実施形態に係る情報処理装置の機能ブロック図である。 本実施形態に係る情報処理装置として機能するコンピュータの概略構成を示すブロック図である。 マルチスレッドにおける共有キャッシュメモリを説明するための図である。 本実施形態における情報処理の一例を示すフローチャートである。 プログラム情報の一例を示す図である。 イベントカウント情報生成プログラムの一例を示す図である。 プログラムデータ情報の一例を示す図である。 配列データ情報の一例を示す図である。 変数データ情報の一例を示す図である。 イベントカウント情報の一例を示す図である。 イベント行列情報生成プログラムの一例を示す図である。 並列実行方法試行情報の一例を示す図である。 並列実行方法情報の一例を示す図である。 イベントカウント情報の他の例を示す図である。 staticによるスレッドへのループの割り当てを説明するための図である。 dynamicによるスレッドへのループの割り当てを説明するための図である。 dynamicによるスレッドへのループの割り当てを説明するための図である。 guidedによるスレッドへのループの割り当てを説明するための図である。 guidedによるスレッドへのループの割り当てを説明するための図である。 キャッシュ構成情報の一例を示す図である。 イベント行列情報の一例を示す図である。 キャッシュプロファイル情報生成処理の一例を示すフローチャートである。 キャッシュプロファイル情報生成処理をプログラムとして記述した一例を示す図である。 キャッシュプロファイル情報生成処理をプログラムとして記述した他の例を示す図である。 第1変換処理の一例を示すフローチャートである。 プログラム情報を構成要素に分解した一例を示す図である。 第2変換処理の一例を示すフローチャートである。
以下、図面を参照して開示の技術に係る実施形態の一例を詳細に説明する。
図1に示すように、本実施形態に係る情報処理装置10には、プロファイルの対象である対象プログラムに関する入力情報が入力される。入力情報には、対象プログラムを示すプログラム情報(ソースファイル)、プログラムデータ情報、配列データ情報、変数データ情報、並列実行方法試行情報、及びキャッシュ構成情報が含まれる。なお、本実施形態における対象プログラムは、複数のスレッドが並列に実行されるマルチスレッドプログラムである。特に、回転数NI回のループ本体におけるループ変数iのループ(以下、「ループi」ともいう)の各々が複数のスレッドのいずれかに割り当てられて、ループ本体が並列に実行されるプログラムを対象プログラムとする。以下、この場合におけるループ本体を「並列化ループ」ともいう。
また、情報処理装置10は、対象プログラムを実行した場合のキャッシュメモリへのアクセスをシミュレーションし、キャッシュメモリへのアクセスに関するプロファイル情報を取得して出力する。プロファイル情報には、キャッシュミスの回数を示すキャッシュプロファイル情報と、キャッシュミスを最小化する並列実行方法の情報とが含まれる。なお、キャッシュミスとは、プログラムがアクセスするメモリ(主記憶装置)のメモリ領域に記憶されているデータがキャッシュメモリに存在しない場合である。また、並列実行方法とは、詳細は後述するが、並列化ループを実行するスレッド数、各スレッドに割り当てるループのチャンクサイズ、及びスレッドのスケジュール方法の種類の3つのパラメータの値で決まる実行方法である。
情報処理装置10へ入出力される各情報の詳細については後述する。
情報処理装置10は、図1に示すように、機能的には、第1変換部11と、計測部12と、第2変換部13と、生成部14と、取得部15とを含む。なお、第1変換部11及び計測部12は、開示の技術の計測部の一例であり、第2変換部13及び生成部14は、開示の技術の生成部の一例であり、取得部15は、開示の技術の取得部の一例である。
第1変換部11は、入力情報に含まれる対象プログラムのプログラム情報を、イベントカウント情報生成プログラムのソースファイルに変換する。イベントカウント情報生成プログラムは、並列化ループの実行時に発生するイベント数を、ループi毎にカウントしたイベントカウント情報を生成するためのプログラムである。なお、本実施形態において「イベント」とは、プログラムからキャッシュメモリへのアクセスを意味する。
計測部12は、入力情報に含まれるプログラムデータ情報、配列データ情報、及び変数データ情報を用いて、第1変換部11により変換されたイベントカウント情報生成プログラムを実行することにより、イベントカウント情報(詳細は後述)を生成する。
第2変換部13は、入力情報に含まれる対象プログラムのプログラム情報を、イベント行列情報生成プログラムのソースファイルに変換する。イベント行列情報生成プログラムは、対象プログラムを実行した際に各スレッドで発生するイベントを、スレッドの識別情報とイベントの発生タイミングとに対応させた行列形式で表現したイベント行列情報を生成するためのプログラムである。なお、本実施形態では、スレッドの識別情報としてスレッド番号を用い、イベントの発生タイミングとしてクロック番号を用い、スレッド番号を列、クロック番号を行とする行列を生成する場合について説明する。
生成部14は、入力情報に含まれる並列実行方法試行情報から作成される並列実行方法毎に、配列データ情報、変数データ情報、及びイベントカウント情報を用いて、第2変換部13により変換されたイベント行列情報生成プログラムを実行する。生成部14は、イベント行列情報生成プログラムの実行により、並列実行方法毎に、イベント行列情報(詳細は後述)を生成する。
取得部15は、生成部14により生成されたイベント行列情報、及び入力情報に含まれるキャッシュ構成情報を用いて、プロファイル情報を生成し、出力する。
情報処理装置10は、例えば図2に示すコンピュータ20で実現することができる。コンピュータ20は、Central Processing Unit(CPU)21と、一時記憶領域としてのメモリ22と、不揮発性の記憶部23とを備える。また、コンピュータ20は、表示部及び入力部を含む入出力装置24と、記憶媒体29に対するデータの読み込み及び書き込みを制御するRead/Write(R/W)部25とを備える。また、コンピュータ20は、インターネット等のネットワークに接続される通信インターフェース(I/F)26を備える。CPU21、メモリ22、記憶部23、入出力装置24、R/W部25、及び通信I/F26は、バス27を介して互いに接続される。なお、CPU21はハードウェアである。
ここで、情報処理装置10によるプロファイルの対象となる計算機(対象プログラムが実行される実機)は、図3に示すようなCPU51を備える。CPU51は、複数のコア511A、511B、511C・・・と、各コア511A、511B、511C・・・により実行される複数のスレッド40A、40B、40C・・・で共有して使用されるキャッシュメモリ512とを備える。キャッシュメモリ512は、所定サイズ毎に複数のブロックに分割されている。この各ブロックをキャッシュセット513といい、各キャッシュセット513には、各キャッシュセット513の識別情報であるキャッシュセット番号が付されている。なお、情報処理装置10では、キャッシュをシミュレーションしてプロファイル情報を取得するため、情報処理装置10のCPU21は、図3に示すCPU51と同様の構成とする必要はない。
記憶部23は、Hard Disk Drive(HDD)、Solid State Drive(SSD)、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部23には、コンピュータ20を情報処理装置10として機能させるための情報処理プログラム30が記憶される。情報処理プログラム30は、第1変換プロセス31と、計測プロセス32と、第2変換プロセス33と、生成プロセス34と、取得プロセス35とを有する。
CPU21は、情報処理プログラム30を記憶部23から読み出してメモリ22に展開し、情報処理プログラム30が有するプロセスを順次実行する。CPU21は、第1変換プロセス31を実行することで、図1に示す第1変換部11として動作する。また、CPU21は、計測プロセス32を実行することで、図1に示す計測部12として動作する。また、CPU21は、第2変換プロセス33を実行することで、図1に示す第2変換部13として動作する。また、CPU21は、生成プロセス34を実行することで、図1に示す生成部14として動作する。また、CPU21は、取得プロセス35を実行することで、図1に示す取得部15として動作する。これにより、情報処理プログラム30を実行したコンピュータ20が、情報処理装置10として機能する。
なお、情報処理プログラム30により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit(ASIC)等で実現することも可能である。
次に、本実施形態に係る情報処理装置10の作用について説明する。対象プログラムの入力情報が情報処理装置10に入力され、プロファイルの開始が指示されると、情報処理装置10が、図4に示す情報処理を実行する。
ここで、例えば、High Performance Computing(HPC)アプリケーションプログラムでは、プログラムのホットスポットが限られる傾向がある。したがって、プログラムの特徴を捉えるためにプロファイル情報を取得する場合でも、いくつかのループ本体のみを調査すればよい場合が多い。そこで、本実施形態では、対象プログラム全体のうち、並列化ループを含む一部分に関する入力情報を情報処理装置10に入力する場合について説明する。図5に、情報処理装置10に入力される対象プログラムのプログラム情報の一例を示す。また、ここでは、図5に示すプログラム情報のトップレベルのループ本体(ループ変数iのループ本体)を並列化ループとして実行する場合を考える。
ステップS10で、詳細を後述する第1変換処理が実行されて、対象プログラムのプログラム情報が、例えば、図6に示すようなイベントカウント情報生成プログラムのソースファイルに変換される。
次に、ステップS30で、計測部12が、例えば、図7に示すプログラムデータ情報、図8に示す配列データ情報、及び図9に示す変数データ情報を用いて、第1変換部11により変換されたイベントカウント情報生成プログラムを実行する。図7に示すプログラムデータ情報には、対象プログラムで参照する各配列の開始アドレス、配列の要素当たりのバイト数、及び次元情報が含まれる。図8に示す配列データ情報は、図5に示す対象プログラムで参照される配列NJの各要素の値(データ)をインデックスと対応付けた情報である。図9に示す変数データ情報は、対象プログラムにおける並列化ループの回転数を示す変数NIの値(データ)を示す情報である。
計測部12は、図6に示すイベントカウント情報プログラムを実行することで、並列化ループのループi毎に、イベントの発生回数、すなわち、プログラムからキャッシュメモリ512にアクセスする回数をカウントする。そして、計測部12は、例えば、図10に示すように、ループ変数iに、ループiでのイベントの発生回数(イベント数)を対応付けたイベントカウント情報を生成する。
次に、ステップS40で、詳細を後述する第2変換処理が実行されて、対象プログラムのプログラム情報が、例えば、図11に示すようなイベント行列情報生成プログラムのソースファイルに変換される。
次に、ステップS61で、生成部14が、キャッシュミス回数の最小値を表す作業用変数MをM=∞に初期化し、キャッシュミス回数を最小化する並列実行方法情報を表す作業用変数RESULTを空に初期化する。
次に、ステップS62で、生成部14が、入力情報に含まれる並列実行方法試行情報から作成される並列実行方法情報のうち、以下のステップS63〜S92の処理が未試行の並列実行方法情報が存在するか否かを判定する。
図12に、入力情報に含まれる並列実行方法試行情報の一例を示す。図12に示す並列実行方法試行情報では、パラメータ変数であるスレッド数T、チャンクサイズC、及びスケジュール方法の種類Kに対して試行する範囲を定義している。図12の例では、スレッド数Tについては4つの値を、チャンクサイズCについては3つの値を、スケジュール方法の種類Kついては3種類を定義している。並列実行方法試行情報は、これら3つのパラメータの全ての組み合わせについて作成される。したがって、図12に示す並列実行方法試行情報から作成される並列実行方法情報の総数は36個となる。
なお、スケジュール方法の種類の定義としては、参考文献「OpenMP Architecture Review Board, OpenMP Application Program Interface(version 4.0), OpenMP Architecture Review Board,2013.」を利用することができる。
未試行の並列実行方法情報が存在する場合には、処理はステップS63へ移行し、生成部14が、未試行の並列実行方法情報Xを一つ作成する。例えば、生成部14は、図13に示すような並列実行方法情報X=(T;C;K)=(4;1;dynamic)を作成する。
次に、ステップS64で、生成部14が、プログラムデータ情報、配列データ情報、変数データ情報、キャッシュ構成情報、及び並列実行方法情報Xを入力データとして、上記ステップS40で生成したイベント行列情報生成プログラムを実行する。
ここで、図11に示すイベント行列情報生成プログラム内のライブラリ関数initialize_WORK(size)は、引数sizeに並列化ループの回転数の値を受け取り、イベント行列情報のデータ領域を初期化する機能を実現する。引数sizeには、変数データ情報が示す変数NIの値が渡される。イベント行列情報のデータ構造は、本ステップで本関数を実行するときに参照する、並列実行方法情報Xの中のスレッド数Tの値によって、その列のサイズが決まる。また、イベント行列情報の行のサイズは、本ステップでイベント行列情報生成プログラムを実行する過程で、必要なだけ拡張される。
また、図11に示すイベント行列情報生成プログラム内の「get_thread_number(i)」は、ループiを実行するスレッドのスレッド番号を求める機能を実現する。ここでは、スレッド番号を求める処理は、上述の参考文献のスケジュール方法の種類の定義に準拠するものとする。スレッド番号を求める処理には、一般に、ループ変数の値(ここではi)、並列化ループの回転数の値(ここではNI)、スレッド数T、チャンクサイズC、スケジュール方法の種類K、ループiを実行する直前の状態等の情報が必要となる。なお、ループiを実行する直前の状態は、上記ステップS30で求めたイベントカウント情報と、本ステップでイベント行列情報生成プログラムを実行する過程で、更新するイベント行列情報とから判定することができる。
より具体的に、上記ステップS30において、図14に示すイベントカウント情報が生成されている場合における「get_thread_number(i)」の実現例について説明する。図14に示すイベントカウント情報から、ループ変数iの値の範囲は0以上10以下で、その総数Nは11個であることがわかる。以下では、スレッドの数T=4と仮定して説明する。
まず、スケジュール方法の種類K=static、チャンクサイズC=2の場合、すなわち、(T;C;K)=(4;2;static)の場合の「get_thread_number(i)」の実現例を以下に示す。
staticは、ループi(ここでは、i=0,1,・・・,10)をC個ずつ均等に各スレッドに順番に割り当てるスケジュール方法である。したがって、ループ本体のスレッドへの割り当て結果は図15に示すようになる。なお、図15に示す割り当て結果では、各スレッドに割り当てられたループiを、そのスレッドのスレッド番号にループ変数iを対応付けて表している。以下、図16〜図19も同様である。この割り当て結果に基づいて、ループ変数iに対応するスレッド番号を特定することで、「get_thread_number(i)」を実現することができる。例えば、図15に示す割り当て結果の場合、i=10ならば、「get_thread_number(i)」により、スレッド番号T1が取得される。
次に、K=dynamic、チャンクサイズC=2の場合、すなわち、(T;C;K)=(4;2;dynamic)の場合の「get_thread_number(i)」の実現例を以下に示す。dynamicは、各スレッドのイベント数に応じて、ループiの各々を各スレッドに動的に割り当てるスケジュール方法である。したがって、まず、1回目の割り当てで、図16に示すように、ループiをC個ずつ均等に各スレッドに順番に割り当てる。このとき、各スレッドのイベント数は、図14に示すイベントカウント情報に基づいて、それぞれ「イベント総数」の行に示した数となる。2回目の割り当てでは、図17に示すように、イベント総数の少ないスレッドから順にループiをC個ずつ割り当てる。例えば、図17に示す割り当て結果が得られた場合、i=10ならば、「get_thread_number(i)」により、スレッド番号T2が取得される。
最後に、K=guided、チャンクサイズC=1の場合、すなわち、(T;C;K)=(4;1;guided)の場合の「get_thread_number(i)」の実現例を以下に示す。なお、K=guidedの場合、Cの値はチャンクサイズの最小値を意味する。guidedは、チャンク数を変更しながら、各スレッドのイベント数に応じて、ループiを各スレッドに動的に割り当てるスケジュール方法である。
まず、1回目の割り当てのチャンクサイズCは、ループの総数NをTで割った値である
=N/T=11/4=2 (小数点以下切捨て)
の値になる。したがって、図18に示すように、まずループiを2個ずつ各スレッドに割り当てる。この場合、ループ8、ループ9、及びループ10が残る。K=guidedの場合、チャンクサイズは指数関数的に減少するので、ここでは一例として2回目の割り当てのチャンクサイズCはC=C/2=1であると仮定する。この結果として、図19に示すように、残りの3個のループi(ループ8、ループ9、及びループ10)を一つずつ、「イベント総数」が少ないスレッドから順に動的に割り当てる。そして、例えば、図19に示す割り当て結果が得られた場合、i=10ならば、「get_thread_number(i)」により、スレッド番号T1が取得される。
このように、上記ステップS30で作成したイベントカウント情報を用いて、各スケジュール方法の種類に応じて、各スレッドへのループiの割り当てをシミュレーションして、ループiが割り当てられるスレッドのスレッド番号を求めることができる。
上述のように、図14に示すイベントカウント情報が得られている場合において、同じスレッド数T=4であっても、スケジュール方法の種類によって、各スレッドが処理するイベント総数が変わることが、図15、図17、及び図19から確認できる。また、イベント総数だけでなく、各スレッドで実行されるループiも、スケジュール方法の種類によって異なる。これは、並列実行方法が異なる場合には、各スレッドからキャッシュメモリ512へのアクセスの状況も異なることを表している。
なお、プログラムの実行時間は、並列実行するスレッドの中で最も遅いスレッド(すなわち最もイベント総数が多いスレッド)によって決まる。イベント総数の最大値は、図15では360、図17では240、図19では200である。すなわち、K=guided、K=dynamic、K=staticの順に効率良くイベントを各スレッドに分配できていることが確認できる。
また、図11に示すイベント行列情報生成プログラム内のライブラリ関数「WORK(address,thread)」は、プログラムがアクセス要求した配列要素のメモリアドレス、及びアクセス要求したスレッドのスレッド番号を取得する機能を実現する。さらに、取得したアドレスaddress及びスレッド番号threadを、イベント行列情報の該当する要素の値として保存する機能を実現する。
具体的には、ライブラリ関数「WORK(address,thread)」により、プログラムがアクセス要求した配列要素が記憶されているメモリアドレスが特定される。例えば、NJ[i]のアドレスは、図7に示すプログラムデータ情報を参照して、配列NJの開始アドレス4000、配列要当たりのバイト数4、及び変数iから、4000+i×4と特定することができる。同様に、Z[i][j]のアドレスは、配列Zの開始アドレス1600、配列要当たりのバイト数8、変数i、j、及び次元情報6×6から、1600+(6×i+j)×8と特定することができる。そして、特定したアドレスを引数addressに渡す。
また、「get_thread_number(i)」により取得されたスレッド番号を引数threadに渡す。そして、イベント行列情報のスレッド番号threadの列をクロック番号0の行から検査し、使用していないクロック番号cを検出する。さらに、アドレスaddressをイベント行列情報のc行、thread列の要素の値として保存する。
上記のように、生成部14がイベント行列情報生成プログラムを実行することにより、図21に示すようなイベント行列情報が生成される。図21に示すイベント行列情報では、列は4つのスレッドT0、T1、T2、T3を示し、行はイベントが発生したクロックを示している。図21の行列の要素には、各スレッドが各クロックでアクセスするデータのアドレス値が入っている。アドレス値が「−1」の欄は、そのスレッドのそのクロックではキャッシュメモリ512へのアクセスが発生しないことを示す。
次に、ステップS70で、取得部15が、上記ステップS64で生成されたイベント行列情報、及び入力情報に含まれるキャッシュ構成情報を用いて、キャッシュプロファイル情報生成処理を実行する。これにより、キャッシュアクセスがシミュレーションされ、キャッシュプロファイル情報が生成される。ここで、図22を参照して、キャッシュプロファイル情報生成処理について詳述する。
ステップS71で、取得部15が、イベント行列情報の行番号(クロック番号)の最大値を取得し、変数rmaxに格納する。また、取得部15が、イベント行列情報の列番号(スレッド番号)の最大値を取得し、変数cmaxに格納する。例えば、図21に示すイベント行列情報の場合、rmax=19、cmax=3である。また、取得部15は、キャッシュミス回数をカウントするための作業用変数mを0にリセットする。
次に、ステップS71で、取得部15が、処理対象の行番号を示す作業用変数rに0を設定する。次に、ステップS71で、取得部15が、rがrmaxより大きいか否かを判定する。rがrmax以下の場合には、イベント行列情報において未処理の行が存在することを表している。この場合、処理はステップS74へ移行する。
ステップS74では、取得部15が、処理対象の列番号を示す作業用変数cに0を設定する。次に、ステップS75で、取得部15が、cがcmaxより大きいか否かを判定する。cがcmax以下の場合には、イベント行列情報のr行において未処理の列が存在することを表している。この場合、処理はステップS76へ移行する。
ステップS76では、取得部15が、イベント行列情報のr行c列の要素aを取り出す。次に、ステップS77で、取得部15が、上記ステップS76で取り出した要素aが−1か否かを判定する。a≠−1の場合には、処理はステップS78へ移行する。ステップS78では、取得部15が、アドレスaに対応するキャッシュメモリ512のキャッシュセット513へのアクセスをシミュレーションし、キャッシュミスか否かを判定する。取得部15は、キャッシュミスの場合には、mに1加算して、処理はステップS79へ移行する。
一方、a=−1の場合には、上記ステップS78の処理はスキップして、ステップS79へ移行する。ステップS79では、取得部15が、cを1インクリメントして、処理はステップS75に戻る。
ステップS75で、cがcmaxより大きいと判定された場合には、イベント行列情報のr行において全ての列について処理が終了したことを表しているため、処理はステップS80へ移行する。ステップS80では、取得部15が、rを1インクリメントして、処理はステップS73に戻る。
ステップS73で、rがrmaxより大きいと判定された場合には、イベント行列情報の全ての要素について処理が終了したことを表しているため、処理はステップS81へ移行する。ステップS81では、取得部15が、作業用変数mに格納されているキャッシュミスの回数を、キャッシュプロファイル情報として出力して、処理は図4に示す情報処理に戻る。
上記のキャッシュプロファイル情報生成処理により、イベント行列情報を利用して、並列に実行されている複数のスレッドが同時に共有キャッシュにアクセスする状態をシミュレーションすることができる。
図23に、図22に示すキャッシュプロファイル情報生成処理をプログラムとして記述した例を示す。図23では、イベント行列情報を2次元配列データMATRIXとして利用している。
また、上記ステップS78の処理は、図23に示すプログラムにおいて、ライブラリ関数ACCESS(address)で実現される。具体的には、引数addressにaを与え、アドレスaに対応するキャッシュメモリ512上のキャッシュセット番号を特定する。例えば、図20に示すような、キャッシュの連想数A、ブロックサイズB、及びセット数Sの情報を含むキャッシュ構成情報を用い、アドレスaのデータが記憶されたキャッシュセット513のキャッシュセット番号sは以下のように特定される。
s=(a/B(小数点以下切捨て))mod S
そして、特定されたキャッシュセット番号sが示すキャッシュセット513に、プログラムがアクセス要求したデータが記憶されているか否かを判定する。該当のデータがキャッシュメモリ512に記憶されていない場合には、キャッシュミスであると判定し、mに1加算する。なお、ライブラリ関数ACCESS(address)は、特開2014−232369号公報で開示されている技術を適用することができるため、ここでは、詳細な説明を省略する。
なお、図23に示すプログラムは、キャッシュセット513毎に、キャッシュプロファイル情報生成処理を逐次実行する場合のプログラムの一例である。ここで、キャッシュアクセスのプロファイル情報はキャッシュセット513毎に独立してシミュレーションすることが可能である。この性質を利用して、全てのキャッシュセット513を同時にシミュレーションし、各キャッシュセット513に関するキャッシュプロファイル情報生成処理を並列に実行することができる。その処理をプログラムとして記述した例を図24に示す。図24に示すプログラム内の「as=(address/B)%S」は、上述のキャッシュセット番号sを特定する式と同様である。そして、asが該当のキャッシュセットの番号(s)と一致する場合に、上述のライブラリ関数ACCESS(address)が実行される。
図4の情報処理に戻って、次のステップS91で、取得部15が、上記ステップS70で出力されたキャッシュプロファイル情報(キャッシュミスの回数)mが、作業用変数Mより小さいか否かを判定する。m<Mの場合には、処理はステップS92へ移行し、取得部15が、Mにmの値を保存し、かつ作業用変数RESULTに並列実行方法情報Xを保存し、処理はステップS62に戻る。一方、m≧Mの場合には、ステップS92の処理はスキップして、ステップS62に戻る。
ステップS62で、全ての並列実行方法情報について、キャッシュプロファイル情報を生成する処理が終了したと判定された場合には、処理はステップS93へ移行する。ステップS93では、取得部15が、Mに保存されているキャッシュプロファイル情報、及びRESULTに保存されている並列実行方法情報Xを、対象プログラムのプロファイル情報として出力し、情報処理は終了する。
ここで、図25を参照して、図4に示す情報処理のステップS10で実行される第1変換処理について説明する。
まず、ステップS11で、第1変換部11が、入力された対象プログラムのプログラム情報を構成要素に分解する。
次に、ステップS12で、第1変換部11が、イベントカウント情報を示す配列を初期化するコードを出力する。なお、コードを出力するとは、生成するプログラムのソースファイルに該当のコードを記述することを意味する。
次に、ステップS13で、第1変換部11が、プログラム情報を分解した構成要素のうち、以下のステップS14〜S23の処理が未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第1変換部11が、未処理の構成要素から、対象プログラムにおける出現順に1つの構成要素Sを選択し、処理はステップS14へ移行する。
ステップS14では、第1変換部11が、構成要素Sがループ変数iで処理を繰り返す並列化ループか否かを判定する。肯定判定の場合には、処理はステップS15へ移行し、否定判定の場合には、処理はステップS16へ移行する。
ステップS15では、第1変換部11が、構成要素Sを出力し、構成要素Sの直後にイベントをカウントする対象のループを特定するループ変数iを初期値に設定するコードを出力する。そして、処理はステップS13に戻る。
ステップS16では、第1変換部11が、構成要素Sが並列化ループ以外のループか否かを判定する。肯定判定の場合には、処理はステップS17へ移行し、第1変換部11が、構成要素Sを出力し、処理はステップS13に戻る。一方、否定判定の場合には、処理はステップS18へ移行する。
ステップS18では、第1変換部11が、構成要素Sが並列化ループの回転数に影響を与えない代入文か否かを判定する。肯定判定の場合には、処理はステップS19へ移行し、否定判定の場合には、処理はステップS20へ移行する。
ステップS19では、第1変換部11が、構成要素Sを削除する。そして、第1変換部11が、構成要素Sの代入文に出現する、配列の要素を参照する項の数cを計算し、構成要素Sの代わりに、イベントカウント情報を示す配列のループ変数iに対応する要素にcを加算するコードを出力する。そして、処理はステップS13に戻る。
ステップS20では、第1変換部11が、構成要素Sが並列化ループの回転数に影響を与える代入文か否かを判定する。肯定判定の場合には、処理はステップS21へ移行し、否定判定の場合には、処理はステップS22へ移行する。
ステップS21では、第1変換部11が、構成要素Sを出力する。そして、第1変換部11が、構成要素Sの代入文に出現する、配列の要素を参照する項の数cを計算し、構成要素Sの直後に、イベントカウント情報を示す配列のループ変数iに対応する要素にcを加算するコードを出力する。そして、処理はステップS13に戻る。
ステップS22では、第1変換部11が、構成要素Sがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップS23へ移行し、第1変換部11が、構成要素Sを出力し、処理はステップS13に戻る。否定判定の場合には、そのままステップS13に戻る。
ステップS13で、第1変換部11が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップS13〜S23の処理が終了したと判定した場合には、処理はステップS24へ移行する。ステップS24では、第1変換部11が、結果のイベントカウント情報を、プログラムの実行結果として出力するためのコードを出力して、第1変換処理は終了する。
第1変換処理の一例として、図5に示す対象プログラムのプログラム情報をイベントカウント情報生成プログラムに変換する場合について説明する。
まず、第1変換部11は、プログラム情報を、図26に示すように、各構成要素に分解する(ステップS11)。図26の例では、プログラム情報において各構成要素が出現する順に、各構成要素に番号Ej(j=1、2、・・・、6)を付与している。以下では、番号Ejの構成要素を「構成要素Ej」と表記する。
次に、第1変換部11は、イベントカウント情報を示す配列を初期化するコードとして、例えば、以下のコードを出力する(ステップS12)。
initialize(EVENTCOUNT,NI);
イベントカウント情報を示す配列EVENTCOUNTの要素数は、並列化ループの回転数に等しいため、変数NIを参照している。
次に、第1変換部11は、構成要素E1を処理対象として選択する。構成要素E1はループ変数iで繰り返す並列化ループである。したがって、第1変換部11は、構成要素E1を出力した後に、例えば以下に示すように、イベントカウント情報を示す配列EVENTCOUNTにおける変数iに初期値0を設定するコードを出力する(ステップS15)。
EVENTCOUNT[i]=0;
次に、第1変換部11は、構成要素E2を処理対象として選択する。構成要素E2はループの回転数に影響を与える代入文である。したがって、第1変換部11は、構成要素E2を出力した後に、例えば以下に示すように、並列化ループのループ変数iのイベントのカウントを1増やすコードを出力する(ステップS21)。
EVENTCOUNT[i]++;
ここで、増やす値が1であるのは、構成要素E2の代入文では、配列の要素を参照する項が右辺のNJ[i]の一つだけであるためである。
次に、第1変換部11は、構成要素E3を処理対象として選択する。構成要素E3は並列化ループ以外のループである。したがって、第1変換部11は、構成要素E3だけを出力する(ステップS17)。
次に、第1変換部11は、構成要素E4を処理対象として選択する。構成要素E4はループの回転数に影響を与えない代入文である。したがって、第1変換部11は、構成要素E4の代わりに、以下に示すように、構成要素E4の代入文が参照する配列の要素毎に、並列化ループのループ変数iのイベントのカウントを3増やすコードを出力する(ステップS19)。
EVENTCOUNT[i]+=3;
ここで、増やす値が3であるのは、構成要素E4の代入文が参照する配列の要素は、右辺のX[i][j]、Y[i][j]、及び左辺のZ[i][j]の3つであるためである。
次に、第1変換部11は、構成要素E5を処理対象として選択する。構成要素E5はループを閉じる括弧であるため、第1変換部11は、単に構成要素E5を出力する(ステップS23)。構成要素E6もループを閉じる括弧であるため、構成要素E5と同様に処理される。
以上のように、全ての構成要素の処理が終了すると、第1変換部11は、以下に示すように、結果のイベントカウント情報を、プログラムの実行結果として出力するためのコードを出力する(ステップS24)。
print_out(EVENTCOUNT);
これにより、図5に示すプログラム情報が、図6に示すようなイベントカウント情報生成プログラムに変換される。
次に、図27を参照して、図4に示す情報処理のステップS40で実行される第2変換処理について説明する。なお、第2変換処理において、上述の第1変換処理(図25)と同様の処理については、同一のステップ番号を付して詳細な説明を省略する。
まず、ステップS11で、第2変換部13が、入力された対象プログラムのプログラム情報を構成要素に分解する。なお、上述の第1変換処理(図25)のステップS11におけるプログラム情報の分解結果(例えば、図26)を取得してもよい。
次に、ステップS42で、第2変換部13が、イベント行列情報を生成する処理のための初期化コードを出力する。
次に、ステップS43で、第2変換部13が、未処理の構成要素が存在するか否かを判定する。未処理の構成要素が存在する場合には、第2変換部13が、未処理の構成要素から、対象プログラムにおける出現順に1つの構成要素Sを選択し、処理はステップS14へ移行する。
ステップS14では、第2変換部13が、構成要素Sがループ変数iで処理を繰り返す並列化ループか否かを判定する。肯定判定の場合には、処理はステップS45へ移行し、否定判定の場合には、処理はステップS16へ移行する。
ステップS45では、第2変換部13が、構成要素Sを出力し、構成要素Sの直後にループiを実行するスレッドのスレッド番号を取得するコードを出力する。そして、処理はステップS13に戻る。
ステップS16では、第2変換部13が、構成要素Sが並列化ループ以外のループか否かを判定する。肯定判定の場合には、処理はステップS17へ移行し、第2変換部13が、構成要素Sを出力し、処理はステップS13に戻る。一方、否定判定の場合には、処理はステップS18へ移行する。
ステップS18では、第2変換部13が、構成要素Sが並列化ループの回転数に影響を与えない代入文か否かを判定する。肯定判定の場合には、処理はステップS49へ移行し、否定判定の場合には、処理はステップS20へ移行する。
ステップS49では、第2変換部13が、構成要素Sを削除する。そして、第2変換部13が、構成要素Sの代入文に出現する、配列の要素を参照する各項tについて、ライブラリ関数WORKを実行するコードを出力する。そして、処理はステップS13に戻る。
ステップS20では、第2変換部13が、構成要素Sが並列化ループの回転数に影響を与える代入文か否かを判定する。肯定判定の場合には、処理はステップS51へ移行し、否定判定の場合には、処理はステップS22へ移行する。
ステップS51では、第2変換部13が、構成要素Sを出力する。そして、第2変換部13が、構成要素Sの代入文に出現する、配列の要素を参照する各項tについて、ライブラリ関数WORKを実行するコードを出力する。そして、処理はステップS13に戻る。
ステップS22では、第2変換部13が、構成要素Sがループを閉じる括弧か否かを判定する。肯定判定の場合には、処理はステップS23へ移行し、第2変換部13が、構成要素Sを出力し、処理はステップS13に戻る。否定判定の場合には、そのままステップS13に戻る。
ステップS13で、第2変換部13が、対象プログラムのプログラム情報を分解した構成要素の全てについて、ステップS13〜S23の処理が終了したと判定した場合には、処理はステップS54へ移行する。ステップS54では、第2変換部13が、結果のイベント行列情報を、プログラムの実行結果として出力するためのコードを出力して、第2変換処理は終了する。
第2変換処理の一例として、図5に示す対象プログラムのプログラム情報をイベント行列情報生成プログラムに変換する場合について説明する。
まず、第2変換部13は、第1変換処理と同様に、プログラム情報を、図26に示すように、各構成要素に分解する(ステップS11)。
次に、第2変換部13は、例えば、以下のように、イベント行列情報を生成する処理のための初期化コードを出力する(ステップS42)。
initialize_WORK(NI);
イベント行列情報を生成するためには並列化ループの回転数が必要であるため、上記の例では、変数NIを初期化処理への引数として渡している。
次に、第2変換部13は、構成要素E1を処理対象として選択する。構成要素E1はループ変数iで繰り返す並列化ループである。したがって、第2変換部13は、構成要素E1を出力した後に、例えば以下に示すように、ループ変数iでループ本体を実行するスレッドのスレッド番号を取得するコードを出力する(ステップS45)。
thread=get_thread_number(i);
次に、第2変換部13は、構成要素E2を処理対象として選択する。構成要素E2はループの回転数に影響を与える代入文である。したがって、第2変換部13は、構成要素E2を出力した後に、例えば以下に示すように、配列要素NJ[i]のアドレス情報をスレッド番号threadのスレッドで実行する処理として、イベント行列情報に保存するためのコードを出力する(ステップS51)。
WORK(address(NJ[i]),thread);
次に、第2変換部13は、構成要素E3を処理対象として選択する。構成要素E3は並列化ループ以外のループである。したがって、第2変換部13は、構成要素E3だけを出力する(ステップS17)。
次に、第2変換部13は、構成要素E4を処理対象として選択する。構成要素E4はループの回転数に影響を与えない代入文である。したがって、第2変換部13は、構成要素E4の代わりに、例えば以下に示すように、各配列要素のアドレス情報をスレッド番号threadのスレッドで実行する処理として、イベント行列情報に保存するためのコードを出力する(ステップS49)。
WORK(address(X[i][j]),thread);
WORK(address(Y[i][j]),thread);
WORK(address(Z[i][j]),thread);
次に、第2変換部13は、ループを閉じる括弧である構成要素E5及びE6の各々について、構成要素E5及びE6を出力する(ステップS23)。
以上のように、全ての構成要素の処理が終了すると、第2変換部13は、以下に示すように、結果のイベント行列情報を、プログラムの実行結果として出力するためのコードを出力する(ステップS54)。
print_out_EVENT_MATRIX();
これにより、図5に示すプログラム情報が、図11に示すようなイベント行列情報生成プログラムに変換される。
以上説明したように、本実施形態における情報処理装置によれば、マルチスレッドプログラムで並列化ループを実行する際の各スレッドで発生するイベント(キャッシュメモリへのアクセス)を、並列実行方法毎にイベント行列情報で表す。イベント行列情報は、スレッドとイベント発生タイミングとを対応させた行列であり、行列の要素は、その要素の列に対応するスレッドが、その要素の行に対応するタイミングで要求したアクセス先のメモリアドレスである。また、並列実行方法の各々について、イベント行列情報に沿って、メモリアドレスに対応するキャッシュメモリのキャッシュセットへのアクセスをシミュレーションして、キャッシュミス回数をカウントする。そして、キャッシュミス回数、及びキャッシュミス回数が最小となる並列実行方法をプロファイル情報として出力する。これにより、マルチスレッドプログラムにおいて、並列処理の実行方法毎に、キャッシュメモリへのアクセスに関するプロファイル情報を取得することができる。
また、対象プログラムが行う計算を省略して、メモリへのアクセスだけを考慮したシミュレーションを行うことにより、プロファイル情報を高速に取得することができる。
また、並列化ループのループ変数毎のイベント回数をカウントしておき、この情報を利用して、各並列実行方法において、各ループがいずれのスレッドで実行されるかを高速に決定することができる。これにより、イベント行列情報を効率よく生成することができる。このことも、プロファイル情報取得の高速化に寄与する。
例えば、HPCアプリケーションプログラムは一般に、複数の巨大な配列にアクセスするため、プログラムの総実行時間における、メモリアクセスに要する時間が占める割合が多く、かつ個々の命令の実行時間が長い浮動小数点演算を大量に含む。本実施形態では、浮動小数点演算もメモリアクセスもほとんど必要としないため、処理を高速化することができる。
また、キャッシュアクセスをシミュレーションするため、対象プログラムが稼動する実機を使用することなく、対象プログラムのキャッシュアクセスのプロファイル情報を取得することができる。
また、対象プログラムの開発環境と実際の稼働環境との相違により、開発時と実際の稼動時とでキャッシュ構成が異なる場合がある。CPUの内蔵レジスタを使用してプロファイル情報を取得する場合は、そのCPUのキャッシュ構成に基づくプロファイル情報しか取得することができない。本実施形態では、実際の稼動時のキャッシュ構成を示すキャッシュ構成情報を与えてシミュレーションすることで、適切なプロファイル情報を取得することができる。
また、キャッシュメモリへのアクセスのシミュレーションを、キャッシュセット毎に並列に行うことができる。このことも、プロファイル情報取得の高速化に寄与する。例えば、キャッシュセット数はCPUによって異なるが、一般に100個以上から数千個である。したがって、キャッシュセット毎に逐次プロファイル情報を取得する場合と比較して、100倍から数千倍以上の高速化を図ることができる。
なお、上記実施形態では、キャッシュミスが最小となる並列実行方法情報と、そのときのキャッシュミス回数とをプロファイル情報として出力する場合について説明したが、これに限定されない。全ての並列実行方法の各々に、その並列実行方法におけるキャッシュミス回数を対応付けてリスト化するなどして出力してもよい。また、キャッシュミス回数が少ない順に所定個の並列実行方法情報を出力するようにしてもよい。
また、上記では、情報処理プログラム30が記憶部23に予め記憶(インストール)されている態様を説明したが、これに限定されない。プログラムは、CD−ROM、DVD−ROM、USBメモリ等の記憶媒体に記憶された形態で提供することも可能である。
以上の実施形態に関し、更に以下の付記を開示する。
(付記1)
複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成する生成部と、
前記実行方法の各々について、前記生成部で生成された行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する取得部と、
を含む情報処理装置。
(付記2)
前記取得部は、前記キャッシュメモリへのアクセスの成否に関する情報として、キャッシュミスの回数を取得し、前記キャッシュミスの回数と前記実行方法とを対応付けて出力する付記1に記載の情報処理装置。
(付記3)
前記取得部は、前記キャッシュミスの回数が最も少ない場合に対応する前記実行方法を出力する付記2に記載の情報処理装置。
(付記4)
前記生成部は、前記アクセスを要求したスレッドと、該アクセスが要求されたタイミングとを対応させた行列であって、各スレッドからアクセスされる前記キャッシュメモリにアクセスするデータのアドレスを要素とする行列を生成する付記1〜付記3のいずれか1項記載の情報処理装置。
(付記5)
前記並列処理は、ループ変数毎の処理を複数のスレッドの各々に割り当ててループを実行する処理である付記1〜付記4のいずれか1項に記載の情報処理装置。
(付記6)
前記実行方法は、並列処理を実行するスレッド数、各スレッドに割り当てるループのチャンクサイズ、及びスレッドのスケジュール方法の種類に基づいて決定される付記5に記載の情報処理装置。
(付記7)
前記ループの実行時における前記キャッシュメモリへのアクセス回数をループ変数毎に計測する計測部を含み、
前記生成部は、前記計測部により計測されたループ変数毎のアクセス回数を利用して、前記スケジュール方法の種類に応じて、前記ループ変数毎の処理がいずれのスレッドに割り当てられるかを特定する
付記6に記載の情報処理装置。
(付記8)
主記憶装置へのアクセスの情報、及びキャッシュメモリの構成情報に基づいて、
前記取得部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応するデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を取得する
付記1〜付記7のいずれか1項に記載の情報処理装置。
(付記9)
前記取得部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否に関連する情報を取得する付記1〜付記8のいずれか1項に記載の情報処理装置。
(付記10)
前記取得部は、前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否に関連する情報を取得する処理を、前記キャッシュセット毎に並列に実行する付記9に記載の情報処理装置。
(付記11)
複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成し、
前記実行方法の各々について、生成した行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する
ことを含む処理をコンピュータが実行する情報処理方法。
(付記12)
前記キャッシュメモリへのアクセスの成否に関する情報として、キャッシュミスの回数を取得し、前記キャッシュミスの回数と前記実行方法とを対応付けて出力する付記11に記載の情報処理方法。
(付記13)
前記キャッシュミスの回数が最も少ない場合に対応する前記実行方法を出力する付記12に記載の情報処理方法。
(付記14)
前記アクセスを要求したスレッドと、該アクセスが要求されたタイミングとを対応させた行列であって、各スレッドからアクセスされる前記キャッシュメモリにアクセスするデータのアドレスを要素とする行列を生成する付記11〜付記13のいずれか1項記載の情報処理方法。
(付記15)
前記並列処理は、ループ変数毎の処理を複数のスレッドの各々に割り当ててループを実行する処理である付記11〜付記14のいずれか1項に記載の情報処理方法。
(付記16)
前記実行方法は、並列処理を実行するスレッド数、各スレッドに割り当てるループのチャンクサイズ、及びスレッドのスケジュール方法の種類に基づいて決定される付記15に記載の情報処理方法。
(付記17)
前記ループの実行時における前記キャッシュメモリへのアクセス回数をループ変数毎に計測することをさらに含む処理を前記コンピュータが実行し、
計測したループ変数毎のアクセス回数を利用して、前記スケジュール方法の種類に応じて、前記ループ変数毎の処理がいずれのスレッドに割り当てられるかを特定する
付記16に記載の情報処理方法。
(付記18)
主記憶装置へのアクセスの情報、及びキャッシュメモリの構成情報に基づいて、
前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、
該キャッシュセット番号が示す前記キャッシュセットに、前記主記憶装置へのアクセス要求に対応するデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を取得する
付記11〜付記17のいずれか1項に記載の情報処理方法。
(付記19)
前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスに関連する情報を取得する付記11〜付記18のいずれか1項に記載の情報処理方法。
(付記20)
複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成し、
前記実行方法の各々について、生成した行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する
ことを含む処理をコンピュータに実行させる情報処理プログラム。
10 情報処理装置
11 第1変換部
12 計測部
13 第2変換部
14 生成部
15 取得部
20 コンピュータ
21 CPU
22 メモリ
23 記憶部
29 記憶媒体
30 情報処理プログラム
40 スレッド
51 CPU
511 コア
512 キャッシュメモリ
513 キャッシュセット

Claims (12)

  1. 複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成する生成部と、
    前記実行方法の各々について、前記生成部で生成された行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する取得部と、
    を含む情報処理装置。
  2. 前記取得部は、前記キャッシュメモリへのアクセスの成否に関する情報として、キャッシュミスの回数を取得し、前記キャッシュミスの回数と前記実行方法とを対応付けて出力する請求項1に記載の情報処理装置。
  3. 前記取得部は、前記キャッシュミスの回数が最も少ない場合に対応する前記実行方法を出力する請求項2に記載の情報処理装置。
  4. 前記生成部は、前記アクセスを要求したスレッドと、該アクセスが要求されたタイミングとを対応させた行列であって、各スレッドからアクセスされる前記キャッシュメモリにアクセスするデータのアドレスを要素とする行列を生成する請求項1〜請求項3のいずれか1項記載の情報処理装置。
  5. 前記並列処理は、ループ変数毎の処理を複数のスレッドの各々に割り当ててループを実行する処理である請求項1〜請求項4のいずれか1項に記載の情報処理装置。
  6. 前記実行方法は、並列処理を実行するスレッド数、各スレッドに割り当てるループのチャンクサイズ、及びスレッドのスケジュール方法の種類に基づいて決定される請求項5に記載の情報処理装置。
  7. 前記ループの実行時における前記キャッシュメモリへのアクセス回数をループ変数毎に計測する計測部を含み、
    前記生成部は、前記計測部により計測されたループ変数毎のアクセス回数を利用して、前記スケジュール方法の種類に応じて、前記ループ変数毎の処理がいずれのスレッドに割り当てられるかを特定する
    請求項6に記載の情報処理装置。
  8. 主記憶装置へのアクセスの情報、及びキャッシュメモリの構成情報に基づいて、
    前記取得部は、前記主記憶装置へのアクセス要求に対応するキャッシュメモリのキャッシュセット番号を特定し、該キャッシュセット番号が示すキャッシュセットに、前記主記憶装置へのアクセス要求に対応するデータが存在するか否かを模擬して、キャッシュメモリへのアクセスの成否に関連する情報を取得する
    請求項1〜請求項7のいずれか1項に記載の情報処理装置。
  9. 前記取得部は、前記キャッシュメモリが複数のキャッシュセットに分割されている場合、前記キャッシュセット毎に前記キャッシュメモリへのアクセスの成否に関連する情報を取得する請求項1〜請求項8のいずれか1項に記載の情報処理装置。
  10. 前記取得部は、前記キャッシュセット毎の前記キャッシュメモリへのアクセスの成否に関連する情報を取得する処理を、前記キャッシュセット毎に並列に実行する請求項9に記載の情報処理装置。
  11. 複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成し、
    前記実行方法の各々について、生成した行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する
    ことを含む処理をコンピュータが実行する情報処理方法。
  12. 複数のスレッドが並列処理を実行するプログラムの実行時における、各スレッドから主記憶装置へのアクセス要求に対応するキャッシュメモリへのアクセスを表す行列を、前記並列処理についての複数の異なる実行方法毎に生成し、
    前記実行方法の各々について、生成した行列の要素が示す前記キャッシュメモリへのアクセスの成否に関連する情報を取得する
    ことを含む処理をコンピュータに実行させる情報処理プログラム。
JP2017018270A 2017-02-03 2017-02-03 情報処理装置、方法、及びプログラム Pending JP2018124892A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017018270A JP2018124892A (ja) 2017-02-03 2017-02-03 情報処理装置、方法、及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017018270A JP2018124892A (ja) 2017-02-03 2017-02-03 情報処理装置、方法、及びプログラム

Publications (1)

Publication Number Publication Date
JP2018124892A true JP2018124892A (ja) 2018-08-09

Family

ID=63111439

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017018270A Pending JP2018124892A (ja) 2017-02-03 2017-02-03 情報処理装置、方法、及びプログラム

Country Status (1)

Country Link
JP (1) JP2018124892A (ja)

Similar Documents

Publication Publication Date Title
Filippone et al. Sparse matrix-vector multiplication on GPGPUs
Ding et al. An instruction roofline model for gpus
Meng et al. GROPHECY: GPU performance projection from CPU code skeletons
Bell et al. Implementing sparse matrix-vector multiplication on throughput-oriented processors
Ubal et al. Multi2Sim: A simulation framework for CPU-GPU computing
US20130226535A1 (en) Concurrent simulation system using graphic processing units (gpu) and method thereof
Grass et al. MUSA: a multi-level simulation approach for next-generation HPC machines
US8738349B2 (en) Gate-level logic simulator using multiple processor architectures
Holst et al. High-throughput logic timing simulation on GPGPUs
Nugteren et al. The boat hull model: enabling performance prediction for parallel computing prior to code development
Siracusa et al. A comprehensive methodology to optimize FPGA designs via the roofline model
Lai et al. Accelerating Strassen-Winograd's matrix multiplication algorithm on GPUs
Yang Hierarchical roofline analysis: How to collect data using performance tools on intel cpus and nvidia gpus
Liu Parallel and scalable sparse basic linear algebra subprograms
Parakh et al. Performance estimation of GPUs with cache
KR101715986B1 (ko) 신호 흐름이 프로그램된 디지털 신호 프로세서 코드의 효율적인 자원 관리를 위한 시스템 및 방법
Vetter et al. Quantifying architectural requirements of contemporary extreme-scale scientific applications
Calotoiu et al. Lightweight requirements engineering for exascale co-design
Kim et al. Introduction to parallel programming and pMatlab v2. 0
Yu et al. An adaptive algorithm selection framework
JP4870956B2 (ja) 組み込み用プログラム生成方法、組み込み用プログラム開発システム、及び情報テーブル部
WO2018032897A1 (zh) 报文转发性能评估方法、装置和计算机存储介质
JP2018124892A (ja) 情報処理装置、方法、及びプログラム
JP2008250838A (ja) ソフトウェア生成装置、方法、およびプログラム
JP7335952B2 (ja) ベクトル述語要約の生成