【文献】
田邊昇ほか,長行を折畳む疎行列ベクトル積方式とGather機能付メモリによる高速化,情報処理学会論文誌 論文誌トランザクション 2012(平成24)年度▲1▼ [CD−ROM],日本,一般社団法人情報処理学会,2012年10月15日,第5巻 第4号,112−124ページ
【文献】
福原敏行ほか,Localized IC分解と多色順序付けを併用したハイブリッド型並列ICCG法に関する検討,情報処理学会研究報告 平成21年度▲4▼ [CD−ROM],日本,社団法人情報処理学会,2009年12月15日,No.122,1−8ページ
(58)【調査した分野】(Int.Cl.,DB名)
処理の実行単位となる複数のプロセスを並列に実行可能な複数の演算部を有し、係数行列として疎行列を含む行列方程式の演算に関する処理を実行する並列処理装置であって、
前記疎行列の各行に含まれる非ゼロ成分の多さを判定するための閾値が格納される記憶部と、
前記疎行列の中で前記閾値より非ゼロ成分の数が大きい第1の行を特定し、当該第1の行を複数の第2の行に分割して前記疎行列を拡大し、拡大した前記疎行列のうち、前記第2の行の集合を複数の第1の行群に分け、前記第2の行以外の第3の行の集合を複数の第2の行群に分け、前記第1の行群毎および前記第2の行群毎に、前記プロセスを割り当てる前記演算部と
を有する、並列処理装置。
【発明を実施するための形態】
【0014】
以下に添付図面を参照しながら、本発明の実施形態について説明する。なお、本明細書及び図面において実質的に同一の機能を有する要素については、同一の符号を付することにより重複説明を省略する場合がある。
【0015】
<1.第1実施形態>
図1を参照しながら、第1実施形態について説明する。
図1は、第1実施形態に係る並列処理装置の一例を示した図である。なお、
図1に示した並列処理装置10は、第1実施形態に係る並列処理装置の一例である。
【0016】
第1実施形態は、係数行列が疎行列になる行列方程式の求解問題を解く方法に関し、それぞれが演算の実行単位となる複数のプロセスを係数行列の部分領域に割り当てて並列に実行することで効率的に問題を処理する並列処理方法を提供する。
【0017】
係数行列に含まれる非ゼロ成分のパターン(非ゼロパターン)によっては、ある一定の並列数を超えると、並列数を増加させても処理速度が向上しない状況になりうる。つまり、並列処理のスケーラビリティが低くなる非ゼロパターンが存在する。第1実施形態は、このような非ゼロパターンを有する係数行列を扱う場合であっても並列処理のスケーラビリティを向上できるようにする技術を提供する。
【0018】
図1に示すように、並列処理装置10は、記憶部11及び演算部12A、…、12Fを有する。なお、説明の都合上、演算部の数を6個(演算部12A、…、12F)としているが、演算部の数は2以上の任意の数でよい。また、並列処理装置10は1つのコンピュータ又は1つの筐体に含まれるコンピュータの集合であってもよいし、複数のコンピュータを通信回線で接続した分散処理システムであってもよい。
【0019】
記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置、或いは、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置である。演算部12A、…、12Fは、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。また、演算部12A、…、12Fの一部は、GPGPU(General-Purpose computing on Graphics Processing Units)などのプロセッサであってもよい。演算部12A、…、12Fは、記憶部11又は他のメモリに記憶されたプログラムを実行する。
【0020】
演算部12A、…、12Fは、複数のプロセスを並列に実行することができる。ここで言うプロセスは演算処理の実行単位である。例えば、演算部12A、…、12Fは、プロセスP1、…、P6を並列に実行可能である。
図1の例は、係数行列Aを含む行列方程式の演算に関する処理を並列処理装置10で実行する様子を示している。係数行列Aは、非ゼロ成分が少なく、多くのゼロ成分を含む疎行列である(
図1(B)参照)。
【0021】
図1(A)に例示した有限要素モデルを考える場合、節点番号21〜32が付与された節点の接続関係に基づく非ゼロパターンは、
図1(B)の係数行列Aのうち最下行及び最右列以外の領域に示した非ゼロ成分の配置パターンとなる。
【0022】
例えば、構造解析の場合、各節点に変位ベクトルや内力ベクトルが割り当てられ、節点毎に未知数が設定される。この設定により、節点を基準に構造物(連続体)を離散化することで、偏微分方程式で与えられる物理量の振る舞いが離散的な行列方程式で記述される。偏微分方程式を解く際に境界条件を設定するように、行列方程式を解く際にも拘束条件(一部の節点に設定した物理量を既知数に設定する条件)が追加される。
【0023】
上記の拘束条件は、係数行列Aに非ゼロ成分を多く含む行及び列を与える(
図1(B)の係数行列Aのうち最下行及び最右列を参照)。そのため、
図1(B)に例示した非ゼロパターンの係数行列Aを複数の行群に分け、各行群にプロセスを割り当てた場合、担当する非ゼロ成分の数(処理負荷に相当)が他のプロセスに比べて大幅に多くなるプロセスが生じうる。プロセスの数を増やし、係数行列Aの分割数を増加させた場合、処理負荷の偏りが拡大する。このような状況は構造解析に限らず、電磁場解析などでも生じうる。
【0024】
上記のような処理負荷の偏りを是正するため、並列処理装置10は、係数行列Aの中で非ゼロ成分が多い行を分割する。そのため、記憶部11には、疎行列の各行に含まれる非ゼロ成分の多さを判定するための閾値THが格納されている。閾値THは、例えば、係数行列Aの行数や、対角成分及びその周辺に存在する非ゼロ成分(バンド領域)がなすバンドの幅などに基づいて予め設定される。
【0025】
例えば、演算部12Aは、疎行列(係数行列A)の中で閾値THより非ゼロ成分の数が大きい第1の行Jを特定する。また、演算部12Aは、
図1(C)に示すように、第1の行Jを複数の第2の行J1、J2に分割して疎行列を拡大する。
図1(C)の例では、最下行及び最右列がそれぞれ1つずつ拡大されている。演算部12Aは、拡大した疎行列(係数行列A)を行群G1、…、G6に分けて、行群毎にプロセスを割り当てる。
【0026】
図1(C)の例では、行群G1、…、G6にそれぞれプロセスP1、…、P6が割り当てられている。演算部12A、…、12Fは、行群G1、…、G6に割り当てられたプロセスP1、…、P6を並列に実行する。例えば、演算部12A、…、12Fは、それぞれプロセスP1、…、P6(行群G1、…、G6に対応する演算処理)を実行する。
【0027】
行列方程式の解法には、例えば、ICCG法などの反復法がある。ICCG法を適用する場合であれば、演算部12A、…、12Fは、それぞれ行群G1、…、G6に対応する行列ベクトル積(行列とベクトルとの積)などの演算処理を実行する。
【0028】
上記のように、非ゼロ成分が多い行を分割し、非ゼロ成分の数に応じて係数行列Aを複数の行群に分けることで、各行群に割り当てられるプロセスの処理負荷をほぼ均等にすることが可能になる。その結果、一部のプロセスが実行する処理が相対的に遅いことで、他のプロセスの処理が滞るリスクが低減される。その結果、処理負荷の偏りに起因するスケーラビリティの制限を抑圧することが可能になる。
【0029】
以上、第1実施形態について説明した。
<2.第2実施形態>
次に、第2実施形態について説明する。第2実施形態は、係数行列が疎行列になる行列方程式の求解問題を解く方法に関し、それぞれが演算の実行単位となる複数のプロセスを係数行列の部分領域に割り当てて並列に実行することで効率的に問題を処理する並列処理方法を提供する。この並列処理方法は、係数行列を適切に分割してプロセス間における処理負荷の偏りを抑制し、並列処理のスケーラビリティを向上させる技術を提供する。
【0030】
[2−1.ハードウェア]
図2及び
図3を参照しながら、第2実施形態に係る並列処理方法を実現することが可能な情報処理装置のハードウェアについて説明する。なお、
図2に示した情報処理装置100及び
図3に示した情報処理装置100a、…、100fは、第2実施形態に係る並列処理方法を実現することが可能な情報処理装置の一例である。
【0031】
図2は、第2実施形態に係るハードウェア(単一装置)の一例を示した図である。
情報処理装置100は、CPU群101、メモリ102、通信インターフェース103、表示インターフェース104、及び機器インターフェース105を有する。CPU群101は、CPU101a、101b、…、101fを含む。CPU101a、101b、…、101f、メモリ102、通信インターフェース103、表示インターフェース104、及び機器インターフェース105はバス106を解して接続されている。CPU群101に含まれるCPUの数は2以上の任意の数でよい。
【0032】
CPU101a、101b、…、101fは、例えば、演算装置又は制御装置として機能し、メモリ102に記録された各種プログラムに基づいてハードウェア要素の動作全般又はその一部を制御する。CPU101a、101b、…、101fは、それぞれ複数のプロセッサコアを有していてもよい。なお、CPU群101には、GPGPUが含まれていてもよい。
【0033】
メモリ102は、CPU101a、101b、…、101fに読み込まれるプログラムや演算に用いられるデータ、そのプログラムを実行する際に変化する各種パラメータなどを一時的又は永続的に保持する記憶装置の一例である。メモリ102は、例えば、RAMなどの揮発性記憶装置、或いは、HDDやフラッシュメモリなどの不揮発性記憶装置である。
【0034】
通信インターフェース103は、ネットワーク201に接続するための通信デバイスである。通信インターフェース103は、例えば、有線又は無線LAN(Local Area Network)用の通信回路や光通信用の通信回路である。ネットワーク201は、有線又は無線により接続されたネットワークであり、例えば、インターネットやLANなどである。
【0035】
表示インターフェース104は、表示装置202に接続するための接続デバイスである。表示装置202は、例えば、CRT(Cathode Ray Tube)、LCD(Liquid Crystal Display)、PDP(Plasma Display Panel)、又はELD(Electro-Luminescence Display)などである。
【0036】
機器インターフェース105は、入力装置203などの外部機器を接続するための接続デバイスである。機器インターフェース105は、例えば、USB(Universal Serial Bus)ポート、IEEE1394ポート、SCSI(Small Computer System Interface)、RS−232Cポートなどである。機器インターフェース105には、着脱可能な記録媒体であるリムーバブル記録媒体(非図示)やプリンタなどの外部機器が接続されうる。リムーバブル記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、又は半導体メモリなどがある。
【0037】
図2のように複数のCPUが搭載された単一の情報処理装置100を利用して第2実施形態に係る演算方法を実現することもできるが、
図3に示すような分散処理システムに第2実施形態の技術を適用することもできる。
図3は、第2実施形態に係るハードウェア(複数装置)の一例を示した図である。
図3の例では、CPU101a、101b、…、101fがそれぞれ情報処理装置100a、100b、…、100fに搭載されている。そして、情報処理装置100a、100b、…、100fは通信回線で接続されている。
【0038】
メモリ102a、102b、…、102fは、上述したメモリ102と同じである。通信インターフェース103a、103b、…、103fは、上述した通信インターフェース103と同じである。説明の都合上、情報処理装置100a、100b、…、100fでは表示インターフェース104及び機器インターフェース105に相当する要素の記載が省略されている。情報処理装置100a、100b、…、100fは、相互に演算結果を送受信しながらCPU101a、101b、…、101fに分散した演算処理を実行することができる分散処理システムとして動作しうる。
【0039】
図2に示した情報処理装置100又は
図3に示した分散処理システムのハードウェアを利用することで、第2実施形態に係る演算方法を実現することができる。なお、
図2及び
図3に示したハードウェアは一例である。例えば、複数のGPGPUや複数のCPUコアを並列に動作させて複数のプロセスを並列実行するシステムに第2実施形態に係る技術を適用することもできる。以下では、説明の都合上、
図2に示した情報処理装置100を利用する例について説明する。
【0040】
以上、ハードウェアについて説明した。
[2−2.機能]
次に、
図4を参照しながら、情報処理装置100の機能について説明する。
図4は、第2実施形態に係る情報処理装置が有する機能の一例を示したブロック図である。
【0041】
図4に示すように、情報処理装置100は、記憶部111、行列拡張部112、プロセス割当部113、及び並列計算部114を有する。
記憶部111の機能は、例えば、メモリ102を利用して実現できる。行列拡張部112及びプロセス割当部113の機能は、例えば、CPU101aの機能を利用して実現できる。並列計算部114の機能は、例えば、CPU群101に含まれる複数のCPU(例えば、CPU101a、…、101fの一部又は全部)を利用して実現できる。
【0042】
記憶部111には、係数行列111a及び閾値111bが格納される。係数行列111aは、演算処理の対象となる行列方程式に含まれる係数行列である。例えば、ベクトルb、x、及び係数行列Aを含む行列方程式「Ax=b」を解く場合、係数行列Aの情報が記憶部111に格納される。この場合、記憶部111には、ベクトルb(右辺ベクトル)の情報も格納される。
【0043】
閾値111bは、係数行列111aの各行における非ゼロ数(非ゼロ成分の数)の多さを判断するための閾値である。この閾値は、例えば、係数行列Aのサイズや情報処理装置100が並列に実行するプロセス(演算処理の実行単位)の数などに応じて設定される。
【0044】
行列拡張部112は、係数行列Aの各行に含まれる非ゼロ成分の数(非ゼロ数)を計数し、非ゼロ数が上記の閾値より大きい行を特定する。そして、行列拡張部112は、特定した行をそれぞれ複数の行に分割して係数行列Aを拡張する。つまり、行列拡張部112は、非ゼロ数が多い行を非ゼロ数が少ない複数の行に分割する。
【0045】
プロセス割当部113は、情報処理装置100が並列に実行するプロセスの数に応じて、行列拡張部112が拡張した係数行列Aを複数の行群に分割する。なお、行群とは、1つ又は複数の行を含む行の集合である。そして、プロセス割当部113は、各行群にプロセスを割り当てる。並列計算部114は、各行群に割り当てられたプロセスをCPU群101に含まれる複数のCPU(CPU101a、…、101fの一部又は全部)に実行させる。
【0046】
(適用例)
ここで、
図5〜
図9を参照しながら、ICCG法に基づく行列方程式の計算アルゴリズムに第2実施形態の技術を適用する方法について説明する。なお、ICCG法は一例であり、第2実施形態に係る技術は、ICCG法以外の反復法に基づく行列方程式の求解問題にも適用可能である。
【0047】
図5は、行列方程式の構造及びICCG法の擬似コードを示した図である。
図6は、行列方程式の構造及び並列ICCG法の擬似コードを示した図である。
図7は、第2実施形態に係る行列拡張方法の一例を示した図である。
図8は、第2実施形態に係る領域分割方法の一例を示した図である。
図9は、第2実施形態に係る並列ICCG法の擬似コードを示した図である。
【0048】
まず、ICCG法とは、CG法に不完全コレスキー(IC:Incomplete Cholesky)分解と呼ばれる前処理を組み合わせた演算手法である。例えば、行列Aが対象行列の場合、下記の式(1)に示すように、対角行列D及び非対角行列Lを用いて行列Aを分解することができる。このとき、対角行列D及び非対角行列Lは下記の式(2)及び式(3)で与えられる。
【0050】
IC分解は、「非対角
行列Lに含まれる非ゼロ成分の配置パターン(非ゼロパターン)が行列Aの非ゼロパターンと同じである」という制約の下で行列C(C=LDL
T≒A)を計算する手法である。なお、上付きのTは転置を表す。このような制限を設ける利点は、非対角行列Lの値を格納する配列のサイズを予め確定できる点にある。また、ICCG法は、係数行列Aが
図5(A)に示すような疎行列の場合に演算負荷や使用メモリ量を低減できる利点がある。
【0051】
ベクトルb、x、及び係数行列Aを含む行列方程式「Ax=b」を解くICCG法の疑似コードは、例えば、
図5(B)のようになる。なお、A、Cは行列である。kなどのインデックスが付されたb、r、x、z、p、qはベクトルである。kなどのインデックスが付されたρ、ε、α、βはスカラーである。kは整数である。(・,・)はベクトルの内積を表す。Sqrt(・)は平方根を表す。|・|はベクトルの大きさを表すノルムである。なお、疑似コードの左端に表示された01などの数字は行番号である。
【0052】
図5(B)の疑似コードを実行することでベクトルxの解(近似解)を得ることができる。この疑似コードの中で、7行目にある「q
k=Ap
k」の演算は、右辺に行列Aとベクトルp
kとの積(行列ベクトル積)を含む。このような行列ベクトル積の演算は演算負荷が高い。そのため、行列ベクトル積の演算をいかに効率良く実行できるかが、処理負荷の低減及び処理時間の短縮に影響する。
【0053】
そこで、
図6(A)に示すように、係数行列Aを複数の部分領域(例えば、{A
(1)}、{A
(2)})に分割し、各部分領域の処理を異なるCPUに割り当てて並列に処理を実行する方法(並列ICCG法)が用いられる。なお、IC
分解を適用する場合、
図6(A)の鎖線で囲まれたブロック領域({A
(IC1)}、{A
(IC2)})にある非ゼロ成分が処理に利用される。
【0054】
並列ICCG法の疑似コードは
図6(B)のようになる。この疑似コードの7行目には、関数Share(・)の処理が含まれている。関数Share(・)は、ある部分領域の処理を担当するCPUが、自己の演算結果の一部を他のCPUに送り、他のCPUの演算結果のうち、自己の演算に用いる演算結果を受け取る処理を表す。
【0055】
つまり、関数Share(・)は、並列に処理を実行する複数のCPUが、それぞれ処理に利用するデータ(演算結果)を共有する処理を表現したものである。例えば、
図6(B)の疑似コードには、9行目、13行目、16行目に内積の演算を含む。これらの内積の演算には、他のCPUが計算したデータが用いられる。そのため、MPI(Message Passing Interface)関数を利用してデータをやり取りする処理が挿入される。なお、関数Share(・)のプログラムコード例は後に示す。
【0056】
図6(A)に例示した係数行列Aは、対角成分及びその周辺に非ゼロ成分を有するバンドマトリクスといえる。この場合、係数行列Aを同程度の非ゼロ成分を含む複数の行群(
図6の例では2つの行群)に分けることで負荷の分散を図ることができる。しかし、
図7に示すように、他の行と比べて非ゼロ数が大幅に大きい行(
図7(A)の例では最下行)が係数行列Aに含まれる場合、
図6(B)の疑似コードをそのまま適用すると、負荷が十分に分散されないことがある。
【0057】
図7(A)に示した係数行列Aの右側に(3)、(3)、…、(11)という数字が並んでいるが、これらの数字は、対応する行の非ゼロ数である。例えば、係数行列Aを3個の行群に分ける場合、各行群に含まれる非ゼロ成分の数をほぼ同程度に調整することは可能である。そのため、3つのCPUに同程度の処理を分担させることが可能になり、並列数(この場合は3)に見合った処理性能の向上が期待できる。
【0058】
一方、全行数が13行の係数行列Aを10個の行群に分ける場合、行群の集合は、非ゼロ成分が11(又は11以上)の行群と、非ゼロ数が5程度の行群とを含むことになる。既に述べたように、ある行群を担当するCPUの演算に、他の行群を担当するCPUの演算結果が利用される。そのため、非ゼロ数が大きい行群を担当するCPUの演算結果を、非ゼロ数が小さい行群を担当するCPUが待つことになる。つまり、並列数(この場合は10)に見合った処理性能の向上が得られないリスクが高い。
【0059】
そのため、第2実施形態では、行列拡張部112が、非ゼロ数が閾値S(例えば、S=7)より大きい行(ラージ行)を特定し、
図7(B)に示すように、非ゼロ数が小さい複数の行に分割する。このとき、行列拡張部112は、分割後の係数行列Aが対称行列となるように列(
図7(B)の例では最右列)も分割する。
【0060】
また、行列拡張部112は、ラージ行に対応するベクトル{p}{q}を拡張する。例えば、ラージ行に対応するベクトル{q}の要素がQである場合、分割後の行に対応する要素をそれぞれQ
1、Q
2とする。但し、「Q=Q
1+Q
2」である。ラージ行に対応するベクトル{p}の要素がPの場合、分割後の行に対応する要素の値は非ゼロ成分の配置に依存する。
図7(B)の例では、係数行列Aの右下端にある非ゼロ成分を分割後の下行右端に割り当てている。この場合、ベクトル{p}の最下段にある要素がPとなり、その上段が0となる。
【0061】
上記のように係数行列Aを拡張することで、
図8(A)に示すように、非ゼロ数のバランスを考慮して係数行列Aを複数の行群に分割することが可能になる。
図8(A)の例では、係数行列Aが行群G1、…、G6に分割されている。なお、ICCG法を適用する場合、プロセス割当部113は、演算に用いる非ゼロ成分の範囲(鎖線で囲った範囲)を考慮し、その範囲に含まれる非ゼロ数を考慮して行群のサイズを決める。そして、プロセス割当部113は、各行群を異なるプロセスに割り当てる。
図8(B)の例では、行群G1、…、G6が実行プロセスP
a、…、P
fに割り当てられている。
【0062】
図7(B)に示した係数行列Aの拡張(行列拡張)に関する処理を考慮した並列ICCG法の疑似コードは
図9のようになる。係数行列Aを拡張した場合、上記のように、ラージ行に対応するベクトル{q}の要素Qも分割されるため、分割された要素(上記の例ではQ
1、Q
2)の和を計算する処理が追加される。
図9に示した疑似コードでは、9行目に追加された関数Reduce_sum(・)が、要素の和を計算する処理を担う。
【0063】
但し、cは係数行列Aに含まれるラージ行の数、N
kcは並列数(並列実行するプロセスの数)、Q(k,m)はk番目のラージ行に対応するベクトル{q}の要素を分割して得たm番目の分割要素を表す。例えば、
図7(B)の例ではcが1であり、Q
1はQ(1,1)に対応し、Q
2はQ(1,2)に対応する。
図8の例ではN
kcが6となる。
【0064】
以上、情報処理装置100の機能について説明した。
[2−3.処理の流れ]
次に、
図10及び
図11を参照しながら、ベクトルb、x及び係数行列Aを含む行列方程式「Ax=b」を解く際の情報処理装置100による処理の流れについて説明する。
図10は、第2実施形態に係る情報処理装置による処理の流れを示した第1の図である。
図11は、第2実施形態に係る情報処理装置による処理の流れを示した第2の図である。
【0065】
(S101)行列拡張部112は、並列数N、閾値S、係数行列A、右辺ベクトルb、非ゼロ成分の総数n
allを取得する。並列数Nは、並列処理に用いるプロセスの数(1つのCPUに1つのプロセスを割り当てる場合にはCPUの数)である。閾値Sは、係数行列Aのサイズなどに応じて予め設定されている。非ゼロ成分の総数n
allは、係数行列Aに含まれる非ゼロ成分の総数である。
【0066】
(S102、S107)行列拡張部112は、パラメータkを1からn
dまで変化させながら、S103からS106までの処理を繰り返し実行する。n
dは、係数行列Aの全行数である。
【0067】
(S103)行列拡張部112は、係数行列Aのk行目に位置する非ゼロ成分の数n
kをカウントする。
(S104)行列拡張部112は、S103でカウントした非ゼロ成分の数n
kが閾値Sより大きいか否かを判定する。非ゼロ成分の数n
kが閾値Sより大きい場合、処理はS105へと進む。一方、非ゼロ成分の数n
kが閾値Sより大きくない場合、処理はS107へと進み、パラメータkがn
d以下の場合にはS102以降の処理が実行される。
【0068】
(S105)行列拡張部112は、k行目の行をラージ行に設定する。ラージ行は、非ゼロ成分を多く含む行として分割の対象になる行である。
(S106)行列拡張部112は、パラメータn
cにn
kを加算する。パラメータn
cは、係数行列Aのラージ行に含まれる非ゼロ成分の総数をカウントするためのパラメータである。S106の処理が完了すると、処理はS107へと進み、パラメータkがn
d以下の場合にはS102以降の処理が実行される。
【0069】
(S108)行列拡張部112は、ラージ行の分割数N
cを計算する。ラージ行の分割数N
cは、係数行列Aに含まれるラージ行の領域をいくつの行群に分割するかを示すパラメータである。
【0070】
例えば、
図7に示すようにラージ行(
図7の例では最下行)が1つの場合、ラージ行の分割数N
cは、下記の式(5)で与えられる。n
aは、n
allからn
cを引いた数である。関数FLOOR(・)は、浮動小数を整数に変換する関数であり、関数に渡された値の小数点以下を切り捨てた整数を返す。
【0071】
下記の式(5)は、下記の式(4)の関係式に基づいている。つまり、ラージ行の非ゼロ成分をN
c個のグループに分けた場合の非ゼロ数と、ラージ行以外の領域に含まれる非ゼロ成分を(N−N
c)個のグループに分けた場合の非ゼロ数とが同等になるようにN
cが決められる。このような方法でN
cを決めることで、係数行列Aを分割して得られる複数の行群について非ゼロ数の偏りを抑制することができる。
【0073】
なお、ラージ行が複数の場合にN
cを決める方法については後述する。
(S109)行列拡張部112は、係数行列Aに含まれるラージ行の領域をN
c個の行群に分割する(行列拡張)。例えば、ラージ行が1つの場合、行列拡張部112は、
図7に示すような方法で係数行列Aのラージ行をN
c個の行群に分割する(
図7の例では、1つのラージ行が、それぞれ1つの行を含む2個の行群に分割されている)。また、行列拡張部112は、係数行列Aが対象行列となるように係数行列Aの列を拡張すると共に、係数行列Aの行列ベクトル積に含まれるベクトル{p}及び行列ベクトル積を格納するベクトル{q}を拡張する(
図7を参照)。
【0074】
(S110)プロセス割当部113は、ラージ行を除く係数行列Aの領域を(N−N
c)個の行群に分割する(領域分割)。例えば、
図8の例では、ラージ行を除く係数行列Aの領域が行群G1、…、G4に分割されている。
【0075】
(S111)プロセス割当部113は、S109でラージ行を分割して得た各行にプロセスを割り当てると共に、S110の領域分割で得た各行群にプロセスを割り当てる。
このとき、プロセス割当部113は、
図12に示すようなデータ構造を有する行列情報を生成する。
図12は、第2実施形態に係る行列情報のデータ構造を示した図である。
図12に示すように、行列情報には、行のサイズ、非ゼロ成分の数、行の先頭番号、各行の配列先頭番号の配列、列番号の配列、係数の配列を示すパラメータの情報が格納される。
【0076】
行列情報は、並列実行される各プロセスの担当CPUに渡される。そのため、プロセス毎に行列情報が生成される。行のサイズは、担当プロセスが処理する行のサイズ(行群をなす行の数)を表す。非ゼロ成分の数は、担当プロセスが処理する行群に含まれる非ゼロ成分の数を表す。行の先頭番号は、担当プロセスが処理する行群の先頭が係数行列Aの何行目に位置するかを表す。
【0077】
各行の配列先頭番号の配列は、係数の配列の中で担当プロセスが処理する各行の非ゼロ成分のデータが格納されている場所の先頭位置を表す配列である。列番号の配列は、係数の配列の中で担当プロセスが処理する各行に対応して、非ゼロ成分のデータが格納されている列の位置を表す配列である。係数の配列は、担当プロセスが処理する係数行列Aの非ゼロ成分が格納される配列である。このような行列情報を各プロセスに配分することで、非ゼロ成分のデータを効率的に受け渡すことができ、メモリ使用量の節約に寄与する。
【0078】
(S112)プロセス割当部113は、プロセスの割り当て内容に応じて、複数のプロセスを並列実行するために用いる通信用情報を生成する。S111でプロセスの割り当て内容が決定すると、どのCPUがどの行群の処理を担当するのかが決まる。そして、各CPUが演算処理を進めるために、各CPUがどのCPUから演算結果を取得するか、どのCPUに自己の演算結果を提供するかが特定される。通信用情報は、このようなCPU間における演算結果の送受信を可能にするための情報である。
【0079】
例えば、プロセス割当部113は、
図13に示すようなデータ構造を有する通信用情報を生成する。
図13は、第2実施形態に係る通信用情報のデータ構造を示した図である。
図13に示すように、通信用情報には、送信時に用いる情報として、送信する値の数、送信先のCPU数、送信先のCPU番号、送信する値の配列先頭番号、送信する値の配列番号、送信する値の配列が含まれる。また、通信用情報には、受信時に用いる情報として、受信する値の数、受信先のCPU数、受信先のCPU番号、受信する値の配列先頭番号、受信する値の配列番号、受信する値の配列が含まれる。
【0080】
(S113)並列計算部114は、S111で生成された行列情報及びS112で生成された通信用情報の送受信を実行する。このとき、S101からS112までの処理を実行したCPUが、CPU毎に対応する行列情報及び通信用情報を該当CPUに送信し、送信された行列情報及び通信用情報を該当CPUが受信する。つまり、行列情報及び通信用情報が並列処理のプロセスを担当するCPUに配信される。
【0081】
(S114)並列計算部114は、複数のCPUを並列に動作させ、通信用情報に基づくCPU間の連携を維持しながら、行列情報に基づく各行群の演算処理を実行させる(未知数の計算)。S114の処理が完了すると、
図10及び
図11に示した一連の処理は終了する。
【0082】
以上、処理の流れについて説明した。
[2−4.応用例:磁場解析]
ここで、第2実施形態の技術を磁場解析に応用する例について説明する。以下では、説明の都合上、並列計算にCPU#1、CPU#2、…、CPU#10を利用可能な場合を例に説明する。
【0083】
(係数行列)
コイルから発生する磁場を記述する方程式は、ベクトルポテンシャルA、電流密度J、磁気抵抗率ν、鎖交磁束Φ、抵抗R、電流I、端子電圧V、コイルの断面積S、コイルの電流密度の単位方向ベクトルnを用いて下記の式(6)〜式(8)で与えられる。式(
7)の左辺第1項は磁束の時間変化に起因する誘導起電力を表し、第2項は抵抗による電圧降下を表す。
【0085】
例えば、
図14(A)に示すように、矩形のコイルに25個の節点を設定し、斜線部分を電流が未知数の領域、他の部分を電流が既知の領域とする有限要素モデルを考えると、節点の接続関係に基づく係数行列Aの非ゼロパターンは
図14(B)のようになる。
図14は、第2実施形態の一応用例に係る係数行列(節点の接続関係)の作成方法を示した図である。なお、番号(1)、(11)、(21)は、行及び列の位置を識別しやすくするために記載した行番号及び列番号であり、節点番号に対応する。
【0086】
電流密度Jが固定であれば係数行列Aは
図14(B)のようなバンドマトリクスとなる。一方、電流密度Jに未知数(電流未知数)を含む場合、係数行列Aの非ゼロパターンは、
図15のようになる。
図15に示すように、最下行及び最右列に電流未知数に対応する非ゼロ成分が追加される。
図14(A)の有限要素モデルでは節点4から25の電流値が未知であるため、節点4から25に対応する成分が非ゼロとなる。
図15は、第2実施形態の一応用例に係る係数行列(電流未知数を追加)の作成方法を示した図である。
【0087】
(行列拡張・領域分割)
閾値Sが10の場合、電流未知数に対応する行がラージ行になる。並列数Nが10の場合、ラージ行の分割数N
cは、上記の式(4)及び式(5)に基づいて下記の式(9)及び式(10)のように計算される。下記の式(10)の結果から、ラージ行の分割数N
cは2となる。一方、ラージ行以外の行を含む領域の分割数(N−N
c)は8となる。なお、ROUND(・)は四捨五入する関数である。MOD(・)は剰余を出力する関数である。
【0089】
ラージ行を2つに分割し、残りの行を8つの行群に分割すると
図16のようになる。
図16は、第2実施形態の一応用例に係る行列拡張方法及び領域分割方法の一例を示した図である。行群は、各行群に含まれる非ゼロ成分の数が同数に近くなるように設定される。なお、
図16の鎖線領域はIC分解における対象となる領域を示している。このようにして設定された各行群にはプロセスが割り当てられ、割当プロセスを実行するCPUが対応付けられる。
図16の例ではCPU#1、CPU#2、…、CPU#10が行群G1、G2、…、G10に対応付けられている。
【0090】
(通信用情報・行列情報)
図16のように係数行列Aの拡張及びプロセスの割り当てが完了すると、
図17に示すような行列情報を設定することが可能になる。
図17は、第2実施形態の一応用例に係る行列情報の設定例を示した図である。
【0091】
図17に示すように、行列情報は、プロセスを実行するCPU毎に設定される。
図17の例では、行群G1を担当するCPU#1について、行のサイズ(n_rows)が4、非ゼロ成分の数(n_nonzero)が14、行の先頭番号(n_row0)が1に設定されている。また、各行の配列先頭番号の配列(ptr_row[])、列番号の配列(col[])、係数の配列(A_mat[])が設定されている。なお、A
i#jは係数行列Aのi行j列成分を表す。CPU#2、…、CPU#10についても
図16の割り当て内容に応じてパラメータが設定される。
【0092】
図16の割り当て内容が決まると、各CPUが自己の演算により正しい値が得られる列ベクトル(ベクトル{p}、ベクトル{q})の成分が特定できる。例えば、
図16に示した係数行列A(拡張後)の非ゼロパターンから、
図18に示すような列ベクトルの非ゼロパターン(ハッチング部分)がCPU毎に特定できる。
図18は、第2実施形態の一応用例に係る列ベクトルの非ゼロパターンを示した図である。
【0093】
また、
図16の割り当て内容から、各CPUが自己の演算で正しい値を取得できる成分(濃いハッチング部分)と、正しい値を取得できない成分(薄いハッチング部分)とが特定できる。正しい値を取得できない成分については、
図19に矢印で示したように、他のCPUが演算処理によって取得した正しい値(演算結果)がコピーされる。
図19は、第2実施形態の一応用例に係るCPU間のデータコピーについて説明するための図である。
【0094】
図19のようにCPU間で送受信される演算結果のデータ、データの送信元及び送信先が特定できると、
図20に示すような通信用情報を設定することができる。
図20は、第2実施形態の一応用例に係る通信用情報の設定例を示した図である。
【0095】
図20の例では、CPU#1に提供される通信用情報として、送信する値の数(n_all_send)が2、送信先のCPU数(num_cpu_send)が1、受信する値の数(n_all_recv)が3、受信先のCPU数(num_cpu_recv)が2に設定されている。また、
送信先のCPU番号(n_cpu_send[])、送信する値の配列
先頭番号(ptr_send[])、送信する値の配列番号(vec_num_send[])も設定される。
【0096】
図19を参照すると、CPU#1は、上から3段目、4段目の値をCPU#2に送信する。そのため、送信する値の数が2、送信先のCPU数が1となる。また、CPU#1は、自己の演算処理に利用する列ベクトルの成分(非ゼロ成分)のうち、正しい値を得られない成分が5段目、6段目、26段目にある。そのため、CPU#1は、5段目、6段目の値をCPU#2から受信し、26段目の値をCPU#10から受信する。そのため、受信する値の数が3、受信先のCPU数が2となる。他のCPUについても同様である。
【0097】
(プログラムコード例#1:関数Share)
上記の通信用情報を取得したCPUは、
図21に示すようなプログラムコードを実行して演算結果をやり取りする。
図21は、第2実施形態に係る関数Shareのプログラムコード例を示した図である。
図21の例ではC言語による表現を用いている。3行目から11行目までが送信時の処理であり、14行目から22行目までが受信時の処理である。
【0098】
送信時の処理では、4行目から7行目までの処理で送信する値を送信用の配列にコピーし、10行目のMPI関数を利用して配列のデータを他のCPUに送信している。受信時の処理では、17行目のMPI関数を利用して配列のデータを他のCPUから受信し、18行目から20行目までの処理で受信した値を演算処理に用いるベクトルにコピーしている。関数Share(・)によりデータが送受信される。
【0099】
(プログラムコード例#2:Reduce_sum)
上述した行列拡張を行う際、係数行列Aの拡張に伴って列ベクトルも拡張される。そのとき、ラージ行に対応する行列ベクトル積が格納される列ベクトルの成分(Q)も分割されるため、その成分を元に戻す処理が演算処理の中に組み込まれる。元に戻す処理を実行する関数が関数Reduce_sumである。
【0100】
関数Reduce_sumを実行するにあたり、
図22(A)に示すようなプログラムコードを実行してラージ行を分割して得た各行に対応する行列ベクトル積の演算結果を配列(Q[])に代入する。そして、
図22(B)に示す関数Reduce_sumのプログラムコードを実行して、その配列の合計値を計算する。
図22は、第2実施形態に係る行列ベクトル積の結果代入コード及び関数Reduce_sumのプログラムコード例を示した図である。なお、
図22の例ではC言語の表現を用いている。
【0101】
(効果:並列処理のスケーラビリティ)
これまで説明してきた第2実施形態の技術を適用すると、
図23(本手法)のように高い並列スケーラビリティを実現することができる。
図23は、第2実施形態に係る技術を適用した場合の並列スケーラビリティに関する評価結果を示した図である。
図23には比較のために従来手法の評価結果も示しているが、従来手法の場合、CPU数が150を超えた辺りでCPU数の増加に対する速度比の向上が停止している。一方、本手法の場合(第2実施形態の技術を適用した場合)、CPU数が250を超えてもCPU数の増加に伴う速度比の向上が見られる。このように、第2実施形態の技術を適用することで、並列スケーラビリティを向上させることが可能になる。
【0102】
(補足:複数コイルの場合)
上記の応用例は、端子電圧が印加される1つのコイルから発生する磁場を解析する手法であった。ここでは説明の都合上、コイルの数を1つとしたが、例えば、芯材に複数のコイルを巻き付けたインダクタモデルなどにも応用することができる。この場合、複数のコイルに対応する複数のラージ行が係数行列Aに含まれる。そのため、ラージ行の分割数N
cの計算方法は、下記の式(11)〜式(15)のように拡張される。
【0103】
コイルの数をy
coil、y番目のコイルに関する自由度(総未知数)をn
cyとすると、全てのコイルの自由度n
c#allは下記の式(11)で与えられる。また、下記の式(12)からラージ行全体の分割数N
cは下記の式(13)で与えられる。また、ラージ行毎の分割数N
cy(y番目のコイルに対応するラージ行の分割数)は、下記の式(14)で与えられる。
【0104】
なお、1つのプロセスに割り当てられるコイルの平均自由度<n
c>は、下記の式(15)で与えられる。n
cyが<n
c>に満たない場合、N
cyが0となる。この場合、複数のコイルに対応するラージ行をグループ化し、ラージ行のグループに対して少なくとも1つのプロセスが割り当てられるようにする。
【0105】
例えば、プロセス割当部113は、n
cyが小さい順(n
cy<n
c(y+1))にコイルの番号(ラージ行の順序に相当)を並べ替え、N
cyが1に満たないラージ行をグループ化する。このとき、プロセス割当部113は、グループ化したラージ行の全体で分割数が1を超えるようにラージ行の組み合わせを設定する。
【0107】
グループの識別番号をID_G、グループの分割数をPa_G、グループの自由度をDof_G、各ラージ行の分割数をPaとすると、これらの値は
図24に示すプログラムコード(関数DistCoilPa(・))で計算することができる。
図24は、第2実施形態に係る関数DistCoilPaのプログラムコード例を示した図である。ID_G、Pa_G、Dof_G、Paはそれぞれ配列の形で出力される。
【0108】
プロセス割当部113は、各グループに対する分割数が1であればラージ行を分割しない。また、プロセス割当部113は、分割数が1より大きく、グループに属するラージ行の数が1の場合に分割数Paで分割する。また、プロセス割当部113は、分割数が1より大きく、グループに属するラージ行の数が1より大きい場合に、最後のラージ行を同じグループに追加したときに分割数が1を超えたと判断する。そして、プロセス割当部113は、同じグループに属する最後のラージ行だけを対象に分割数に応じた分割を行う。
【0109】
4つのCPU#1、…、#4を5つのラージ行(5つのコイルに対応)に割り当てる例を
図25に示す。
図25は、第2実施形態に係る関数DistCoilPaの出力に基づく割当自由度の算出例を示した図である。
図24に示した関数DistCoilPaを実行することで、Pa_G及びPaが得られる。図
25の例では、5つのラージ行が2つの大きなグループ(Pa_G[0], Pa_G[1]に対応するグループ)に分けられ、それぞれ自由度に応じてCPUが割り当てられている。
【0110】
なお、自由度を調整するためにCPU#1に4番目のコイルに対応する一部の自由度X
4が割り当てられている。この自由度X
4は、下記の式(16)により計算される。MOD(・)は剰余を求める関数である。
図25のように複数のコイルに対応する複数のラージ行をグループ化し、グループ単位でプロセスを割り当てることで、複数のコイルを含むモデルに対しても柔軟に第2実施形態の技術を適用することが可能になる。
【0112】
以上、第2実施形態について説明した。