[go: up one dir, main page]

JP5782265B2 - 行列計算処理方法、プログラム及びシステム - Google Patents

行列計算処理方法、プログラム及びシステム Download PDF

Info

Publication number
JP5782265B2
JP5782265B2 JP2011022311A JP2011022311A JP5782265B2 JP 5782265 B2 JP5782265 B2 JP 5782265B2 JP 2011022311 A JP2011022311 A JP 2011022311A JP 2011022311 A JP2011022311 A JP 2011022311A JP 5782265 B2 JP5782265 B2 JP 5782265B2
Authority
JP
Japan
Prior art keywords
matrix
cpu
row
column
memory
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
JP2011022311A
Other languages
English (en)
Other versions
JP2012164039A (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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2011022311A priority Critical patent/JP5782265B2/ja
Priority to US13/363,421 priority patent/US20120203815A1/en
Priority to US13/591,631 priority patent/US9098460B2/en
Publication of JP2012164039A publication Critical patent/JP2012164039A/ja
Application granted granted Critical
Publication of JP5782265B2 publication Critical patent/JP5782265B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; 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)
  • Complex Calculations (AREA)

Description

この発明は、コンピュータの処理によって、行列の計算を行う技法に関し、より詳しくは、FMM(Funny Matrix Multiplication)の計算に関する。
FMMとは、通常の行列乗算処理におけるadd(加算)とmultiply(乗算)を、それぞれ、min演算とadd演算に置き換えた行列計算処理のことである。すなわち、2つの入力行列A、Bについて、C[i,j] = mink{A[i,k] + B[k,j]}を全ての(i,j)について計算することがFMMの定義である。FMMは正方行列に限定されないが、ここでは便宜上、行列Aと行列Bは、n×nの正方行列であると仮定する。
FMMは、最短経路計算や画像処理などへの応用がある。例えば、A. V. Aho, J. E. Hopcroft, and J. D. Ullman, The Design and Analysis of Computer Algorithms. Addison-Wesley, 1974には、FMMを使った最短経路計算の技法の例が記述されている。
FMMにおいては、長さnの2つのベクトルva、vbについて、va[k] + vb[k]の価を、k = 1,..,nの順に計算していき、そのうちの最小値をとる計算が基本となる。つまり、mink{va[k] + vb[k]}を計算する処理が中心となり、この処理をn2回行うので、
FMM全体の処理にO(n3)時間かかる。
ところで、近年、交通シミュレーションやカー・ナビゲーションなどの分野で、最短経路計算をより高速に行うことの要望が高まっており、そのためFMMを高速化するアルゴリズムが、次の文献に記述されている。
J. J. McAuley and T. S. Caetano, “An expected-case sub-cubic solution to the all-pairs shortest path problem in R,” arXiv:0912.0975v1, 2009は、二つのベクトルvaとvbについて、mink{va[k] + vb[k]}を計算する前に、va[a1] ≦ va[a2] ≦…≦ va[an], vb[b1] ≦ vb[b2] ≦…≦ vb[bn] となるような順列a1,a2,…,anとb1,b2,…,bnを事前に計算することを開示する。FMM全体の処理では、この事前計算をするには、全体で2n回のソート処理を行えば十分であり、すると、全体でO(n2log n)時間で計算を行うことが可能である。
J. J. McAuley and T. S. Caetano, "An expected-case sub-cubic solution to the all-pairs shortest path problem in R," arXiv:0912.0975v1, 2009
この発明の目的は、FMMの計算において、上記非特許文献1に開示されている技法を更に改良して高速にすることにある。
本発明においても、mink{va[k] + vb[k]}を計算する前に、va[a1] ≦ va[a2] ≦…≦ va[an], vb[b1] ≦ vb[b2] ≦…≦ vb[bn] となるような順列a1,a2,…,anとb1,b2,…,bnを事前に計算することは行われる。
本発明の特徴は、FMMで中心となるva[k] + vb[k]の最小値を計算する処理において、k=1,…nについて順番に処理するのではなく、best = ∞に初期設定してから、以下の処理Xと処理Yを一回ずつ適用した上で、bestの値をva[k]+vb[k]の最小値として出力することにある。
(処理X) k=a1,a2,…の順にva[k]+vb[k]の値を計算していき、それまでに見つかった最小値をbestとしたときに、va[k] > best/2となるkで処理をやめる(そのようなkが無ければk = anまで処理したらやめる)
(処理Y) 処理Xと同様の処理をk = b1,b2,…についても行い、vb[k] > best/2の値となるkで処理をやめる(そのようなkが無ければk = bnまで処理したらやめる)
このような処理を採用したことにより、FMMの計算において、SIMD命令を利用して処理を高速化することが可能となった。この場合、行列Aと行列BのFMMを計算するとすると、行列Aを、列が主のレイアウト(column-majorlayout)、行列Bを、行が主のレイアウト(row-majorlayout)で保存するのがポイントである。ここで、列が主のレイアウトとは、行列 A をメモリ上に保管する際に(行列Aで)列方向に隣り合う要素を(メモリ上でも)なるべく隣り合うように並べる方法のことをいう。つまり、行列 A を、A[1,1], A[2,1], A[3,1],..., A[n,1], A[1,2], A[2,2], A[3,2], ..., A[n,2], A[1,3], A[2,3], ........., A[n,n] といった順番で並べる。一方、行が主のレイアウトとは、列が主のレイアウトにおいて、列と行を入れ替えたものであり、つまり、行列 A を、A[1,1], A[1,2], A[1,3],..., A[1,n], A[2,1], A[2,2], A[2,3], ..., A[2,n], A[3,1], A[3,2], ........., A[n,n] といった順番で並べる。
この発明によれば、bestの値を一旦計算して、その値に基づき、最小値の計算を打ち切るようにすることにより、最小値の計算を速くすることによって、FMMの計算処理を高速化することができる。
また、非特許文献1の技法ではSIMD命令を利用することは困難であったが、本発明の技法では、SIMD命令を有利に適用して、更にFMMの計算処理を高速化することが可能である。
本発明を実施するためのハードウェア構成のブロック図である。 本発明に係る機能論理ブロック図である。 本発明の一実施例の処理全体のフローチャートを示す図である。 図3における、行列を更新する処理のフローチャートを示す図である。 図3における、行列を更新する処理のフローチャートを示す図である。 行列におけるSIMD命令に対応した処理を説明するための図である。 本発明の、SIMD命令に対応した実施例の処理全体のフローチャートを示す図である。 図7における、行列を更新する処理のフローチャートを示す図である。 図7における、行列を更新する処理のフローチャートを示す図である。
以下、図面に基づき、この発明の実施例を説明する。特に断わらない限り、同一の参照番号は、図面を通して、同一の対象を指すものとする。尚、以下で説明するのは、本発明の一実施形態であり、この発明を、この実施例で説明する内容に限定する意図はないことを理解されたい。
図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・パス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。CPU104は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標) 4、Core(商標)2 Duo、Xeon(商標)、AMD社のAthlon(商標)などを使用することができる。この実施例の目的のため、CPU104は、SIMD(Single Instruction Multiple Data)命令をもつものである。主記憶106は、好適には、4GB以上の容量をもつものである。ハードディスク・ドライブ108は、行列要素の基となる大量のデータを格納できるように、例えば、500GB以上の容量をもつものであることが望ましい。
ハードディスク・ドライブ108には、個々に図示しないが、オペレーティング・システムが、予め格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows XP(商標)、Windows(商標)7、アップルコンピュータのMac OS(商標)などの、CPU104に適合する任意のものでよい。
ハードディスク・ドライブ108にはまた、好適には、C、C++、C#、Java(R)などのプログラム言語処理系も格納されている。このプログラム言語処理系は、後で説明する、本発明に係るFMM(Funny Matrix Multiplication)の計算処理のためのモジュールを作成し、保守するために使用される。
ハードディスク・ドライブ108はさらに、プログラム言語処理系でコンパイルするためのソースコードを書くためのテキスト・エディタ、及び、Eclipse(商標)などの開発環境を含んでいてもよい。
キーボード110及びマウス112は、オペレーティング・システムまたは、ハードディスク・ドライブ108から主記憶106にロードされ、ディスプレイ114に表示されたプログラム(図示しない)を起動したり、文字を打ち込んだりするために使用される。
ディスプレイ114は、好適には液晶ディスプレイであり、例えば、XGA(1024×768の解像度)、またはUXGA(1600×1200の解像度)などの任意の解像度のものを使用することができる。ディスプレイ114は、図示しないが、本発明の処理を開始するための操作ウインドウや、FMMの計算結果を表示するために使用される。
次に、図2の機能ブロック図を参照して、本発明の処理を実行するための処理ルーチンについて説明する。これらの処理ルーチンはC、C++などの、好適にはSIMD命令を利用可能なプログラム言語で作成されて、実行可能な形式でハードディスク・ドライブ108に保存され、オペレーティング・システムの動作で主記憶106にロードされて実行される。
メイン・ルーチン202は、本発明の全体の動作を統合するためのプログラムであり、図示しないが、ディスプレイ114に操作ウインドウを表示したり、ユーザの操作を受け付けて処理を開始したりする機能を有する。
入力ルーチン204は、ハードディスク・ドライブ108に保存された地図データなどである処理データ206のファイルからデータを読み込んで、行列Aと行列Bの各要素を決定する機能をもつ。
ソート・ルーチン208は、本発明に従いFMMの計算を行うためのインデックスの順列を求めるためのソートを行う機能をもつ。この際のソートのアルゴリズムは、クイック・ソートであるが、これには限定されず、シェル・ソート、ヒープ・ソート、マージ・ソートなどの任意の適当なソート・アルゴリズムを用いることができる。
更新ルーチン210は、ソートされたインデックスの順列を用いて、FMMの結果の行列Cの要素を更新するための処理を実行する機能をもつ。更新ルーチン210の処理の詳細は、図3〜図5のフローチャート、あるいは図7〜図9のフローチャートを参照して、後で説明する。
出力ルーチン212は、行列Aと行列BとのFMM計算の結果得られた行列Cを、結果データ214のファイルとして書き出す機能をもつ。
次に、図3のフローチャートを参照して、本発明による全体のFMM計算処理について説明する。この処理を開始するにあたって、メイン・ルーチン202は予め入力ルーチン204を呼び出し、処理データ206のファイルからデータを読み込むことによって、行列Aと行列Bの各要素の値を決定する。ここでは、行列Aと行列Bは、n×nの正方行列であると仮定する。しかし、本発明の処理は、正方行列以外の行列にも適用できることを理解されたい。
さて図3において、ステップ302からステップ314までは、iの1からnまでの繰り返しのループである。ステップ304では、メイン・ルーチン202は、行列Aのi行目について、ソート・ルーチン208を呼び出して、値が昇順になるインデックスの順列{a1,...,an}を得る。
ステップ306からステップ312までは、jの1からnまでの繰り返しのループである。ステップ308では、メイン・ルーチン202は、行列Aと行列BのFMM計算結果である行列Cについて、C[i,j] = ∞を格納する。ここで∞とは、実際の処理では現れないような十分大きい値のことである。行列Cも、行列A及び行列Bと同様に、n×nの正方行列である。
ステップ310では、メイン・ルーチン202は、更新ルーチン210を呼び出して、C[i,j]を{ai}を用いて更新する。ここで、{ai}とは、{a1,...,an}の略記である。ステップ310の詳細は、図4のフローチャートを参照して後で説明する。
メイン・ルーチン202は、ステップ312でjを1つインクリメントしてステップ306に戻る。ステップ306に戻って、メイン・ルーチン202は、jがn以下ならステップ308以下を繰り返す。jがnを超えたなら、ステップ306からステップ312までのループを抜ける。
ステップ312でループを抜けると、メイン・ルーチン202は、ステップ314でiを1つインクリメントしてステップ302に戻る。ステップ302に戻って、メイン・ルーチン202は、iがn以下ならステップ304以下を繰り返す。iがnを超えたなら、ステップ302からステップ314までのループを抜ける。
ステップ316からステップ326までは、iの1からnまでの繰り返しのループである。ステップ318では、メイン・ルーチン202は、行列Bのi列目について、ソート・ルーチン208を呼び出して、値が昇順になるインデックスの順列{b1,...,bn}を得る。
ステップ320からステップ324までは、jの1からnまでの繰り返しのループである。
ステップ322では、メイン・ルーチン202は、更新ルーチン210を呼び出して、C[i,j]を{bj}を用いて更新する。ここで、{bj}とは、{b1,...,bn}の略記である。ステップ322の詳細は、図5のフローチャートを参照して後で説明する。
メイン・ルーチン202は、ステップ324でjを1つインクリメントしてステップ320に戻る。ステップ320に戻って、メイン・ルーチン202は、jがn以下ならステップ322以下を繰り返す。jがnを超えたなら、ステップ320からステップ324までのループを抜ける。
ステップ324でループを抜けると、メイン・ルーチン202は、ステップ326でiを1つインクリメントしてステップ316に戻る。ステップ316に戻って、メイン・ルーチン202は、iがn以下ならステップ318以下を繰り返す。iがnを超えたなら、ステップ316からステップ326までのループを抜ける。
ここまでの処理が終了すると、C[i,j]の要素が全て得られている。メイン・ルーチン202は、出力ルーチン212を呼び出して、C[i,j]の要素の値を、結果データ214を含むファイルとして、ハードディスク・ドライブ108に書き出す。
図4は、図3のステップ310をより詳細に示すフローチャートである。図3では、この処理が、更新ルーチン210をサブルーチンとして呼び出す処理として説明されているが、図4のフローチャートに対応するコードがインライン的に埋め込まれて実行されるようにしてもよい。
図4において、更新ルーチン210は、ステップ402で、変数kを1とおく。更新ルーチン210は、ステップ404で、bestという変数に、C[i,j]の値を格納する。
ステップ406では、更新ルーチン210は、best = min{best, A[i,ak] + B[ak,j]}によりbestの値を更新し、ステップ408でkを1だけ増分する。
ステップ410では、更新ルーチン210は、k > nもしくはA[i,ak] > best/2であるかどうか判断し、そうでないならステップ406に戻る。
更新ルーチン210がステップ410で、k > nもしくはA[i,ak] > best/2であると判断すると、ステップ412でC[i,j] = bestと格納して、ステップ310が終了する。
図5は、図3のステップ322をより詳細に示すフローチャートである。図3では、この処理が、更新ルーチン210をサブルーチンとして呼び出す処理として説明されているが、図4のフローチャートに対応するコードがインライン的に埋め込まれて実行されるようにしてもよい。
図5において、更新ルーチン210は、ステップ502で、変数kを1とおく。更新ルーチン210は、ステップ504で、bestという変数に、C[i,j]の値を格納する。
ステップ506では、更新ルーチン210は、best = min{best, A[i,bk] + B[bk,j]}によりbestの値を更新し、ステップ508でkを1だけ増分する。
ステップ510では、更新ルーチン210は、k > nもしくはB[bk,j] > best/2であるかどうか判断し、そうでないならステップ506に戻る。
更新ルーチン210がステップ510で、k > nもしくはB[bk,j] > best/2であると判断すると、ステップ512でC[i,j] = bestと格納して、ステップ322が終了する。
この実施例は、図4のステップ410のA[i,ak] > best/2、あるいは、図5のステップ510のB[bk,j] > best/2の判断で、比較を早めに打ち切ることができるので、非特許文献1に記述されている技法よりも処理速度を向上することができる。
本発明のさらなる特徴は、SIMD(Single Instruction Multiple Data)命令を有利に利用して、処理速度を向上することができることである。その技法を図6を参照して説明する。
すなわち、本発明に従い、C[i,j]とC[i,j'](ここでj'= j+1)を計算するとき、
− C[i,j]については、まず、k = a1,a2,…の順にA[i,k] + B[k,j]を計算していく。
− C[i,j'] については、まず、k = a1,a2,… の順にA[i,k] + B[k,j']を計算していく。
この両者の計算では、行列Aについては同じ行にアクセスし、行列Bについては隣同士の値にアクセスしている。
よって、C[i,j] と C[i,j'] の計算を融合して、同時に行えば両者を一つのループで処理できる。そして、A[i,k] + B[k,j] と A[i,k] + B[k,j'] は、2-wayのSIMD命令を使えば一つのvec_add命令で処理できて高速化が可能となる。
− ループを融合する際、ループの終了条件を調整する必要があるが、これも容易に実現可能
− ループを融合した結果、ループ長が長くなる場合があるが、これによる計算速度の低下は一般にSIMD命令による高速化に比べて小さい。
C[i,j]とC[i,j']の計算にあたっては、次にk = b1, b2, … についても計算をする必要があるが、この両者の計算は融合できない。ただ、i' = i+1とすると、C[i,j]とC[i',j]の計算は k = b1, b2, … についてループの融合ができる。よって、k = a1, a2, … の計算には列方向に隣同士の行列 C の計算を融合し、k = b1, b2, … の計算には行方向に隣同士の行列 C の計算を融合する、という二段階で行う。非特許文献1の手法では、k = a1, a2, … の計算と k = b1, b2, … の計算、というように分解ができないのが問題である。
SIMDの実装方法は、これには限定されないが例えば、gcc、Visual C++などの処理系を使用して、emmintrin.hなどのヘッダファイルをインクルードし、__m128iなどのデータ型宣言を用いる。メモリからの読み出しは_mm_loadu_si128()を使用し、レジスタの初期化には_mm_set_epi32()を使用し、加算には_mm_add_epi32()を使用する、等である。
次に、SIMDを実装するのに好適な実施例の処理の全体を、図7のフローチャートを参照して説明する。この処理を開始するにあたって、メイン・ルーチン202は予め入力ルーチン204を呼び出し、処理データ206のファイルからデータを読み込むことによって、行列Aと行列Bの各要素の値を決定する。ここでも、行列Aと行列Bは、n×nの正方行列であると仮定する。また、SIMDの多重度をsとし、nを、sで割り切れる数であると仮定する。
さて図7において、ステップ702からステップ714までは、iの1からnまでの繰り返しのループである。ステップ704では、メイン・ルーチン202は、行列Aのi行目について、ソート・ルーチン208を呼び出して、値が昇順になるインデックスの順列{a1,...,an}を得る。
ステップ706からステップ712までは、jの1からn/sまでの繰り返しのループである。ステップ708では、メイン・ルーチン202は、行列Aと行列BのFMM計算結果である行列Cについて、C[i,(j-1)*s+1] = ∞、C[i,(j-1)*s+2] = ∞、...、C[i,(j-1)*s+s-1] = ∞と格納する。ここで、行列Cも、行列A及び行列Bと同様に、n×nの正方行列である。
ステップ710では、メイン・ルーチン202は、更新ルーチン210を呼び出して、C[i,(j-1)*s+1]、C[i,(j-1)*s+2]、...、C[i,(j-1)*s+s-1]を{ai}を用いて更新する。ステップ710の詳細は、図8のフローチャートを参照して後で説明する。
メイン・ルーチン202は、ステップ712でjを1つインクリメントしてステップ706に戻る。ステップ706に戻って、メイン・ルーチン202は、jがn/s以下ならステップ708以下を繰り返す。jがn/sを超えたなら、ステップ706からステップ712までのループを抜ける。
ステップ712でループを抜けると、メイン・ルーチン202は、ステップ714でiを1つインクリメントしてステップ702に戻る。ステップ702に戻って、メイン・ルーチン202は、iがn以下ならステップ704以下を繰り返す。iがnを超えたなら、ステップ702からステップ714までのループを抜ける。
ステップ716からステップ726までは、iの1からnまでの繰り返しのループである。ステップ718では、メイン・ルーチン202は、行列Bのi列目について、ソート・ルーチン208を呼び出して、値が昇順になるインデックスの順列{b1,...,bn}を得る。
ステップ720からステップ724までは、jの1からn/sまでの繰り返しのループである。
ステップ722では、メイン・ルーチン202は、更新ルーチン210を呼び出して、C[(i-1)*s+1,j]、C[(i-1)*s+2,j]、...、C[(i-1)*s+s-1,j]を{bj}を用いて更新する。ステップ722の詳細は、図9のフローチャートを参照して後で説明する。
メイン・ルーチン202は、ステップ724でjを1つインクリメントしてステップ720に戻る。ステップ720に戻って、メイン・ルーチン202は、jがn/s以下ならステップ722以下を繰り返す。jがn/sを超えたなら、ステップ720からステップ724までのループを抜ける。
ステップ724でループを抜けると、メイン・ルーチン202は、ステップ726でiを1つインクリメントしてステップ716に戻る。ステップ716に戻って、メイン・ルーチン202は、iがn以下ならステップ718以下を繰り返す。iがnを超えたなら、ステップ716からステップ726までのループを抜ける。
ここまでの処理が終了すると、C[i,j]の要素が全て得られている。メイン・ルーチン202は、出力ルーチン212を呼び出して、C[i,j]の要素の値を、結果データ214を含むファイルとして、ハードディスク・ドライブ108に書き出す。
図8は、図7のステップ710をより詳細に示すフローチャートである。図7では、この処理が、更新ルーチン210をサブルーチンとして呼び出す処理として説明されているが、図8のフローチャートに対応するコードがインライン的に埋め込まれて実行されるようにしてもよい。
更新ルーチン210は、図8のステップ802では、変数kに、1を格納する。
ステップ804からステップ808までは、p = (j-1)*s + 1から(j-1)*s + s - 1までの繰り返しである。ステップ806では、更新ルーチン210は、t[p] = C[i,p]と値を格納する。このループがp = (j-1)*s + 1から(j-1)*s + s - 1まで終わると、ループを抜け出てステップ810に進む。
次は、ステップ810からステップ814までで、p = (j-1)*s + 1から(j-1)*s + s - 1までの繰り返しである。ステップ812では、更新ルーチン210は、t[p] = min{t[p],A[i,ak]+B{ak,p]}を実行する。このとき、複数のA[i,ak]+B{ak,p]の計算に並列的にvec_addのSIMD命令を使用して、処理速度が向上される。このループがp = (j-1)*s + 1から(j-1)*s + s - 1まで終わると、ループを抜け出てステップ816に進む。
更新ルーチン210は、ステップ816で、kを1だけ増分し、ステップ818で、k > nもしくは、A[i,ak] > maxp{t[p]/2}を判断する。この判断が否定的であるなら、処理はステップ810に戻る。
ステップ816の判断が肯定的なら、ステップ820からステップ824までのループを実行する。ステップ820からステップ824は、p = (j-1)*s + 1から(j-1)*s + s - 1までの繰り返しである。更新ルーチン210は、ステップ822で、C[i,p] = t[p]と格納する。このループがp = (j-1)*s + 1から(j-1)*s + s - 1まで終わると、ステップ710が終了する。
図9は、図7のステップ722をより詳細に示すフローチャートである。図7では、この処理が、更新ルーチン210をサブルーチンとして呼び出す処理として説明されているが、図9のフローチャートに対応するコードがインライン的に埋め込まれて実行されるようにしてもよい。
更新ルーチン210は、図9のステップ902では、変数kに、1を格納する。
ステップ904からステップ908までは、p = (i-1)*s + 1から(i-1)*s + s - 1までの繰り返しである。ステップ906では、更新ルーチン210は、t[p] = C[p,j]と値を格納する。このループがp = (i-1)*s + 1から(i-1)*s + s - 1まで終わると、ループを抜け出てステップ910に進む。
次は、ステップ910からステップ914までで、p = (i-1)*s + 1から(i-1)*s + s - 1までの繰り返しである。ステップ912では、更新ルーチン210は、t[p] = min{t[p],A[p,bk]+B[bk,j]}を実行する。このとき、複数のA[p,bk]+B[bk,j]の計算に並列的にvec_addのSIMD命令を使用して、処理速度が向上される。このループがp = (i-1)*s + 1から(i-1)*s + s - 1まで終わると、ループを抜け出てステップ916に進む。
更新ルーチン210は、ステップ916で、kを1だけ増分し、ステップ918で、k > nもしくは、B[bk,j] > maxp{t[p]/2}を判断する。この判断が否定的であるなら、処理はステップ910に戻る。
ステップ916の判断が肯定的なら、ステップ920からステップ924までのループを実行する。ステップ920からステップ924は、p = (i-1)*s + 1から(i-1)*s + s - 1までの繰り返しである。更新ルーチン210は、ステップ922で、C[p,j] = t[p]と格納する。このループがp = (i-1)*s + 1から(i-1)*s + s - 1まで終わると、ステップ722が終了する。
ところで、図4あるいは図5の処理を擬似コードで書くと、次のとおりである。
best = ∞
i = 1
repeat
best = min { best, va[ai] + vb[ai] }
i = i+1
until (i > n or va[ai] > best/2)
j = 1
repeat
best = min { best, va[bj] + vb[bj] }
j = j+1
until (j > n or vb[bj] > best/2)
output best
ここの(j > n or vb[bj] > best/2)という判定条件については、次のような実施例も考えられる。
best = ∞, temp = ∞
i = 1
repeat
best = min { best, va[ai] + vb[ai] }
temp = min { temp, vb[ai] }
i = i+1
until (i > n or va[ai] > best/2)
j = 1
repeat
best = min { best, va[bj] + vb[bj] }
j = j+1
until (j > n or vb[bj] > min { best/2, temp })
output best
best/2 ≧ min { best/2, temp }なので、こうするとループの脱出が早まる。ここでは、2つのループの打ち切り条件が異なることに留意されたい。
あるいは、以下のような例もありえる。
best = ∞
i = 1
repeat
best = min { best, va[ai] + vb[ai] }
i = i+1
until (i > n or va[ai] > best/2)
j = 1
repeat
best = min { best, va[bj] + vb[bj] }
j = j+1
until (j > n - 1 or vb[bj] > best/2)
output best
ここでも、2つのループの打ち切り条件が異なっている。
また、上記実施例では、行列A、B、Cはどれもn×nの正方行列であると想定したが、これには限定されず、通常の行列の掛け算と同様に、行列Aがm×k、行列Bがk×nであるとしてよい。この結果、行列Cは、m×nとなる。
以上、特定のハードウェアおよびソフトウェアのプラットフォーム上で実施するものとして本発明を説明してきたが、本発明は示されている例に限定されず、任意のコンピュータ・プラットフォーム上で実施可能である。
102 システム・パス
104 CPU
106 主記憶
108 ハードディスク・ドライブ
110 キーボード
112 マウス
114 ディスプレイ
202 メイン・ルーチン
204 入力ルーチン
206 処理データ
208 ソート・ルーチン
210 更新ルーチン
212 出力ルーチン
214 結果データ

Claims (9)

  1. CPUとメモリとを備えるコンピュータの処理により、2つの行列(以下、それぞれA,Bとする)からFMM(Funny Matrix Multiplication)の結果である1つの行列(以下、Cとする)を計算する方法であって、
    前記CPUにより、前記行列Cのi,j成分であるC[i,j]の値を所定の変数(best)とし、想定されるよりも大きい値初期値として前記メモリに格納するステップと
    前記CPUにより、前記行列Aの最初の行から最後の行までの各々の行について、前記行列Aのi番目の行に対応し、値が昇順になるインデックスの順列{ai}を計算するステップと、
    前記CPUにより、前記行列Bの最初の列から最後の列までの各々の列について、前記行列Bのj番目の列に対応し、値が昇順になるインデックスの順列{bj}を計算するステップと、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best= min{best, A[i,ak]+B[ak,j]}を計算し、ここで、akは前記インデックスの順列{ai}のk番目の要素であり、kが前記行列Aの行の数を超えるかA[i,ak]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第一更新ステップと、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best= min{best, A[i,bk]+B[bk,j]}を計算し、ここで、bkは前記インデックスの順列{bj}のk番目の要素であり、kが前記行列Bの列の数を超えるかB[bk,j]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第二更新ステップとを有する
    方法。
  2. 前記行列Aを前記メモリ上に格納する際に、前記行列Aにおいて列方向に隣り合う要素を、前記メモリ上において隣り合うように並べ、
    前記行列Bを前記メモリ上に格納する際に、前記行列Bにおいて行方向に隣り合う要素を、前記メモリ上において隣り合うように並べ、
    前記第一更新ステップにおいて、A[i,ak]+B[ak,j]の計算が前記CPUのSIMD命令により並列実行され、
    前記第二更新ステップにおいて、A[i,bk]+B[bk,j]の計算が前記CPUのSIMD命令により並列実行される
    請求項1に記載の方法。
  3. 前記CPUのSIMD命令がアクセス可能なレジスタに前記行列Aにおいて列方向に隣り合う要素及び前記行列Bにおいて行方向に隣り合う要素が読み込まれる
    請求項2に記載の方法。
  4. 前記SIMD命令は、ベクトル加算命令である
    請求項2又は3に記載の方法。
  5. 前記第一更新ステップにおいて、行列Cの列方向に隣り合う要素の計算が並列化され、
    前記第二更新ステップにおいて、行列Cの行方向に隣り合う要素の計算が並列化される
    請求項1から4のいずれか1項に記載の方法。
  6. 前記行列A、B及びCが、n×nの正方行列である
    請求項1から4のいずれか1項に記載の方法。
  7. CPUとメモリとを備えるコンピュータに、2つの行列(以下、それぞれA,Bとする)からFMM(Funny MatrixMultiplication)の結果である1つの行列(以下、Cとする)を計算させるコンピュータ・プログラムであって、
    前記コンピュータに、
    前記CPUにより、前記行列Cのi,j成分であるC[i,j]の値を所定の変数(best)とし、想定されるよりも大きい値初期値として前記メモリに格納するステップと
    前記CPUにより、前記行列Aの最初の行から最後の行までの各々の行について、前記行列Aのi番目の行に対応し、値が昇順になるインデックスの順列{ai}を計算するステップと、
    前記CPUにより、前記行列Bの最初の列から最後の列までの各々の列について、前記行列Bのj番目の列に対応し、値が昇順になるインデックスの順列{bj}を計算するステップと、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best = min{best, A[i,ak]+B[ak,j]}を計算し、ここで、akは前記インデックスの順列{ai}のk番目の要素であり、kが前記行列Aの行の数を超えるかA[i,ak]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第一更新ステップと、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best = min{best, A[i,bk]+B[bk,j]}を計算し、ここで、bkは前記インデックスの順列{bj}のk番目の要素であり、kが前記行列Bの列の数を超えるかB[bk,j]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第二更新ステップ
    とを実行させるコンピュータ・プログラム
  8. CPUとメモリとを備え、2つの行列(以下、それぞれA,Bとする)からFMM(Funny Matrix Multiplication)の結果である1つの行列(以下、Cとする)を計算するコンピュータ・システムであって、
    前記CPUにより、前記行列Cのi,j成分であるC[i,j]の値を所定の変数(best)とし、想定されるよりも大きい値初期値として前記メモリに格納する手段と
    前記CPUにより、前記行列Aの最初の行から最後の行までの各々の行について、前記行列Aのi番目の行に対応し、値が昇順になるインデックスの順列{ai}を計算する手段と、
    前記CPUにより、前記行列Bの最初の列から最後の列までの各々の列について、前記行列Bのj番目の列に対応し、値が昇順になるインデックスの順列{bj}を計算する手段と、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best = min{best, A[i,ak]+B[ak,j]}を計算し、ここで、akは前記インデックスの順列{ai}のk番目の要素であり、kが前記行列Aの行の数を超えるかA[i,ak]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第一更新手段と、
    前記CPUにより、変数kをk = 1から1つずつ増分しながら順次、best = min{best, A[i,bk]+B[bk,j]}を計算し、ここで、bkは前記インデックスの順列{bj}のk番目の要素であり、kが前記行列Bの列の数を超えるかB[bk,j]がbest/2を超えることに応答して、C[i,j] = bestによりC[i,j]を更新する第二更新手段とを有する、
    コンピュータ・システム
  9. 前記行列Aを前記メモリ上に格納する際に、前記行列Aにおいて列方向に隣り合う要素を、前記メモリ上において隣り合うように並べ、
    前記行列Bを前記メモリ上に格納する際に、前記行列Bにおいて行方向に隣り合う要素を、前記メモリ上において隣り合うように並べ、
    前記第一更新手段は、A[i,ak]+B[ak,j]の計算を前記CPUのSIMD命令により並列実行し、
    前記第二更新手段は、A[i,bk]+B[bk,j]の計算を前記CPUのSIMD命令により並列実行する
    請求項8に記載のコンピュータ・システム。
JP2011022311A 2011-02-04 2011-02-04 行列計算処理方法、プログラム及びシステム Active JP5782265B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2011022311A JP5782265B2 (ja) 2011-02-04 2011-02-04 行列計算処理方法、プログラム及びシステム
US13/363,421 US20120203815A1 (en) 2011-02-04 2012-02-01 Matrix calculation method, program, and system
US13/591,631 US9098460B2 (en) 2011-02-04 2012-08-22 Matrix calculation method, program, and system

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011022311A JP5782265B2 (ja) 2011-02-04 2011-02-04 行列計算処理方法、プログラム及びシステム

Publications (2)

Publication Number Publication Date
JP2012164039A JP2012164039A (ja) 2012-08-30
JP5782265B2 true JP5782265B2 (ja) 2015-09-24

Family

ID=46601407

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011022311A Active JP5782265B2 (ja) 2011-02-04 2011-02-04 行列計算処理方法、プログラム及びシステム

Country Status (2)

Country Link
US (2) US20120203815A1 (ja)
JP (1) JP5782265B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10311154B2 (en) * 2013-09-21 2019-06-04 Oracle International Corporation Combined row and columnar storage for in-memory databases for OLTP and analytics workloads
JP6786948B2 (ja) * 2016-08-12 2020-11-18 富士通株式会社 演算処理装置及び演算処理装置の制御方法
CN118034781A (zh) 2017-03-20 2024-05-14 英特尔公司 用于矩阵加法、减法和乘法的系统、方法和装置
US11275588B2 (en) 2017-07-01 2022-03-15 Intel Corporation Context save with variable save state size
US11436011B2 (en) 2020-02-18 2022-09-06 Samsung Electronics Co., Ltd. Processing method and processing device with matrix multiplication computation

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2009107712A1 (ja) 2008-02-29 2009-09-03 日本電気株式会社 高性能伝送システム、伝送方法、受信機、及び送信機

Also Published As

Publication number Publication date
JP2012164039A (ja) 2012-08-30
US9098460B2 (en) 2015-08-04
US20120203815A1 (en) 2012-08-09
US20120317160A1 (en) 2012-12-13

Similar Documents

Publication Publication Date Title
EP3940606B1 (en) Device and method for performing backpropagation of artificial neural network
Peng et al. GLU3. 0: Fast GPU-based parallel sparse LU factorization for circuit simulation
US20180203673A1 (en) Execution of computation graphs
EP3564863A1 (en) Apparatus for executing lstm neural network operation, and operational method
US9547474B2 (en) Inclusive or bit matrix to compare multiple corresponding subfields
JP5782265B2 (ja) 行列計算処理方法、プログラム及びシステム
US8786617B2 (en) Parallelization of random number generation processing by employing GPU
CN106991077A (zh) 一种矩阵计算装置
US20190138922A1 (en) Apparatus and methods for forward propagation in neural networks supporting discrete data
CN111580866A (zh) 一种向量运算装置及运算方法
BR102013032654A2 (pt) instruções e lógica para vetorizar laços condicionais
US8726252B2 (en) Management of conditional branches within a data parallel system
Bikov et al. Parallel fast Walsh transform algorithm and its implementation with CUDA on GPUs
Xiang et al. Scalable matrix inversion using mapreduce
Izquierdo-Carrasco et al. A generic vectorization scheme and a GPU kernel for the phylogenetic likelihood library
Langr et al. Accelerating many-nucleon basis generation for high performance computing enabled ab initio nuclear structure studies
US20220051095A1 (en) Machine Learning Computer
TWI531966B (zh) 計算裝置、計算方法及非暫態機器可讀儲存媒體
Snytsar et al. Parallel approach to sliding window sums
Baker et al. Parallelizing the Smith-Waterman algorithm using OpenSHMEM and MPI-3 one-sided interfaces
Ma et al. Point-block incomplete LU preconditioning with asynchronous iterations on GPU for multiphysics problems
US9600446B2 (en) Parallel multicolor incomplete LU factorization preconditioning processor and method of use thereof
Garade et al. Optimization Strategies to Accelerate BLAS Operations with ARM SVE
Neuman et al. Fast, good, and repeatable: Summations, vectorization, and reproducibility
Phillips et al. Performance analysis of the high-performance conjugate gradient benchmark on GPUs

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20131108

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20141215

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20150106

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20150330

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20150501

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20150717

R150 Certificate of patent (=grant) or registration of utility model

Ref document number: 5782265

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150