JP6083300B2 - プログラム、並列演算方法および情報処理装置 - Google Patents

プログラム、並列演算方法および情報処理装置 Download PDF

Info

Publication number
JP6083300B2
JP6083300B2 JP2013074443A JP2013074443A JP6083300B2 JP 6083300 B2 JP6083300 B2 JP 6083300B2 JP 2013074443 A JP2013074443 A JP 2013074443A JP 2013074443 A JP2013074443 A JP 2013074443A JP 6083300 B2 JP6083300 B2 JP 6083300B2
Authority
JP
Japan
Prior art keywords
matrix
thread
submatrix
vector
zero
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
JP2013074443A
Other languages
English (en)
Other versions
JP2014199545A (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
Priority to JP2013074443A priority Critical patent/JP6083300B2/ja
Priority to US14/190,623 priority patent/US9418048B2/en
Publication of JP2014199545A publication Critical patent/JP2014199545A/ja
Application granted granted Critical
Publication of JP6083300B2 publication Critical patent/JP6083300B2/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)
  • Theoretical Computer Science (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Mathematical Analysis (AREA)
  • Data Mining & Analysis (AREA)
  • Computational Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Computing Systems (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Complex Calculations (AREA)

Description

本発明はプログラム、並列演算方法および情報処理装置に関する。
スーパーコンピュータなどの演算能力の高いコンピュータを利用して、科学技術計算などの大規模数値計算が行われることがある。大規模数値計算は、次数の大きな行列の演算を含むことが多い。例えば、流体解析や構造解析などの分野では、連立方程式の係数を表した係数行列を用いて大規模な連立方程式を解くことがある。また、例えば、回路解析や振動解析などの分野では、大規模な行列の固有値を求めることがある。コンピュータを利用した行列演算では、行列とベクトルとの積を反復的に計算することで近似解を求めることができる。例えば、有限要素法に従って係数行列とベクトルとの積を反復的に計算することで、解析的に解くことが難しい微分方程式の近似解を求めることができる。
大規模数値計算で利用する行列は、値が0である要素(零要素)の割合が大きく、値が0でない要素(非零要素)の割合が小さい疎行列(スパース行列)であることがある。スパース行列は、零要素も含めて行列構造通りのデータとして表現するとデータ量が大きくなり非効率的であることから、圧縮格納法によって零要素が省略された圧縮データとして表現され得る。圧縮格納法には、圧縮列格納(CCS:Compressed Column Storage)法と圧縮行格納(CRS:Compressed Row Storage)法とが含まれる。
圧縮列格納法では、N×M行列に含まれる要素が、列優先の順序(1行1列,2行1列,…,N行1列,1行2列,2行2列,…,1行M列,…,N行M列の順)で探索されて、行列から非零要素のみが抽出される。そして、上記の順序に従って非零要素の値を列挙した第1の配列と、各非零要素の行番号を列挙した第2の配列と、第1の配列の中で列が変わる位置を列挙した第3の配列とが生成される。圧縮行格納法では、N×M行列に含まれる要素が、行優先の順序(1行1列,1行2列,…,1行M列,2行1列,2行2列,…,N行1列,…,N行M列の順)で探索されて、行列から非零要素のみが抽出される。そして、非零要素の値を列挙した第1の配列と、各非零要素の列番号を列挙した第2の配列と、第1の配列の中で行が変わる位置を列挙した第3の配列とが生成される。
ところで、大規模な行列演算は、行列を分割して複数のスレッドに割り振り、これら複数のスレッドを複数のプロセッサを用いて並列に実行することで、高速化することができる。このとき、行列の分割方法によっては、最終的な演算結果の中の同じ要素についての演算を、複数のスレッドが分担することになる場合がある。この場合、各スレッドに、中間の演算結果を記憶する記憶領域を割り当てる方法が考えられる。
例えば、圧縮列格納法で表現されたスパース行列と列ベクトルとの積を、複数のプロセッサを用いて計算する並列処理方法が提案されている。この並列処理方法では、行列に含まれる複数の列を均等に分割して複数のスレッドに割り振り、また、最終的な演算結果の列ベクトルと同じ大きさの記憶領域を各スレッドに割り当てる。そして、各スレッドが生成した中間の演算結果の列ベクトルを合算して、最終的な演算結果を求める。
なお、連立方程式の係数を表した係数行列では対角線付近と一部の正方領域内に非零要素が集中しやすいという特徴を利用して、係数行列を複数のブロックに分割し、複数のプロセッサを用いて並列計算を行う高速演算処理方法が提案されている。
特開2009−199430号公報 国際公開第2008/026261号
しかし、複数のスレッドそれぞれに対して中間の演算結果のベクトルを記憶する記憶領域を割り当てると、メモリの使用量が大きくなるという問題がある。例えば、100万行×100万行のスパース行列と列ベクトルとの積を、1000スレッドを用いて並列計算する場合を考える。この場合、スパース行列のデータは圧縮格納法によって圧縮できる一方、上記の記憶領域は全体で100万行の列ベクトル1000個分の大きさになってしまう。この方法では、スレッド数の増加に伴ってメモリの使用量が増大する。
これに対し、複数のスレッドに共通の記憶領域を1つ用意し、各スレッドが演算結果のベクトルの中の要素に対して値を順次加算していく方法も考えられる。しかしながら、単純に記憶領域を共通化してしまうと、スレッド間で同じ要素(例えば、演算結果の列ベクトルの中の同じ行)に対する値の加算が同時に発生して、アクセスが競合する可能性がある。もし、アクセス競合に備えてスレッド間で排他制御を行うと、メモリアクセスのオーバヘッドが大きくなり並列処理の効率が低下するおそれがある。
1つの側面では、本発明は、行列演算においてメモリの記憶領域を効率的に利用できるプログラム、並列演算方法および情報処理装置を提供することを目的とする。
1つの態様では、複数のスレッドを並列に実行可能なコンピュータに、以下の処理を実行させるプログラムが提供される。零要素および非零要素を含む行列の中の第1の部分行列の演算を第1のスレッドに割り当て、行列の中の第2の部分行列の演算を第2のスレッドに割り当てる。第1の部分行列における行間または列間の非零要素の分布と、第2の部分行列における行間または列間の非零要素の分布とを比較する。比較の結果に応じて、第1および第2のスレッドが演算においてそれぞれ利用するベクトルを記憶する記憶領域の割り当てを変化させる。また、1つの態様では、複数のスレッドを並列に実行可能なコンピュータが行う並列演算方法が提供される。
また、1つの態様では、互いに並列にスレッドを実行可能な複数のプロセッサと、スレッドが演算においてそれぞれ利用するベクトルを記憶するメモリと、を有する情報処理装置が提供される。複数のプロセッサの1つは、以下の処理を実行する。零要素および非零要素を含む行列の中の第1の部分行列の演算を第1のスレッドに割り当て、行列の中の第2の部分行列の演算を第2のスレッドに割り当てる。第1の部分行列における行間または列間の非零要素の分布と、第2の部分行列における行間または列間の非零要素の分布とを比較する。比較の結果に応じて、第1および第2のスレッドに対するメモリにおけるベクトルを記憶する記憶領域の割り当てを変化させる。
1つの側面では、行列演算においてメモリの記憶領域を効率的に利用できる。
第1の実施の形態の情報処理装置を示す図である。 情報処理装置のハードウェア例を示すブロック図である。 スパース行列とベクトルの積の例を示す図である。 スパース行列の圧縮格納の例を示す図である。 スパース行列の分割とスレッド割り当ての例を示す図である。 スパース行列とベクトルの積の並列計算例を示す図である。 非零要素マップの例を示す図である。 非零要素マップの他の例を示す図である。 作業ベクトルの割り当て例を示す図である。 作業ベクトルの他の割り当て例を示す第1の図である。 作業ベクトルの他の割り当て例を示す第2の図である。 作業ベクトルの他の割り当て例を示す第3の図である。 作業ベクトルの他の割り当て例を示す第4の図である。 情報処理装置の機能例を示すブロック図である。 行列演算制御の手順例を示すフローチャートである。 非零要素チェックの手順例を示すフローチャートである。 作業ベクトル割り当ての手順例を示すフローチャートである。 並列行列演算の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。
第1の実施の形態の情報処理装置10は、行列演算(例えば、行列とベクトルとの積を求める演算)を、複数のスレッドを並列に動作させることで実行する。情報処理装置10は、プロセッサ11〜13を含む複数のプロセッサとメモリ14とを有する。
プロセッサ11〜13は、物理的に互いに並列にスレッドを実行することができる演算装置である。プロセッサ11〜13それぞれは、CPU(Central Processing Unit)などの1つのプロセッサパッケージでもよいし、プロセッサパッケージに含まれるプロセッサコア(単にコアと呼ぶことがある)でもよい。例えば、プロセッサ11〜13は、メモリ14に記憶されたプログラムを実行する。第1の実施の形態では、プロセッサ12がスレッド21を実行し、プロセッサ13がスレッド22を実行する。また、プロセッサ11が、行列演算の並列化を制御するスレッドまたはプロセスを実行する。ただし、プロセッサ12またはプロセッサ13が、並列化制御を行うようにしてもよい。
メモリ14は、プロセッサ11〜13からアクセスされる共有メモリであり、例えば、RAM(Random Access Memory)である。メモリ14は、スレッド21,22が演算において利用する1または2以上のベクトルを記憶する。このベクトルには、例えば、スレッド21,22それぞれの演算途中の値が書き込まれる。また、このベクトルには、例えば、スレッド21,22それぞれの演算が終了した時点の中間結果の値(最終結果が集計される前の値)が書き込まれる。行列演算が行列と列ベクトルの積を求める演算である場合、上記のベクトルは列ベクトルになる。また、行列演算が行ベクトルと行列の積を求める演算である場合、上記のベクトルは行ベクトルになる。第1の実施の形態では、以下に述べるように、スレッド21,22に対するメモリ14のベクトルが記憶される記憶領域の割り当てを変化させる。例えば、情報処理装置10は、スレッド21,22に対して共通の記憶領域(記憶領域26)または異なる記憶領域(記憶領域26,27)を用意する。
ここで、プロセッサ11は、零要素および非零要素を含む行列23を分析し、行列23に含まれる部分行列の演算をスレッド21,22に割り当てる。行列23は、例えば、零要素の割合が大きく非零要素の割合が小さいスパース行列である。行列23は、圧縮列格納法や圧縮行格納法などの圧縮格納法で表現されていてもよい。第1の実施の形態では、プロセッサ11は、部分行列24の演算をスレッド21に割り当て、部分行列25の演算をスレッド22に割り当てる。例えば、部分行列24と部分行列25とを、列が重複しておらず少なくとも一部の行が重複したものとする。また、例えば、部分行列24と部分行列25とを、行が重複しておらず少なくとも一部の列が重複したものとする。
また、プロセッサ11は、行列23を分析し、演算において利用されるベクトルを記憶する記憶領域をスレッド21,22に割り当てる。このとき、プロセッサ11は、部分行列24の非零要素の分布と部分行列25の非零要素の分布とを比較する。例えば、演算結果のベクトルが列ベクトルになる場合、プロセッサ11は、列方向(複数の行の間)の非零要素の分布を比較する。また、例えば、演算結果のベクトルが行ベクトルになる場合、プロセッサ11は、行方向(複数の列の間)の非零要素の分布を比較する。
そして、プロセッサ11は、非零要素の分布の比較結果に応じて、スレッド21,22に対する記憶領域の割り当てを変化させる。例えば、プロセッサ11は、部分行列24と部分行列25とが同じ行(または、同じ列)に非零要素を含まない場合、スレッド21,22に共通の記憶領域を割り当ててよいと判断する。これは、同じ行に非零要素が存在しなければ、スレッド21,22は、演算において利用される列ベクトルの中の同じ行要素にアクセスせず、アクセス競合が発生しないためである。また、同じ列に非零要素が存在しなければ、スレッド21,22は、演算において利用される行ベクトルの中の同じ列要素にアクセスせず、アクセス競合が発生しないためである。
例えば、スレッド21,22に共通の記憶領域26が割り当てられた場合、スレッド21は、部分行列24の演算途中の値または演算終了時点の値(中間の演算結果)を記憶領域26に書き込む。また、スレッド22は、部分行列25の演算途中の値または演算終了時点の値(中間の演算結果)を記憶領域26に書き込む。このとき、スレッド21とスレッド22の間で、記憶領域26へのアクセスの排他制御が行われなくてもよい。一方、スレッド22にスレッド21とは異なる記憶領域27が割り当てられた場合、スレッド21は、部分行列24の演算についての値を記憶領域26に書き込み、スレッド22は、部分行列25の演算についての値を記憶領域27に書き込む。記憶領域26,27に記憶されたベクトルは、最終的な演算結果のベクトルを求めるときに合算される。
なお、スレッド21,22の間のアクセス競合は、特に次のような行列演算において問題となる。例えば、行列23が圧縮列格納法で表現されており、行列23と列ベクトルとの積を求める場合である。この場合、圧縮列格納法で表現された行列は列を分割する方が演算が効率的になるため、同じ行についてのスレッド21,22間の競合が問題となる。また、例えば、行列23が圧縮行格納法で表現されており、行ベクトルと行列23との積を求める場合である。この場合、圧縮行格納法で表現された行列は行を分割する方が演算が効率的になるため、同じ列についてのスレッド21,22間の競合が問題となる。
また、例えば、行列23が対称行列であり、部分行列24と対称の位置にある部分行列の演算もスレッド21に割り当て、部分行列25と対称の位置にある部分行列の演算もスレッド22に割り当てる場合である。この場合、行列23の下三角および上三角の何れか一方についてスレッド21,22間の競合が問題となる。行列23と列ベクトルの積を求める場合、下三角の部分行列に含まれる同じ行についてスレッド21,22間の競合が問題となる。また、行ベクトルと行列23の積を求める場合、上三角の部分行列に含まれる同じ列についてスレッド21,22間の競合が問題となる。
第1の実施の形態の情報処理装置10によれば、部分行列24の非零要素の分布と部分行列25の非零要素の分布とが比較される。そして、比較結果に応じて、スレッド21,22への記憶領域の割り当てが変化する。よって、同じ記憶領域の同じ要素に対するアクセス競合を抑制でき(例えば、アクセス競合が発生しないようにでき)、スレッド21,22間の排他制御の負荷が軽減される。また、排他制御の負荷が重くならない範囲(例えば、排他制御が不要になる範囲)で、メモリ14に確保する記憶領域の量を抑制できる。従って、行列演算においてメモリ14の記憶領域を効率的に利用することができる。
[第2の実施の形態]
図2は、情報処理装置のハードウェア例を示すブロック図である。
第2の実施の形態の情報処理装置100は、大規模行列演算が可能なコンピュータであり、例えば、ユーザからの要求に応じて行列演算を行うサーバコンピュータである。
情報処理装置100は、CPU110,110a,110b,110cを含む複数のCPUおよびRAM120を有する。複数のCPUとRAM120とは、システムバス136に接続されている。また、情報処理装置100は、HDD(Hard Disk Drive)131、画像信号処理部132、入力信号処理部133、媒体リーダ134および通信インタフェース135を有する。HDD131、画像信号処理部132、入力信号処理部133、媒体リーダ134および通信インタフェース135は、入出力バス137に接続されている。システムバス136と入出力バス137とは、例えば、ブリッジで接続されている。
CPU110,110a,110b,110cは、プログラムを実行するプロセッサパッケージである。CPU110,110a,110b,110cは、HDD131からプログラムの命令やデータの少なくとも一部をRAM120にロードし、プログラムを実行する。各CPUは、複数のコアおよびキャッシュメモリを有する。
一例として、CPU110は、コア111〜114を含む複数のコアおよびキャッシュメモリ115を有する。コア111〜114は、物理的に互いに並列にスレッドを実行することができる。キャッシュメモリ115は、RAM120から読み込まれたプログラムの命令やデータを一時的に記憶する揮発性メモリであり、例えば、SRAM(Static Random Access Memory)である。キャッシュメモリはコア毎に設けてもよい。
RAM120は、CPU110,110a,110b,110cから、高速なシステムバス136を介してアクセスされる共有メモリである。RAM120は、プログラムの命令やデータを一時的に記憶する。なお、情報処理装置100は、RAM以外の種類の揮発性メモリを備えてもよいし、複数個のメモリを備えていてもよい。
HDD131は、OS(Operating System)やアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部132は、何れかのCPUからの命令に従って、情報処理装置100に接続されたディスプレイ141に画像を出力する。ディスプレイ141としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部133は、情報処理装置100に接続された入力デバイス142から入力信号を取得し、何れかのCPUに出力する。入力デバイス142としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置100に、複数の種類の入力デバイスが接続されてもよい。
媒体リーダ134は、記録媒体143に記録されたプログラムやデータを読み取る駆動装置である。記録媒体143として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ134は、例えば、記録媒体143から読み取ったプログラムの命令やデータをRAM120またはHDD131に格納する。
通信インタフェース135は、ネットワーク144に接続され、ネットワーク144を介して他の情報処理装置と通信するインタフェースである。通信インタフェース135は、ケーブルでスイッチやルータなどの通信装置と接続される有線通信インタフェースでもよいし、無線基地局と接続される無線通信インタフェースでもよい。
なお、情報処理装置100は、媒体リーダ134を備えていなくてもよい。また、ユーザが操作する端末装置からネットワーク144経由で情報処理装置100を制御できる場合、情報処理装置100は、画像信号処理部132や入力信号処理部133を備えていなくてもよい。また、ディスプレイ141や入力デバイス142が、情報処理装置100の筐体と一体に形成されていてもよい。なお、コア111〜113は前述のプロセッサ11〜13の一例であり、RAM120は前述のメモリ14の一例である。
次に、第2の実施の形態で行う行列演算について説明する。
図3は、スパース行列とベクトルの積の例を示す図である。
情報処理装置100は、行列と入力ベクトルとの積を反復的に計算する。行列は、例えば、連立方程式の係数を表した係数行列である。情報処理装置100は、1回目に、行列と初期の入力ベクトルとの積を計算する。情報処理装置100は、1回目の積である結果ベクトルを所定のアルゴリズムに従って加工し、次の入力ベクトルとして使用する。情報処理装置100は、2回目に、1回目と同じ行列と1回目の結果ベクトルを加工して得られた入力ベクトルとの積を計算する。以上の行列演算が、所定の終了条件(例えば、反復回数や結果ベクトルに含まれる値の精度などの条件)を満たすまで繰り返される。
第2の実施の形態では、行列として対称行列であり且つスパース行列であるもの(対称スパース行列)を想定し、入力ベクトルとして列ベクトルを想定する。対称スパース行列と列ベクトルとの積である結果ベクトルは、列ベクトルになる。例えば、6行×6列の対称スパース行列の1行目が(4.0,9.0,0,3.0,0,0)であり、入力ベクトルが(0.1,0.2,0.3,0.4,0.5,0.6)であるとする。この場合、結果ベクトルの1行目の値が3.4と算出される。なお、以下では説明を簡単にするために6行×6列の行列の例を用いることがあるが、第2の実施の形態では次数(1辺の要素数)が数万〜数千万程度の大規模な対称スパース行列が使用され得る。
図4は、スパース行列の圧縮格納の例を示す図である。
第2の実施の形態では、対称スパース行列の下三角の領域が圧縮列格納法によって表現される。対称スパース行列の上三角の領域(対角要素を除く)は、下三角の領域に基づいて再現することができるため行列データに含めず省略することができる。
行列データには、要素配列121(Val)、行番号配列122(Row)および列ポインタ配列123(Cp)が含まれる。要素配列121は、対称スパース行列の下三角の領域に含まれる非零要素の値を列優先の順序で並べたものである。行番号配列122は、要素配列121に列挙された各非零要素の行番号を記載したものである。行番号配列122のk番目の値(Row(k))は、k番目の非零要素の行番号を表す。要素配列121と行番号配列122の長さは、対称スパース行列に含まれる非零要素の数になる。列ポインタ配列123は、要素配列121の中で列が変わる位置を列挙したものである。列ポインタ配列123のk番目の値(Cp(k))は、k列目の先頭の非零要素の番号を表す。ただし、列ポインタ配列123の長さは、対称スパース行列の列数より1だけ大きい。列ポインタ配列123の末尾には、要素番号の最大値より1だけ大きい数が格納される。
例えば、6行×6列の対称スパース行列の下三角の領域に、次のような要素が含まれているとする。1列目:(4.0,9.0,0,3.0,0,0)、2列目:(11.0,5.0,0,0,0)、3列目:(6.0,0,0,0)、4列目:(1.0,8.0,12.0)、5列目:(2.0,10.0)、6列目:(7.0)。
この場合、要素配列121は、(4.0,9.0,3.0,11.0,5.0,6.0,1.0,8.0,12.0,2.0,10.0,7.0)となる。行番号配列122は、(1,2,4,2,3,3,4,5,6,5,6,6)となる。列ポインタ配列123は、(1,4,6,7,10,12,13)となる。例えば、4列目の上から2番目の非零要素は、要素配列121、行番号配列122および列ポインタ配列123を参照して次のように特定される。まず、Cp(4)=7から、4列目の先頭の非零要素の番号が7と特定され、4列目の2番目の非零要素の番号は8と特定される。そして、Val(8)=8.0,Row(8)=5から、4列目の上から2番目の非零要素は5行目にあり、その値は8.0であると特定される。
なお、対称スパース行列の上三角の領域(対角要素を含む)は、要素配列121、行番号配列122および列ポインタ配列123を、値を変換せずに読み替えることで再現できる。すなわち、要素配列121を行優先の順序で非零要素を列挙したものと読み替え、行番号配列122を列番号配列に読み替え、列ポインタ配列123を行ポインタ配列と読み替える。このように読み替えた要素配列、列番号配列および列ポインタ配列は、上三角の領域(対角要素を含む)を圧縮行格納法で表現したものに相当する。
図5は、スパース行列の分割とスレッド割り当ての例を示す図である。
情報処理装置100は、対称スパース行列を複数の部分行列に分割して複数のスレッドに割り振り、複数のコアを用いてそれらスレッドを並列に実行する。第2の実施の形態では、情報処理装置100は、対称スパース行列の下三角の領域について、各スレッドに連続する1または2以上の列を割り当てる。また、情報処理装置100は、対称スパース行列の上三角の領域(対角要素を除く)について、各スレッドに連続する1または2以上の行を割り当てる。このとき、対称の位置にある下三角の領域のj列目と上三角の領域(対角要素を除く)のj行目とを、同じスレッドに割り当てるようにする。
対称スパース行列は圧縮列格納法で表現されているため、情報処理装置100は、まず下三角の領域の列とスレッドとの関係を決定する。これに伴い、上三角の領域(対角要素を除く)の行とスレッドとの関係も自動的に決まる。このとき、情報処理装置100は、各スレッドで処理される非零要素の数ができる限り均等になるようにする。例えば、要素配列121の長さが12であり、並列実行可能なスレッドが4つであるとする。この場合、情報処理装置100は、各スレッドが担当する非零要素が12/4=3個に近くなるように、要素配列121を分割する。図5の例では、下三角の領域の1列目がスレッド#1に割り当てられ、2列目および3列目がスレッド#2に割り当てられ、4列目がスレッド#3に割り当てられ、5列目および6列目がスレッド#4に割り当てられている。
対称スパース行列が分割されると、情報処理装置100は、スレッドポインタ配列124(Bp)を生成する。スレッドポインタ配列124は、各スレッドに割り当てられた列集合の先頭の列を示す列番号が列挙される。複数のスレッドには、連番のスレッド番号が付与されている。スレッドポインタ配列124のk番目の値(Bp(k))は、スレッド#kに割り当てられた列集合の先頭の列を表している。ただし、スレッドポインタ配列124の長さは、スレッド数より1だけ大きい。スレッドポインタ配列124の末尾には、対称スパース行列の列数より1だけ大きい数が格納される。
図6は、スパース行列とベクトルの積の並列計算例を示す図である。
RAM120には、要素配列121、行番号配列122、列ポインタ配列123およびスレッドポインタ配列124が記憶される。更に、RAM120には、作業領域127(Work)、入力ベクトル128(X)および結果ベクトル129(Y)が記憶される。
作業領域127は、中間の演算結果を記憶する1または2以上の列ベクトルとしての作業ベクトルを含む。下三角の領域の部分行列について各スレッドが計算した値は、作業領域127に書き込まれる。一方、上三角の領域(対角要素を除く)について各スレッドが計算した値は、結果ベクトル129に直接書き込まれる。1または2以上の作業ベクトルは、複数のスレッドの実行が完了した後、結果ベクトル129に合算される。ここでは、スレッド毎に1つの作業ベクトルが作業領域127に確保される場合を考える。
下三角の領域について、スレッド#1は、1行1列の非零要素と入力ベクトル128の1行目との積を、スレッド#1に割り当てられた作業領域127の作業ベクトルの1行目(1行1列)に加算する。同様に、スレッド#1は、2行1列の非零要素と入力ベクトル128の1行目との積を作業領域127の2行1列に加算し、4行1列の非零要素と入力ベクトル128の1行目との積を作業領域127の4行1列に加算する。上三角の領域(対角要素を除く)について、スレッド#1は、1行2列の非零要素と入力ベクトル128の2行目との積を結果ベクトル129の1行目に加算し、1行4列の非零要素と入力ベクトル128の4行目との積を結果ベクトル129の1行目に加算する。
下三角の領域について、スレッド#2は、2行2列の非零要素と入力ベクトル128の2行目との積を作業領域127の2行2列に加算する。また、スレッド#2は、3行2列の非零要素と入力ベクトル128の2行目との積を作業領域127の3行2列に加算し、3行3列の非零要素と入力ベクトル128の3行目との積を作業領域127の3行2列に加算する。上三角の領域(対角要素を除く)について、スレッド#2は、2行3列の非零要素と入力ベクトル128の3行目との積を結果ベクトル129の2行目に加算する。
同様に、スレッド#3は、作業領域127の4行3列、5行3列および6行3列に値を加算し、結果ベクトル129の4行目に値を加算する。スレッド#4は、作業領域127の5行4列および6行4列に値を加算し、結果ベクトル129の5行目に値を加算する。スレッド#1〜#4の実行が完了すると、情報処理装置100は、作業領域127に含まれる4つの作業ベクトルを結果ベクトル129に足し合わせる。これにより、結果ベクトル129が、対称スパース行列と入力ベクトル128の積を表すことになる。
上記では、異なるスレッドに対して異なる作業ベクトルを割り当てることとした。しかし、この方法では、作業領域127内の多くの要素が、値が加算されずに0のままになる。例えば、図6の例では、作業領域127の4行2列、5行2列および6行2列の値が0のままである。この4行2列、5行2列および6行2列の領域をスレッド#3が使用したとしても、スレッド#2とスレッド#3の間でアクセス競合は生じない。一方、各作業ベクトルは結果ベクトル129に合算されるものであるため、値の加算される行が正しければ値の加算される列が変わっても、最終的な演算結果に影響しない。そこで、第2の実施の形態では、情報処理装置100は、アクセス競合が生じない範囲で、2以上のスレッドに割り当てる作業領域127の作業ベクトルを共通化するようにする。
図7は、非零要素マップの例を示す図である。
情報処理装置100は、対称スパース行列を分析して、確保する作業ベクトルの数とスレッドへの作業ベクトルの割り当てを決定する。対称スパース行列の分析において、情報処理装置100は、対称スパース行列の行を複数の区間に分割する。好ましくは、区間1つ当たりの行数をできる限り均等にする。情報処理装置100は、区間の数(分割数)を予め固定で決めておいてもよいし、対称スパース行列の次数に応じて分割数を変えてもよい。例えば、数万次元程度の対称スパース行列に対して分割数を100とする。
そして、情報処理装置100は、対称スパース行列の下三角の領域について、行方向および列方向に細分化されたブロック毎に非零要素の有無を確認し、非零要素の分布を示す非零要素マップ125(Map)を生成する。非零要素マップ125の行は上記の区間に対応し、非零要素マップ125の列はスレッド(すなわち、当該スレッドに割り当てられた対称スパース行列の列集合)に対応する。非零要素マップ125では、各ブロックの状態が1ビットのフラグで表現される。フラグ=1は当該ブロック内に少なくとも1つの非零要素があることを示し、フラグ=0は当該ブロック内に非零要素がないことを示す。
例えば、図5のように分割した6行×6列の対称スパース行列の下三角の領域から、6行×4列の非零要素マップ125が生成される。ここでは、非零要素マップ125の1つの行が対称スパース行列の1つの行に対応する。例えば、非零要素マップ125の1行1列、2行1列、4行1列、2行2列、3行2列、4行3列、5行3列、6行3列、5行4列および6行4列がフラグ=1であり、他の要素がフラグ=0になる。このような非零要素マップ125の列同士を比較することで、共通の作業ベクトルを割り当てることが可能なスレッドの組み合わせを探索することができる。
図8は、非零要素マップの他の例を示す図である。
ここでは、2534行×2534列の対称スパース行列を8スレッドで並列処理する場合を考える。行の分割数を8とすると、1区間当たりの行数は317行(2534/8の小数点以下を繰り上げた値)になる。ただし、端数処理の影響で末尾の区間の行数は315行になる。情報処理装置100は、8行×8列の非零要素マップ125を生成し、各ブロックに少なくとも1つの非零要素が含まれるか確認する。大規模な対称スパース行列では、非零要素が対角線付近に集中することがある。その場合、図8に示すように、非零要素マップ125の対角要素および対角要素に隣接する一部の要素がフラグ=1になり、非零要素マップ125の他の多くの要素がフラグ=0になり得る。
図9は、作業ベクトルの割り当て例を示す図である。
上記の通り、情報処理装置100は、非零要素マップ125に基づいて、共通の作業ベクトルを割り当て可能なスレッドの組み合わせを探索する。具体的には、情報処理装置100は、非零要素マップ125から、フラグ=1が同じ行で衝突していない列の組み合わせを探索する。図7の非零要素マップ125の例の場合、1列目と4列目との組み合わせはフラグ=1が衝突せず、2列目と3列目との組み合わせはフラグ=1が衝突しない。
この場合、例えば、情報処理装置100は、スレッド#1,#4に作業ベクトル1(作業領域127の1列目)を割り当て、スレッド#2,#3に作業ベクトル2(作業領域127の2列目)を割り当てる。作業領域127には、4つのスレッド(スレッド#1〜#4)に対して2つの作業ベクトルを確保すればよいことになる。各スレッドに作業ベクトルを割り当てると、情報処理装置100は、スレッドが使用する作業ベクトルの番号を列挙した作業ポインタ配列126(Up)を生成する。作業ポインタ配列126のk番目の値(Up(k))は、スレッド#kが使用する作業ベクトルを表す。
図10は、作業ベクトルの他の割り当て例を示す第1の図である。
ここでは、対称スパース行列を8スレッドで並列処理し、対称スパース行列の行を8区間に分割した場合を考える。スレッド#1の区間1,2、スレッド#2の区間2,3、スレッド#3の区間3,4、スレッド#4の区間4,5、スレッド#5の区間5,6、スレッド#6の区間6,7、スレッド#7の区間7,8およびスレッド#8の区間8に非零要素が存在する。他の区間には非零要素は存在しない。
この場合、スレッド#1,#3,#5,#7に共通の作業ベクトルを割り当てても、これらのスレッド間で作業ベクトルの同じ要素に対するアクセス競合は生じない。また、スレッド#2,#4,#6,#8に共通の作業ベクトルを割り当てても、これらのスレッド間で作業ベクトルの同じ要素に対するアクセス競合は生じない。そこで、例えば、情報処理装置100は、スレッド#1,#3,#5,#7に作業ベクトル1を割り当て、スレッド#2,#4,#6,#8に作業ベクトル2を割り当てる。8個のスレッド(スレッド#1〜#8)に対して2つの作業ベクトルを確保すればよいことになる。
このように、3以上のスレッドに共通の作業ベクトルを割り当てることもできる。多くの大規模な対称スパース行列では、スレッドの組み合わせを適切に判断することで、作業領域127に確保する作業ベクトルの数を2〜3個に抑えることが可能である。
図11は、作業ベクトルの他の割り当て例を示す第2の図である。
ここでは、図10と同様に、対称スパース行列を8スレッドで並列処理し、対称スパース行列の行を8区間に分割した場合を考える。スレッド#1の区間1,2,4、スレッド#2の区間2,3,6、スレッド#3の区間3,4,8、スレッド#4の区間4,5、スレッド#5の区間5,6、スレッド#6の区間6,7、スレッド#7の区間7,8およびスレッド#8の区間8に非零要素が存在する。他の区間には非零要素は存在しない。
この場合、例えば、情報処理装置100は、スレッド#1,#5,#7に作業ベクトル1を割り当て、スレッド#2,#4,#8に作業ベクトル2を割り当て、スレッド#3,#6に作業ベクトル3を割り当てる。8個のスレッド(スレッド#1〜#8)に対して3つの作業ベクトルを作業領域127に確保すればよいことになる。
図12は、作業ベクトルの他の割り当て例を示す第3の図である。
ここでは、図10と同様に、対称スパース行列を8スレッドで並列処理し、対称スパース行列の行を8区間に分割した場合を考える。スレッド#1の区間1,3,7、スレッド#2の区間2,6、スレッド#3の区間3,5、スレッド#4の区間4,8、スレッド#5の区間5,7、スレッド#6の区間6、スレッド#7の区間7およびスレッド#8の区間8に非零要素が存在する。他の区間には非零要素は存在しない。
この場合、例えば、情報処理装置100は、スレッド#1,#2,#4に作業ベクトル1を割り当て、スレッド#3,#6,#7,#8に作業ベクトル2を割り当て、スレッド#5に作業ベクトル3を割り当てる。8個のスレッド(スレッド#1〜#8)に対して3つの作業ベクトルを作業領域127に確保すればよいことになる。
ここで、アクセス競合が生じないスレッドの組み合わせは、様々なアルゴリズムを使用して探索することができる。図9〜12の組み合わせ例は、非零要素マップ125の左側の列から順に、既に確保した作業ベクトルの中からフラグ=1が衝突しないものを探し、該当する作業ベクトルがなければ新たな作業ベクトルを確保することで探索できる。
例えば、図12の場合、情報処理装置100は、作業ベクトル1を確保し、スレッド#1に作業ベクトル1を割り当てる。次に、情報処理装置100は、作業ベクトル1にスレッド#2を追加可能であるため、スレッド#2に作業ベクトル1を割り当てる。次に、情報処理装置100は、作業ベクトル1にスレッド#3を追加できないため、作業ベクトル2を確保し、スレッド#3に作業ベクトル2を割り当てる。
次に、情報処理装置100は、作業ベクトル1にスレッド#4を追加可能であるため、スレッド#4に作業ベクトル1を割り当てる。次に、情報処理装置100は、作業ベクトル1,2の何れにもスレッド#5を追加できないため、作業ベクトル3を確保し、スレッド#5に作業ベクトル3を割り当てる。次に、情報処理装置100は、作業ベクトル1にはスレッド#6を追加できないが、作業ベクトル2にスレッド#6を追加可能であるため、スレッド#6に作業ベクトル2を割り当てる。同様にして、情報処理装置100は、スレッド#7,#8に作業ベクトル2を割り当てる。
ただし、対称スパース行列の中の非零要素の分布が複雑である場合、使用する探索アルゴリズムによって、作業領域127に確保される作業ベクトルの数が変わることがある。
図13は、作業ベクトルの他の割り当て例を示す第4の図である。
ここでは、対称スパース行列を6スレッドで並列処理し、対称スパース行列の行を8区間に分割した場合を考える。スレッド#1の区間1,3,8、スレッド#2の区間2,5、スレッド#3の区間3,4,7,8、スレッド#4の区間4,5,7、スレッド#5の区間6およびスレッド#6の区間6に非零要素が存在する。
ある探索アルゴリズム(例えば、前述のアルゴリズム)によれば、例えば、情報処理装置100は、スレッド#1,#2,#5に作業ベクトル1を割り当て、スレッド#3,#6に作業ベクトル2を割り当て、スレッド#4に作業ベクトル3を割り当てる。すなわち、3つの作業ベクトルが作業領域127に確保される。一方、別の探索アルゴリズムによれば、例えば、情報処理装置100は、スレッド#1,#4,#5に作業ベクトル1を割り当て、スレッド#2,#3,#6に作業ベクトル2を割り当てる。すなわち、先の探索アルゴリズムの場合よりも少ない2つの作業ベクトルが、作業領域127に確保される。
通常、作業ベクトルの数を最小化できる探索アルゴリズム(最適解を求めるアルゴリズム)は、その他の探索アルゴリズム(準最適解を求めるアルゴリズム)よりも計算量が大きくなる。情報処理装置100は、解の精度と計算量とのバランスを考慮して、使用する探索アルゴリズムを選択するようにしてもよい。以下の説明では、情報処理装置100は、少ない計算量で準最適解を求める探索アルゴリズムを使用するものとする。
次に、情報処理装置100の機能および処理手順について説明する。
図14は、情報処理装置の機能例を示すブロック図である。
情報処理装置100は、データ記憶部150、行列演算要求部161、並列化制御部162、並列処理部165およびOS168を有する。データ記憶部150は、RAM120に確保した記憶領域として実現される。行列演算要求部161、並列化制御部162および並列処理部165は、ソフトウェアのモジュールとして実現される。特に、並列化制御部162および並列処理部165は、数値計算ライブラリであってもよい。
データ記憶部150は、行列記憶部151、制御データ記憶部152、中間データ記憶部153およびベクトル記憶部154を有する。行列記憶部151は、対称スパース行列を表す行列データを記憶する。行列データは、要素配列121、行番号配列122および列ポインタ配列123を含む。制御データ記憶部152は、並列化の制御に用いる制御データを記憶する。制御データは、スレッドポインタ配列124、非零要素マップ125および作業ポインタ配列126を含む。中間データ記憶部153は、作業領域127を含む。ベクトル記憶部154は、入力ベクトル128および結果ベクトル129を記憶する。
行列演算要求部161は、要素配列121、行番号配列122、列ポインタ配列123および入力ベクトル128をデータ記憶部150に格納し、対称スパース行列と入力ベクトル128との積の計算を並列化制御部162に要求する。結果ベクトル129が得られると、行列演算要求部161は、結果ベクトル129を加工し、次の入力ベクトル128として使用する。行列演算要求部161は、反復回数や結果ベクトル129に含まれる値の精度などの演算状況が所定の終了条件を満たすまで、対称スパース行列と入力ベクトル128との積の計算を繰り返し並列化制御部162に対して要求する。
並列化制御部162は、行列演算の並列化を制御する。並列化制御部162は、行列解析部163およびベクトル入出力部164を有する。
行列解析部163は、行列演算要求部161から最初に対称スパース行列が指定されたとき(反復演算の1回目のとき)、対称スパース行列を分析して並列化方法を決定する。行列解析部163は、対称スパース行列を分割して複数のスレッドに割り振る。行列演算を行うスレッドの数は、例えば、情報処理装置100が備えるハードウェア資源の量、情報処理装置100の現在の負荷、ユーザの契約内容などの条件に基づいて決定される。また、行列解析部163は、作業領域127に確保する作業ベクトルの数を決定し、複数のスレッドそれぞれに何れかの作業ベクトルを割り当てる。
ベクトル入出力部164は、行列演算要求部161から入力ベクトル128が指定される毎に(反復演算の1回毎に)、作業領域127および結果ベクトル129を初期化する。また、ベクトル入出力部164は、複数のスレッドの行列演算が完了すると、作業領域127に含まれる全ての作業ベクトルを結果ベクトル129に足し合わせて、対称スパース行列と入力ベクトル128の積としての最終的な解を求める。
並列処理部165は、並列に実行される複数のスレッドの機能を実現する。並列処理部165は、非零要素チェック部166および行列演算部167を有する。
非零要素チェック部166は、行列解析部163からの要求に応じて、自スレッドに割り当てられた部分行列における非零要素の分布を確認し、非零要素マップ125の自スレッドに対応する列のフラグを更新していく。非零要素マップ125の生成は、複数のスレッドを用いて並列化されることになる。なお、各スレッドは、スレッドポインタ配列124を参照して、割り当てられた対称スパース行列の列を特定できる。
行列演算部167は、ベクトル入出力部164からの要求に応じて、自スレッドに割り当てられた部分行列と入力ベクトル128との積を計算する。対称スパース行列の下三角の領域については、行列演算部167は、行列解析部163から割り当てられた作業ベクトルに演算結果を書き込む。一方、対称スパース行列の上三角の領域(対角要素を除く)については、行列演算部167は、結果ベクトル129に演算結果を書き込む。
OS168は、行列解析部163からの要求に応じて、複数のスレッドを起動し、CPU110,110a,110b,110cに含まれる複数のコアにそれら複数のスレッドを割り振る。原則として、異なるスレッドは異なるコアに割り当てられる。また、OS168は、行列解析部163からの要求に応じて、RAM120に作業領域127を確保する。なお、並列化制御部162、並列処理部165およびOS168に相当するスレッドまたはプロセスは、好ましくは、互いに異なるコアで実行される。
図15は、行列演算制御の手順例を示すフローチャートである。
(S1)行列演算要求部161は、対称スパース行列を表す要素配列121、行番号配列122および列ポインタ配列123を行列記憶部151に格納する。行列解析部163は、行列記憶部151から行番号配列122および列ポインタ配列123を読み込む。
(S2)行列解析部163は、行列演算に使用するスレッドの数を決定し、決定した数のスレッドを起動するようOS168に要求する。このとき、行列解析部163は、各スレッドに連番のスレッド番号を付与する。また、行列解析部163は、要素配列121を参照して対称スパース行列に含まれる非零要素の数を特定し、非零要素の数ができる限り均等になるように対称スパース行列の列を分割する。そして、行列解析部163は、スレッドポインタ配列124を生成して、制御データ記憶部152に格納する。
(S3)行列解析部163は、非零要素マップ125を生成して、制御データ記憶部152に格納する。そして、行列解析部163は、スレッド毎に非零要素チェック部166を呼び出す。各スレッドの非零要素チェック部166は、非零要素マップ125に含まれる自スレッドに対応する列のフラグを更新する。非零要素チェックの詳細は後述する。
(S4)行列解析部163は、ステップS3で生成された非零要素マップ125に基づいて、作業領域127に確保する作業ベクトルの数および各スレッドへの作業ベクトルの割り当てを決定する。そして、行列解析部163は、作業ポインタ配列126を生成し、制御データ記憶部152に格納する。作業ベクトル割り当ての詳細は後述する。
(S5)行列解析部163は、ステップS4で決定した数の作業ベクトルを含む作業領域127を中間データ記憶部153に確保するよう、OS168に要求する。また、行列解析部163は、空の結果ベクトル129を生成し、ベクトル記憶部154に格納する。
(S6)行列演算要求部161は、入力ベクトル128をベクトル記憶部154に格納する。ただし、反復演算の1回目に使用する初期の入力ベクトル128については、ステップS1でベクトル記憶部154に格納されてもよい。ベクトル入出力部164は、ベクトル記憶部154から入力ベクトル128を読み込む。
(S7)ベクトル入出力部164は、スレッド毎に行列演算部167を呼び出す。行列演算部167は、自スレッドに割り当てられた部分行列と入力ベクトル128との積を計算する。ベクトル入出力部164は、作業領域127に含まれる全ての作業ベクトルを結果ベクトル129に足し合わせる。これにより、結果ベクトル129は、対称スパース行列と入力ベクトル128との積を表す。並列行列演算の詳細は後述する。
(S8)行列演算要求部161は、結果ベクトル129をベクトル記憶部154から読み込む。そして、行列演算要求部161は、演算状況が所定の終了条件を満たしているか判断する。終了条件を満たす場合、行列演算要求部161は、反復演算を打ち切る。終了条件を満たさない場合、行列演算要求部161は、読み込んだ結果ベクトル129を用いて次の入力ベクトル128を生成し、ステップS6に処理を進める。
図16は、非零要素チェックの手順例を示すフローチャートである。この非零要素チェックは、図15のフローチャートのステップS3で実行される。
(S30)行列解析部163は、対称スパース行列の行を複数の区間に分割する。例えば、区間の数(分割数)が予め決まっているとすると、行列解析部163は、幅(区間1つ当たりの行数)を、幅w=(対称スパース行列の行数+分割数−1)/分割数と計算する。なお、以下の説明では除算は小数点以下を切り捨てるものとする。
(S31)行列解析部163は、大きさが分割数×スレッド数の非零要素マップ125を生成し、制御データ記憶部152に格納する。このとき、行列解析部163は、非零要素マップ125の全ての要素を零に初期化する。そして、行列解析部163は、スレッド毎に非零要素チェック部166を呼び出す。以下のステップS32〜S38の処理が、複数のスレッドで並列に実行される。以下では、スレッド番号=tのスレッド(スレッド#t)がステップS32〜S38の処理を行う場合を説明する。
(S32)非零要素チェック部166は、スレッドポインタ配列124を参照して、スレッド#tに割り当てられた列集合の中の先頭の列を選択する。具体的には、非零要素チェック部166は、列番号c=Bp(t)を特定する。
(S33)非零要素チェック部166は、列ポインタ配列123を参照して、ステップS32またはステップS38で選択した列に含まれる先頭の非零要素を選択する。具体的には、非零要素チェック部166は、要素番号e=Cp(c)を特定する。
(S34)非零要素チェック部166は、ステップS33またはステップS36で選択した非零要素に対応する非零要素マップ125のフラグを1に設定する。具体的には、非零要素チェック部166は、Map((Row(e)−1)/w+1,t)=1とする。
(S35)非零要素チェック部166は、列ポインタ配列123を参照して、ステップS32またはステップS38で選択した列に含まれる全ての非零要素を選択したか判断する。具体的には、非零要素チェック部166は、ステップS33またはステップS36で特定した要素番号eがCp(c+1)−1に一致するか判断する。全て選択した場合はステップS37に処理を進め、未選択のものがある場合はステップS36に処理を進める。
(S36)非零要素チェック部166は、次の非零要素を選択する。具体的には、非零要素チェック部166は、要素番号eをインクリメント(現在の要素番号eに1を加算)する。そして、ステップS34に処理を進める。
(S37)非零要素チェック部166は、スレッドポインタ配列124を参照して、スレッド#tに割り当てられた列を全て選択したか判断する。具体的には、非零要素チェック部166は、列番号cがBp(t+1)−1に一致するか判断する。全て選択した場合、非零要素チェック部166は、非要素チェックを終了して行列解析部163に完了を通知する。未選択の列がある場合、ステップS38に処理を進める。
(S38)非零要素チェック部166は、次の列を選択する。具体的には、非零要素チェック部166は、列番号cをインクリメント(現在の列番号cに1を加算)する。そして、ステップS33に処理を進める。
図17は、作業ベクトル割り当ての手順例を示すフローチャートである。この作業ベクトル割り当ては、図15のフローチャートのステップS4で実行される。
(S40)行列解析部163は、作業ベクトルを1つ用意すると決定し、用意した作業ベクトルをスレッド#1に割り当てる。具体的には、行列解析部163は、変数としてベクトル数nを1に設定すると共に、Up(1)=1に設定する。
(S41)行列解析部163は、スレッド#2を選択する。具体的には、行列解析部163は、変数としてスレッド番号tを2に設定する。
(S42)行列解析部163は、現在までに用意した作業ベクトルのうちの先頭を選択する。具体的には、行列解析部163は、変数としてベクトル番号vを1に設定する。
(S43)行列解析部163は、非零要素マップ125のv列目とt列目とを比較し、フラグ=1の分布に重複があるか判断する。具体的には、行列解析部163は、v列目の列ベクトルとt列目の列ベクトルとの論理積を計算し、v列目とt列目の両方でフラグ=1になっている区間が存在するか判断する。フラグ=1の分布に重複がある場合はステップS46に処理を進め、重複がない場合はステップS44に処理を進める。
(S44)行列解析部163は、ステップS41またはステップS52で選択したスレッドに、ステップS42またはステップS47で選択した作業ベクトルを割り当てる。具体的には、行列解析部163は、Up(t)=vに設定する。
(S45)行列解析部163は、非零要素マップ125のt列目のフラグ=1をv列目にコピーする。そして、ステップS51に処理を進める。
(S46)行列解析部163は、現在までに用意した作業ベクトルを全て選択したか判断する。具体的には、行列解析部163は、ベクトル番号vがベクトル数nに一致するか判断する。全ての作業ベクトルを選択した場合はステップS48に処理を進め、未選択の作業ベクトルがある場合はステップS47に処理を進める。
(S47)行列解析部163は、現在用意している次の作業ベクトルを選択する。具体的には、行列解析部163は、ベクトル番号vをインクリメント(現在のベクトル番号vに1を加算)する。そして、ステップS43に処理を進める。
(S48)行列解析部163は、作業ベクトルを1つ追加する。具体的には、行列解析部163は、ベクトル数nをインクリメント(現在のベクトル数nに1を加算)する。
(S49)行列解析部163は、ステップS41またはステップS52で選択したスレッドに、ステップS48で新たに追加した作業ベクトルを割り当てる。具体的には、行列解析部163は、Up(t)=nに設定する。
(S50)行列解析部163は、非零要素マップ125のn列目のフラグをt列目のフラグで上書きする。すなわち、n列目の列ベクトルをt列目の列ベクトルと一致させる。
(S51)行列解析部163は、スレッドを全て選択したか判断する。具体的には、行列解析部163は、スレッド番号tがスレッド数に一致するか判断する。全てのスレッドを選択した場合、行列解析部163は、作業ベクトル割り当てを終了する。これにより、作業領域127に確保する作業ベクトルの数と、作業ポインタ配列126の内容が確定する。未選択のスレッドがある場合、ステップS52に処理を進める。
(S52)行列解析部163は、次のスレッドを選択する。具体的には、行列解析部163は、スレッド番号tをインクリメント(現在のスレッド番号tに1を加算)する。そして、ステップS42に処理を進める。
図18は、並列行列演算の手順例を示すフローチャートである。この並列行列演算は、図15のフローチャートのステップS7で実行される。
(S70)ベクトル入出力部164は、作業領域127に含まれる作業ベクトルの要素と結果ベクトル129の要素を全て零に初期化する。そして、ベクトル入出力部164は、スレッド毎に行列演算部167を呼び出す。以下のステップS71〜S79の処理が、複数のスレッドで並列に実行される。以下では、スレッド番号=tのスレッド(スレッド#t)がステップS71〜S79の処理を行う場合を説明する。
(S71)行列演算部167は、スレッドポインタ配列124を参照して、スレッド#tに割り当てられた列集合の中の先頭の列を選択する。具体的には、行列演算部167は、列番号c=Bp(t)を特定する。
(S72)行列演算部167は、列ポインタ配列123を参照して、ステップS71またはステップS79で選択した列に含まれる先頭の非零要素を選択する。具体的には、行列演算部167は、要素番号e=Cp(c)を特定する。
(S73)行列演算部167は、下三角の領域に関して、ステップS72またはステップS77で選択した非零要素の値と入力ベクトル128のc行目の値との積を計算し、スレッド#tに割り当てられた作業ベクトルに保存する。具体的には、行列演算部167は、Val(e)X(c)をWork(Row(e),Up(t))に加算する。
(S74)行列演算部167は、ステップS72またはステップS77で選択した非零要素が、対称スパース行列の対角要素であるか判断する。具体的には、行列演算部167は、Row(e)と列番号cが一致するか判断する。対角要素である場合はステップS76に処理を進め、対角要素でない場合はステップS75に処理を進める。
(S75)行列演算部167は、上三角の領域(対角要素を除く)に関して、ステップS72またはステップS77で選択した非零要素の値と入力ベクトル128の当該非零要素に対応する行の値との積を計算し、結果ベクトル129に保存する。具体的には、行列演算部167は、Val(e)X(Row(e))をY(c)に加算する。
(S76)行列演算部167は、列ポインタ配列123を参照して、ステップS71またはステップS79で選択した列に含まれる全ての非零要素を選択したか判断する。具体的には、行列演算部167は、ステップS72またはステップS77で特定した要素番号eがCp(c+1)−1に一致するか判断する。全て選択した場合はステップS78に処理を進め、未選択のものがある場合はステップS77に処理を進める。
(S77)行列演算部167は、次の非零要素を選択する。具体的には、行列演算部167は、要素番号eをインクリメントする。そして、ステップS73に処理を進める。
(S78)行列演算部167は、スレッドポインタ配列124を参照して、スレッド#tに割り当てられた列を全て選択したか判断する。具体的には、行列演算部167は、列番号cがBp(t+1)−1に一致するか判断する。全て選択した場合、行列演算部167は、部分行列と入力ベクトル128との積の計算を終了してベクトル入出力部164に完了を通知する。そして、ステップS80に処理を進める。未選択の列がある場合、ステップS79に処理を進める。
(S79)行列演算部167は、次の列を選択する。具体的には、行列演算部167は、列番号cをインクリメントする。そして、ステップS72に処理を進める。
(S80)ベクトル入出力部164は、作業領域127に含まれる全ての作業ベクトルを結果ベクトル129に足し合わせる。具体的には、ベクトル入出力部164は、作業領域127のi行j列の値をY(i)に加算する。そして、ベクトル入出力部164は、行列演算要求部161に、行列演算の完了を通知する。
なお、第2の実施の形態では、対称スパース行列と列ベクトルとの積を計算した。しかし、上記の作業ベクトルの割り当て方法は、行ベクトルと対称スパース行列との積を計算する場合にも適用できる。その場合、対称スパース行列の上三角の領域の部分行列と入力ベクトル128との積を保存するために作業ベクトルが使用される。
また、第2の実施の形態では、対称スパース行列を圧縮列格納法で表現した。しかし、対称スパース行列を圧縮行格納法で表現してもよいし、圧縮せずに表現してもよい。対称の位置にある部分行列を同じスレッドに割り当てる限り、上三角の領域と下三角の領域の何れか一方についてスレッド間のアクセス競合の問題が生じる。
また、第2の実施の形態では、ベクトルと掛け算されるスパース行列が対称行列であるとした。しかし、スパース行列が対称行列でなくてもよい。圧縮列格納法で表現されたスパース行列の列を分割し、列ベクトルとの積を求める場合、スレッド間のアクセス競合の問題が生じる。また、圧縮行格納法で表現されたスパース行列の行を分割し、行ベクトルとの積を求める場合にも、スレッド間のアクセス競合の問題が生じる。
第2の実施の形態の情報処理装置100によれば、複数のスレッドに割り当てられた部分行列の間で非零要素の分布が比較され、非零要素の分布が重複しないようなスレッドの組み合わせに対して共通の作業ベクトルが割り当てられる。よって、作業ベクトルの同じ要素に対するアクセス競合を防ぐことができ、複数のスレッド間で作業ベクトルへのアクセスの排他制御を行わなくてよい。また、アクセス競合が発生しない範囲で、作業領域127に確保する作業ベクトルの数を少なくする(例えば、最小化する)ことができる。よって、スレッド数が増加しても作業領域127のサイズを抑制することができる。このように、情報処理装置100によれば、RAM120の記憶領域を効率的に利用することができ、大規模なスパース行列とベクトルとの積を効率的に計算できる。
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10にプログラムを実行させることで実現することができる。また、第2の実施の形態の情報処理は、情報処理装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体143)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD131)にプログラムを複製して(インストールして)実行してもよい。
10 情報処理装置
11,12,13 プロセッサ
14 メモリ
21,22 スレッド
23 行列
24,25 部分行列
26,27 記憶領域

Claims (4)

  1. 複数のスレッドを並列に実行可能なコンピュータに、
    零要素および非零要素を含む行列の中の2以上の行および1以上の列によって特定される第1の部分行列を、第1のスレッドに割り当て、前記第1の部分行列と少なくとも一部が重複する2以上の行および前記第1の部分行列と重複しない1以上の列によって特定される前記行列の中の第2の部分行列を、第2のスレッドに割り当て、
    前記第1の部分行列および前記第2の部分行列それぞれについて非零要素が存在する行を検出し、前記第1の部分行列と前記第2の部分行列との間で非零要素が同じ行に存在しないことを示す所定条件を満たすか判定し、
    前記行列の行数に応じた大きさの第1の記憶領域を前記第1のスレッドに割り当てることで、前記第1の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、
    前記所定条件を満たす場合には、前記第1の記憶領域を更に前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、前記所定条件を満たさない場合には、前記行列の行数に応じた大きさの第2の記憶領域を前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第2の記憶領域内の位置に書き込ませる、
    処理を実行させるプログラム。
  2. 前記所定条件の判定では、前記行列の行を複数の区間に分割し、前記第1の部分行列の各区間内に非零要素が存在するか否かを示す第1のビットマップを生成し、前記第2の部分行列の各区間内に非零要素が存在するか否かを示す第2のビットマップを生成し、前記第1のビットマップと前記第2のビットマップとを比較する、
    請求項1記載のプログラム。
  3. 複数のスレッドを並列に実行可能なコンピュータが行う並列演算方法であって、
    零要素および非零要素を含む行列の中の2以上の行および1以上の列によって特定される第1の部分行列を、第1のスレッドに割り当て、前記第1の部分行列と少なくとも一部が重複する2以上の行および前記第1の部分行列と重複しない1以上の列によって特定される前記行列の中の第2の部分行列を、第2のスレッドに割り当て、
    前記第1の部分行列および前記第2の部分行列それぞれについて非零要素が存在する行を検出し、前記第1の部分行列と前記第2の部分行列との間で非零要素が同じ行に存在しないことを示す所定条件を満たすか判定し、
    前記行列の行数に応じた大きさの第1の記憶領域を前記第1のスレッドに割り当てることで、前記第1の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、
    前記所定条件を満たす場合には、前記第1の記憶領域を更に前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、前記所定条件を満たさない場合には、前記行列の行数に応じた大きさの第2の記憶領域を前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第2の記憶領域内の位置に書き込ませる、
    並列演算方法。
  4. 互いに並列にスレッドを実行可能な複数のプロセッサと、
    モリと、
    を有し、前記複数のプロセッサの1つは、
    零要素および非零要素を含む行列の中の2以上の行および1以上の列によって特定される第1の部分行列を、第1のスレッドに割り当て、前記第1の部分行列と少なくとも一部が重複する2以上の行および前記第1の部分行列と重複しない1以上の列によって特定される前記行列の中の第2の部分行列を、第2のスレッドに割り当て、
    前記第1の部分行列および前記第2の部分行列それぞれについて非零要素が存在する行を検出し、前記第1の部分行列と前記第2の部分行列との間で非零要素が同じ行に存在しないことを示す所定条件を満たすか判定し、
    前記行列の行数に応じた大きさの前記メモリ内の第1の記憶領域を前記第1のスレッドに割り当てることで、前記第1の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、
    前記所定条件を満たす場合には、前記第1の記憶領域を更に前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第1の記憶領域内の位置に書き込ませ、前記所定条件を満たさない場合には、前記行列の行数に応じた大きさの前記メモリ内の第2の記憶領域を前記第2のスレッドに割り当てることで、前記第2の部分行列の非零要素に基づいて算出される値を当該非零要素が存在する行に対応する前記第2の記憶領域内の位置に書き込ませる、
    情報処理装置。
JP2013074443A 2013-03-29 2013-03-29 プログラム、並列演算方法および情報処理装置 Active JP6083300B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2013074443A JP6083300B2 (ja) 2013-03-29 2013-03-29 プログラム、並列演算方法および情報処理装置
US14/190,623 US9418048B2 (en) 2013-03-29 2014-02-26 Apparatus and method for allocating shared storage areas to parallel processors for multiplication of sparse matrix and vector

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013074443A JP6083300B2 (ja) 2013-03-29 2013-03-29 プログラム、並列演算方法および情報処理装置

Publications (2)

Publication Number Publication Date
JP2014199545A JP2014199545A (ja) 2014-10-23
JP6083300B2 true JP6083300B2 (ja) 2017-02-22

Family

ID=51622180

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013074443A Active JP6083300B2 (ja) 2013-03-29 2013-03-29 プログラム、並列演算方法および情報処理装置

Country Status (2)

Country Link
US (1) US9418048B2 (ja)
JP (1) JP6083300B2 (ja)

Families Citing this family (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9367519B2 (en) * 2013-08-30 2016-06-14 Microsoft Technology Licensing, Llc Sparse matrix data structure
US10373057B2 (en) * 2015-04-09 2019-08-06 International Business Machines Corporation Concept analysis operations utilizing accelerators
US9720851B2 (en) * 2015-08-20 2017-08-01 National Technologies & Engineering Solutions of Sandia, LLC Method and apparatus for managing access to a memory
US9858144B2 (en) 2015-08-20 2018-01-02 National Technology & Engineering Solutions Of Sandia, Llc Processor-in-memory-and-storage architecture
JP6601222B2 (ja) * 2016-01-04 2019-11-06 富士通株式会社 行列演算プログラム、行列分割方法、及び並列処理装置
CN108701463B (zh) 2016-02-03 2020-03-10 杜比国际公司 音频译码中的高效格式转换
US9898441B2 (en) * 2016-02-05 2018-02-20 Google Llc Matrix processing apparatus
US9805001B2 (en) 2016-02-05 2017-10-31 Google Inc. Matrix processing apparatus
JP6848979B2 (ja) * 2016-10-11 2021-03-24 日本電気株式会社 領域確保装置、領域確保方法、及び、領域確保プログラム
US10031806B2 (en) * 2016-11-01 2018-07-24 Cisco Technology, Inc. Efficient repair of erasure coded data based on coefficient matrix decomposition
DE102016223079B4 (de) * 2016-11-23 2024-03-28 Robert Bosch Gmbh Verfahren und Vorrichtung zur Ermittlung einer Zuordnung zwischen einem Matrixelement einer Matrix und einem Vergleichsmatrixelement einer Vergleichsmatrix mittels Korrespondenztabelle
US10146738B2 (en) * 2016-12-31 2018-12-04 Intel Corporation Hardware accelerator architecture for processing very-sparse and hyper-sparse matrix data
US11508821B2 (en) 2017-05-12 2022-11-22 Analog Devices, Inc. Gallium nitride device for high frequency and high power applications
JP6907700B2 (ja) * 2017-05-23 2021-07-21 富士通株式会社 情報処理装置、マルチスレッド行列演算方法、およびマルチスレッド行列演算プログラム
KR20190041388A (ko) * 2017-10-12 2019-04-22 삼성전자주식회사 전자 장치 및 그 제어 방법
US11429915B2 (en) 2017-11-30 2022-08-30 Microsoft Technology Licensing, Llc Predicting feature values in a matrix
US11010688B2 (en) * 2017-11-30 2021-05-18 Microsoft Technology Licensing, Llc Negative sampling
WO2020010253A1 (en) 2018-07-06 2020-01-09 Analog Devices, Inc. Compound device with back-side field plate
US10726096B2 (en) * 2018-10-12 2020-07-28 Hewlett Packard Enterprise Development Lp Sparse matrix vector multiplication with a matrix vector multiplication unit
US11132423B2 (en) * 2018-10-31 2021-09-28 Hewlett Packard Enterprise Development Lp Partition matrices into sub-matrices that include nonzero elements
US11562248B2 (en) * 2019-04-29 2023-01-24 Advanced Micro Devices, Inc. Data sparsity monitoring during neural network training
US11127167B2 (en) * 2019-04-29 2021-09-21 Nvidia Corporation Efficient matrix format suitable for neural networks
US11010202B2 (en) * 2019-08-06 2021-05-18 Facebook, Inc. Distributed physical processing of matrix sum operation

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3697992B2 (ja) * 2000-01-25 2005-09-21 日本電気株式会社 行列ベクトル積演算システム及びそれに用いる行列格納システム並びにそれらの方法
US8775495B2 (en) * 2006-02-13 2014-07-08 Indiana University Research And Technology Compression system and method for accelerating sparse matrix computations
EP2058740A1 (en) 2006-08-30 2009-05-13 Fujitsu Limited High-speed calculation process method of combination equation based on finite element method and boundary element method
JP4942095B2 (ja) * 2007-01-25 2012-05-30 インターナショナル・ビジネス・マシーンズ・コーポレーション マルチコア・プロセッサにより演算を行う技術
JP5262177B2 (ja) 2008-02-22 2013-08-14 富士通株式会社 ベクトル積の並列処理方法
JP5458621B2 (ja) 2009-03-19 2014-04-02 富士通株式会社 スパースな正値対称行列の連立1次方程式の計算方法、装置、プログラム
CA2691851A1 (en) * 2010-02-04 2011-08-04 Ibm Canada Limited - Ibm Canada Limitee Control flow analysis using deductive reaching definitions
US8751556B2 (en) * 2010-06-11 2014-06-10 Massachusetts Institute Of Technology Processor for large graph algorithm computations and matrix operations
JP5672902B2 (ja) 2010-09-27 2015-02-18 富士通株式会社 ordering生成方法、プログラム及び共有メモリ型スカラ並列計算機

Also Published As

Publication number Publication date
US9418048B2 (en) 2016-08-16
US20140298351A1 (en) 2014-10-02
JP2014199545A (ja) 2014-10-23

Similar Documents

Publication Publication Date Title
JP6083300B2 (ja) プログラム、並列演算方法および情報処理装置
US20190266217A1 (en) Apparatus and method for matrix computation
US20170206089A1 (en) Information processing apparatus and computational method
CN111340201A (zh) 卷积神经网络加速器及其执行卷积运算操作的方法
US9910714B2 (en) Scriptable dynamic load balancing in computer systems
JP6200824B2 (ja) 演算制御装置及び演算制御方法並びにプログラム、OpenCLデバイス
US20190004728A1 (en) Method and device for managing storage system
US20210117188A1 (en) Information processing device, arithmetic device, and information processing method
US20200090051A1 (en) Optimization problem operation method and apparatus
US10831604B2 (en) Storage system management method, electronic device, storage system and computer program product
JP6659724B2 (ja) 並列プロセッサカーネルのディスパッチサイズのコンカレンシーファクタを決定するシステム及び方法
US11048600B2 (en) Method and apparatus for managing storage system
JP2016103132A (ja) 有限要素演算プログラム、有限要素演算装置および有限要素演算方法
CN109308191A (zh) 分支预测方法及装置
CN112948279A (zh) 管理存储系统中的访问请求的方法、设备和程序产品
US20200285510A1 (en) High precision load distribution among processors
KR102574449B1 (ko) 데이터 처리 방법 및 장치
US20170329650A1 (en) Information processing apparatus and job management method
JP2020080048A (ja) 並列処理装置およびプログラム
JP2024516514A (ja) 畳み込みニューラル・ネットワーク実行のための活性化のメモリ・マッピング
US20150106570A1 (en) Cache method and cache apparatus
US11615106B2 (en) Non-transitory computer-readable storage medium storing program for performing time-series analysis by calculating approximation calculation application degree, time-series analysis method for performing time-series analysis by calculating approximation calculation application degree, and information processing apparatus for performing time-series analysis by calculating approximation calculation application degree
JP2023047899A (ja) データ解析プログラム、データ解析方法および情報処理装置
US20220414184A1 (en) Data processing apparatus and data processing method
US20230409666A1 (en) Computer-readable recording medium storing calculation program, calculation method, and information processing device

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20151204

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20161018

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20161025

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161207

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: 20161227

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170109

R150 Certificate of patent or registration of utility model

Ref document number: 6083300

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150