JP5110081B2 - 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法 - Google Patents

共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法 Download PDF

Info

Publication number
JP5110081B2
JP5110081B2 JP2009512784A JP2009512784A JP5110081B2 JP 5110081 B2 JP5110081 B2 JP 5110081B2 JP 2009512784 A JP2009512784 A JP 2009512784A JP 2009512784 A JP2009512784 A JP 2009512784A JP 5110081 B2 JP5110081 B2 JP 5110081B2
Authority
JP
Japan
Prior art keywords
matrix
block
lower triangular
tridiagonalization
cpu
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.)
Active
Application number
JP2009512784A
Other languages
English (en)
Other versions
JPWO2008136045A1 (ja
Inventor
誠 中西
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
Publication of JPWO2008136045A1 publication Critical patent/JPWO2008136045A1/ja
Application granted granted Critical
Publication of JP5110081B2 publication Critical patent/JP5110081B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/16Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Computational Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Devices For Executing Special Programs (AREA)
  • Complex Calculations (AREA)

Description

本発明は、共有メモリ型スカラ並列計算機における、実対称行列の三重対角化を高速に処理可能な並列処理方法に関する。
実対称行列の固有地問題を解く上で対角化を行い、三重対角行列の固有値問題に変形して解く方法がある。この方法では、実対称行列を三重対角化する部分の計算コストが大きい。この三重対角化に関して、共有メモリ型の並列計算機では、ベクトル計算機のような強力なメモリアクセス能力がないため、メモリアクセスに対して演算量を増やすアルゴリズム上の工夫がなされている。
特許文献1には、ブロック化された三重対角化の処理の基本が記述されている。
しかし、計算のコストの大部分が行列ベクトル積であるため、メモリアクセスのスピードの影響を大きく受ける。全体の性能を改善するために、この部分の改良が必要である。
演算量を増やす工夫を行ったブロック化した方法では、行列ベクトル積を連続アクセスを使って計算すること、および、その計算を各CPUで均等に並列処理することがポイントになる。このために、更新時に必要となる行列全体を更新するとき、下三角部分を更新し、上三角部分をコピーしていた。更新時の負荷をバランスさせるために、行列を列方向にCPU の総数の 2倍で分割し、更新での演算量がバランスするようにi 番目と2 ×#CPU−(i−1)番目をペアとして、各CPUに割り付けていた。しかし、この方法は、行列ベクトル積の計算で参照するメモリ領域が離れており、このためキャッシュ上のデータと干渉して、データをキャッシュに保存しにくい欠点があった。
行列ベクトル積、行列積による更新および負荷分散がうまく調和し、行列ベクトル積を高速に行なえる方法を探せれば、大きな性能向上を得られる可能性がある。
なお、非特許文献1には、三重対角化の基本アルゴリズムが、非特許文献2には、三重対角化の並列計算が記載されている。
特開2004-5528号公報 G.H. Golub, C.F. van Loan, Matrix Computation Second Edition, Johns Hopkins University Press 1989 J.Choi, J.J.Dongarra, and D.W.Walker, "THE DESIGN OF A PARALLEL DENSE LINEAR ALGEBRA SOFTWARE LIBRARY: REDUCTION TO HESSENBERG, TRIDIAGONAL, AND BIDIAGONAL FORM", Engineering Physics and Mathematics Division, Mathematical Sciences Section, prepared by the Oak Ridge National Laboratory managed by Martin Marietta Energy System, Inc., for U.S. DEPARTMENT OF ENERGY under Contract No. DE-AC05-84OR21400, ORNL/TM-12472.
本発明の課題は、共有メモリ型スカラ並列計算機において、高速に実対称行列の三重対角化演算を行うことが出来る並列処理方法を提供することである。
本発明の並列処理方法は、複数のプロセッサを備える共有メモリ型スカラ並列計算機において、実対称行列の三重対角化を高速に行うための並列処理方法であって、該実対称行列の下三角行列を、プロセッサの個数個の列ブロック行列に分割し、該列ブロックを各プロセッサの記憶領域にロードし、各プロセッサは、1回のロードで読み込んだ列ブロックの要素に対し、該実対称行列の縦方向についての演算と、横方向についての演算とを施すことを特徴とする。
本発明が念頭に置く共有メモリ型並列計算機のハードウェア構成を示すブロック図である。 ブロック化された三重対角化演算について説明する図(その1)である。 ブロック化された三重対角化演算について説明する図(その2)である。 ブロック化された三重対角化演算について説明する図(その3)である。 ブロック化された三重対角化演算について説明する図(その4)である。 ブロック化された三重対角化演算について説明する図(その5)である。 本発明の実施形態に従った並列処理方法を説明する図(その1)である。 本発明の実施形態に従った並列処理方法を説明する図(その2)である。 本発明の実施形態に従った並列処理方法を説明する図(その3)である。 本発明の実施形態の並列処理方法をより詳しく説明する図(その1)である。 本発明の実施形態の並列処理方法をより詳しく説明する図(その2)である。 本発明の実施形態の並列処理方法をより詳しく説明する図(その3)である。 本発明の実施形態の並列処理方法をより詳しく説明する図(その4)である。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。 本発明の実施形態に従った処理のフローである。
本発明では、特許文献1に記載の三重対角化の方法を基本に、これに改良を加えたものである。
本発明の実施形態においては、三重対角化を行なうとき、更新部分の演算密度を高めるために、ブロック化されたアルゴリズムを使う。行列ベクトル積部分の対称性を利用して、下三角部分のみを利用して行列ベクトル積を並列に実行する。このとき2回の行列ベクトル積が出現するが、メモリアクセスを共通にして1回の参照にする。下三角部分のみ使うため、更新を行なうための下三角行列を演算量が均等になるように分割を動的に設定する。これにより余分なコピーを行なう必要がなくなる。また、行列ベクトル積で参照したメモリがキャッシュに保持されやすくなる。
下三角部分の行列積(rank-p update) による更新の計算量だけでなく、行列を参照する行列ベクトル積の演算量も同じく均等( 下三角行列を分割したおのおのの面積が均等)になるように列方向に分割して処理する。このとき、分割された領域のおのおのは下三角形部分と長方形部分の 2つの領域からなると見なせる。下三角形部分の更新は、この部分を適当に再分割し、いくつかの行列積で部分的に更新する。対角要素を含む分割された下三角部分を通常の行列積で更新すると、上三角部分の一部も更新するが、なるべくはみだす部分の計算を少なくするようにすることで、演算量を削減し、下三角部分だけを更新するときの計算に近い演算量で更新を行なう。
図1は、本発明が念頭に置く共有メモリ型並列計算機のハードウェア構成を示すブロック図である。
図1に示されるように、本発明が念頭に置く並列計算機では、CPU12−1〜12−mとメモリモジュール10−1〜10−nがバスで構成される相互結合網11によって相互に接続された構成となっている。CPU12−1〜12−mは、それぞれ、L2キャッシュ及びバスインタフェースと、これに接続される複数のL1キャッシュとCPUコアからなっている。この構成をマルチコアCPUという。マルチコアCPUは、1つのCPUの内部にCPUコア(L1キャッシュも内臓)を複数封入したもので、各コアからL2キャッシュ及びバスインタフェースは共通に使う構成である。論理的には、各CPUコアが1つのCPUとして動作するように見える。図1の例では、1つのCPUに2つのCPUコアが封入された例を示しているが、4つ封入されるものもある。
図2〜図4Cは、ブロック化された三重対角化演算について説明する図である。
図2〜図4Cを参照して、固有値・固有ベクトルを求めるための三重対角化の数学低枠組みを説明する。
a)ブロック化された三重対角化の数学的アルゴリズム
行列をブロック幅ごとに3重対角化する。行列をブロックに分割してブロック単位で下記のブロックアルゴリズムで三重対角化を行う。図2はn番目のブロックを処理しているときの図である。
最後のブロックは、そのブロック幅−2をブロックとする左詰めのブロックに関してアルゴリズムを適用してすべての処理を終わる。
step1:An のn+i 行ベクトルよりHouseholder ベクトルuを作る。
step2: vi = An +iu , wi = vi - u(utv)/2, を計算する。
step3: Ui =(Ui-1,ui ) , Wi =(Wi-1,wi )と更新する。
step4: if(i < blks)then
Anのn+i+1 列目を更新する。
An(*,n+i+1) = An (*,n+i+1)- Ui Wi (n+i+1,*)t- Wi Ui (n+i+1,*)t
endif
enddo
step5:An+blks = An - Ublks Wblks t- Wblks Ublks t
次に、ブロック化されたHouseholder 変換による三重対角化について説明する。ブロック化されたHouseholder変換は、以下の式の通りに行う。
v=(v1,v2,...,vn )
|v|2 =v・v=h2
Uv =(h,0,…,0)t とすると、Uv = v − (v1−h ,v2,...,vn)の関係がある。
U =(I −uut / |u |2 )=(I −αuut ), ここでu=(v1−h ,v2,...,vn )
以下αを省略して計算する。
An+1 =Ut An U =(I-uut )A (I-uut
=An - uut An - An uut+ uut An uut
=An - uvt -vut +uvt uut
=An - uwt -uut ut v/2 - wut- uut ut v/2 +uut ut v
=An - u wt -wut ・・・(*)
ここで、 w = v - u(ut v)/2, v = An u
これを繰りし利用すれば、
An+k =An −Uk Wk t −WkUk t ・・・(**)
kステップ目の計算は(*)および(**)からVn を次のように計算できる。
vk = An uk -Uk-1 Wk-1 tuk - Wk-1Uk-1 t uk
wk =vk - uk uk t vk/2
Uk =(Uk-1,uk ) , Wk =(Wk-1,wk)
An+k = An - Uk Wk t - WkUk t
b)Householder変換を構成する情報の格納
固有ベクトルを計算するときに3重対角化でつかったHouseholder 変換が必要になる。このため、Un およびαをhouseholder 変換を構成するベクトルの位置に格納する。αは対応する対角要素の位置に格納する。
c)Ui を効率的に求める方法
ブロック部分の三重対角化を行うためのHouseholder 変換のために、次のベクトルを更新する必要がある。これらの計算をできるだけローカルに行うために、ブロック幅部分を作業域にコピーして3重対角化を行い、もとの領域に格納する。次の列ベクトルの更新をそのたび行わず、行列積の形にして演算密度を上げて計算を行う。このため、ブロック部分の三重対角化を再帰的なプログラミングで行う。
すなわち、図3の左の図における行列Aのブロック領域を、図3右の作業領域Uにコピーし、当該ブロック領域を前半更新部分と後半更新部分とに分けて、再帰的に処理する。図4A〜図4Cは、再帰的な処理の様子を示している。今、図4Aの斜線部分を更新したとすると、次に、図4Bの斜線部分を更新し、更に、図4Cの斜線部分を更新する。このように、前半部分と後半部分とに分けて更新する仕方を入れ子状に適用する。すなわち、再帰的プログラムが深さ2まで呼ばれると、最初の前半処理で図4Aの斜線部分をBとして更新し、次に、図4Bの斜線部分、最後に図4Cの斜線部分が更新される。更新時の並列化は更新部分ブロック行列を行ベクトル方向に均等に分割して、各部分の更新をプロセッサで均等に分割した領域に対して並列して行う。
図5〜図7は、本発明の実施形態に従った並列処理方法を説明する図である。
1)行列ベクトル積を下三角部分のみを使って1つのアクセス(ロード)で 2倍の演算を行ない、各CPUで均等に行なう方法
図5に示されるように、下三角行列部分のみを利用して行列ベクトル積を計算する。行列ベクトル積で使う行列の大きさをN×Nとする。4並列で行うとき、下三角部分を4つの部分に分割する位置は、以下のようになる。
im=Nn×(1-sqrt(1-m/#p))
m=1、2、3で計算したものがちょうど境界位置になる。なお、#pは、分割する総数、つまり、並列数である。
nの対称性つまり、An = An t を利用して、各プロセッサで自分の受け持つ領域にある情報から、行列積を計算する。
各部分は対角ブロック行列部分の下三角行列部分Dm と、その下にある長方形の行列Rmとからなる。
下三角行列を#Pに分割した、m 番目の部分を転置したものは、ちょうど上三角部分を行方向に分割したものになっている。この関係から、以下の計算を行なうことができる。
xm1 (im+1:Nn )=Rm ×u1(im-1+1:im) (式1)
xm2 (im-1+1:im )=Rm t ×u1(im+1:Nn) (式2)
xm3 (im-1+1:im )=Dm ×u1(im-1+1:im) (式3 )
xm4 (im-1+1:im )=notdiag(Dmt×u1(im-1+2:im ) (式4 )
(notdiag(X)は、下三角行列Xの対角部分を除いた下三角行列を表す)
Figure 0005110081
この計算で、行列の要素を連続にアクセスしながら、1つの要素のアクセスに対して、vxm1とvxm2の計算を同時に行なうことで、行列ベクトル積の性能を 2倍にすることができる。
式1と式2で同時に計算するプログラム例は以下のようになる。
簡単のためRmを行列n×mの行列、xを長さnのベクトル、xを長さmのベクトル、yを長さmのベクトル、yを長さnのベクトルとする。
=R×y、および、x=Rt ×y をRの参照を共通に行なう。

x1(1:n)=0
do j=1,m
tmp1=y1(j)
sum=0
do i=1,n
tmp2=y2(i)
tmp=R(i,j)
x1(i)=x1(i)+tmp*tmp1
sum=sum+tmp*tmp2
enddo
x2(j)=sum
enddo
この場合、x1やy2はデータ量が小さく、かつ、繰り返しアクセスされるので、キャッシュに保持され、高速にアクセスできる。R(i,j)のアクセスに比べ、演算はほとんど無視できるほど速いので、別々に行列ベクトル積を行なう場合に比べて約2倍の性能になる。
(*)分割の境界を計算する式、im = Nn ×(1-qsrt(1-m/#p))は次のように求めることができる。
各CPU での演算数が等しい。つまり、要素数に比例する行列の対応部分の面積(あるいは要素数そのもの)が等しいと考える。
n 2-( Nn - im )2=Nn 2×m/#p,r=im /Nn と置いて計算する。
2 −2r=m/#p , この根の0<= r<=1 をとる。
(r−1)2=m/#p
r=1−sqrt(1-m/#p) ( 根の範囲より小さい方を採用する。)
2)更新部分の並列化および対角ブロック部分の計算方法
step5の更新部分は対称性を利用して下半分を計算する。更新の演算量が各CPU(スレッド) で、均等化するように、分割する。分割方法は行列ベクトル積で分割したのと同じ方法で行なう。
行列ベクトル積で使う行列の大きさをNn ×Nn とする。4 並列で行なうとき、下三角部分を 4つの部分に分割する位置は以下のようになる。
i m = Nn ×(1-qsrt(1-m/#p)) m=1,2,3 で計算したものがちょうど境界の位置になる。#pは、分割する総数、つま並列数である。
このように、CPUごとに分割された領域は、対角ブロック行列部分とその下の長方行列部分に分かれる。図6は、配列An+iをCPUごとに分割した様子を示している。長方行列部分は、普通の行列積で
An+k =An −Uk Wk t −WkUk t から、対応部分を計算する。
対角ブロック行列部分の更新は、図7のように行なう。すなわち、対角ブロックの下三角部分について、対角線の2等分点を決める。この等分点から、行方向、及び、列方向に下三角行列を分割する。矩形部分は、行列積で更新する。2つの大きさが半分の下三角行列ができるので、これらに関して、同じく対角線上の等分点を決め、同様に列方向、行方向に分割する。そして、対象となる下三角行列の大きさが十分小さくなったら、上三角行列も一緒に行列積で計算する。これらは、簡単な再帰プログラムで作ることが出来る。
以上の並列処理方法により、高性能かつスケーラビリティのある実対称行列の三重対角化を実現できる。以上の方法は、従来の方法に比べて2倍超の性能であることがわかった。
図8〜図11は、本発明の実施形態の並列処理方法をより詳しく説明する図である。
ブロック化された三重対角化演算においては、以下のような処理を行う。
1)三重対角化でブロックごとに、三重対角化を行う。上のブロックを三重対角化し、その三重対角化で生成された行列U およびW を使って、ブロック幅分縮小された正方行列( この下三角行列は、図8において、太い点線で表示) を更新する。ただし、この正方行列は対称行列なので、下三角行列部分( 太い点線で囲んだ三角形部分) のみ更新して上三角行列部分のデータとして利用する。
2)ブロックごとの三重対角化では、ブロック内の太線で示した正方行列(An+1:太線で囲んだ正方行列) に関する行列ベクトル積を計算する必要がある。この計算で、正方行列の大きさは1ずつ小さくなっていく。この部分も対称行列なので、下三角行列部分を使って計算する。
これらの計算が計算の中での演算コストが大きい。並列処理で効果を引き出すには以下の点の考慮が必要である。
・メモリアクセスが遅いスカラ計算機で行列ベクトル積の計算を行うとき、ほとんどがメモリアクセスの時間である。このた、メモリアクセスのコストを削減することがポイントである。
・行列の対称性を利用して、下三角行列部分を使うとき、並列処理の観点から負荷分散が均等であることが望ましい。
そこで、以下のような構成を有するプログラムを用意する。
図9は、本発明の実施形態に従ったプログラムの機能ブロック図である。
ブロック三重対角制御部15は、ブロック部分の三重対角化部16と、更新部19からなる。三重対角化部16は、各スレッドが担当する下三角行列の2次元目の区間を決める行列ベクトル積の負荷制御部17を備え、負荷制御部17は、ブロック対角行列の下三角部分とその下の長方形行列で計算を行う行列ベクトル積並列計算部18を備える。また、更新部19は、各スレッドが担当する下三角行列の2次元目の区間を決める行列積による演算の負荷制御部20を備える。負荷制御部20は、更に、ブロック対角部分を除く更新を行うブロック更新部21とブロックの細分化の制御を行うブロック対角部の下三角行列部の更新制御部22からなり、更新制御部22は、ブロック対角行列を細分化して下三角行列を細かい正方行列で近似して計算する計算部23を備える。
図10は、下三角行列(繰り返しごとに大きさが1ずつ小さくなる)から、行列ベクトル積を計算する処理を説明する図である。
ここでは、V(nptr:n) = A(nptr:n, nptr:n) * U(nptr:n)の計算をする。ここで、nptrは、下三角行列の左端、nは、行列の右端、msは、各スレッドの受け持つ始点、meは、各スレッドの受け持つ終点を示す値である。
配列として、V(*,i)、U(*,i)、vsum(1:n,numthrd)と、shared属性の全体行列Aを確保する。そして、以下の処理を行う。
1)vsum(nptr:n,nothrd)=0と各スレッドで0クリアする。
2)以下の2つの計算をL2の列方向へ、図10のL2の中の矢印のように参照しながら同時に計算する。後に説明するmatvec1のフローを参照されたい。
vsum(me+1:n)=L2*U(ms:me)
vsum(ms:me)=L2t*U(me+1:n)
3)L1を使ってブロック対角部分を同様に計算する。
vsum(ms:me)=vsum(ms:me)+L1*U(ms:me)+ND(L1)t*U(ms:me,i)
(ここで、ND(L1)は、L1の対角要素に0とした下三角行列)
4)nptr:nをスレッドごとに均等分割した区間を作る。isを始点、ieを終点とする。計算終了をバリア同期をとって確認し、各スレッドで並列計算する。
V(is:ie,i)=Σvsum(is:ie,nothrd)
nothrd=1〜numthrd
(nothrdは、スレッド番号1〜numthrdの値を取る。numthrdは、総スレッド数。)
図11は、更新部の処理を説明する図である。
A(nptr:n,nptr:n)の下三角行列部分を以下の式で更新する。
A(nptr:n,nptr:n)=A(nptr:n,nptr:n)-U(nptr:n,1:blk)*W(nptr:n,1:blk)t-W(nptr:n,1:blk)*U(nptr:n,1:blk)t
ここで、nptrは、下三角行列の左端、blkは、ブロック幅、nは、行列の右端、msは、各スレッドの受け持つ始点、meは、各スレッドの受け持つ終点である。
L1を、底辺と垂線の中点を求めて、L11、L12、L22に分割する。更に、L11、L22を同様に、中点を求めて分割し、下三角行列を正方行列の集合に分割する。これを繰り返す。ブロック対角行列が十分小さくなったら、一般の行列の行列積で計算する。これは、再帰プログラムで実現する。(詳細は、サブルーチンltgemmtrtのフローを参照。)
図12〜図20は、本発明の実施形態に従った処理のフローである。
図12は、実対称行列を三重対角化するサブルーチンtridのフローである。このサブルーチンでは、shared配列A(k,n)、diad(n)、及び、sdiag(n)を入力とする。diag、sdiagは、計算した三重対角行列の対角要素、副対角要素を出力として返却するための配列である。
ステップS10において、作業域U(n+1,iblk)、v(n+1,iblk)をルーチン内部で確保し、shared属性で利用する。ステップS11において、スレッドを生成する。各スレッドでローカル域numthrに総スレッド数、nothrdに各スレッドに割り振られたスレッド番号を設定し、各スレッドで、iblkにブロック幅、nb=(n-2+iblk-1)/iblk、nbase=0、i=1を設定する。ステップS12において、i>nb-1か否かを判断する。ステップS12の判断がYesの場合には、ステップS18に進む。ステップS12の判断がNoの場合には、ステップS13において、nbase=(i-1)*iblk, istart=1、 nwidth=iblkを設定する。ステップS14において、作業領域Uにブロック三重対角化の対象領域をコピーする。すなわち、U(nbase+1:n,1:iblk)←A(nbase+1:n,nbase+1:nbase+iblk)とする。ステップS15において、サブルーチンblktridを呼び出し、Uにコピーした部分の三重対角化を行う(istart=1、ブロック幅はiblkを受け渡す)。ステップS16において、三重対角化されたものを配列Aに戻す。すなわち、A(nbase+1:n,nbase+1:nbase+iblk)←U(nbase+1:n,1:iblk)とする。ステップS17において、サブルーチンupdateを呼び出し、A(nbase+iblk:n,nbase+iblk:n)の下三角部分を更新する。そして、ステップS12に戻る。
ステップS18では、nbase=(nb-1)*iblk、istart=1、iblk2=n-nbaseと設定する。ステップS19において、作業領域Uにブロック三重対角化の対象領域をコピーする。すなわち、U(nbase+1:n,1:nwidth)←A(nbase+1:n,nbase+1:n)とする。ステップS20において、サブルーチンblktridを呼び出し、Uにコピーした部分の三重対角化を行う(istart=1、ブロック幅はiblk2を受け渡す)。ステップS21において、三重対角化されたものを配列Aに戻す。すなわち、A(nbase+1:n,nbase+1:n)←U(nbase+1:n,1:width)とする。ステップS22において、並列処理のために生成したスレッドを消し、このサブルーチンを抜ける。
図13は、サブルーチンblktridのフローである。
このサブルーチンは、再帰的プログラムである。呼び出すプログラム文は、subroutine blktrid ( A ,k ,n ,diag ,sdiag ,nbase ,istart ,nwidth ,U ,V
,nothrd ,numthrd )のようにする。ここで、nbaseは、ブロックの位置を示すオフセット、istartは、再帰呼び出しで対象となる縮小されたブロックのブロック内でのオフセットで、最初は1で、再帰的に呼び出されるとき、対象ブロックの位置を示す。nwidthは、ブロック幅をあらわす。
ステップS25において、nwidth<10か否かを判断する。ステップS25の判断がYesの場合には、ステップS26において、サブルーチンbtunitを呼び出し、三重対角化を行い、サブルーチンを抜ける。ステップS25の判断がNoの場合には、ステップS27において、再帰呼び出しのために、対象となる更新位置とブロック幅を変えて呼び出す。istart2=istart、nwidth2=nwidth/2を設定し、受け渡す。縮小されたブロックの開始位置、ブロック幅を受け渡す。ステップS28において、サブルーチンblktridを再帰的に呼び出す。ステップS29において、スレッド間でバリア同期を取る。ステップS30において、更新で各スレッドが分担する始点(is2,is3)、終点(ie2,ie3)を計算する。すなわち、以下の計算をする。
istart3=istart+nwidth/2、nwidth3=nwidth-nwidth/2,
is2=istart2, ie2=istart+nwidth2-1, is3=istart3, ie3=istart3+nwidth3-1,
iptr=nbase+istart3, ぇん(n-iptr+numthrd-1)/numthrd,
is=iptr+(nothrd-1)*len+1、 ie=min(n,iptr+nothrd*len)
ステップS31において、U(is:ie,is3:ie3)=U(is:ie,is3:ie3)-U(is:ie,is2:ie2)*W(is3:ie3,is2:ie2)t-W(is:ie,is2:ie2)*U(is3:ie3,is2:ie2)tとする。
ステップS32において、スレッド間でバリア同期を取り、ステップS33において、サブルーチンblktridを再帰的に呼び出して、このサブルーチンを抜ける。
図14は、サブルーチンbtunitのフローである。
このサブルーチンの呼び出しは、btunit(A, k, n, diag, sdiag, nbase, istart, nwidth, U, V, nothrd, numthrd)とする。なお、以下で、tmpという配列は、計算用一時配列である。ステップS35において、tmp(numthrd)、sigma、alphaをshared属性で割り付ける。ステップS36において、nbase+istart>n-2であるか否かを判断する。ステップS36の判断がYesの場合には、このサブルーチンを抜ける。ステップS36の判断がNoの場合には、ステップS37において、i=istartとし、ステップS38において、i<=istart-1+nwidthか否かを判断する。ステップS38の判断がNoの場合には、このサブルーチンを抜ける。ステップS38の判断がYesの場合には、ステップS39において、各スレッドで分担する始点(is)、終点(ie)を計算する。すなわち、以下を計算する。
iptr2=nbase+i、len=(n-iptr2+numthrd-1)/numthrd、
is=iptr2+(nothrd-1)*len+1、ie=min(n,iptr2+nothrd*len)
ステップS40において、バリア同期を取る。ステップS41において、tmp(nothrd)=U(is:ie,i)t*U(is:ie,i)とし、ステップS42で、バリア同期を取る。ステップS43において、nothrd=1であるか否かを判断する。ステップS43の判断がNoのときは、ステップS45に進む。ステップS43の判断がYesの場合には、ステップS44において、各スレッドで部分計算したデータの和の平方根をとり、三重対角化のための計算を行う(ハウスホルダーベクトルの作成)。すなわち、以下の計算を行う。なお、sumは、和をあらわし、sqrtは、平方根をあらわす。
sigma=sqrt(sum(tmp(1:numthrd)))
diag(iptr2)=u(iptr2,i), sdiag(iptr2)=-sigma,
U(nbase+i+1,i)=U(nbase+1,i)+sign(u(nbase+i+1,i)*sigma
alpha=1.0/(sigma*u(nbase+i+1,i), U(iptr2,i)=alpha
ステップS45では、バリア同期を取る。ステップS46において、iptr3=iptr2+1とする。ステップS47において、A, V, U, n, k, I, iptr3, is, ie, nothrd, numthrdを受け渡して、サブルーチンmatvecを呼び出す。すなわち、A(iptr3:n,iptr3:n)の下三角行列からV=A*Uの計算を行う。ステップS48において、バリア同期を取る。ステップS49において、以下の計算をする。
V(is:ie,i)= alpha*(V(is:ie,i)-V(is:ie,1:i-1)*(U(iptr3:n, 1:i-1)t * U(iptr3:n, i))-U(is:ie, 1:i-1)*(V(iptr3:n, 1:i-1)t*U(iptr3:n,i)))
ステップS50において、バリア同期を取る。ステップS51において、tmp(nothrd)=V(is:ie,i)t*U(is:ie,i)とし、ステップS52において、バリア同期を取る。ステップS53において、nothrd=1であるか否かを判断する。ステップS53の判断がNoの場合には、ステップS55に進む。ステップS53の判断がYesの場合には、ステップS54において、beta=0.5*alpha*sum(tmp(1:numthrd))とする。ここで、sumは、ベクトルの和である。ステップS55で、バリア同期を取り、ステップS56において、V(is:ie,i)=V(is:ie,i)-beta*U(is:ie,i)とし、ステップS57において、バリア同期を取る。ステップS59において、ptr2<n-2であるか否かを判断する。ステップS59の判断がYesの場合には、ステップS60において、U(is:ie, i+1)=U(is:ie, i+1)- U(is:ie, istart:i)*V(i+1, istart:i)t- V(is:ie, istart:i)*U(n+1, istart:i)tを計算し、ステップS38に戻る。ステップS59の判断がNoの場合には、ステップS61において、、U(is:ie, i+1:i+2)=U(is:ie, i+1:i+2)- U(is:ie, istart:i)*V(i+1:n, istart:i)t- V(is:ie, istart:i)*U(n+1:n, istart:i)tを計算し、サブルーチンを抜ける。
図16は、サブルーチンmatvecのフローである。
引数は、A, V, U, n, k, I, is, ie, iptr3, nothrd, numthrdである。ステップS65において、vsum(n,numthrd)をshared属性で確保する。ステップS66において、各スレッドでvsum(iptr3:n,nothrd)=0と初期化する。制御部では、行列ベクトル積を各スレッドで分担計算するために、下三角行列A(iptr3:n, iptr3:n)を各スレッドで分担する区間を計算する。すなわち、以下の計算をする。
nn=n-iptr3+1,
xleft=1.0-dble(nothrd-1)/dble(numthrd),
xright=1.0-dble(nothrd)/dble(numthrd),
ms=nbase2+nn*(1.0-dqsrt(xleft))+1,
me=nbase2+nn*(1.0-dsqrt(xright))
ステップS68において、matvec1を呼び出す。下三角行列の2次元目の範囲が始点ms、終点meの対角行列部分の下のA(me+1:n, ms:me)から各スレッドで
vsum(ms:me, nothrd)=A(me+1:n, ms:me)t*U(me+1:n,i)
vsum(ne+1:n,nothrd)=A(me+1:n,ms:me)*U(ms:me)
を計算する。引数は、A, vsum, U, I, ms, me, is, ie, nothrd, numthrdである。
ステップS69において、matvec2を呼び出す。下三角行列の2次元目の範囲が始点ms、終点meの対角行列部分の下三角行列から各スレッドで
vsum(ms:me)=vsum(ms:me)+LOW(A(ms:me, ms:me))*U(ms:me,i)
+NDLOW(A(ms:me, ms:me))t*U(ms:me,i)
を計算する。
LOWは、対角要素を含む下三角行列部分であり、NDLOWは、対角要素を0とした下三角行列部分である。引数は、A, vsum, U, I, ms, me, is, ie, nothrd, numthrdである。
ステップS70において、バリア同期を取り、ステップS71において、
Figure 0005110081
を計算し、このサブルーチンを抜ける。
図17は、サブルーチンmatvec1のフローである。
ステップS75において、k2=msとする。ステップS76において、k2<=meであるか否かを判断する。ステップS76の判断がNoの場合には、このサブルーチンを抜ける。ステップS76の判断がYesの場合には、ステップS77において、k1=me+1, sum=0.0, tmp1=U(k2,i)とする。ステップS78において、k1<=nであるか否かを判断する。ステップS78の判断がYesの場合には、ステップS79において、tmp2=U(k1,i)、tmp=A(k1,k2)(Aの要素の1回のロードで2回演算する)、vsum(k1)=vsum(k1)+tmp*tmp1、sum=sum+tmp*tmp2、k1=k1+1とし、ステップS78に戻る。ステップS78の判断がNoの場合には、ステップS80において、vsum(k2)=sum、k2=k2+1とし、ステップS76に戻る。
図18は、サブルーチンmatvec2のフローである。
ステップS85において、k2=msとする。ステップS86において、k2<=meであるか否かを判断する。ステップS86の判断がNoの場合には、このサブルーチンを抜ける。ステップS86の判断がYesの場合には、ステップS87において、k1=k2+1、tmp1=U(k2,i)、tmpz=A(k2,k2)、sum=tmp1*tmpzとする。ステップS88において、k1<=meであるか否かを判断する。ステップS88の判断がYesの場合には、ステップS89において、tmp2=U(k1,i)、tmp=A(k1,k2)(1回のロードで2回計算する)、vsum(k1)=vsum(k1)+tmp*tmp1、sum=sum+tmp*tmp2、k1=k1+1として、ステップS88に戻る。ステップS88の判断がNoの場合には、ステップS90において、vsum(k2)=vsum(k2)+sum、k2=k2+1として、ステップS86に戻る。
図19は、サブルーチンupdateのフローである。
ステップS95において、スレッド間でバリア同期を取る。ステップS96は負荷の制御部で行う。ステップS96においては、各スレッドでペアをつくり、更新を分担する始点、終点を決める。すなわち、以下の演算を行う。
nbase2=nbase+iblk,
nn=n-nbase2,
xleft=1.0-dble(nothrd-1)/dble(numthrd),
xright=1.0-dble(nothrd)/dble(numthrd),
is=nbase2+nn*(1.0-dqsrt(xleft))+1,
ie=nbase2+nn*(1.0-dsqrt(xright))
ステップS97においては、以下を計算する。
A(ie+1:n, is;ie1)=A(ie+1:n, is:ie)-W(ie+1:n, 1:blk)*U(is:ie, 1:blk)t-U(ie+1:n, 1:blk)*W(is:ie, 1:blk)t
ステップS98において、下三角行列部の更新(A=A-W*Ut)を行う。サブルーチンltgemmtrtを呼び出し、対角ブロック行列の下三角行列部分を更新する。引数として、W(is:ie, 1:blk), U(is:ie, 1:blk), A(is:ie, is:ie)及び対角ブロック行列の大きさlen=ie-is+1を渡す。
ステップS99において、下三角行列部の更新(A=A-U*Wt)を行う。サブルーチンltgemmtrtを呼び出し、対角ブロック行列の下三角行列部分を更新する。引数として、U(is:ie, 1:blk), W(is:ie, 1:blk), A(is:ie, is:ie)及び対角ブロック行列の大きさlen=ie-is+1を渡す。すなわち、UとWを入れ替えて呼び出す。
ステップS100において、スレッド間でバリア同期を取り、このサブルーチンを抜ける。
図20は、サブルーチンltgemmtrtのフローである。
このサブルーチンは、対角行列の下三角行列部分の更新を行うもので、再帰的プログラムとして呼び出される。引数としては、W(is:ie, 1:blk), U(is:ie, 1:blk), A(is:ie, is:ie)をW(len,blk), U(len, blk), A(len, len)として受け取る。lenは、行列の大きさである。ブロックをどんどん小さく分割していく際にブロックが所定の最小値まで小さくなったら、ブロックをそれ以上小さく分割する処理をやめる。たとえば、ここでは、ブロックの最小値をnwc=8と設定しておく。ステップS105において、len<=nwcであるか否かを判断する。ステップS105の判断がYesの場合には、ステップS106において、A(len, len)=A(len, len)-W(len, blk)*U(len, blk)tを計算し、このサブルーチンを抜ける。ステップS105の判断がNoの場合には、ステップS107において、len1=len/2、len2=len-len1、nptr=len1+1とし、ステップS108において、サブルーチンltgemmtrtを呼び出し、対角ブロック行列の下三角行列部分を更新する。このとき、引数として、U(1:len1, 1:blk), W(1:len, 1:blk), A(1:len, 1:len1)及び、対角ブロック行列の大きさlen1を渡す。
ステップS109において、A(nptr:len, 1:len2)=A(nptr:len, 1:len2)-W(nptr:len, blk)*U(1:len2, blk)tを計算する。ステップS110において、len1=len2であるか否かを判断する。ステップS110の判断がYesの場合には、ステップS111において、len3=len2、nptr2=nptrとし、ステップS113に進む。ステップS110の判断がNoの場合には、ステップS112において、len3=len1、nptr2=nptr+1とし、ステップS113に進む。ステップS113では、サブルーチンltgemmtrtを呼び出し、対角ブロック行列の下三角行列部分を更新する。引数としては、U(nptr2:len, 1:blk), W(nptr2:len, 1:blk), A(nptr2:len, nptr2:len)と対角ブロックの大きさlen3を渡す。そして、ステップS113の後、このサブルーチンを抜ける。

Claims (2)

  1. 共有メモリ型スカラ並列計算機において、n×nなる実対称行列Aの三重対角化をブロック化した方法で行う方法であって、
    実対称行列を2次元配列に格納した場所に下三角行列部分だけを格納し、
    該実対称行列を幅iblkを持つ列ブロックごとに分割し、
    列ブロックごとに三重対角化を行うブロックの三重対角化部分と、三重対角化を行うときに生成されたブロック幅iblkの本数のベクトルを連結したブロック行列U,Wを使ってUW T とWU T を計算して三重対角化が完了したm番目の列ブロックまでを取り除いた残りのA(m*iblk+1:n,m*iblk+1:n)なる部分実対称行列の下三角行列を更新し、
    次の列ブロックの三重対角化を行うことを繰り返して、行列全体の三重対角化を行い、
    m番目の列ブロックに対する三重対角化部分で三重対角化を該列ブロックにあるi列に対して順次行うとき、i+1列を最左端列に持つ部分実対称正方行列A(i+1:n,i+1:n)とベクトルとの行列ベクトル積を行う場合に、A(i+1:n,i+1:n)の下三角行列を列方向に分割して各CPUに割り当てて該行列ベクトル積を並列に計算し、
    各CPUで、割り付けられた部分の行列の要素a(s,t)を順次取り出してこの値を使って、行列ベクトル積を行う場合、対角要素以外は対称なa(t,s)に対する行列ベクトル積の積を同じ値を使って、ベクトルの対応する要素と演算を行い、
    結果を最初にゼロクリアされた一次元配列の対応位置にそれぞれ加え、
    行列ベクトル積の各CPUでの並列計算の後、それぞれのCPUで計算した中間結果を加え合わせ、
    部分行列A(i+1:n,i+1:n)の下三角行列を列方向に分割して各CPUに割り当てるとき、A(i+1:n,i+1:n)が十分大きなとき、各CPUに割り当てられた下三角行列の要素数がおおよそ等しくなるように列方向に分割し、行列の列を各CPUに割り当てる、
    ことを特徴とする方法。
  2. 列ブロックの三重対角化の処理の後ごとに行う更新部分に関しては、UW T ,WU T を計算して該更新部分から引くことで更新を行い、
    更新を行う下三角部分行列の更新に関して、この行列が十分大きなとき、各CPUに更新する要素数がおおよそ等しくなるようにこの下三角行列を列方向に分割して各CPUに割り当て、
    各CPUに割り当てられた、列を束ねたブロックが、対角ブロック部分が下三角行列と、その下の部分の長方形の部分に分かれる場合に、長方形の部分は行列積で計算し、
    対角ブロック部分の下三角行列部分は、対角ブロックの対角要素のほぼ中央で、対角ブロックを列方向、行方向に、もとの下三角行列の1/4の大きさの2つの下三角行列と長方形の行列部分に分割して3つの部分に分け、
    このように分割してできた下三角行列に対して、該分割を再帰的に適用して、生成された下三角行列が十分小さくなるまで繰り返して、長方形部分は行列積で更新し、対角要素を含む小さな下三角行列はこれと対称な位置関係にある上三角部分も合わせた正方行列を行列積で計算して更新する、
    ことを特徴とする請求項1に記載の方法。
JP2009512784A 2007-04-19 2007-04-19 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法 Active JP5110081B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2007/000424 WO2008136045A1 (ja) 2007-04-19 2007-04-19 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法

Publications (2)

Publication Number Publication Date
JPWO2008136045A1 JPWO2008136045A1 (ja) 2010-07-29
JP5110081B2 true JP5110081B2 (ja) 2012-12-26

Family

ID=39943170

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009512784A Active JP5110081B2 (ja) 2007-04-19 2007-04-19 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法

Country Status (3)

Country Link
US (1) US8527569B2 (ja)
JP (1) JP5110081B2 (ja)
WO (1) WO2008136045A1 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9262799B2 (en) * 2013-11-08 2016-02-16 Silicon Graphics International Corp. Shared memory eigensolver
JP6503902B2 (ja) 2015-06-02 2019-04-24 富士通株式会社 並列計算機システム、並列計算方法及びプログラム
JP6610350B2 (ja) * 2016-03-11 2019-11-27 富士通株式会社 計算機、行列分解方法、及び行列分解プログラム
JP6907700B2 (ja) * 2017-05-23 2021-07-21 富士通株式会社 情報処理装置、マルチスレッド行列演算方法、およびマルチスレッド行列演算プログラム
CN109766515B (zh) * 2018-12-26 2023-04-14 上海思朗科技有限公司 矩阵分解处理装置及方法
US11562239B2 (en) * 2019-05-23 2023-01-24 Google Llc Optimizing sparse graph neural networks for dense hardware
CN113704691B (zh) * 2021-08-26 2023-04-25 中国科学院软件研究所 一种申威众核处理器的小规模对称矩阵并行三对角化方法
WO2023206074A1 (zh) * 2022-04-26 2023-11-02 浙江凌迪数字科技有公司 一种对称矩阵与向量相乘的并行计算方法及其***
WO2024122067A1 (ja) * 2022-12-09 2024-06-13 日本電信電話株式会社 ハッシュ値計算装置、ハッシュ値計算方法及びプログラム

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004005528A (ja) * 2002-03-29 2004-01-08 Fujitsu Ltd 共有メモリ型スカラ並列計算機用固有値問題の並列処理方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5790598A (en) * 1996-03-01 1998-08-04 Her Majesty The Queen In Right Of Canada Block decision feedback equalizer
JP3639206B2 (ja) * 2000-11-24 2005-04-20 富士通株式会社 共有メモリ型スカラ並列計算機における並列行列処理方法、及び記録媒体
US20030182518A1 (en) * 2002-03-22 2003-09-25 Fujitsu Limited Parallel processing method for inverse matrix for shared memory type scalar parallel computer
JP3983188B2 (ja) * 2002-03-22 2007-09-26 富士通株式会社 共有メモリ型スカラ並列計算機用逆行列の並列処理方法
US20030187898A1 (en) * 2002-03-29 2003-10-02 Fujitsu Limited Parallel processing method of an eigenvalue problem for a shared-memory type scalar parallel computer
JP4448784B2 (ja) * 2005-03-15 2010-04-14 株式会社日立製作所 並列計算機の同期方法及びプログラム

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004005528A (ja) * 2002-03-29 2004-01-08 Fujitsu Ltd 共有メモリ型スカラ並列計算機用固有値問題の並列処理方法

Also Published As

Publication number Publication date
WO2008136045A1 (ja) 2008-11-13
US20090319592A1 (en) 2009-12-24
US8527569B2 (en) 2013-09-03
JPWO2008136045A1 (ja) 2010-07-29

Similar Documents

Publication Publication Date Title
JP5110081B2 (ja) 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法
US11386644B2 (en) Image preprocessing for generalized image processing
KR102175044B1 (ko) 인공 신경망 역방향 트레이닝 실행용 장치와 방법
US10489703B2 (en) Memory efficiency for convolutional neural networks operating on graphics processing units
KR102203746B1 (ko) 인공 신경망 정방향 연산 실행용 장치와 방법
JP6956796B2 (ja) 演算回路、演算方法、およびプログラム
Ballard et al. Parallel nonnegative CP decomposition of dense tensors
US8214818B2 (en) Method and apparatus to achieve maximum outer level parallelism of a loop
Eswar et al. PLANC: Parallel low-rank approximation with nonnegativity constraints
Li On parallel solution of sparse triangular linear systems in CUDA
US7483937B2 (en) Parallel processing method for inverse matrix for shared memory type scalar parallel computer
Myllykoski et al. Task‐based, GPU‐accelerated and robust library for solving dense nonsymmetric eigenvalue problems
US20030187898A1 (en) Parallel processing method of an eigenvalue problem for a shared-memory type scalar parallel computer
US20180349321A1 (en) Parallel processing apparatus, parallel operation method, and parallel operation program
Abdelfattah et al. Progressive optimization of batched LU factorization on GPUs
Perepelkina et al. The DiamondCandy LRnLA algorithm: raising efficiency of the 3D cross-stencil schemes
JP2012221254A (ja) 並列処理最適化装置及びシミュレーションプログラム
Bylina et al. The parallel tiled WZ factorization algorithm for multicore architectures
US9600446B2 (en) Parallel multicolor incomplete LU factorization preconditioning processor and method of use thereof
Jung et al. Accelerating implicit integration in multi-body dynamics using GPU computing
Seznec et al. Real-time optical flow processing on embedded GPU: an hardware-aware algorithm to implementation strategy
JP4037303B2 (ja) 共有メモリ型スカラ並列計算機用固有値問題の並列処理方法
Kapllani et al. A multistep scheme to solve backward stochastic differential equations for option pricing on GPUs
Jammer et al. Solving ARGESIM Benchmark CP2'Parallel and Distributed Simulation'with Open MPI/GSL and Matlab PCT-Monte Carlo and PDE Case Studies.
Tokura et al. Gpu-accelerated bulk computation of the eigenvalue problem for many small real non-symmetric matrices

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120515

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120717

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120911

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120924

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20151019

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Ref document number: 5110081

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150