(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024127077
(43)【公開日】2024-09-20
(54)【発明の名称】演算処理装置及び演算処理方法
(51)【国際特許分類】
G06F 17/16 20060101AFI20240912BHJP
【FI】
G06F17/16 K
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2023035942
(22)【出願日】2023-03-08
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】戸倉 宏樹
【テーマコード(参考)】
5B056
【Fターム(参考)】
5B056BB42
(57)【要約】
【課題】標準固有値問題の計算効率を向上させる演算処理装置及び演算処理方法を提供する。
【解決手段】計算実行部は、所定の対称行列に対する標準固有値問題の計算を分割して生成されたそれぞれが異なる計算を行う複数の計算単位について、各計算単位の計算がそれぞれで実行される複数のタスクのうちの第1タスクと第2タスクとの間にいずれか一方の結果に基づいて他方が計算を行うという依存関係が存在しない場合、第1タスクと第2タスクとを非同期で計算し、第1タスクと第2タスクとに依存関係が存在する場合、第1タスクと第2タスクとを逐次計算する。出力部は、計算実行部により計算された所定の対称行列に対する標準固有値問題の計算結果を出力する。
【選択図】
図5
【特許請求の範囲】
【請求項1】
所定の対称行列に対する標準固有値問題の計算を分割して生成されたそれぞれが異なる計算を行う複数の計算単位について、各前記計算単位がそれぞれで実行される複数のタスクのうちの第1タスクと第2タスクとの間にいずれか一方の結果に基づいて他方が計算を行うという依存関係が存在しない場合、前記第1タスクと前記第2タスクとを非同期で計算し、前記第1タスクと前記第2タスクとに前記依存関係が存在する場合、前記第1タスクと前記第2タスクとを逐次計算する計算実行部と、
前記計算実行部により計算された前記所定の対称行列に対する標準固有値問題の計算結果を出力する出力部と
を備えたことを特徴とする演算処理装置。
【請求項2】
前記計算実行部は、前記第1タスク及び前記第2タスクのそれぞれについて、実行する前記計算単位の計算量が所定値以上の場合、前記計算単位の計算を複数スレッドで実行することを特徴とする請求項1に記載の演算処理装置。
【請求項3】
前記複数のタスク間の計算の結果の入出力関係を示す依存関係グラフを生成する依存関係グラフ生成部をさらに備え、
前記計算実行部は、前記依存関係グラフ生成部により生成された前記依存関係グラフを基に、前記第1タスクと前記第2タスクとの間の依存関係の存否を判定する依存関係判定部とを備える
ことを特徴とする請求項1に記載の演算処理装置。
【請求項4】
前記計算実行部は、前記所定の対称行列に対する標準固有値問題の計算に含まれる対称行列の三重対角化の計算を複数に分割した計算単位を含む前記複数の計算単位について、前記第1タスクと前記第2タスクとの間の依存関係の存否に基づいて計算を実行することを特徴とする請求項1に記載の演算処理装置。
【請求項5】
前記計算実行部は、前記所定の対称行列に対する標準固有値問題の計算に含まれる対称行列の三重対角化から得られる三重対角行列に対する固有値及び固有ベクトルの計算を複数に分割した計算単位を含む前記複数の計算単位について、前記第1タスクと前記第2タスクとの間の依存関係の存否に基づいて計算を実行することを特徴とする請求項1に記載の演算処理装置。
【請求項6】
前記計算実行部は、前記三重対角行列の固有ベクトルの逆変換で使用する三角行列の計算を行う計算単位を含む前記複数の計算単位について、前記第1タスクと前記第2タスクとの間の依存関係の存否に基づいて計算を実行することを特徴とする請求項5に記載の演算処理装置。
【請求項7】
所定の対称行列に対する標準固有値問題の計算を分割して生成されたそれぞれが異なる計算を行う複数の計算単位について、
各前記計算単位がそれぞれで実行される複数のタスクのうちの第1タスクと第2タスクとの間にいずれか一方の結果に基づいて他方が計算を行うという依存関係が存在しない場合、前記第1タスクと前記第2タスクとを非同期で計算し、
前記第1タスクと前記第2タスクとに前記依存関係が存在する場合、前記第1タスクと前記第2タスクとを逐次計算する
処理をプロセッサに実行させることを特徴とする演算処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、演算処理装置及び演算処理方法に関する。
【背景技術】
【0002】
行列の標準固有値問題は、特定の正方行列に対して、Aν=λνと表される固有値(λ)と固有ベクトル(ν)とをすべて求める問題である。特定の正方行列がn×nの大きさの場合、固有値(λ)と固有ベクトル(ν)のペアが一般にn個存在し、標準固有値問題を解くことでそれらを求めることができる。標準固有値問題は、科学技術分野において幅広く用いられている。特に対称行列の標準固有値問題は、新薬設計やビッグデータ解析などで用いられ、現代社会において重要なテーマである。
【0003】
対称行列の標準固有値問題を計算機で求める場合、一般には次のように行列を変換しながら計算が進められる。第1に、計算機は、対称行列の三重対角化を行う。次に、計算機は、三重対角行列に対する固有値及び固有ベクトルの計算を行う。最後に、計算機は、三重対角行列の固有ベクトルの逆変換を行い、元の対称行列の固有値及び固有ベクトルを算出する。
【0004】
ここで、三重対角行列は、対角成分と対角成分の上下隣り合う要素のみ非ゼロである行列である。また、三重対角化では、行列の相似変換により対称行列が三重対角行列へ変換される。この変換に用いられる行列として、ハウスホルダー変換を用いたハウスホルダー行列が知られている。
【0005】
三重対角化では、一般には以下の3つの手法のいずれかが用いられる。第1の手法は、QR法と呼ばれる手法であり、直交行列による相似変換を用いて標準固有値問題を解くことが行われる。QR法は、固有値・固有ベクトルを安定して求めやすいという特徴を有する。第2の手法は、MRRR(Multiple Relatively Robust Representations)法と呼ばれる手法である。MRRR法は、精度良く標準固有値問題を解き易いという特徴を有する。第3の手法は、分割統治法と呼ばれる手法である。分割統治法は、行列を小さな行列に分割し、固有値及び固有ベクトルを計算する方法である。分割統治法は、高い並列度で計算し易いという特徴を有する。近年の計算機は、大規模化に伴い並列度が非常に高い。そこで、高い並列度により標準固有値問題を解くために、分割統治法が用いられることが多い。
【0006】
標準固有値問題を始めとする様々な数学的問題では、行列演算などが多用される。そのため、線形代数の基本的な演算をまとめたBasic Linear Algebra Subprograms(BLAS)や標準固有値問題計算関数及び特異値問題計算関数をまとめたLinear Algebra Package(LAPACK)等がオープンソースとして公開されている。一般的には、BLASやLAPACKを組み合わせて対称行列の標準固有値問題を計算することができる。BLASやLAPACKは頻繁に用いられるため、各ベンダーからチューニングされた様々なライブラリが提供されている。
【0007】
ここで、近年のプロセッサの傾向として、より多くのコアを搭載することで計算性能の向上が図られている。例えば、富士通が開発したスーパーコンピュータ京とスーパーコンピュータ富岳向けのプロセッサのコア数は8から48に増加している。その他、Nvidia社が開発しているフラグシップ向けGPUのコア数は、順に、5120(V100)、6912(A100)、16896(H100)と増加している。このようなプロセッサを用いる場合、計算性能を高めるためには、すべてのコアを使い切るような高い並列度を持ったアルゴリズムを用いることが好ましい。
【0008】
倍精度の対称行列の標準固有値問題をLAPACKにより分割統治法で解く場合、倍精度の対称行列の標準固有値問題の専用関数(DSYEVDと呼ばれる関数:Double to Symmetric Eigenvalue using Divide and conquer algorithm)が用いられる。DSYEVDでは、主にDSYTRD、DSTEDC及びDORMTRと呼ばれる関数で処理が構成される。DSYTRD(Double to Symmetric tridiagonal form reduce)は、対称行列の三重対角化を行う関数である。DSTEDC(Double to Symmetric tridiagonal Eigenvalue using Divide and conquer algorithm)は、三重対角行列の標準固有値問題を分割統治法で解く関数である。DORMTR(Double Overwrite Real M-by-N matrix with Trans)は、三重対角行列の固有ベクトルを行列積により逆変換を行う関数である。
【0009】
ここで、各関数の特徴を挙げる。DSYTRDは、キャッシュヒットし難い傾向があり、計算が進むにつれて並列度が減少する。また、DSTEDCは、高い並列度と高い計算効率で計算することが可能である。また、DORMTRは、高い計算効率で計算することが可能である。そのため、一般に対称行列の標準固有値問題では、DSYTRDが全体の計算時間のうち多くの時間を占める。このようなそれぞれの関数の特徴から、DSYTRDにおけるパフォーマンスの問題を改善することで全体のパフォーマンスを向上することができると考えられる。
【0010】
なお、並列処理の技術として、与えられた計算モデルを分割して、非相互依存の複数のサブ計算を構築し、複数のプロセッサがサブ計算をそれぞれ並列で処理する技術が提案されている。
【先行技術文献】
【特許文献】
【0011】
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、対称行列の標準固有値問題の計算では、DSYTRDの特徴としてキャッシュヒットし難い傾向及び計算が進むにつれ並列度が減少するといった特徴が存在するため、DSYTRDによる三重対角化の計算がボトルネックになる。そのため、キャッシュヒットし難い傾向を改善できない場合には、倍精度の対称行列の標準固有値問題を分割統治法で解く限り計算効率を向上させることが困難であった。
【0013】
一例として、サイズが16×16の対称行列に対するDSYTRDによる実際の計算の流れを説明する。1回目の相似変換を行うために0列目の1行目から15行目の要素にアクセスし、ハウスホルダー行列を計算する。ハウスホルダー行列はベクトルを用いて表現できるため、実際にはベクトルの形で保持される。そして、ハウスホルダー行列を用いて相似変換を行う。ここで、相似変換は行列ベクトル積で行われキャッシュ効率が悪く、計算に多くの待ちが発生してしまう。1回目の相似変換では、実質、225(=15×15)要素の更新が行われる。2回目の相似変換も0列目と同じように計算が行われる。2回目の相似変換では、実質、196(=14×14)要素の更新が行われる。このような計算を繰り返した場合、相似変換により更新される要素が大きく減っていき、十分な並列度がなくなっていく。そのため、複数のスレッドが利用可能であっても、一部のスレッドにより計算が行われるため、プロセッサの計算性能を十分に引き出すことは困難である。
【0014】
ここで、DSYTRDの特徴の1つであるキャッシュヒットし難いといった問題は、計算アルゴリズムを変更することによりある程度の回避は可能である。この方法として、例えば、LAPACKに含まれるdsytrd_2stageと呼ばれるアルゴリズムを使用することが考えられる。ただし、dsytrd_2stageを用いた場合、固有ベクトル計算においてDORMTRに相当する部分で計算量が2倍程度になるため、計算段階に対応して使い分けることが好ましい。しかし、dsytrd_2stageを使用したとしても、三重対角化における並列度の低下を回避することは困難である。
【0015】
開示の技術は、上記に鑑みてなされたものであって、標準固有値問題の計算効率を向上させる演算処理装置及び演算処理方法を提供することを目的とする。
【課題を解決するための手段】
【0016】
本願の開示する演算処理装置及び演算処理方法の一つの態様において、計算実行部は、所定の対称行列に対する標準固有値問題の計算を分割して生成されたそれぞれが異なる計算を行う複数の計算単位について、各前記計算単位がそれぞれで実行される複数のタスクのうちの第1タスクと第2タスクとの間にいずれか一方の結果に基づいて他方が計算を行うという依存関係が存在しない場合、前記第1タスクと前記第2タスクとを非同期で計算し、前記第1タスクと前記第2タスクとに前記依存関係が存在する場合、前記第1タスクと前記第2タスクとを逐次計算する。出力部は、前記計算実行部により計算された前記所定の対称行列に対する標準固有値問題の計算結果を出力する。
【発明の効果】
【0017】
1つの側面では、本発明は、標準固有値問題の計算効率を向上させることができる。
【図面の簡単な説明】
【0018】
【
図1】
図1は、実施例に係る計算機のブロック図である。
【
図2】
図2は、スレッド並列とタスク並列の一例を示す図である。
【
図3】
図3は、標準固有値問題の計算の流れを示す図である。
【
図4】
図4は、DSYTRDによる三重対角化の計算の流れを示す図である。
【
図5】
図5は、実施例1に係る依存関係グラフの一例を示す図である。
【
図6】
図6は、実施例に係るプロセッサによる標準固有値問題の計算処理のフローチャートである。
【
図7】
図7は、非同期実行可否判定処理のフローチャートである。
【
図8】
図8は、依存関係判定処理のフローチャートである。
【
図9】
図9は、非同期実行判定処理のフローチャートである。
【
図10】
図10は、標準固有値問題の計算について計算単位の非同期実行を行う場合と行わない場合とを比較したタイムラインの一例の図である。
【
図11】
図11は、実施例1に係るプロセッサによる標準固有値問題の計算と計算単位の非同期実行を行わない場合の計算との計算速度の比較を示す図である。
【
図12】
図12は、実施例2に係る依存関係グラフの一例を示す図である。
【
図13】
図13は、DSTEDCにおける行列の分割を示す図である。
【
図14】
図14は、DSTEDCにおける再帰的な行列の固有値及び固有ベクトルの計算を示す図である。
【
図15】
図15は、実施例2に係るプロセッサによる標準固有値問題の計算と計算単位の非同期実行を行わない場合の計算との計算速度の比較を示す図である。
【
図16】
図16は、実施例3に係る依存関係グラフの一例を示す図である。
【
図17】
図17は、実施例3に係るDORMTRによる計算の概要を示す図である。
【発明を実施するための形態】
【0019】
以下に、本願の開示する演算処理装置及び演算処理方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理方法が限定されるものではない。
【実施例0020】
図1は、実施例に係る計算機のブロック図である。本実施例では、計算機1が線形代数の基本的な演算をまとめたライブラリであるLAPACK又はBLASを用いて標準固有値問題を解く場合で説明する。ただし、標準固有値問題を計算するためのアルゴリズムであれば、計算機1が使用するアルゴリズムに特に限定はない。
【0021】
計算機1は、プロセッサ10、メモリ11及び記憶装置12を有する。プロセッサ10、メモリ11及び記憶装置12は、それぞれバスに接続され相互にデータの送受信が可能である。
【0022】
プロセッサ10は、複数のコアを有する。各コアは、一度に1つのスレッドを実行することが可能である。すなわち、プロセッサ10は、複数のスレッドを実行することが可能である。また、プロセッサ10は、複数のスレッドを並列で実行することが可能である。複数のスレッドの並列での実行を、スレッド並列と呼ぶ。
【0023】
また、本実施例では、LAPACKやBLASにより提供される数学的な処理及びプロセッサ10が計算を進めるための一まとまりの処理の関数や、ユーザが定義した数学的な処理又はプロセッサ10が計算を進めるための一まとまりの処理を、計算単位と呼ぶ。計算単位は、何らかの結果が得られる計算や処理であれば、自由に定義可能である。ただし、計算単位を小さくすると、その計算単位単体で得られる結果が、その計算単位を含むより大きな計算や処理等の単なる途中経過等といった意味を持たないものとなることが考えられる。そのような計算単位は、処理を複雑化するため好ましくない。本実施例では、数学的に意味のある結果が得られる計算や処理を計算単位とする。
【0024】
本実施例に係る計算単位として、以下のようなものを使用することが可能である。例えば、計算単位の1つは、倍精度実数の行列積を行う関数であり、例えば、BLASにおけるdgemmである。また、計算単位の1つは、倍精度実数の三重対角対称行列の固有値及び固有ベクトルの計算を行う関数であり、例えば、LAPACKにおけるdsteqrである。
【0025】
また、計算単位の1つは、倍精度の行列の複製を行う関数であり、例えば、LAPACKにおけるdlacpyである。ここで、LAPACKやBLASでは行列やベクトルの上書きを前提にする関数も存在する。そのため、本実施例では、計算機1で計算を進めるための行列やベクトルの複製も計算単位とする。
【0026】
また、計算単位の1つは、ユーザにより定義された計算を行うために配列要素の一時退避を行う関数である。配列には、行列も含まれる。ここで、配列要素の一時退避は数学的には意味はないが、プログラム観点では処理を進めるために必要な処理である。そのため、このような関数も計算単位として扱う。このように、本実施例では、課題を解決するためにユーザにより定義された処理も計算単位とすることができる。
【0027】
一方で、本実施例では、以下に示す例は計算単位として扱われない。1つは、エラー処理用の関数であり、例えば、BLASにおけるdgemmから呼ばれるxerblaである。エラー処理は数学的な処理または計算機1で計算を進めるための処理でないため、xerblaは、計算単位として扱われない。例えば、xerblaは、計算単位であるdgemmの計算単位に含まれる処理として扱われる。また、1つは、BLASにおけるdgemm内部の積和演算である。dgemmを構成する積和演算自体は、数学的な最終的な意味を有さない。dgemm内部の積和演算は計算単位であるdgemmに含まれる処理として扱われる。
【0028】
また、1つは、倍精度実数における定数を取得する関数であり、例えば、LAPACKにおけるdsteqr内部のdlamchである。dlamchは、dsteqrの計算で必要な定数を取得する関数であり、数学的な処理でないため計算単位でない。dlamchは、計算単位であるdsteqrに含まれる処理として扱われる。また、1つは、計算単位として扱われるLAPACKにおけるdstedc内部のdgemmである。計算単位であるdstedc内部で呼ばれるdgemmは、dstedcに含まれる処理として扱われる。
【0029】
また、1つは、ユーザが実装したdsteqrの計算結果を標準出力に出力する処理である。この処理は、数学的な処理または計算機1で計算を進めるために必用な処理でないため計算単位として取り扱わない。この処理は、計算単位であるdsteqrに含まれる処理として扱われる。
【0030】
プロセッサ10は、標準固有問題をとくプログラムに含まれる計算単位それぞれを1つのタスクとして扱う。タスクには、1つ又は複数のスレッドが含まれる。プロセッサ10は、複数のタスクを並列で実行することが可能である。複数のタスクの非同期での実行を、非同期でのタスクの実行と呼ぶ。また、タスクで処理される計算単位を指して、計算単位の非同期実行と呼ぶ場合もある。非同期でのタスクの実行では、プロセッサ10は、プログラムの記述に沿って順番に各タスクを実行する場合と異なり、それぞれのタスクを独立して実行する。
【0031】
ここで、本実施例のプロセッサ10は、タスクを非同期で処理する場合、OpenMP(Multi Processing)のタスク並列機能を用いる。ただし、実際には、プロセッサ10は、アーキテクチャ毎に適切なアルゴリズムを選択することが好ましい。例えば、ハードウェアバリア機能による高速な同期を使用するためOpenMPのタスク並列機能を使用すると性能が出やすい場合には、OpenMPを用いることが好ましい。他にも、プロセッサ10は、stream機能やCUDA Graphs機能を使用してもよい。
【0032】
図2は、スレッド並列とタスク並列の一例を示す図である。例えば、プロセッサ10は、スレッド並列201に示すように計算を実行する。すなわち、プロセッサ10は、1つの計算単位を実行するタスク211について、複数スレッドで計算を行う。
【0033】
また、プロセッサ10は、タスク並列202に示すように計算を実行する。この場合、プロセッサ10は、タスク221と、タスク222と、タスク223とを並列、すなわち非同期で実行する。タスク並列202において、ある計算単位に着目した場合、その計算単位に複数のスレッドが割当たっていれば、プロセッサ10は、スレッド並列でその計算単位の処理を実行している。すなわち、プロセッサ10は、タスク221やタスク223についてスレッド並列で処理を実行する。すなわち、プロセッサ10は、タスク並列の売、複数の計算単位を同じタイミングで1つ又は複数のスレッドで計算する。ここで、タスク並列の場合、プロセッサ10は、同じタイミングでの複数の計算単位の処理を期待されるだけで、実際には異なるタイミングでそれら複数の計算単位を処理してもよい。
【0034】
図1に戻って説明を続ける。プロセッサ10は、スレッド並列及びタスク並列を用いて標準固有値問題を解く。ここでは、プロセッサ10は、対称行列の標準固有値問題を計算する。
【0035】
図3は、標準固有値問題の計算の流れを示す図である。ここで、
図3を用いて、本実施例に係るプロセッサ10による標準固有値問題の計算の流れの概要を説明する。ここでは、対称行列231が、n×n行列である場合を例に説明する。
【0036】
プロセッサ10は、対称行列231に対してDSYTRDを用いて三重対角化を行い、三重対角行列232を算出する(ステップS1)。三重対角化の際、プロセッサ10は、固有ベクトルの計算のために、i番目の相似変換で使用したハウスホルダー行列Hiを直交行列Qtに蓄積する。そして、三重対角化完了後に、プロセッサ10は、Qt=Hn-2・・・H2H1を得る。
【0037】
図4は、DSYTRDによる三重対角化の計算の流れを示す図である。プロセッサ10は、DSYTRDを実行することにより、
図4に示すように対称行列の左の列から右の列に向かって1列ずつ三重対角行列へ変換していく。この時、1回の相似変換により1列の三重対角化を行うことができる。
図4では、確定した対角成分を黒で表し、確定した副対角要素を斜線パターンで表し、それ以外の確定した要素を白で表し、未確定の要素をグレーで表した。n×nの対称行列の場合、n-2回の相似変換で三重対角化が完了する。
【0038】
図3に戻って説明を続ける。次に、プロセッサ10は、解233として示した三重対角行列232の固有値(λ
1,λ
2,・・・,λ
n)及び固有ベクトル(x
1,x
2,・・・,x
n)を算出する(ステップS2)。
【0039】
次に、プロセッサ10は、固有ベクトル(x1,x2,・・・,xn)の逆変換を行い、対称行列231の固有ベクトル(ν1,ν2,・・・,νn)を算出する。これにより、プロセッサ10は、解234として示した対称行列231の固有値(λ1,λ2,・・・,λn)及び固有ベクトル(ν1,ν2,・・・,νn)を取得する(ステップS3)。
【0040】
図1に戻って説明を続ける。メモリ11は、主記憶装置である。メモリ11は、例えば、DRAM(Dynamic Random Access Memory)である。メモリ11は、例えば、プロセッサ10により演算処理における記憶領域として用いられる。
【0041】
記憶装置12は、補助記憶装置であり、例えば、ハードディスクやSSD(Solid State Drive)である。記憶装置12は、プロセッサ10が演算処理を実行するための各種プログラムを格納する。また、記憶装置12は、プロセッサ10が演算処理を実行するためのデータを記憶する。例えば、記憶装置12は、標準固有値問題により固有行列や固有値を求める対象となる対称行列を記憶する。
【0042】
次に、本実施例に係るプロセッサ10による標準固有値問題の計算の詳細について説明する。プロセッサ10は、
図1に示すように、計算単位分割部101、依存関係グラフ生成部102、依存関係判定部103、計算実行部104及び出力部105を有する。
【0043】
計算単位分割部101は、予め指定された計算単位の生成ルールを有する。計算単位分割部101は、標準固有値問題を計算する対象となる対称行列を記憶装置12から取得する。そして、計算単位分割部101は、行数や列数といった対称行列の特徴から、生成ルールにしたがい、標準固有値問題の計算全体を計算単位に分割して、計算単位を生成する。その後、計算単位分割部101は、生成した計算単位の情報を依存関係グラフ生成部102へ出力する。
【0044】
図5は、実施例1に係る依存関係グラフの一例を示す図である。
図5は、標準固有値問題の計算における計算単位に対応するタスク間の依存関係の一例を示す。
【0045】
例えば、計算単位分割部101は、標準固有値問題の計算のうちDSYTRDによる計算におけるハウスホルダー行列H
iの生成を1つの計算単位とする。iは対称行列のi列目を表し、H
iはi列目のハウスホルダー行列を表す。
図4におけるタスク#1-iが、ハウスホルダー行列Hiの生成を行う計算単位を表す。タスク#1-iがこの計算単位にあたり、i列目のハウスホルダー行列H
iを生成する処理を表す。
【0046】
また、計算単位分割部101は、標準固有値問題の計算のうちDSYTRDによる計算における相似変換を1つの計算単位とする。
図5におけるタスク#2-iがこの計算単位にあたり、i列目のハウスホルダー行列H
iを用いた相似変換を行う処理を表す。
【0047】
また、計算単位分割部101は、標準固有値問題の計算のうちDSTEDCによる三重対角行列の固有値及び固有ベクトルの計算を1つの計算単位とする。
図5におけるタスク#3がこの計算単位にあたる。
【0048】
また、計算単位分割部101は、標準固有値問題の計算のうちDORMTRによる計算におけるハウスホルダー行列H
iの行列式への変換を1つの計算単位とする。
図5におけるタスク#4-iがこの計算単位にあたり、i列目のハウスホルダー行列H
iの行列式への変換を表す。
【0049】
また、計算単位分割部101は、標準固有値問題の計算のうちDORMTRによる計算における行列積を1つの計算単位とする。
図5におけるタスク#5がこの計算単位にあたる。
【0050】
図1に戻って説明を続ける。依存関係グラフ生成部102は、対称行列に対する標準固有値問題の計算の計算単位の情報の入力を計算単位分割部101から受ける。次に、依存関係グラフ生成部102は、特定の計算単位を実行するタスクが入力情報として他の計算単位を実行するタスクにより算出された結果を用いる場合に、タスク間の計算の結果の出入力関係を示す情報を生成する。例えば、依存関係グラフ生成部102は、結果を出力した他の計算単位から特定の計算単位へ向けて矢印を配置する。
【0051】
例えば、DSYTRDにおいて、i列目のハウスホルダー行列H
iが生成されると、そのハウスホルダー行列H
iを用いて相似変換が行われる。また、DSYTRDにおいて生成されたi列目のハウスホルダー行列H
iは、DORMTRにより行列式へ変換される。そこで、依存関係グラフ生成部102は、
図5の依存関係グラフ240のようにタスク#1-iから、タスク#2-i及び#4-iに向かって矢印を配置して、出入力関係を示す情報を生成する。
【0052】
依存関係グラフ生成部102は、全ての計算単位について出入力関係を示す情報を生成する。これにより、依存関係グラフ生成部102は、例えば、
図5に示す依存関係グラフ240を生成する。その後、依存関係グラフ生成部102は、生成した依存関係グラフを依存関係判定部103へ出力する。ここで、本実施例では、分かり易いように2次元のグラフとして非依存関係グラフを表現したが、依存関係グラフは、タスク間の出入力関係の情報が取得可能な情報であれば他の形式の情報でもよい。
【0053】
依存関係判定部103は、依存関係グラフの入力を依存関係グラフ生成部102から受ける。次に、取得した依存関係グラフから依存関係が存在しないタスクの組み合わせを抽出する。ここで、第1タスクが出力した結果を、他の第2タスクが直接又は間接的に計算に利用する場合、または、第2タスクが出力した結果を、第1タスクが直接又は間接的に計算に利用する場合、第1タスクと第2タスクとの間に依存関係が存在するといえる。依存関係が存在しないタスクの組み合わせの抽出後、依存関係判定部103は、各計算単位の情報及び依存関係が存在しないタスクの組み合わせの情報を計算実行部104へ出力する。以下に、
図5を参照して、依存関係が存在しないタスクの抽出の詳細を説明する。
【0054】
依存関係グラフは出入力関係毎に向きが存在する有向グラフであり、依存関係グラフ中に存在する異なるタスクAとタスクBとを例に説明する。タスクAからタスクB、もしくは、タスクBからタスクAへの出入力関係の向きにしたがった経路が存在する場合、依存関係判定部103は、タスクAとタスクBとの間に依存関係が存在すると判定する。一方、タスクAからタスクB、及び、タスクBからタスクAへの出入力関係の向きにしたがった経路が存在しない場合、依存関係判定部103は、タスクAとタスクBとの間に依存関係が存在しないと判定する。
【0055】
例えば、
図5におけるタスク#2-0とタスク#4-0との間には、出入力関係の方向にしたがって、タスク#2-0からタスク#4-0へ辿る経路及びタスク#4-0からタスク#2-0へたどる経路は存在しない。そこで、依存関係判定部103は、タスク#2-0とタスク#4-0との間に依存関係が存在しないと判定する。また、タスク#1-2とタスク#4-1との間にも同様に、出入力関係の方向にしたがって辿ることができる経路は存在しないため、依存関係判定部103は、タスク#1-2とタスク#4-1との間に依存関係が存在しないと判定する。
【0056】
一方、タスク#2-0とタスク#4-2との間では、出入力関係の方向にしたがって、タスク#4-2からタスク#2-0へたどる経路は存在しないが、タスク#2-0からタスク#4-2へたどる経路は存在する。そこで、依存関係判定部103は、タスク#2-0とタスク#4-2との間に依存関係が存在すると判定する。
【0057】
図1に戻って説明を続ける。計算実行部104は、非同期実行判定部140を有する。計算実行部104は、各計算単位の情報及び依存関係が存在しないタスクの組み合わせの情報の入力を依存関係判定部103から受ける。また、計算実行部104は、対称行列を記憶装置12から取得する。
【0058】
そして、計算実行部104は、取得した対称行列に対して
図3に概要を示した標準固有値問題の計算の実行を開始する。標準固有値問題の計算において、計算実行部104は、依存関係が存在しないタスク同士は、非同期で各計算単位の計算を実行する。これに対して、依存関係が存在し非同期での計算に対応しないタスク同士は、決められた順序で逐次にそれぞれのタスクの計算単位の計算を行う関数を呼び出して順番に処理する。
【0059】
より具体的には、計算実行部104の非同期実行判定部140は、あるタスクの終了後に、そのタスクの次に実行し得る各タスクの中から、依存関係が存在しないタスクを抽出する。そして、非同期実行判定部140は、特定のタスクと抽出したタスクとを非同期で実行した場合に計算速度が上昇するか否かを判定する。計算速度が上昇する場合、非同期実行判定部140は、特定のタスクと抽出したタスクとの非同期での実行を決定する。そして、計算実行部104は、非同期実行判定部140の決定にしたがって、各タスクを実行する。
【0060】
例えば、
図5において、タスク#1-iの完了後は、タスク#2-iとタスク#4-iとの間には依存関係が存在しないため、非同期実行判定部140は、タスク#2-iとタスク#4-iとが非同期で実行可能であることを確認する。そして、計算実行部104は、非同期実行判定部140によりタスク#2-iとタスク#4-iとの非同期での実行が決定されると、タスク#2-iとタスク#4-iとを非同期で実行する。
【0061】
ここで、計算実行部104は、非同期で計算できる計算単位は、例えば、OpenMPのタスク並列機能を用いて計算することができる。タスク並列機能により、計算実行部104は、タスク化された処理をスレッドとして割り当て非同期に処理することができる。例えば、タスク#2-iとタスク#4-iは処理が比較的重たい処理であるためスレッド並列で行うことが好ましい。そこで、計算実行部104は、タスク#2-i及びタスク#4-iの処理を#pragma omp taskloopを用いて処理させる。これにより、タスク#2-iに割り当てられたスレッドは、計算の完了後にタスク#4-iの処理に割り当てられる可能性があり、その逆も可能性がある。すなわち、計算実行部104は、タスク#2-iとタスク#4-iとを非同期で実行できる可能性がある。これにより、プロセッサ10の効率を向上させることが期待できる。
【0062】
非同期でタスクを実行する場合、各タスクの依存関係に応じた様々な制御が行われる。そして、タスクの依存関係が定義できている場合、タスク実行の自動化が可能である。例えば、計算実行部104は、NVIDIA社により提供されるCUDAにおけるstream機能やCUDA Graphs機能によりタスク実行の自動化を行える。stream機能を用いる場合、計算実行部104は、streamと呼ばれるキューを用意し、依存関係にないタスクを異なるキューに投入することで依存関係にないタスクを非同期で実行できる。この場合、同じキューに投入されたタスクは、依存関係にあるとみなされ各タスクは順番に実行される。CUDA Graphs機能を用いる場合、計算実行部104は、各タスクの依存関係を定義した後に、タスクを実行する。この時、依存関係にないタスクは非同期で実行される可能性が高く、依存関係にあるタスクは適切な順番で実行される。
【0063】
また、計算実行部104は、各タスクについて、そのタスクで実行される計算単位の計算量が所定値以上の場合、前記タスクに含まれる計算単位の計算を複数スレッドで実行する。また、計算実行部104は、各タスクについて、そのタスクで実行される計算単位の計算量が所定値未満の場合、前記タスクに含まれる計算単位の計算を単一スレッドで実行する。
【0064】
計算実行部104は、全てのタスクの実行を完了させることで、対称行列の固有値及び固有ベクトルの算出を完了する。そして、計算実行部104は、算出した対称行列の固有値及び固有ベクトルを出力部105へ通知する。
【0065】
以上のように、本実施例に係る計算実行部104は、所定の対称行列に対する標準固有値問題の計算に含まれる対称行列の三重対角化の計算(DSYTRD)を複数に分割した計算単位を含む複数の計算単位について、第1タスクと第2タスクとの間の依存関係の存否に基づいて計算を実行する。
【0066】
出力部105は、対称行列の固有値及び固有ベクトルの通知を計算実行部104から受ける。そして、出力部105は、通知された対称行列の固有値及び固有ベクトルを表示装置等に表示させて、計算結果をユーザに提示する。
【0067】
図6は、実施例に係るプロセッサによる標準固有値問題の計算処理のフローチャートである。次に、
図6を参照して、本実施例に係るプロセッサ10による標準固有値問題の計算処理の流れを説明する。
【0068】
計算単位分割部101は、予め決められた計算単位の生成ルールにしたがって、対称行列に対する標準固有値問題の計算を計算単位に分割する(ステップS101)。
【0069】
依存関係グラフ生成部102は、計算単位分割部101により生成された計算単位の間における出入力関係の情報を生成して、依存関係グラフを生成する(ステップS102)。
【0070】
依存関係判定部103は、依存関係グラフ生成部102により生成された依存関係グラフを用いて、各タスク間の依存関係を判定する依存関係判定処理を実行する(ステップS103)。
【0071】
計算実行部104は、タスク間の依存関係に応じた非同期実行判定部140による各タスクの非同期で実行するか否かの決定にしたがって、対称行列に対する標準固有値問題の計算を実行する(ステップS104)。
【0072】
出力部105は、計算実行部104により算出された対称行列の固有値及び固有ベクトルを出力してユーザに提供する(ステップS105)。
【0073】
図7は、非同期実行可否判定処理のフローチャートである。
図7のフローで示される各処理は、
図6のステップS103及びS104で実行される処理の一例にあたる。ただし、
図7のフローでは、ステップS103及びS104が並行して行われる場合を例に各処理を記載した。次に、
図7を参照して、本実施例に係るプロセッサ10による非同期実行可否判定処理の流れを説明する。ここでは、対称行列がn×n行列であり、且つ、各タスクに連番で番号が振られた場合で説明する。
【0074】
依存関係判定部103は、依存関係グラフを依存関係グラフ生成部102から取得する(ステップS201)。
【0075】
次に、依存関係判定部103は、i=0及びj=0と設定する(ステップS202)。
【0076】
次に、依存関係判定部103は、タスク#iとタスク#jとの間に依存関係が存在するか否かを判定する(ステップS203)。
【0077】
タスク#iとタスク#jとの間に依存関係が存在する場合(ステップS203:肯定)、非同期実行判定部140は、タスク#iとタスク#jとを非同期で実行可能と判定する(ステップS204)。
【0078】
これに対して、タスク#iとタスク#jとの間に依存関係が存在しない場合(ステップS203:否定)、非同期実行判定部140は、タスク#iとタスク#jとを非同期で実行しないと決定する(ステップS205)。
【0079】
その後、依存関係判定部103は、j=N-1か否かを判定する(ステップS206)。j≠N-1の場合(ステップS206:否定)、依存関係判定部103は、jを1つインクリメントする(ステップS207)。その後、非同期実行可否判定処理は、ステップS203へ戻る。
【0080】
これに対して、j=N-1の場合(ステップS206:肯定)、依存関係判定部103は、i=N-1か否かを判定する(ステップS208)。i≠N-1の場合(ステップS208:否定)、依存関係判定部103は、iを1つインクリメントする(ステップS209)。その後、非同期実行可否判定処理は、ステップS203へ戻る。
【0081】
これに対して、i=N-1の場合(ステップS208:肯定)、依存関係判定部103及び非同期実行判定部140は、非同期実行可否判定処理を終了する。
【0082】
図8は、依存関係判定処理のフローチャートである。
図8のフローで示される各処理は、
図7のステップS203で実行される処理の一例にあたる。次に、
図8を参照して、本実施例に係るプロセッサ10による依存関係判定処理の流れを説明する。
【0083】
依存関係判定部103は、依存関係グラフを用いて、出入力関係の向きにしたがいタスク#iからタスク#jへ辿る経路が存在するか否かを判定する(ステップS301)。
【0084】
タスク#iからタスク#jへ辿る経路が存在しない場合(ステップS301:否定)、依存関係判定部103は、出入力関係の向きにしたがいタスク#jからタスク#iへ辿る経路が存在するか否かを判定する(ステップS302)。
【0085】
タスク#iからタスク#jへ辿る経路が存在する場合(ステップS301:肯定)、依存関係判定部103は、タスク#iとタスク#jとの間に依存関係が存在すると判定する(ステップS303)。また、タスク#jからタスク#iへ辿る経路が存在する場合(ステップS302:肯定)、依存関係判定部103は、タスク#iとタスク#jとの間に依存関係が存在すると判定する(ステップS303)。
【0086】
これに対して、タスク#jからタスク#iへ辿る経路が存在しない場合(ステップS302:否定)、依存関係判定部103は、タスク#iとタスク#jとの間に依存関係が存在しないと判定する(ステップS304)。
【0087】
図9は、非同期実行判定処理のフローチャートである。
図9のフローで示される各処理は、
図6のステップS104で実行される処理の一例にあたる。次に、
図9を参照して、本実施例に係るプロセッサ10による非同期実行判定処理の流れを説明する。ここでは、対称行列がn×n行列であり、且つ、各タスクに連番で番号が振られた場合で説明する。
【0088】
非同期実行判定部140は、タスク集合Xの完了後に、次に実行可能なタスクについて依存関係が存在しないタスク群を取得する(ステップS401)。ここで、次に実行可能なタスクの数をMとし、次に実行可能なタスクに対して依存関係が存在しないタスク群にふくまれるタスクの数をKとする。
【0089】
次に、非同期実行判定部140は、次に実行可能なタスクであるタスク#iについて、i=0と設定する。また、非同期実行判定部140は、タスク#iに対応する依存関係が存在しないタスク群に含まれるタスク#jについてj=0と設定する(ステップS402)。
【0090】
次に、非同期実行判定部140は、タスク#iとタスク#jとを非同期で実行した場合に計算速度が上昇するか否かを判定する(ステップS403)。
【0091】
計算速度が上昇する場合(ステップS403:肯定)、非同期実行判定部140は、タスク#iとタスク#jとの非同期での実行を決定する(ステップS404)。
【0092】
これに対して、計算速度が上昇しない場合(ステップS403:否定)、非同期実行判定部140は、タスク#iとタスク#jとを順次実行すると決定する(ステップS405)。
【0093】
その後、非同期実行判定部140は、j=K-1か否かを判定する(ステップS406)。j≠K-1の場合(ステップS406:否定)、非同期実行判定部140は、jを1つインクリメントする(ステップS407)。その後、非同期実行判定部140は、ステップS403へ戻る。
【0094】
これに対して、j=K-1の場合(ステップS406:肯定)、非同期実行判定部140は、i=M-1か否かを判定する(ステップS408)。i≠M-1の場合(ステップS408:否定)、非同期実行判定部140は、iを1つインクリメントする(ステップS409)。その後、非同期実行判定部140は、ステップS403へ戻る。
【0095】
これに対して、i=M-1の場合(ステップS408:肯定)、非同期実行判定部140は、非同期実行判定処理を終了する。
【0096】
図10は、標準固有値問題の計算について計算単位の非同期実行を行う場合と行わない場合とを比較したタイムラインの一例の図である。通常の場合は、グラフ251に示すように、プロセッサ10は、DSYTRDが完了した後にDSTEDCを実行し、DSTEDCが完了した後にDORMTRを実行する。これに対して、計算単位を非同期で実行した場合、例えば、グラフ252に示すように、プロセッサ10は、DSYTRDの所定のタスクが完了すると、DSTEDC及びDORMTRをDSYTRDに並行して処理することができる。グラフ251とグラフ252とを比較した場合、グラフ252における処理が、グラフ251における処理よりも早く終了することが示されている。ここで、
図6では、非同期でのタスクの実行において各タスクが連続して実行されるように記載したが、例えば、
図5に示した依存関係を各タスクが有する場合には、DSYTRD、DSTEDC、DORMTRにおいて特定のタスクが完了するまでの同期待ちの待機が発生する場合がある。
【0097】
図11は、実施例1に係るプロセッサによる標準固有値問題の計算と計算単位の非同期実行を行わない場合の計算との計算速度の比較を示す図である。
図11では、対称行列をn×n行列として、n=1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288である場合について記載した。
【0098】
この場合、対称行列が12288×12288まで大きくなると、計算単位の非同期実行による効果が表れ、プロセッサ10は、計算単位の非同期実行を行わない計算手法に対して標準固有値問題の計算を30%程度の高速化することができる。
【0099】
以上に説明したように、本実施例に係る演算処理装置であるプロセッサは、対称行列に対する標準固有値問題の計算を予め決められたルールにしたがい計算単位に分割する。そして、プロセッサは、各計算単位をタスクとしてその依存関係に基づいてタスク同士を非同期実行で実行するか否かを決定して、決定にしたがって対称行列の標準固有値問題を計算する。これにより、使用するコアの並列度が低くなった待ち時間に、個別に並列でタスクを計算処理でき、キャッシュミスした待ち時間の隠蔽ができる。したがって、キャッシュヒットし難い傾向がある場合でも、分割統治法による計算効率の改善および高速化を実現することができ、標準固有値問題の計算効率を向上させることが可能となる。
依存関係グラフ301において、タスク#2-0とタスク#4-0との間には、タスク#2-0からタスク#4-0へ辿ることができる経路及びタスク#4-0からタスク#2-0へ辿ることができる経路のいずれも存在しない。そこで、依存関係判定部103は、タスク#2-0とタスク#4-0との間には依存関係が存在しないと判定する。また、タスク#2-2とタスク#4-2との間も同じように双方向のいずれも辿ることができる経路が存在しないため、依存関係判定部103は、タスク#2-2とタスク#4-2との間には依存関係が存在しないと判定する。
一方、タスク#1-4とタスク#4-8との間には、タスク#4-8からタスク#1-4へ辿る経路は存在しないが、タスク#1-4からタスク#4-8へ辿る経路が存在する。そこで、依存関係判定部103は、タスク#1-4とタスク#4-8との間には依存関係が存在すると判定する。
計算実行部104は、計算単位分割部101により生成されたDSTEDCが分割された計算単位を含む複数の計算単位について、各タスク間の依存関係の存否にしたがって標準固有値問題を計算する。すなわち、計算実行部104は、対称行列の三重対角化から得られる三重対角行列に対する固有値及び固有ベクトルの計算を複数に分割した計算単位を含む複数の計算単位について、第1タスクと第2タスクとの間の依存関係の存否に基づいて計算を実行する。
計算実行部104は、非同期で実行可能な計算単位は、OpenMPのタスク並列機能を用いて計算を行う。ここで、タスク#2-iは処理が比較的軽いため、計算実行部104は、タスク#2-iを1スレッドで処理してもよい。一方で、タスク#4-iは処理が比較的重たいため、計算実行部104は、タスク#4-iを複数のスレッドで処理することが好ましい。そこで、計算実行部104は、タスク#2-iの処理を#pragma omp taskを用いて実行し、タスク#4-iの処理を#pragma omp taskloopを用いて実行する。これにより、計算実行部104は、タスク#2-iに割り当てられたスレッドの計算の完了後に、そのスレッドをタスク#4-iの処理に割り当てられる可能性があり、プロセッサ10の計算効率を向上させることができる。
以上に説明したように、本実施例に係る演算処理装置であるプロセッサは、標準固有値問題の計算のうちDSTEDCによる三重対角行列の2×2の行列への分割、並びに、固有値及び固有ベクトルの計算を1つの計算単位とする。また、プロセッサは、標準固有値問題の計算のうちDSTEDCによる末端の2×2の行列から繰り返される固有値及び固有ベクトルの再帰的な統合の計算の全体をまとめて1つの計算単位とする。そして、プロセッサは、各計算単位をタスクとしてその依存関係に基づいて非同期で実行するか否かを決定して、決定にしたがって対称行列の標準固有値問題を計算する。これにより、DSTEDCにおいて、行列サイズが十分に大きくなり並列度が十分に大きくなると多数のコアを十分に使用可能になる。したがって、標準固有値問題の計算効率を向上させることが可能となる。