JP2009199430A - ベクトル積の並列処理方法 - Google Patents
ベクトル積の並列処理方法 Download PDFInfo
- Publication number
- JP2009199430A JP2009199430A JP2008041498A JP2008041498A JP2009199430A JP 2009199430 A JP2009199430 A JP 2009199430A JP 2008041498 A JP2008041498 A JP 2008041498A JP 2008041498 A JP2008041498 A JP 2008041498A JP 2009199430 A JP2009199430 A JP 2009199430A
- Authority
- JP
- Japan
- Prior art keywords
- matrix
- calculation result
- thread
- update
- array
- 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.)
- Granted
Links
Landscapes
- Complex Calculations (AREA)
Abstract
【解決手段】上記課題を解決するために、演算割り当て範囲における部分行列についての行列のベクトル積の演算処理を各スレッドに実行させ、演算結果が更新割り当て範囲か否かを判別し、当該演算結果が、更新割り当て範囲の場合には、行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、更新割り当て範囲でない場合には、行列と列ベクトルとの積を一時的に記憶する演算結果退避手段に記憶させ、各スレッドに演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出させ、演算結果記憶手段に記憶されている演算結果を更新させる。
【選択図】図4
Description
例えば、n行n列のスパース行列(nは自然数)を行列mat、行列matの非ゼロ要素の総数をnz(nzは自然数)とすると、行列matは、nz個の要素からなる1次元配列aに格納される。
さらに、配列aに格納された各要素が、行列matの何番目の行ベクトルに属するかを示す情報が、nz個の要素からなる1次元配列nrowに格納される。
y(i)=y(i)+mat(i,j)*x(j)
の計算を行なうことで得られる。したがって、1≦j≦nの要素について上式の計算を行なうことにより、i番目の行の要素y(i)の計算をすることができる。
った。
(本実施例に係る並列処理の概要)
説明を簡単にするために、下記に示す4行4列の行列matと4行1列の列ベクトルx
のベクトル積における並列処理(並列処理が可能な2つのCPU(CPU#1、CPU#2)を有する場合)について説明する。
yを4行1列の列ベクトルとすると、行列matと列ベクトルxのベクトル積は、次式によって求められる。
ここで、行列matの列を2つに分割した下記の4行2列の部分行列m1、m2と、列ベクトルxの行を2つに分割した下記に示す2行1列の部分列ベクトルx1、x2を用いると、
式(3)は、下記のように変形することができる。
本実施例に係る行列のベクトル積では、図1に示すようにm1*x1’の演算処理をCPU#1に割り当て、m2*x2’の演算処理をCPU#2に割り当てる。このように各CPUに割り当てられた演算処理を、以下「演算割り当て範囲」という。なお、演算装置100が生成する各スレッドに当該演算処理を割り当てた場合も同様である。
y3を求め、CPU#1による演算「a4,1*x1+a4,2*x2」の結果と、CPU#2自身による演算「a4,3*x3+a4,4*x4」の結果と、からy4を求めるので、
CPU#1による演算「a3,1*x1+a3,2*x2」および「a4,1*x1+a4,2*x2」、CPU#2自身による演算「a3,3*x3+a3,4*x4」および「a4,3*x3+a4,4*x4」は、CPU#2の更新割り当て範囲となる。
(本実施例に係る圧縮列格納法)
図2は、本実施例に係る圧縮列格納法の説明をする図である。
行列matを圧縮列格納法を用いて記憶装置に記憶するためには、図2に示す1次元配列a、nfcnzおよびnrow(すなわち、配列a、nfcnzおよびnrowを確保する記憶領域)を使用する。
(第1の実施例)
図3は、本実施例に係る行列ベクトル積の演算の概要を説明する図である。なお、図3に示す1次元配列w、2次元配列iw、3次元配列nentryは、図2に示した行列matについて演算を行なう場合の例を示しているが、これに限定する趣旨でないのは当然である。
したがって、配列wは配列aと同じ大きさ(同じ構成)の1次元配列とすればよい。なお、本実施例では、更新割り当て範囲に属する演算結果については、配列wに格納せずに、演算結果を格納する配列y(以下、「演算結果記憶領域」という)に格納するので、配列aより小さい大きさであってもよい。
(以下、「終端位置領域」という)である。本実施例では、両領域とも整数型として記憶領域を確保する。
(1)nentry(1:2,1,1)に、CPU#1の更新割り当て範囲かつCPU#1の演算割り当て範囲、
(2)nentry(1:2,1,2)に、CPU#1の更新割り当て範囲かつCPU#2の演算割り当て範囲、
(3)nentry(1:2,2,1)に、CPU#2の更新割り当て範囲かつCPU#1の演算割り当て範囲、
(4)nentry(1:2,2,2)に、CPU#2の更新割り当て範囲かつCPU#2の演算割り当て範囲、の演算結果に対応するチェインiwの先頭位置情報と終端位置情報を格納する。
CPU#1は、演算割り当て範囲における式(2)の演算を実行する。そして、当該演算が更新割り当て範囲である場合には、演算結果を格納する配列yに演算結果を格納し、当該演算が更新割り当て範囲でない場合には、演算結果を配列wに格納する。
)に対応するnrow(4)の値を格納し、当該チェインの位置情報領域iw(1,2)にターミナル情報を格納する。
各CPUが自身に割り当てられた演算割り当て範囲について演算を完了すると、各CPUは、自身に割り当てられた更新割り当て範囲について、配列nentryを参照する。そして、当該nentryの先頭位置領域が示すチェインiwから、当該nentryの終端位置領域が示すチェインiwまで、たどりながらチェインiwのデータ領域を参照する。そして、当該データ領域に格納されている行番号に基づいて、各チェインiwに対応する配列wに格納されている演算結果を、配列yのいずれの要素に加算するか判断し、該当する配列yの要素に加算する。
(本実施例に係る行列のベクトル積の演算の具体的な説明)
以下、n行n列の行列matとn行1列の列ベクトルxの行列ベクトル積y=mat*xについて説明する。
ステップS401において、演算装置100は、行列matの列の総数nを演算処理の割り当て可能なCPU数mで均等に分割したn行(n/m)列の部分行列mat’1、mat’2、mat’3、・・・、mat’m、を生成する。
そして、部分行列ベクトル積mat’k*x’kの処理をCPU#k(kは1以上m以下の自然数)に割り当てる。この時、例えば、行列ベクトル積mat’k*x’kが、CPU#kの演算割り当て範囲となる。
ステップS403において、各スレッドは、自身に割り当てられた演算割り当て範囲について行列ベクトル積の計算(mat(i,j)*x(j))を行なう。
ステップS409において、当該スレッドは、自身に割り当てられた演算割り当て範囲について、行列のベクトル積の演算を全て実行したか否かを判別する。そして、まだ、演算割り当て範囲の全ての演算を完了していない場合、当該スレッドは、処理をステップS403に移行し、ステップS403〜S409の処理を繰り返す。また、演算割り当て範囲の全ての演算を完了した場合、当該スレッドは、処理をステップS410に移行する。
ステップS411において、スレッド番号がnothrdのスレッドは、他のスレッドに割り当てられた演算割り当て範囲、かつ自身のスレッドに割り当てられた範囲について、配列nentryがポイントする先頭チェインから終端チェインまでを参照し、当該チェインに格納された位置情報pに対応するw(p)から演算結果を取得し、当該チェインに格納された行数qに対応するy(q)に加算する。
ャートである。図5A〜5Cに示すフローチャートは、n行n列のスパース行列matとn行1列の列ベクトルxとの演算処理を示す。
js = nn*(nothrd−1)
je = min(n,nn*nothrd)
例えば、スレッド番号kのスレッドの演算割り当て範囲は、行列matの部分行列mat(1:n,nn*(k−1):min(n,nn*k))と、列ベクトルx(n,1)の部分列ベクトルをx(nn*(k−1):min(n,nn*k),1)とすると、
mat(1:n,nn*(k−1):min(n,nn*k))*x(nn*(k−1):min(n,nn*k),1) ・・・ (10)
となる。そして、更新割り当て範囲は、行列yの部分行列y(nn*(k−1):min(n,nn*k),1)となる。
ステップS505において、スレッドは、バリア同期をとって、他のスレッドが自身に割り当てられた演算割り当て範囲の処理を開始できる状態になるまで処理を停止する。
。そして、スレッドは、以下に示す処理(ステップS507〜S519)を実行する。
ncnt = 1
nbase = nfcnz(js)−1
ns = nfcnz(js)
ne = nfcnz(je)−1
ステップS507において、スレッドは、行列ベクトル積の演算に使用する変数iに対して下記の処理を実行して初期化を行なう。
ステップS508において、スレッドは、以降の演算(ステップS510又はS511)によって得る演算結果の更新割り当て範囲を担当するスレッド番号(以下、「インデックス」という)を以下の処理によって計算し、変数indexに代入する。また、当該演算に使用するxの要素を取り出して、変数xxに代入する。
index = (ii+nn−1)/nn
xx = x(ii)
ステップS509において、スレッドは、ステップS508で算出したindexとnothrdとを比較する。そして、一致する場合、スレッドはステップS510に処理を移行する。また、一致しない場合、スレッドはステップS511に処理を移行する。
y(ii) = y(ii)+a(i)*xx
ステップS511において、スレッドは、以下のベクトル積の演算を実行し、演算結果を演算結果退避領域に格納する。すなわち、演算結果を配列wに格納するとともに、配列iwにチェインを追加して、配列iwの位置情報領域に終端(tail)を示す値0を格納し、同じくデータ領域にa(i)の行番号を格納する。
iw(1,nbase+ncnt) = 0
iw(2,nbase+ncnt) = ii
ステップS512において、スレッドは、配列nentry(1,index,nothrd)が0か否かを判別する。配列nentry(1,index,nothrd)が0の場合、スレッドは、処理をステップ613に移行する。また、配列nentry(1,index,nothrd)が0でない場合、スレッドは、配列nentry(1,index,nothrd)に既にチェインが追加されていると判断し、処理をステップS514に移行する。
nentry(1,index,nothrd) = nbase+ncnt
ステップS514において、スレッドは、以下の処理を行なって配列nentry(1,index,nothrd)にチェインを登録する。
nentry(2,index,nothrd) = nbase*ncnt
iw(1,nptr) = nbase+ncnt
ステップS515において、スレッドは、以下の処理を行なって変数ncnt、iをインクリメントする。
i = i+1
ステップS516において、スレッドは、変数iと変数neとを比較する。そして、i>neの場合、スレッドは、ステップS517に処理を移行する。また、i≦eの場合、スレッドは、ステップS508に処理を移行する。そして、ステップS508〜S516の処理を繰り返し行なう。
j = j+1
ステップS518において、スレッドは、変数jと変数jeとを比較する。そして、j>jeの場合、スレッドは、ステップS519に処理を移行する。また、j≦jeの場合、スレッドは、ステップS507に処理を移行する。そして、ステップS507〜S518に処理を繰り返し行なう。
ステップS519において、スレッドは、バリア同期をとって、他のスレッドが自身に割り当てられた演算割り当て範囲の処理を完了するまで処理を停止する。
i = 1
ステップS521において、スレッドは、以下の処理を行なって自身のスレッド番号以外のスレッドのスレッド番号を取得し、変数nothrd_nxtに格納する。
ステップS522において、スレッドは、配列nentry(1,nothrd,nothrd_nxt)が0か否かを判別する。配列nentry(1,nothrd,nothrd_nxt)が0の場合、スレッドは、他のスレッドが登録したチェインはないと判断し、ステップS526に処理を移行する。また、配列nentry(1,nothrd,nothrd_nxt)が0でない場合、スレッドは、他のスレッドが登録したチェインが存在すると判断し、ステップS523に処理を移行する。
ステップS524において、スレッドは、変数nptrが0か否かを判別する。そして、変数nptrが0の場合、スレッドは、ステップS526に処理を移行する。また、変数nptrが0でない場合、スレッドは、ステップS525に処理を移行する。
y(ii) = y(ii)+w(nptr)
nptr = iw(1,nptr)
ステップS526において、スレッドは、以下の処理を行なって変数iをインクリメントする。
ステップS527において、スレッドは、変数iとnumthrd−1と比較する。そして、i>numthrd−1の場合、スレッドは、ステップS528に処理を移行する。また、i≦numthrd−1の場合、スレッドは、ステップS521に処理を移行する。そして、ステップS509〜S527の処理を繰り返す。
ステップS528において、スレッドは、バリア同期をとって、他のスレッドの処理が完了するまで処理を停止する。そして、全スレッドの処理が完了すると、行列matのベクトル積の演算結果が変数y(1:n)に得られる(ステップS529)。
(第2の実施例)
第1の実施例では、2次元配列iwを行列のベクトル積演算に使用した場合について説明したが、例えば、配列iwには1次元配列を使用してもよい。以下、配列iwに1次元配列を使用した場合についての例を説明する。
この時、CPU#1は、演算割り当て範囲における式(9)の演算を実行する。そして、当該演算が更新割り当て範囲である場合には、演算結果を格納する配列yに演算結果を格納し、当該演算が更新割り当て範囲でない場合には、演算結果を配列wに格納する。
各CPUが自身に割り当てられた演算割り当て範囲について演算を完了すると、各CPUは、自身に割り当てられた更新割り当て範囲について、配列nentryを参照する。そして、当該nentryの先頭位置領域が示すチェインiwから、当該nentryの終端位置領域が示すチェインiwまで、たどりながらチェインiwのデータ領域を参照する。そして、各チェインiwに対応する配列wに格納されている演算結果が、演算結果を格納する配列yのいずれの要素に加算されるものかを判断し、当該配列yの要素に加算する。
図7A〜7Cは、本実施例に係る行列のベクトル積の演算処理の具体例を示すフローチャートである。図7A〜7Cに示すフローチャートは、n行n列のスパース行列matとn行1列の列ベクトルxとの演算処理を示す。
js = nn*(nothrd−1)
je = min(n,nn*nothrd)
ステップS704において、スレッドは、行列ベクトル積の演算結果を格納する領域y(js:je)=0.0d0により当該領域をゼロクリアする。
ステップS706において、スレッドは、行列ベクトル積の演算に使用する各種変数j、ncnt、nsおよびneに対して以下の処理を実行して初期化を行なう。そして、スレッドは、以下に示す処理(ステップS707〜S719)を各スレッドに実行させる。
ncnt = 1
ns = nfcnz(js)
ne = nfcnz(je)−1
ステップS707において、スレッドは、行列ベクトル積の演算に使用する変数iに対して下記の処理を実行して初期化を行なう。
ステップS708において、スレッドは、以降の演算(ステップS710又はS711)によって得る演算結果のインデックスを以下の処理によって計算し、変数indexに代入する。また、当該演算に使用する列ベクトルxの要素を取り出して、変数xxに代入する。
index = (ii+nn−1)/nn
xx = x(ii)
ステップS709において、スレッドは、ステップS708で算出したindexとnothrdとを比較する。そして、一致する場合、スレッドはステップS710に処理を移行する。また、一致しない場合、スレッドはステップS711に処理を移行する。
y(ii) = y(ii)+a(i)*xx
ステップS711において、スレッドは、以下のベクトル積の演算を実行し、演算結果
を演算結果退避領域に格納する。すなわち、演算結果を配列wに格納するとともに、配列iwにチェインの終端(tail)を示す0を格納する。
iw(i) = 0
ステップS712において、スレッドは、配列nentry(1,index,nothrd)が0か否かを判別する。配列nentry(1,index,nothrd)が0の場合、スレッドは、処理をステップ613に移行する。また、配列nentry(1,index,nothrd)が0でない場合、スレッドは、配列nentry(1,index,nothrd)に既にチェインが追加されていると判断し、処理をステップS714に移行する。
nentry(1,index,nothrd) = i
ステップS714において、スレッドは、以下の処理を行なって配列nentry(1,index,nothrd)にチェインを登録する。
nentry(2,index,nothrd) = i
iw(nptr) = i
ステップS715において、スレッドは、以下の処理を行なって変数iをインクリメントする。
ステップS716において、スレッドは、変数iと変数neとを比較する。そして、i>neの場合、スレッドは、ステップS717に処理を移行する。また、i≦eの場合、スレッドは、ステップS708に処理を移行する。そして、ステップS708〜S716の処理を繰り返し行なう。
j = j+1
ステップS718において、スレッドは、変数jと変数jeとを比較する。そして、j>jnの場合、スレッドは、ステップS719に処理を移行する。また、j≦jeの場合、スレッドは、ステップS707に処理を移行する。そして、ステップS707〜S718に処理を繰り返し行なう。
ステップS719において、スレッドは、バリア同期をとって、他のスレッドが自身に割り当てられた演算割り当て範囲の処理を完了するまで処理を停止する。
i = 1
ステップS721において、スレッドは、以下の処理を行なって自身のスレッド番号以外のスレッドのスレッド番号を取得し、変数nothrd_nxtに格納する。
ステップS722において、スレッドは、配列nentry(1,nothrd,no
thrd_nxt)が0か否かを判別する。配列nentry(1,nothrd,nothrd_nxt)が0の場合、スレッドは、他のスレッドが登録したチェインはないと判断し、ステップS726に処理を移行する。また、配列nentry(1,nothrd,nothrd_nxt)が0でない場合、スレッドは、他のスレッドが登録したチェインが存在すると判断し、ステップS723に処理を移行する。
ステップS724において、スレッドは、変数nptrが0か否かを判別する。そして、変数nptrが0の場合、スレッドは、ステップS726に処理を移行する。また、変数nptrが0でない場合、スレッドは、ステップS725に処理を移行する。
y(ii) = y(ii)+w(nptr)
nptr = iw(nptr)
ステップS726において、スレッドは、以下の処理を行なって変数iをインクリメントする。
ステップS727において、スレッドは、変数iとnumthrd−1と比較する。そして、i>numthrd−1の場合、スレッドは、ステップS728に処理を移行する。また、i≦numthrd−1の場合、スレッドは、ステップS721に処理を移行する。そして、ステップS709〜S727の処理を繰り返す。
ステップS728において、スレッドは、バリア同期をとって、他のスレッドの処理が完了するまで処理を停止する。そして、全スレッドの処理が完了すると、行列matのベクトル積の演算結果が変数y(1:n)に得られる(ステップS829)。
図8に示す演算装置100は、複数のメモリモジュール#1、#2、・・・、#nと、複数のCPU#1、#2、・・・、#nと、相互結合網901と、を少なくとも備える共有メモリ型演算装置である。
インタフェースおよび相互結合網901を介して他のcpuコアやメモリモジュールとアクセス可能である。
Language)挿入などでは簡単に並列化することはできないが、本実施例に係る演算方法によれば、上述の理由から、簡単かつ効率的に並列化することが可能となる。
(付記1) 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出するプログラムであって、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定処理と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り
当て範囲決定処理と、
前記演算割り当て範囲における前記部分行列を、前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記行列と前記列ベクトルとの積を一時的に記憶する演算結果退避手段に記憶させる演算結果振り分け処理と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新処理と、
を演算装置に実行させるプログラム。
(付記2) 前記演算割り当て範囲決定処理は、前記行列の列を均等幅に分割して部分行列を生成する、
ことを特徴とする付記1に記載のプログラム。
(付記3) 前記更新割り当て範囲決定処理は、前記行列と前記列ベクトルとの積を格納する列ベクトルの列を均等幅に分割して部分列ベクトルを生成し、該部分列ベクトルの更新処理を、前記スレッド毎に割り当てる、
ことを特徴とする付記1に記載のプログラム。
(付記4) 前記行列記憶手段は、
前記行列の非ゼロ要素を列ごとに抽出して記憶する第1の配列と、
該第1の配列の各要素が属する前記行列における行番号を記憶する第2の配列と、
前記第1および第2の配列の要素位置であって前記行列の各列の先頭要素が格納される要素位置を記憶する第3の配列と、
を備えることを特徴とする付記1に記載のプログラム。
(付記5) 前記演算結果退避手段は、
前記更新割り当て範囲外の演算結果を記憶する第1の配列と、
該演算結果の記憶する順に対応して、該演算に使用した前記行列の要素の行番号を記憶する第2の配列と、
前記更新割り当て範囲毎に、該更新割り当て範囲の演算結果が記憶されている前記第2の配列の位置を記憶する第3の配列と、
を備えることを特徴とする付記1に記載のプログラム。
(付記6) 前記演算結果更新処理は、
前記第3の配列から、他のスレッドが算出した更新割り当て範囲の演算結果を得る演算に使用した前記行列の要素の行番号が記憶されている前記第2の配列の位置を取得し、該行番号に応じて、前記演算結果記憶手段に記憶されている更新すべき演算結果を特定する、
を備えることを特徴とする付記5に記載のプログラム。
(付記7) 前記第2の配列は、前記行番号を記憶する第1の要素と次の行番号が記憶されている要素の位置を記憶する第2の要素とを1つの単位とするチェイン構造を有する、
ことを特徴とする付記5に記載のプログラム。
(付記8) 前記第1の配列には、前記行列の非ゼロ要素を列ごとに抽出して記憶する配列の要素の位置と同じ位置に、該要素から算出される演算結果が格納され、前記第2の配列には、前記行列の非ゼロ要素を列ごとに抽出して記憶する配列の要素の位置と同じ位置に、該要素の演算に使用した前記行列の要素の行番号を記憶する、
ことを特徴とする付記5に記載のプログラム。
(付記9) 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出する演算方法であって、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定処理と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り当て範囲決定処理と、
前記演算割り当て範囲における前記部分行列を、前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記行列と前記列ベクトルとの積を一時的に記憶する演算結果退避手段に記憶させる演算結果振り分け処理と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新処理と、
を演算装置に実行させる方法。
(付記10) 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出する演算装置であって、
前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段と、
前記行列と前記列ベクトルとの積を一時的に記憶する演算結果退避手段と、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定手段と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り当て範囲決定手段と、
前記演算割り当て範囲における前記部分行列を前記行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理手段と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記演算結果退避手段に記憶させる演算結果振り分け手段と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新手段と、
を備える演算装置。
Claims (5)
- 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出するプログラムであって、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定処理と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り当て範囲決定処理と、
前記演算割り当て範囲における前記部分行列を、前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記行列と前記列ベクトルとの積を一時的に記憶する演算結果退避手段に記憶させる演算結果振り分け処理と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新処理と、
を演算装置に実行させるプログラム。 - 前記行列記憶手段は、
前記行列の非ゼロ要素を列ごとに抽出して記憶する第1の配列と、
該第1の配列の各要素が属する前記行列における行番号を記憶する第2の配列と、
前記第1および第2の配列の要素位置であって前記行列の各列の先頭要素が格納される要素位置を記憶する第3の配列と、
を備えることを特徴とする請求項1に記載のプログラム。 - 前記演算結果退避手段は、
前記更新割り当て範囲外の演算結果を記憶する第1の配列と、
該演算結果の記憶する順に対応して、該演算に使用した前記行列の要素の行番号を記憶する第2の配列と、
前記更新割り当て範囲毎に、該更新割り当て範囲の演算結果が記憶されている前記第2の配列の位置を記憶する第3の配列と、
を備えることを特徴とする請求項1に記載のプログラム。 - 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出する演算方法であって、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定処理と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り当て範囲決定処理と、
前記演算割り当て範囲における前記部分行列を、前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記行列と前記列ベクトルとの積を
一時的に記憶する演算結果退避手段に記憶させる演算結果振り分け処理と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新処理と、
を演算装置に実行させる方法。 - 複数のスレッドを同時並列的に使用して行列と列ベクトルとの積を算出する演算装置であって、
前記行列を圧縮列格納法にしたがって圧縮して記憶する行列記憶手段と、
前記行列と前記列ベクトルとの積を一時的に記憶する演算結果退避手段と、
前記行列を所定の範囲で分割して部分行列を生成し、該部分行列についての行列のベクトル積の演算処理を、前記スレッド毎に割り当てる演算割り当て範囲を決定する演算割り当て範囲決定手段と、
前記スレッドが算出した演算結果から、前記行列と列ベクトルとの積の一部を求める演算結果の更新処理を、前記スレッド毎に割り当てる更新割り当て範囲を決定する更新割り当て範囲決定手段と、
前記演算割り当て範囲における前記部分行列を前記行列記憶手段から読み出し、該部分行列についての行列のベクトル積の演算処理を前記スレッドに実行させるベクトル演算処理手段と、
該演算結果が前記更新割り当て範囲か否かを判別し、前記更新割り当て範囲の場合には前記演算結果を、前記行列と列ベクトルとの積を記憶する演算結果記憶手段に記憶し、前記更新割り当て範囲でない場合には前記演算結果を、前記演算結果退避手段に記憶させる演算結果振り分け手段と、
該演算結果退避手段から他のスレッドが算出した更新割り当て範囲の演算結果を読み出し、前記演算結果記憶手段に記憶されている演算結果を更新する演算結果更新手段と、
を備える演算装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008041498A JP5262177B2 (ja) | 2008-02-22 | 2008-02-22 | ベクトル積の並列処理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008041498A JP5262177B2 (ja) | 2008-02-22 | 2008-02-22 | ベクトル積の並列処理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2009199430A true JP2009199430A (ja) | 2009-09-03 |
JP5262177B2 JP5262177B2 (ja) | 2013-08-14 |
Family
ID=41142844
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2008041498A Active JP5262177B2 (ja) | 2008-02-22 | 2008-02-22 | ベクトル積の並列処理方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5262177B2 (ja) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2489526A (en) * | 2011-04-01 | 2012-10-03 | Schlumberger Holdings | Representing and calculating with sparse matrixes in simulating incompressible fluid flows. |
US9418048B2 (en) | 2013-03-29 | 2016-08-16 | Fujitsu Limited | Apparatus and method for allocating shared storage areas to parallel processors for multiplication of sparse matrix and vector |
CN112260695A (zh) * | 2020-10-15 | 2021-01-22 | 苏州浪潮智能科技有限公司 | 压缩感知信号的重构方法、装置、fpga及存储介质 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104572587B (zh) * | 2014-12-23 | 2017-11-14 | 中国电子科技集团公司第三十八研究所 | 数据矩阵相乘的加速运算方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH02266458A (ja) * | 1989-04-06 | 1990-10-31 | Nec Corp | ニューラルネットワークシミュレーション装置 |
JPH06175986A (ja) * | 1992-12-10 | 1994-06-24 | Nippon Telegr & Teleph Corp <Ntt> | 行列演算の並列処理方法 |
JPH09212483A (ja) * | 1996-01-31 | 1997-08-15 | Fujitsu Ltd | 多様な行列格納法を使用可能な連立方程式の並列処理装置および方法 |
JP2001209631A (ja) * | 2000-01-25 | 2001-08-03 | Nec Corp | 行列ベクトル積演算システム及びそれに用いる行列格納システム並びにそれらの方法 |
-
2008
- 2008-02-22 JP JP2008041498A patent/JP5262177B2/ja active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH02266458A (ja) * | 1989-04-06 | 1990-10-31 | Nec Corp | ニューラルネットワークシミュレーション装置 |
JPH06175986A (ja) * | 1992-12-10 | 1994-06-24 | Nippon Telegr & Teleph Corp <Ntt> | 行列演算の並列処理方法 |
JPH09212483A (ja) * | 1996-01-31 | 1997-08-15 | Fujitsu Ltd | 多様な行列格納法を使用可能な連立方程式の並列処理装置および方法 |
JP2001209631A (ja) * | 2000-01-25 | 2001-08-03 | Nec Corp | 行列ベクトル積演算システム及びそれに用いる行列格納システム並びにそれらの方法 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2489526A (en) * | 2011-04-01 | 2012-10-03 | Schlumberger Holdings | Representing and calculating with sparse matrixes in simulating incompressible fluid flows. |
US9146902B2 (en) | 2011-04-01 | 2015-09-29 | Paul Frederick Cilgrim Dickenson | Parallel computation of matrix problems |
US9418048B2 (en) | 2013-03-29 | 2016-08-16 | Fujitsu Limited | Apparatus and method for allocating shared storage areas to parallel processors for multiplication of sparse matrix and vector |
CN112260695A (zh) * | 2020-10-15 | 2021-01-22 | 苏州浪潮智能科技有限公司 | 压缩感知信号的重构方法、装置、fpga及存储介质 |
CN112260695B (zh) * | 2020-10-15 | 2022-05-13 | 苏州浪潮智能科技有限公司 | 压缩感知信号的重构方法、装置、fpga及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
JP5262177B2 (ja) | 2013-08-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6977239B2 (ja) | 行列乗算器 | |
JP7329533B2 (ja) | 演算を加速するための方法および加速器装置 | |
EP3557425B1 (en) | Accelerator and system for accelerating operations | |
CN108388537B (zh) | 一种卷积神经网络加速装置和方法 | |
US10768894B2 (en) | Processor, information processing apparatus and operation method for processor | |
KR20190019081A (ko) | 심층 신경망용 가속기 | |
CN112106078A (zh) | 神经网络处理元件 | |
JP7453244B2 (ja) | 推定装置、訓練装置、推定方法及びモデル生成方法 | |
JP5374878B2 (ja) | ハーネス配線経路算出方法、ハーネス配線経路設計支援装置及びプログラム | |
JP5262177B2 (ja) | ベクトル積の並列処理方法 | |
US10120717B2 (en) | Method for optimizing the size of a data subset of a processing space for improved execution performance | |
CN109840585B (zh) | 一种面向稀疏二维卷积的运算方法和系统 | |
CN109416755B (zh) | 人工智能并行处理方法、装置、可读存储介质、及终端 | |
CN114995782B (zh) | 数据处理方法、装置、设备和可读存储介质 | |
CN110837483B (zh) | 张量维度变换的方法以及装置 | |
CN113254391A (zh) | 一种神经网络加速器卷积计算和数据载入并行方法及装置 | |
CN113485750B (zh) | 数据处理方法及数据处理装置 | |
CN117435855B (zh) | 用于进行卷积运算的方法、电子设备和存储介质 | |
CN114003201A (zh) | 矩阵变换方法、装置及卷积神经网络加速器 | |
JP5777458B2 (ja) | パターン識別装置、パターン識別方法及びプログラム | |
JP2002163247A (ja) | 共有メモリ型スカラ並列計算機における多次元フーリエ変換の並列処理方法 | |
CN116541680A (zh) | 基于轻量化时间序列缩减的工业设备状态预测方法与装置 | |
Löhner | Cache‐efficient renumbering for vectorization | |
JP6666548B2 (ja) | 並列計算機、fft演算プログラムおよびfft演算方法 | |
CN111191774A (zh) | 面向精简卷积神经网络的低代价加速器架构及其处理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20100917 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20121227 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130108 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130311 |
|
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: 20130402 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20130415 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 Ref document number: 5262177 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |