(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024065355
(43)【公開日】2024-05-15
(54)【発明の名称】疎行列ベクトル積演算装置、疎行列ベクトル積演算方法および疎行列ベクトル積演算プログラム
(51)【国際特許分類】
G06F 17/16 20060101AFI20240508BHJP
【FI】
G06F17/16 P
【審査請求】未請求
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2022174178
(22)【出願日】2022-10-31
(71)【出願人】
【識別番号】000004237
【氏名又は名称】日本電気株式会社
(74)【代理人】
【識別番号】100103090
【弁理士】
【氏名又は名称】岩壁 冬樹
(74)【代理人】
【識別番号】100124501
【弁理士】
【氏名又は名称】塩川 誠人
(72)【発明者】
【氏名】荒木 拓也
【テーマコード(参考)】
5B056
【Fターム(参考)】
5B056BB38
5B056FF01
(57)【要約】
【課題】疎行列ベクトル積を求める演算の性能を向上させることができる疎行列ベクトル積演算装置を提供する。
【解決手段】疎行列ベクトル積演算装置20は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列を生成する生成部21を備える。また、疎行列ベクトル積演算装置20は、第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k(kは正の整数)番目に抽出された列を第k列として所定の形式の第3の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行する追加部を備える。
【選択図】
図14
【特許請求の範囲】
【請求項1】
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を前記非零の成分の数が多い順に並べることによって、前記所定の形式の第2の疎行列を生成する生成部を備える
ことを特徴とする疎行列ベクトル積演算装置。
【請求項2】
第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対して当該行が有する前記非零の成分を行方向に探索し、前記非零の成分が探索されたら前記非零の成分を有する前記作業行列を構成する列を前記作業行列から抽出し、k(kは正の整数)番目に抽出された列を第k列として所定の形式の第3の疎行列に追加する追加処理を、前記作業行列を構成する各行に対して上から順に繰り返し実行する追加部を備える
請求項1記載の疎行列ベクトル積演算装置。
【請求項3】
第2の疎行列と全ての追加処理が実行された第3の疎行列を、前記第2の疎行列、前記第3の疎行列の順で横方向に結合することによって所定の形式の第4の疎行列を生成する結合部を備える
請求項2記載の疎行列ベクトル積演算装置。
【請求項4】
第1の疎行列との乗算の対象であるベクトルの各成分を、前記第1の疎行列を構成する各列が第4の疎行列において並べられた順番に応じて入れ替える入替部を備える
請求項3記載の疎行列ベクトル積演算装置。
【請求項5】
第4の疎行列と各成分が入れ替えられたベクトルとの乗算を演算する演算部を備える
請求項4記載の疎行列ベクトル積演算装置。
【請求項6】
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対して当該行が有する前記非零の成分を行方向に探索し、前記非零の成分が探索されたら前記非零の成分を有する前記作業行列を構成する列を前記作業行列から抽出し、k番目に抽出された列を第k列として前記所定の形式の第2の疎行列に追加する追加処理を、前記作業行列を構成する各行に対して上から順に繰り返し実行する追加部を備える
ことを特徴とする疎行列ベクトル積演算装置。
【請求項7】
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を前記非零の成分の数が多い順に並べることによって、前記所定の形式の第2の疎行列を生成する
ことを特徴とする疎行列ベクトル積演算方法。
【請求項8】
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対して当該行が有する前記非零の成分を行方向に探索し、前記非零の成分が探索されたら前記非零の成分を有する前記作業行列を構成する列を前記作業行列から抽出し、k番目に抽出された列を第k列として前記所定の形式の第2の疎行列に追加する追加処理を、前記作業行列を構成する各行に対して上から順に繰り返し実行する
ことを特徴とする疎行列ベクトル積演算方法。
【請求項9】
コンピュータに、
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を前記非零の成分の数が多い順に並べることによって、前記所定の形式の第2の疎行列を生成する生成処理
を実行させるための疎行列ベクトル積演算プログラム。
【請求項10】
コンピュータに、
所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対して当該行が有する前記非零の成分を行方向に探索し、前記非零の成分が探索されたら前記非零の成分を有する前記作業行列を構成する列を前記作業行列から抽出し、k番目に抽出された列を第k列として前記所定の形式の第2の疎行列に追加する追加処理を、前記作業行列を構成する各行に対して上から順に繰り返し実行させる
ための疎行列ベクトル積演算プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、疎行列ベクトル積演算装置、疎行列ベクトル積演算方法および疎行列ベクトル積演算プログラムに関する。
【背景技術】
【0002】
機械学習やHPC(High-Performance Computing)の分野では、行列演算が多く行われる。行列演算では、一部の成分のみが非零の値を有し(以下、非零の成分と呼ぶ。)、他の成分が全て0(以下、零の成分と呼ぶ。)である行列である「疎行列」が用いられることも多い。疎行列の性質を利用して非零の成分だけが保存されると、記憶領域の省力化および計算時間の短縮化が行われる。
【0003】
図16は、疎行列の例を示す説明図である。
図16に示す疎行列における白色の矩形が、零の成分を表す。また、
図16に示す疎行列における斜線模様の矩形が、非零の成分を表す(他の図においても同様)。
【0004】
図16の左部に示すように、疎行列は、一部の成分のみが非零の値を有する行列である。また、
図16の右部に示すように、非零の成分だけを詰めて保存することによって、効率的に疎行列が保存される。
【0005】
疎行列を対象とする演算は、疎行列とベクトルとの積(以下、疎行列ベクトル積と呼ぶ。)を求める演算であることが多い。
図17は、疎行列を対象とする演算の例を示す説明図である。
【0006】
図17に示すように、疎行列と列ベクトルとの乗算が行われることによって、疎行列ベクトル積が求められる。なお、疎行列を対象とする演算は、例えば非零の成分が詰められた形式の疎行列を対象に実行される。
【0007】
非零の成分が詰められた疎行列の形式として、例えばJagged Diagonal Storage(JDS)が挙げられる。JDSは、ベクトル型コンピュータで多く使用される形式である。ベクトル型コンピュータは、「ベクトル」という単位ごとに処理を行うことによって高速に演算を実行するコンピュータである。
【0008】
ベクトル型コンピュータによる処理を高速にするためには、ベクトル型コンピュータが一度に処理可能な量を示すベクトル長をより長くすることが求められる。JDSは疎行列ベクトル積を求める演算においてベクトル長をより長くできる形式であるため、ベクトル型コンピュータでJDSが多く使用される。
【0009】
図18は、JDSの疎行列の例を示す説明図である。
図18の上部に示すように、最初に疎行列の非零の成分が全て左に詰められ、
図18の中部に示す行列に疎行列が変換される。次いで、変換された行列の各行が非零の成分の数が多い順にソートされ、
図18の下部に示す行列に変換される。次いで、変換された行列の列方向(縦方向)に、非零の成分の値が保存される。
【0010】
図19は、JDSの内部表現の例を示す説明図である。
図19に示すJDSの内部表現は、
図18に示すJDSの疎行列に対応する。JDSの疎行列を保存するメモリは、
図19に示す「値(value)」、「列の位置(index)」、「新しい列が始まる位置(offset)」をそれぞれ保存している。
【0011】
図19に示す「値(value)」には、変換された行列の列方向の非零の成分の値が格納されている。また、
図19に示す「列の位置(index)」には、非零の成分の値が含まれていた元の疎行列の列の位置がそれぞれ格納されている。なお、元の疎行列の最初の列が、0番目の列である。
【0012】
また、
図19に示す「新しい列が始まる位置(offset)」には、最初の「4」を0個目として、
図18の下部に示す行列において新しい列が始まる成分の順番がそれぞれ格納されている。例えば、
図19に示すoffsetは、4個目である「5」から、8個目である「6」から、および11個目である「7」から次の列がそれぞれ開始されていることを示している。なお、
図19に示すoffsetには、終端となる箇所(12)も格納されている。
【0013】
図20は、疎行列を対象とする演算の他の例を示す説明図である。
図20に示す疎行列と列ベクトルとの乗算では、右辺に示すような計算が行われる。すなわち、零の成分に対する計算は無駄な計算になるため、疎行列ベクトル積を求めるには非零の成分に対する計算だけが実行されればよい。
【0014】
図21は、疎行列を対象とする演算の他の例を示す説明図である。
図21は、JDSの疎行列と列ベクトルとの乗算を示す。
図21に示す例では、列ベクトルとの乗算が列ごとに実行される。乗算が実行される度に、積になるベクトルの各成分に計算結果が順次加算されることによって、疎行列を対象とする演算が実現される。なお、各成分への加算にあたって、計算結果の順序は、後で調整される。
【0015】
列ごとに列ベクトルとの乗算を行い、計算結果をベクトルの各成分に順次加算する処理は、
図21に示すようにJDSの疎行列の行数分(
図21に示す例では「4」)だけ並列に実行可能である。すなわち、疎行列を対象とする演算においてJDSの疎行列が使用されると、ベクトル長がより長くなる。
【0016】
図22は、疎行列を対象とする演算の他の例を示す説明図である。
図22では、JDSの疎行列と列ベクトルとの乗算が、JDSの内部表現を用いて表されている。
【0017】
例えば、
図22に示す括弧のように、offsetから各列の切れ目が分かるので、最初の乗算対象の値が「4」「1」「8」「11」であると判断される。また、indexから掛けるベクトルの成分のうちアクセス対象(乗算対象)の成分が分かるので、valueの各値にアクセス対象の各成分の値がそれぞれ掛けられる。次いで、計算結果が積になるベクトルの各成分に加算される。以上の処理が各列に対して繰り返し実行された後、疎行列ベクトル積が求められる。
【0018】
また、特許文献1には、Power Lowに従うデータを格納した疎行列に対する行列ベクトル積を、ベクトル計算機上で高速に演算可能とする情報処理方法が記載されている。
【0019】
また、特許文献2には、疎行列用行列格納形式において、規則性を保持可能な情報処理装置が記載されている。
【0020】
また、特許文献3には、非ゼロ要素が多く集まった行および列が行列の一部に存在する疎行列を、ベクトルとの積を高速に演算できる形式に変換する情報処理装置が記載されている。
【先行技術文献】
【特許文献】
【0021】
【特許文献1】国際公開第2017/154946号
【特許文献2】特開2019-175040号公報
【特許文献3】国際公開第2021/024300号
【発明の概要】
【発明が解決しようとする課題】
【0022】
JDSの疎行列を用いた疎行列と列ベクトルとの乗算には、以下の課題がある。メモリに保存されている行列へのアクセス、および乗算結果のベクトルである疎行列ベクトル積に対するアクセスは、アクセス対象の成分が連続するため高速になる。
【0023】
しかし、掛けるベクトルへのアクセスは、indexの値に応じてアクセス対象の成分がランダムになるため、低速になることが多い。掛けるベクトルへのアクセスが低速になる傾向にあるため、JDSの疎行列を用いた疎行列と列ベクトルとの乗算も低速になることが多い。
【0024】
例えば、多くの行で非零の成分を含む列が疎行列に存在するとする。特に、機械学習では非零の成分を含む列が偏ることが多いため、上記のような列が疎行列に発生する可能性がある。
【0025】
JDSの疎行列では、上記のような列における非零の成分のindexの値は同じになる。よって、非零の成分が連続してアクセスされた場合、キャッシュメモリに存在する列が再利用されるため、キャッシュヒットする機会が発生しやすい。しかし、JDSの疎行列では上記のような列における非零の成分が同じ列に存在しなくなるため、キャッシュヒットする機会が発生しにくくなる。
【0026】
図23は、JDSの疎行列を示す模式図である。
図23に示す黒色の領域は、JDSの疎行列において非零の成分が分布している箇所を表す。
【0027】
また、
図23に示す破線が、indexが同じ非零の成分を表す。
図23に示すように、indexが同じ非零の成分は、JDSの疎行列では別の列に存在する。JDSの疎行列では非零の成分が左寄せされているため、元の疎行列で同じ列に存在する非零の成分が異なる列に存在する。
【0028】
また、
図23に示す実線の矢印が、JDSの疎行列に対するアクセス方向を表す。JDSの疎行列が列方向にアクセスされるため、indexが同じ非零の成分が連続してアクセスされず、疎行列ベクトル積を求める演算が低速になることが多い。また、特許文献1~3にも、上記の理由により疎行列ベクトル積を求める演算が低速になるという課題を解決できる技術は記載されていない。
【0029】
そこで、本発明は、疎行列ベクトル積を求める演算の性能を向上させることができる疎行列ベクトル積演算装置、疎行列ベクトル積演算方法および疎行列ベクトル積演算プログラムを提供することを目的とする。
【課題を解決するための手段】
【0030】
本発明による疎行列ベクトル積演算装置は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列を生成する生成部を備えることを特徴とする。
【0031】
本発明による疎行列ベクトル積演算装置は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k(kは正の整数)番目に抽出された列を第k列として所定の形式の第2の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行する追加部を備えることを特徴とする。
【0032】
本発明による疎行列ベクトル積演算方法は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列を生成することを特徴とする。
【0033】
本発明による疎行列ベクトル積演算方法は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k番目に抽出された列を第k列として所定の形式の第2の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行することを特徴とする。
【0034】
本発明による疎行列ベクトル積演算プログラムは、コンピュータに、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列を生成する生成処理を実行させることを特徴とする。
【0035】
本発明による疎行列ベクトル積演算プログラムは、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k番目に抽出された列を第k列として所定の形式の第2の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行させることを特徴とする。
【発明の効果】
【0036】
本発明によれば、疎行列ベクトル積を求める演算の性能を向上させることができる。
【図面の簡単な説明】
【0037】
【
図1】本発明の実施形態の疎行列ベクトル積演算装置の構成例を示すブロック図である。
【
図2】列入替部110の構成例を示すブロック図である。
【
図3】列ソート部112による入力行列を構成する各列の入れ替え(再配置)の例を示す説明図である。
【
図4】本実施形態におけるJDSの疎行列の例を示す説明図である。
【
図5】本実施形態におけるJDSの内部表現の例を示す説明図である。
【
図6】本実施形態におけるJDSの疎行列を示す模式図である。
【
図7】疎行列を構成する非零の成分の数が少ない列の例を示す説明図である。
【
図8】Index連続化部113による入力行列を構成する各列の入れ替えの例を示す説明図である。
【
図9】Index連続化部113による入力行列を構成する各列の他の入れ替えの例を示す説明図である。
【
図10】本実施形態におけるJDSの疎行列の他の例を示す説明図である。
【
図11】本実施形態におけるJDSの内部表現の他の例を示す説明図である。
【
図12】本実施形態の疎行列ベクトル積演算装置100による疎行列ベクトル積演算処理の動作を示すフローチャートである。
【
図13】本発明による疎行列ベクトル積演算装置100のハードウェア構成例を示す説明図である。
【
図14】本発明による疎行列ベクトル積演算装置の概要を示すブロック図である。
【
図15】本発明による疎行列ベクトル積演算装置の他の概要を示すブロック図である。
【
図17】疎行列を対象とする演算の例を示す説明図である。
【
図19】JDSの内部表現の例を示す説明図である。
【
図20】疎行列を対象とする演算の他の例を示す説明図である。
【
図21】疎行列を対象とする演算の他の例を示す説明図である。
【
図22】疎行列を対象とする演算の他の例を示す説明図である。
【発明を実施するための形態】
【0038】
[構成の説明]
以下、本発明の実施形態を図面を参照して説明する。
図1は、本発明の実施形態の疎行列ベクトル積演算装置の構成例を示すブロック図である。
【0039】
本実施形態の疎行列ベクトル積演算装置100は、上記のようにベクトル型コンピュータで多く用いられるJDSと呼ばれる疎行列の形式において、演算におけるキャッシュヒット率を向上させることによって、疎行列ベクトル積を求める演算の性能を向上させる装置である。
【0040】
具体的には、疎行列ベクトル積演算装置100は、掛けるベクトルの成分にアクセスして計算する際に可能な限りキャッシュメモリに存在する疎行列の成分にヒットするように掛けられる疎行列を変換することによってアクセス速度を改善する。掛けられる疎行列を変換することによって、疎行列ベクトル積演算装置100は、疎行列ベクトル積を求める演算の速さを改善できる。
【0041】
図1に示す疎行列ベクトル積演算装置100は、列入替部110と、行列ベクトル積演算部120とを備える。
【0042】
図1に示すように、列入替部110にJDSの入力行列が入力される。なお、入力行列の形式は、JDS以外の形式(例えば、Compressed Row Storage)であってもよい。
【0043】
図2は、列入替部110の構成例を示すブロック図である。
図2に示す列入替部110は、列振替部111と、列ソート部112と、Index連続化部113と、列結合部114とを含む。
【0044】
疎行列ベクトル積を求める演算において可能な限りキャッシュメモリに存在する入力行列の成分にヒットするように、列入替部110は、入力行列を構成する各列の順番を入れ替える機能を有する。
【0045】
列入替部110の列ソート部112は、JDSの入力行列を構成する各列を、非零の成分の数が多い順に入れ替える機能を有する。すなわち、列ソート部112は、非零の成分の数が多い順に各列を配置し直す。列ソート部112の処理により入力行列において、非零の成分が多い列が、入力行列の左側に入れ替えられる。なお、列ソート部112は、JDSの疎行列を構成する各列から非零の成分の数が多い列を抽出し、非零の成分の数が多い順に抽出された列を入れ替えてもよい。
【0046】
図3は、列ソート部112による入力行列を構成する各列の入れ替え(再配置)の例を示す説明図である。
図3の左上部は、入力行列を示す。また、
図3の左下部は、入力行列に掛ける列ベクトルを示す。
【0047】
また、
図3の入力行列の下に示す値は、各列における非零の成分の出現数を表す。列ソート部112は、indexの出現頻度、すなわち元の入力行列における列ごとの非零の成分の出現数が多い順に、列を入れ替える。
【0048】
図3の右上部は、列ソート部112により列が入れ替えられた入力行列を示す。
図3の右上部に示すように、入力行列において、非零の成分の出現数が多い順に列が入れ替えられている。
【0049】
また、
図3の右下部は、入力行列に掛ける各成分が入れ替えられた列ベクトルを示す。疎行列ベクトル積を求める際、列ソート部112は、入力行列の列の入れ替え方に対応した掛ける列ベクトルの各成分の入れ替え方を示す情報を「列入替情報」として生成する。
【0050】
図3を参照すると、例えば掛ける列ベクトルの5行目の成分「5」が、1行目に入れ替えられている。対応した入れ替え方で掛ける列ベクトルの各成分が入れ替えられると、入れ替える前の疎行列と列ベクトルとで求められた疎行列ベクトル積と、入れ替えた後の疎行列と列ベクトルとで求められた疎行列ベクトル積が同じになる。
【0051】
図4は、本実施形態におけるJDSの疎行列の例を示す説明図である。
図18と同様に、
図4の上部に示すように、最初に疎行列の非零の成分が全て左に詰められ、
図4の中部に示す行列に疎行列が変換される。次いで、変換された行列の各行が非零の成分の数が多い順にソートされ、
図4の下部に示す行列に変換される。次いで、変換された行列の列方向(縦方向)に、非零の成分の値が保存される。
【0052】
図5は、本実施形態におけるJDSの内部表現の例を示す説明図である。
図5に示すJDSの内部表現は、
図4に示すJDSの疎行列に対応する。
【0053】
図5に示すindexでは、「0」が4つ連続、「1」が3つ連続で並んでいる。すなわち、
図3に示すように入力行列が変換されると、JDSの疎行列の各非零の成分のindexとして、同じ値が並びやすくなる。
【0054】
図6は、本実施形態におけるJDSの疎行列を示す模式図である。
図23と同様に、
図6に示す黒色の領域は、JDSの疎行列において非零の成分が分布している箇所を表す。
【0055】
また、
図6に示す破線が、indexが同じ非零の成分を表す。
図6は、
図3に示す列ソート部112による入れ替えにより、最も多く現れる同じindexに対応する非零の成分を含む列が、最初の列に位置することを示す。
【0056】
図23と異なり、
図6ではJDSの疎行列に対するアクセス方向とindexが同じ非零の成分が並ぶ方向が一致しやすくなるため、indexが同じ非零の成分が連続してアクセスされる可能性が高くなる。
【0057】
また、
図6は、2番目に多く現れる同じindexに対応する非零の成分を含む列が、2番目の列に位置することを示す。2列目以降はJDSの疎行列に対するアクセス方向とindexが同じ非零の成分が並ぶ方向がずれる可能性があるが、多く現れるindexに対応する非零の成分が比較的同じ列に存在するためキャッシュヒット率が向上し、疎行列ベクトル積を求める演算の性能が向上する。
【0058】
列入替部110のIndex連続化部113は、JDSの疎行列を構成する各列から非零の成分の数が少ない列を抽出し、可能な限りindexが連続するように抽出された列を入れ替える機能を有する。
【0059】
以下、Index連続化部113が非零の成分の数が少ない列を可能な限りindexが連続に出現するように入れ替える理由を説明する。非零の成分が少ない列は、JDSであっても、キャッシュヒットに貢献しない可能性がある。
【0060】
例えば、キャッシュメモリのサイズを1MBと仮定すると、キャッシュメモリが保存できるサイズの上限値は、倍精度浮動小数点(= 8 Byte)を用いると、1MB / 8Byte = 256Kである。
【0061】
また、入力行列の行数を10Mと仮定すると、10M / 256K = 40であるから、キャッシュメモリが保存できる行の上限値は40である。よって、非零の成分の数が少ない列において非零の成分が等間隔に現れるとすると、1列に40成分以上存在しないと、同じ列に存在する他の非零の成分がアクセスされる場合であっても、列が再利用されずにキャッシュメモリから追い出されてしまう可能性が高い。
【0062】
図7は、疎行列を構成する非零の成分の数が少ない列の例を示す説明図である。
図7に示す黒色の矩形が非零の成分、白色の矩形が零の成分をそれぞれ表す。
【0063】
図7に示すように、同じ列に非零の成分が複数存在しても、他の非零の成分がアクセスされる間に他の箇所がアクセスされるとキャッシュミスとなり、キャッシュメモリから列が追い出されてしまう可能性が高い。
【0064】
よって、非零の成分の数が少ない列に関して、Index連続化部113は、元の入力行列で隣り合う列がJDSで同じ列になりやすいことを考慮し、indexが可能な限り連続に現れるように列を入れ替える。
【0065】
図8は、Index連続化部113による入力行列を構成する各列の入れ替えの例を示す説明図である。Index連続化部113による列の入れ替え方を説明するにあたって、
図8に示すように、簡単のため各行各列に非零の成分が1つだけ存在する疎行列を考える。なお、各行各列に非零の成分が1つだけ存在する疎行列は、JDSでは1列のベクトルに変換される。
【0066】
図8の上部に示す疎行列では非零の成分がランダムに分布しているため、JDSにおけるindexの並び方もランダムになり、上記の理由によりキャッシュミスが生じる可能性が高い。
【0067】
図8の下部に示すように、Index連続化部113は、indexが連続して並ぶように列を入れ替える。indexが連続して並ぶため、キャッシュヒット率が向上する。
【0068】
キャッシュヒット率が向上する理由は、キャッシュメモリに保存される値は、「キャッシュライン」と呼ばれる複数の値が含まれる範囲で管理されている。
図8に示す例では、index「0」の列の非零の成分がキャッシュミスによりキャッシュメモリにロードされた場合、同じキャッシュラインに存在する隣接するindex「1」「2」等の列の非零の成分は、同じタイミングでキャッシュメモリにロードされる。
【0069】
上記のように、JDSでは元の入力行列で隣り合う列が同じ列になりやすいので、各列の非零の成分がキャッシュメモリに併せてロードされることによってキャッシュヒット率が向上するからである。
【0070】
また、列ソート部112と同様に、Index連続化部113は、入力行列の列の入れ替え方に対応した掛ける列ベクトルの各成分の入れ替え方を示す情報を「列入替情報」として生成する。対応した入れ替え方で掛ける列ベクトルの各成分が入れ替えられると、入れ替える前の疎行列と列ベクトルとで求められた疎行列ベクトル積と、入れ替えた後の疎行列と列ベクトルとで求められた疎行列ベクトル積が同じになる。
【0071】
図9は、Index連続化部113による入力行列を構成する各列の他の入れ替えの例を示す説明図である。
図9に示す各Stepにおける左の行列が、入力行列を表す。また、
図9に示す入力行列における黒色の矩形が、後述する抽出された列における非零の成分を表す。
【0072】
簡単のため、
図9に示す入力行列において非零の成分が多い列は省略されている。また、JDSでは行の順番が入れ替えられるため、
図9は行が入れ替えられた後の行列を示す。また、
図9に示す各Stepにおける右の行列が、入力行列を構成する各列が入れ替えられた行列を表す。
【0073】
Index連続化部113は、入力行列に対して以下の具体的な操作を行う。最初に、Index連続化部113は、最も上の行から非零の成分を行方向に探索する。非零の成分を探索すると、Index連続化部113は、探索された非零の成分を含む列を入力行列から抽出する。次いで、Index連続化部113は、1番目に抽出された列を第1列として各列が入れ替えられた行列に追加する(Step.1)。
【0074】
次いで、Index連続化部113は、上から2番目の行に対して同様の処理を実行し、2番目に抽出された列を第2列として各列が入れ替えられた行列に追加する(Step.2)。次いで、Index連続化部113は、上から3番目の行に対して同様の処理を実行し、3番目に抽出された列を第3列として各列が入れ替えられた行列に追加する(Step.3)。
【0075】
各列が入れ替えられた行列の上から4~5番目の行(Step.4における括弧の箇所)には既に非零の成分が存在するため、Index連続化部113は、上から4~5番目の行をスキップし、次の行に移動する。次いで、Index連続化部113は、上から6番目の行に対して同様の処理を実行し、4番目に抽出された列を第4列として各列が入れ替えられた行列に追加する(Step.4)。
【0076】
行のスキップは、抽出された1つの列に複数の非零の成分が存在する場合や、前の列の抽出が繰り返される場合に発生する。なお、スキップされた行は、近くの列がアクセスされているため、キャッシュメモリからまだ追い出されておらずキャッシュヒットする可能性が高いことを期待されている行である。
【0077】
最も下の行に対する処理を終えたら、Index連続化部113は、最も上の行から同じ処理を繰り返し実行する。なお、Index連続化部113は、非零の成分が無い行をスキップする。
【0078】
例えば、最も上の行には既に非零の成分が無いので、Index連続化部113は、最も上の行をスキップする。上から2番目の行には非零の成分があるので、Index連続化部113は、上から2番目の行に対して同様の処理を実行し、5番目に抽出された列を第5列として各列が入れ替えられた行列に追加する(Step.5)。
【0079】
また、上から3番目の行には既に非零の成分が無いので、Index連続化部113は、上から3番目の行をスキップする。上から4番目の行には非零の成分があるので、Index連続化部113は、上から4番目の行に対して同様の処理を実行し、6番目に抽出された列を第6列として各列が入れ替えられた行列に追加する(Step.6)。入力行列から非零の成分が全て抽出された後、Index連続化部113は、各列の入れ替えを終了する。
【0080】
図10は、本実施形態におけるJDSの疎行列の他の例を示す説明図である。
図10の上部に示す疎行列は、列ソート部112により列が入れ替えられた入力行列である。また、疎行列の右の数字は、JDSにおいてソートされた後の行の順番である。
【0081】
列の非零の成分の数が所定値未満の行列(
図10の上部に示す領域Bにおける行列)が、Index連続化部113に入力される。Index連続化部113は、JDSにおける最も上の行から順に、非零の成分を行方向に探索する。
【0082】
次いで、Index連続化部113は、探索された非零の成分を含む列を抽出する。次いで、Index連続化部113は、1番目に抽出された列を第1列として領域Bにおける各列が入れ替えられた行列に追加する。上記の処理を各行に対して繰り返し実行することによって、Index連続化部113は、
図10の中部に示す領域Bにおける行列を生成する。
【0083】
次いで、変換された行列の各行が非零の成分の数が多い順にソートされ、
図10の下部に示す行列に変換される。次いで、変換された行列の列方向(縦方向)に、非零の成分の値が保存される。
【0084】
図11は、本実施形態におけるJDSの内部表現の他の例を示す説明図である。
図11の上部に示すJDSの内部表現は、
図4に示すJDSの疎行列に対応する。また、
図11の下部に示すJDSの内部表現は、
図10に示すJDSの疎行列に対応する。Index連続化部113の処理により、
図11の上部に示す内部表現が
図11の下部に示す内部表現に変換される。
【0085】
図11の下部に示すindexでは、1つの列に「2」「3」「4」が連続で並んでいる。よって、
図10に示すJDSの疎行列が使用された場合、index「2」の列の非零の成分がキャッシュミスによりキャッシュメモリにロードされた場合、同じキャッシュラインに存在する隣接するindex「3」「4」の列の非零の成分が、同じタイミングでキャッシュメモリにロードされる。従って、各非零の成分がJDSの疎行列の同じ列に存在することから、キャッシュヒット率が向上するため、疎行列ベクトル積を求める演算の性能が向上する。
【0086】
列振替部111は、列ごとの非零の成分の数を基に、入力行列を分割する機能を有する。
図10に示す例であれば、列振替部111は、入力行列を領域Aにおける行列(列の非零の成分の数が所定値以上の行列)と領域Bにおける行列(列の非零の成分の数が所定値未満の行列)とに分割する。次いで、列振替部111は、領域Aにおける行列を列ソート部112に、領域Bにおける行列をIndex連続化部113にそれぞれ入力する。
【0087】
列結合部114は、列が入れ替えられた行列同士を結合し、新たな行列を生成する機能を有する。
図10に示す例であれば、列結合部114には、列ソート部112から列が入れ替えられた領域Aにおける行列が、Index連続化部113から列が入れ替えられた領域Bにおける行列が、それぞれ入力される。
【0088】
次いで、列結合部114は、列が入れ替えられた行列同士を結合し、新たな行列を生成する。
図10に示す例であれば、列結合部114は、
図10の中部に示す行列を生成する。具体的には、列結合部114は、列が入れ替えられた領域Aにおける行列と列が入れ替えられた領域Bにおける行列を、列が入れ替えられた領域Aにおける行列、列が入れ替えられた領域Bにおける行列の順で横方向に結合する。
【0089】
列結合部114が生成した新たな行列が、
図1~2に示す列入替後行列に相当する。また、列ソート部112およびIndex連続化部113から、列結合部114に列入替情報がそれぞれ入力される。次いで、列結合部114は、列入替後行列および列入替情報を、行列ベクトル積演算部120に入力する。
【0090】
行列ベクトル積演算部120は、列入替後行列に対して疎行列ベクトル積を求める演算を実行する機能を有する。行列ベクトル積演算部120には、列入替後行列に掛けるベクトルである入力ベクトルが入力される。
【0091】
行列ベクトル積演算部120は、列入替情報を用いて、入力ベクトルの各成分を入れ替える。次いで、行列ベクトル積演算部120は、列入替後行列と各成分が入れ替えられた入力ベクトルとの乗算を演算する。乗算を演算することによって、行列ベクトル積演算部120は、疎行列ベクトル積を求める。
【0092】
なお、列入替後行列および列入替情報は、メモリ等に保存された後に再利用されてもよい。
【0093】
以上のように、本実施形態の列ソート部112は、所定の形式の第1の疎行列(入力行列)を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列(
図10の上部に示す領域Aにおける行列)を生成する。
【0094】
また、本実施形態のIndex連続化部113は、第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列(
図10の上部に示す領域Bにおける行列)を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k番目に抽出された列を第k列として所定の形式の第3の疎行列(
図10の中部に示す領域Bにおける行列)に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行する。
【0095】
また、本実施形態のIndex連続化部113は、最も下の行に対して追加処理を実行した後に作業行列にまだ非零の成分が存在する場合、作業行列を構成する各行に対して上から順に追加処理を再度繰り返し実行してもよい。
【0096】
また、本実施形態の列結合部114は、第2の疎行列と全ての追加処理が実行された第3の疎行列を、第2の疎行列、第3の疎行列の順で横方向に結合することによって所定の形式の第4の疎行列(列入替後行列)を生成する。
【0097】
また、本実施形態の行列ベクトル積演算部120は、第1の疎行列との乗算の対象であるベクトルの各成分を、第1の疎行列を構成する各列が第4の疎行列において並べられた順番に応じて入れ替える。また、行列ベクトル積演算部120は、第4の疎行列と各成分が入れ替えられたベクトルとの乗算を演算する。
【0098】
なお、本実施形態の列入替部110は、列ソート部112とIndex連続化部113のうち、いずれか1つだけを含んでもよい。
【0099】
[動作の説明]
以下、本実施形態の疎行列ベクトル積演算装置100の疎行列ベクトル積を求める動作を
図12を参照して説明する。
図12は、本実施形態の疎行列ベクトル積演算装置100による疎行列ベクトル積演算処理の動作を示すフローチャートである。
【0100】
最初に、疎行列ベクトル積演算装置100の列入替部110に、JDSの疎行列である入力行列が入力される(ステップS101)。
【0101】
次いで、列入替部110の列振替部111は、入力行列を列の非零の成分の数が所定値以上の行列と、列の非零の成分の数が所定値未満の行列とに分割する(ステップS102)。次いで、列振替部111は、列の非零の成分の数が所定値以上の行列を列ソート部112に、列の非零の成分の数が所定値未満の行列をIndex連続化部113にそれぞれ入力する。
【0102】
次いで、列ソート部112は、列の非零の成分の数が所定値以上の行列を構成する各列を、非零の成分の数が多い順に入れ替える(ステップS103)。また、列ソート部112は、入れ替えられた列を基に列入替情報を生成する。次いで、列ソート部112は、列が入れ替えられた行列と列入替情報とを列結合部114に入力する。
【0103】
また、Index連続化部113は、列の非零の成分の数が所定値未満の行列を構成する各列を、可能な限りindexが連続するように入れ替える(ステップS104)。また、Index連続化部113は、入れ替えられた列を基に列入替情報を生成する。次いで、Index連続化部113は、列が入れ替えられた行列と列入替情報とを列結合部114に入力する。
【0104】
次いで、列結合部114は、入力された列が入れ替えられた行列同士を結合する(ステップS105)。次いで、列結合部114は、結合することによって生成された列入替後行列と、列入替情報とを行列ベクトル積演算部120に入力する。また、行列ベクトル積演算部120に、列入替後行列に掛けるベクトルである入力ベクトルが入力される(ステップS106)。
【0105】
次いで、行列ベクトル積演算部120は、入力された列入替情報を用いて、入力ベクトルの各成分を入れ替える(ステップS107)。次いで、行列ベクトル積演算部120は、列入替後行列と各成分が入れ替えられた入力ベクトルとの乗算を演算する(ステップS108)。
【0106】
乗算を演算することによって、行列ベクトル積演算部120は、疎行列ベクトル積を求める。次いで、行列ベクトル積演算部120は、求められた疎行列ベクトル積を出力する(ステップS109)。出力した後、疎行列ベクトル積演算装置100は、疎行列ベクトル積演算処理を終了する。
【0107】
[効果の説明]
本実施形態の列ソート部112は、疎行列を構成する各列のうち非零の成分の数が多い列に対して、非零の成分の数が多い順に列を入れ替える。入れ替えることによって、JDSの疎行列に対するアクセス方向とindexが同じ非零の成分が並ぶ方向が一致しやすくなるため、indexが同じ非零の成分が連続してアクセスされる可能性が高くなる。
【0108】
また、本実施形態のIndex連続化部113は、疎行列を構成する各列のうち非零の成分の数が少ない列に対して、可能な限りindexが連続するように列を入れ替える。入れ替えることによって、連続するindexのいずれかの列の非零の成分がキャッシュミスによりキャッシュメモリにロードされた場合、同じキャッシュラインに存在する他の隣接するindexの列の非零の成分が、同じタイミングでキャッシュメモリにロードされる。
【0109】
上記のいずれの処理によっても疎行列ベクトル積を求める演算におけるキャッシュヒット率が向上するため、本実施形態の疎行列ベクトル積演算装置100は、疎行列ベクトル積を求める演算の性能を向上させることができる。
【0110】
以下、本実施形態の疎行列ベクトル積演算装置100のハードウェア構成の具体例を説明する。
図13は、本発明による疎行列ベクトル積演算装置100のハードウェア構成例を示す説明図である。
【0111】
図13に示す疎行列ベクトル積演算装置100は、CPU(Central Processing Unit )11と、主記憶部12と、通信部13と、補助記憶部14とを含む。また、ユーザが操作するための入力部15や、ユーザに処理結果または処理内容の経過を提示するための出力部16を含む。
【0112】
疎行列ベクトル積演算装置100は、
図13に示すCPU11が各構成要素が有する機能を提供するプログラムを実行することによって、ソフトウェアにより実現される。
【0113】
すなわち、CPU11が補助記憶部14に格納されているプログラムを、主記憶部12にロードして実行し、疎行列ベクトル積演算装置100の動作を制御することによって、各機能がソフトウェアにより実現される。
【0114】
なお、
図13に示す疎行列ベクトル積演算装置100は、CPU11の代わりにDSP(Digital Signal Processor)を含んでもよい。または、
図13に示す疎行列ベクトル積演算装置100は、CPU11とDSPとを併せて含んでもよい。
【0115】
主記憶部12は、データの作業領域やデータの一時退避領域として用いられる。主記憶部12は、例えばRAM(Random Access Memory)である。
【0116】
通信部13は、有線のネットワークまたは無線のネットワーク(情報通信ネットワーク)を介して、周辺機器との間でデータを入力および出力する機能を有する。
【0117】
補助記憶部14は、一時的でない有形の記憶媒体である。一時的でない有形の記憶媒体として、例えば磁気ディスク、光磁気ディスク、CD-ROM(Compact Disk Read Only Memory )、DVD-ROM(Digital Versatile Disk Read Only Memory )、半導体メモリが挙げられる。
【0118】
入力部15は、データや処理命令を入力する機能を有する。入力部15は、例えばキーボード、マウス、タッチパネル等の入力デバイスである。
【0119】
出力部16は、データを出力する機能を有する。出力部16は、例えば液晶ディスプレイ装置等の表示装置、タッチパネル、またはプリンタ等の印刷装置である。
【0120】
また、
図13に示すように、疎行列ベクトル積演算装置100において、各構成要素は、システムバス17に接続されている。
【0121】
疎行列ベクトル積演算装置100において、補助記憶部14は、列入替部110、および行列ベクトル積演算部120を実現するためのプログラムを記憶している。
【0122】
なお、疎行列ベクトル積演算装置100は、例えば内部に
図1に示すような機能を実現するLSI(Large Scale Integration )等のハードウェア部品が含まれる回路が実装されてもよい。
【0123】
また、疎行列ベクトル積演算装置100は、CPU等の素子を用いるコンピュータ機能を含まないハードウェアにより実現されてもよい。例えば、各構成要素の一部または全部は、汎用の回路(circuitry )または専用の回路、プロセッサ等やこれらの組み合わせによって実現されてもよい。これらは、単一のチップ(例えば、上記のLSI)によって構成されてもよいし、バスを介して接続される複数のチップによって構成されてもよい。各構成要素の一部または全部は、上述した回路等とプログラムとの組み合わせによって実現されてもよい。
【0124】
また、疎行列ベクトル積演算装置100の各構成要素の一部または全部は、演算部と記憶部とを備えた1つまたは複数の情報処理装置で構成されていてもよい。
【0125】
各構成要素の一部または全部が複数の情報処理装置や回路等により実現される場合には、複数の情報処理装置や回路等は集中配置されてもよいし、分散配置されてもよい。例えば、情報処理装置や回路等は、クライアントアンドサーバシステム、クラウドコンピューティングシステム等、各々が通信ネットワークを介して接続される形態として実現されてもよい。
【0126】
次に、本発明の概要を説明する。
図14は、本発明による疎行列ベクトル積演算装置の概要を示すブロック図である。本発明による疎行列ベクトル積演算装置20は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数以上有する複数の列を非零の成分の数が多い順に並べることによって、所定の形式の第2の疎行列を生成する生成部21(例えば、列ソート部112)を備える。
【0127】
また、疎行列ベクトル積演算装置20は、第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k番目に抽出された列を第k列として所定の形式の第3の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行する追加部(例えば、Index連続化部113)を備えてもよい。
【0128】
また、追加部は、最も下の行に対して追加処理を実行した後に作業行列にまだ非零の成分が存在する場合、作業行列を構成する各行に対して上から順に追加処理を再度繰り返し実行してもよい。
【0129】
そのような構成により、疎行列ベクトル積演算装置は、疎行列ベクトル積を求める演算の性能を向上させることができる。
【0130】
また、疎行列ベクトル積演算装置20は、第2の疎行列と全ての追加処理が実行された第3の疎行列を、第2の疎行列、第3の疎行列の順で横方向に結合することによって所定の形式の第4の疎行列を生成する結合部(例えば、列結合部114)を備えてもよい。
【0131】
また、疎行列ベクトル積演算装置20は、第1の疎行列との乗算の対象であるベクトルの各成分を、第1の疎行列を構成する各列が第4の疎行列において並べられた順番に応じて入れ替える入替部(例えば、行列ベクトル積演算部120)を備えてもよい。
【0132】
そのような構成により、疎行列ベクトル積演算装置は、正しい疎行列ベクトル積を求めることができる。
【0133】
また、疎行列ベクトル積演算装置20は、第4の疎行列と各成分が入れ替えられたベクトルとの乗算を演算する演算部(例えば、行列ベクトル積演算部120)を備えてもよい。また、所定の形式は、Jagged Diagonal Storageでもよい。
【0134】
また、
図15は、本発明による疎行列ベクトル積演算装置の他の概要を示すブロック図である。本発明による疎行列ベクトル積演算装置30は、所定の形式の第1の疎行列を構成する複数の列のうち非零の成分を所定数未満有する複数の列で構成される作業行列を構成する行に対してその行が有する非零の成分を行方向に探索し、非零の成分が探索されたら非零の成分を有する作業行列を構成する列を作業行列から抽出し、k番目に抽出された列を第k列として所定の形式の第2の疎行列に追加する追加処理を、作業行列を構成する各行に対して上から順に繰り返し実行する追加部31(例えば、Index連続化部113)を備える。
【0135】
また、追加部31は、最も下の行に対して追加処理を実行した後に作業行列にまだ非零の成分が存在する場合、作業行列を構成する各行に対して上から順に追加処理を再度繰り返し実行してもよい。
【0136】
そのような構成により、疎行列ベクトル積演算装置は、疎行列ベクトル積を求める演算の性能を向上させることができる。
【0137】
また、疎行列ベクトル積演算装置30は、第1の疎行列との乗算の対象であるベクトルの各成分を、第1の疎行列を構成する各列が全ての追加処理が実行された第2の疎行列において並べられた順番に応じて入れ替える入替部(例えば、行列ベクトル積演算部120)を備えてもよい。
【0138】
そのような構成により、疎行列ベクトル積演算装置は、正しい疎行列ベクトル積を求めることができる。
【0139】
また、疎行列ベクトル積演算装置30は、第2の疎行列と各成分が入れ替えられたベクトルとの乗算を演算する演算部(例えば、行列ベクトル積演算部120)を備えてもよい。また、所定の形式は、Jagged Diagonal Storageでもよい。
【符号の説明】
【0140】
11 CPU
12 主記憶部
13 通信部
14 補助記憶部
15 入力部
16 出力部
17 システムバス
20、30、100 疎行列ベクトル積演算装置
21 生成部
31 追加部
110 列入替部
111 列振替部
112 列ソート部
113 Index連続化部
114 列結合部
120 行列ベクトル積演算部