JP6972547B2 - 演算処理装置及び演算処理装置の制御方法 - Google Patents

演算処理装置及び演算処理装置の制御方法 Download PDF

Info

Publication number
JP6972547B2
JP6972547B2 JP2016254339A JP2016254339A JP6972547B2 JP 6972547 B2 JP6972547 B2 JP 6972547B2 JP 2016254339 A JP2016254339 A JP 2016254339A JP 2016254339 A JP2016254339 A JP 2016254339A JP 6972547 B2 JP6972547 B2 JP 6972547B2
Authority
JP
Japan
Prior art keywords
data
element data
calculation
calculation unit
product
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
JP2016254339A
Other languages
English (en)
Other versions
JP2018106559A (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 JP2016254339A priority Critical patent/JP6972547B2/ja
Priority to US15/782,881 priority patent/US10642622B2/en
Publication of JP2018106559A publication Critical patent/JP2018106559A/ja
Application granted granted Critical
Publication of JP6972547B2 publication Critical patent/JP6972547B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/544Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices for evaluating functions by calculation
    • G06F7/5443Sum of products
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • G06F15/8007Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors single instruction multiple data [SIMD] multiprocessors
    • G06F15/8015One dimensional arrays, e.g. rings, linear arrays, buses
    • 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/15Correlation function computation including computation of convolution operations
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30032Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3893Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled in tandem, e.g. multiplier-accumulator
    • G06F9/3895Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled in tandem, e.g. multiplier-accumulator for complex operations, e.g. multidimensional or interleaved address generators, macros
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • G06N3/063Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • G06N3/084Backpropagation, e.g. using gradient descent

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Mathematical Physics (AREA)
  • Computing Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Mathematical Analysis (AREA)
  • Computational Mathematics (AREA)
  • Biophysics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • General Health & Medical Sciences (AREA)
  • Computational Linguistics (AREA)
  • Evolutionary Computation (AREA)
  • Artificial Intelligence (AREA)
  • Molecular Biology (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Neurology (AREA)
  • Computer Hardware Design (AREA)
  • Complex Calculations (AREA)
  • Advance Control (AREA)

Description

本発明は、演算処理装置及び演算処理装置の制御方法に関する。
演算処理装置に用いられるGPU(Graphic Processing Unit)は、元々は画像処理用のプロセッサであるが、後述する浮動小数点の積和演算器を多数有し、行列計算に最適化されているため、機械学習用の処理を行うプロセッサとしても用いられることが多い。そして、深層学習(ディープラーニング)を行う処理においても、GPUが用いられることが一般的である。
深層学習では、ニューラルネットワークを用いて処理が行われることが多い。例えば、画像認識の深層学習の場合、与えられた画像が何か判断するフォワード処理及び判断するためのニューラルネットワークのパラメータを更新するためのバックワード処理の2つの処理を有する。深層学習を行う演算処理装置は、フォワード処理での計算結果と期待値との差分を用いてバックワード処理を行い、ニューラルネットワークのパラメータを更新する。そして、演算処理装置は、更新したパラメータを用いてフォワード処理の精度を向上させる。
ニューラルネットワークは複数の層で構成され、各層で特徴量の抽出などの演算処理が行われ、且つ、学習が繰り返される。このように、ニューラルネットワークは、それぞれの層で実施される異なる演算処理が行われる多層の構造を有する。このような構造を有することから、層毎のパラメータの更新を行うために、後の層の計算結果と期待値との差分を求め、その差分を1つ前の層に、その層の差分計算の結果をさらに1つ前の層に伝搬しながら学習が行われる。ここでの説明における1つ前及び1つ先は、フォワード処理が進む方向を基準とする。
さらに、深層学習の中で主に画像認識で用いられる演算処理として、畳み込みニューラルネットワークという処理がある。畳み込みニューラルネットワークでは、畳み込みと呼ばれる演算が多用される。以下では、「畳み込み演算」という。例えば、画像認識を行う場合、入力画像上の領域に予め決められたパラメータを各要素として有する重み枠を元画像に配置する。そして、重み枠が配置された入力画像の各要素と、重み枠の各要素とを乗算したものを合計することで、入力画像における重み枠が配置された領域の特徴量を算出する。この元画像への重み枠の配置を予め決められた重み枠の移動幅を用いて入力画像全体に行い、算出した特徴量をまとめたものが、畳み込み演算の結果として出力される出力画像となる。重み枠は、「フィルタ」と呼ばれる場合がある。
例えば、入力画像として、8×8の要素を有する画像、すなわち8×8ビットのグレースケールの画像を考える。以下では、8×8の入力画像という。また、4×4の要素を有するフィルタを用いる場合で、且つフィルタを入力画像における1列又は1行ずつずらす場合について説明する。以下では、4×4のフィルタという。また、以下では、行が延びる方向を「行方向」といい、列が延びる方向を「列方向」という。この場合、8×8の入力画像の行方向の一方の端に配置された4×4のフィルタを行方向に5(=8−3)回移動させると他方の端に到達する。すなわち、出力画像は行方向に5つの要素を有する。同様に、8×8の入力画像の列方向の一方の端に配置された4×4のフィルタを列方向に8−3回移動させると他方の端に到達する。すなわち、出力画像は列方向にも5つの要素を有する。したがって、出力画像は、5×5の画像となる。そして、出力画像の各要素は、フィルタを入力画像に配置した状態の、フィルタの各要素とその各要素に対応する位置の入力画像の各要素を乗算した合計値となる。
このような乗算した値を合計する演算を行う場合、演算処理装置は、fma(Fused Multiply Add)と呼ばれる命令を用いることが多い。fmaとは、(A×B)+Cの形で表される浮動小数点の積和演算を行う命令である。
さらに、このような畳み込み演算を行う場合に、1つの命令を実行することにより、複数のデータに対する演算処理を同時に行い、同時に複数の演算結果出力を得るSIMD(Single Instruction Multiple Data)という方式が用いられる場合がある。例えば、4個のデータを並列に処理するSIMDを用いた演算の場合で説明する。以下では、n個のデータを並列に処理するSIMDを、nSIMDという。すなわち、この場合の演算処理は、4SIMDの演算処理といえる。また、以下では、SIMDを用いた演算を、SIMD演算という。
上述した8×8の入力画像及び4×4のフィルタを用いた畳み込み演算の場合、演算装置は、フィルタを1列ずつ4回ずらした各配置状態のフィルタの1つの要素と対応する入力画像の要素とを乗算した結果である4つの値を一度で計算できる。すなわち、4SIMDの演算を行う場合、演算処理装置は、4つの異なる配置のフィルタの状態に対応する出力画像の要素を並行して算出することができる。
このようなSIMDを用いた演算処理を行う場合、演算処理装置は、記憶装置としてのメモリに格納された入力画像のデータのうち、演算に用いるデータを、SIMD演算で用いるレジスタに格納してから1回の演算を行う。この処理を繰り返すことで、演算処理装置は、畳み込み演算を行うことができる。例えば、4SIMDの演算処理の場合、1回のSIMD演算に用いられるレジスタは4つである。演算処理装置は、SIMD演算においてレジスタへのデータの格納を行う場合、SIMDのロード命令を用いて1度にSIMDレジスタの全てのレジスタにデータを格納する。
ここで、畳み込み演算では、出力画像の1つの要素を求める場合に、フィルタの各要素とそれに対応する入力画像の各要素とを用いる。さらに、SIMDを用いた畳み込み演算では、フィルタの範囲をずらしながら、繰り返し演算が行われるため、並行する畳み込み演算の中で、同じデータが何度も用いられる。
従来、畳み込み演算では、1つのフィルタの配置状態毎に、各要素の乗算及び乗算結果の合計がまとめて行われる。そのため、SIMDを用いた場合のように複数の演算器で並行して計算を行う場合、処理速度を向上するため、計算順の調整を行い同じデータの使用を回避することや同じデータのコピーを用意して同時に使用することが行われる。
例えば、畳み込み演算に関する技術としては、1ライン毎に乗算器を設け、各ラインの重みを格納するシフトレジスタを設け、値をシフトさせて順次乗算を行い、乗算結果を加算する従来技術がある。また、隣接するライン同士が乗算器を共有するように、各ラインに対応させて乗算器を設け、畳み込み演算を行う従来技術がある。また、メモリのラインデータを格納する領域と重みデータを格納する領域とに分け、メモリ領域を循環させて演算を行う従来技術がある。また、乗算器の出力を他の乗算器に渡して演算を行う従来技術がある。さらに、計算式を簡略化することで乗算器及び加算器を削減した従来技術がある。
特開2010−134697号公報 特開2015−210709号公報 特開2008−310700号公報 特開2012−205298号公報 特開2001−67338号公報
しかしながら、同じデータの読み出しを回避するために計算順の調整を行う場合、使用するデータを決めるために乗算や除算が用いられる。乗算や除算は加算や減算と比較して、演算により多くのサイクル数を消費するため、計算コストが高い。そして、乗算や除算の演算中には、演算器が毎サイクル動作できないおそれがある。このため、計算順の調整を行うことで、演算の処理速度が低下するおそれがある。また、同じデータの読み出しを回避するためにデータのコピーを用意する場合、同時に使用されないようなデータの並び替えが煩雑になる可能性やコピーするデータ数が増えるおそれがある。例えば、フィルタの1度の移動距離が2列2行以上の場合、読み出すデータが各演算器でばらばらになるため、上記の問題が発生する。すなわち、1つのフィルタの配置状態毎にまとめて演算を行う処理方法を用いた場合、処理速度を向上させるには多くの計算コストがかかるおそれがある。
また、異なるデータを使用する場合でも、レジスタにデータを移動する方法によってはレジスタからデータを読み出せない状態になる場合もある。例えば、2つの演算器が同じタイミングで同じレジスタからデータを読み出そうとした場合、データの読み出しが困難となることが考えられる。そのため、演算の処理速度が低下するおそれがある。
さらに、バックワード処理では、入力データが小さく出力データが多いため、同じデータを使って実施する演算の回数が多い。そこで、より多くの演算器を使用して計算することで処理を効率的に行うことができるが、単に演算器を増やして従来の方法で演算を行った場合、多数の演算器へ効率的にデータ供給を行うことは困難である。
開示の技術は、上記に鑑みてなされたものであって、コストの増加を抑えつつ演算処理速度を向上させる演算処理装置及び演算処理装置の制御方法を提供することを目的とする。
本願の開示する演算処理装置及び演算処理装置の制御方法の一つの態様において、データ格納部は、第1行列を表す第1データ及び第2行列を表す第2データをそれぞれ格納する。演算部は、複数配置される。複数の第1格納部は、前記データ格納部に格納された前記第1データの異なる第1所定行をそれぞれが格納、且つ、前記第1行列における格納した第1所定行から列方向にストライド数移動した次の第1所定行に格納情報を順次入れ替えていく。複数の第2格納部は、前記演算部毎に配置され、前記データ格納部に格納された前記第2データの同じ連続する所定数の要素データの集まりをそれぞれが格納し、且つ、先頭から順に前記所定数の要素データを順次入れ替えて格納していく。積和演算部は、前記演算部毎に複数配置され、対応する前記第1格納部に格納された前記第1所定行に含まれる要素データのうち前記第1所定行における先頭の要素データから所定間隔ずつ移動した位置の要素データを先頭として前記所定数の要素データの集まりである異なる第1要素データをそれぞれが取得し、且つ、前記第2格納部に格納された前記所定数の要素データの集まりである同じ第2要素データを対応する前記第2格納部からそれぞれが取得し、取得した前記第1要素データと前記第2要素データとを乗算し、対応する前記第1格納部に格納された前記第1所定行及び対応する前記第2格納部に格納された前記第2格納部に格納された前記所定数の要素データの集まり入れ替えられる毎の乗算結果を累積加算した値を基に前記第1データと前記第2データとを用いた演算を実行する。
1つの側面では、本発明は、コストの増加を抑えつつ演算処理速度を向上させることができる。
図1は、深層学習の全体的な流れを説明するための図である。 図2は、畳み込みフォワード演算及びバックワード演算を説明するための図である。 図3は、演算処理装置のブロック図である。 図4は、演算部の詳細を表すブロック図である。 図5は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。 図6は、畳み込みバックワードの重み差分演算時の要素データの読み出しを説明するための図である。 図7Aは、畳み込みバックワードの重み差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。 図7Bは、畳み込みバックワードの重み差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。 図8Aは、畳み込みバックワードの重み差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。 図8Bは、畳み込みバックワードの重み差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。 図9は、畳み込みバックワードの重み差分演算における1回目の計算における演算部を表す図である。 図10は、畳み込みバックワードの重み差分演算における2回目の計算における演算部を表す図である。 図11は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。 図12は、畳み込みバックワードのボトム差分演算時の要素データの読み出し及び格納を説明するための図である。 図13Aは、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。 図13Bは、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。 図13Cは、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。 図14Aは、畳み込みバックワードのボトム差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。 図14Bは、畳み込みバックワードのボトム差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。 図15は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の1行目の計算時の演算部を表す図である。 図16は、ストライド数が1の場合の畳み込みバックワードの重み差分演算における2行目の計算における演算部を表す図である。 図17は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算における1行目の計算における演算部を表す図である。 図18は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。 図19は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。 図20は、畳み込みバックワードの重み差分演算のフローチャートである。 図21は、畳み込みバックワードのボトム差分演算のフローチャートである。 図22は、複数の演算部によるボトムデータ及びトップデータの指定を説明するための図である。 図23は、複数の演算部を用いた場合の畳み込み演算全体のフローチャートである。 図24は、複数の演算部を用いた畳み込みフォワード演算のプログラムの記述例を説明するための図である。 図25は、複数の演算部を用いた場合の畳み込みバックワードの重み差分演算のプログラムの記述例を説明するための図である。 図26は、複数の演算部を用いた場合の畳み込みバックワードのボトム差分演算のプログラムの記述例を説明するための図である。 図27は、演算処理装置のハードウェア構成図である。
以下に、本願の開示する演算処理装置及び演算処理装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理装置の制御方法が限定されるものではない。
図1は、深層学習の全体的な流れを説明するための図である。ここで、本実施例では、画像認識のための深層学習について説明する。以下では、畳み込み演算を例に説明するが、ニューラルネットワークの各層で行われる演算は畳み込み演算以外の演算もある。
図1に示すように、演算処理装置1は、入力データ10の入力を受ける。そして、演算処理装置1は、複数の演算処理層を有する。各演算処理層では、それぞれ異なる特徴点の抽出などの演算処理を行う。演算処理装置1は、取得した入力データ10に対して第1層である演算処理層101で重みデータを用いて畳み込み演算を実行する。ここで、重みデータは、フィルタにあたる。次に、演算処理装置1は、演算処理層101からの特徴量でもある出力データ20に対して第2層である演算処理層102で重みデータを用いて畳み込み演算を行う。演算処理装置1は、このように各層での演算処理を順次行っていき、第n層である演算処理層103での重みデータを用いた畳み込み演算の演算結果を特徴量でもある出力データ20として出力する。このようにして、例えば、入力データ10を入力画像とすれば、各層での出力データ20は、画像認識のための特徴量として取得でき、各層で取得した特徴量を用いて繰り返しパラメータ更新する深層学習をさせることで、画像認識の精度は向上し、演算処理装置1は、画像認識を行うことができる。また、例えば、音声認識の場合には、入力データ10は、音声データ、テキストマイニングの場合には入力データ10は単語となる。ここで説明した、演算処理装置1による矢印P1へ向かう方向の畳み込み演算による演算処理は、「畳み込みフォワード演算」と呼ばれる場合がある。
さらに、演算処理装置1は、各層における特徴点の抽出の精度を上げるために、期待値の差分を用いて重みデータの変更を行う。例えば、演算処理装置1は、予め決められた期待値を有し、第n層である演算処理層103からの出力データ20と期待値とを比較する。そして、演算処理装置1は、出力データ20と期待値との差分を求め、その求めた差分及びn−1層からの入力データ10を用いて重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた重みデータの期待値との差分を用いて重みデータを修正する。そして、演算処理装置1は、修正した重みデータ及び出力データ20と期待値との差分を用いて第n−1層における重みデータを修正するためのデータであるトップ差分データを求める。次に、演算処理装置1は、n−2層からの入力データ10に対して、求めた第n−1層の出力データ20と第n−1層における出力の期待値との差分を用いて第n−1層の重みデータを修正する。
ここで、矢印P1方向を各層の並び方向とすると、演算処理装置1は、特定の演算処理層の1つ前の演算処理層において特定の演算処理層におけるトップ差分データを算出する。そして、演算処理装置1は、算出した特定の演算処理層におけるトップ差分データと1つ前の演算処理装置1からの出力データ20とを用いて、特定の演算処理層における重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた特定の演算処理層における重みデータの期待値との差分を用いて重みデータを修正する。その後、演算処理装置1は、修正した特定の演算処理層における重みデータと特定の演算処理層における出力データ20と期待値との差分とを用いて、特定の演算処理層の1つ前の演算処理層におけるトップ差分データを算出する。
演算処理装置1は、各演算処理層における重みデータの修正及び1つ前の演算処理層におけるトップ差分データの算出を順次繰り返す。これにより、演算処理装置1は、演算処理層101〜103の全ての層の重みデータを演算処理層103の出力データ20の期待値に合わせて修正することができる。ここで説明した、演算処理装置1による矢印P2へ向かう方向の各演算処理層における重みデータを修正するための演算処理は、「畳み込みバックワード演算」と呼ばれる場合がある。
以下では、特定の演算処理層における畳み込みフォワード演算に用いる入力データを、「ボトムデータ」という。ボトムデータは、特定の演算処理層の1つ前の演算処理層からの出力データにあたる。また、特定の演算処理層における重みデータの期待値との差分のデータを、「重み差分データ」という。また、特定の演算処理装置における畳み込みバックワード演算の演算結果のデータを「ボトム差分データ」という。さらに、特定の演算処理層において畳み込みバックワード演算において重みデータの修正に用いられる元データを、「トップ差分データ」という。ここで、特定の演算処理層における畳み込みバックワード演算の算出結果は、特定の演算処理層の1つ前の演算処理層の畳み込みバックワード演算の元データとして用いられる。すなわち、特定の演算処理層において算出されたボトム差分データは、特定の演算処理層の1つ前の演算処理層のトップ差分データにあたる。
また、畳み込みバックワード演算において、トップ差分データとボトムデータとを用いて重み差分データを求める演算を、「畳み込みバックワードの重み差分演算」という。さらに、修正された重みデータとトップ差分データとを用いてボトム差分データを算出する演算を、「畳み込みバックワードのボトム差分演算」という。
さらに、本実施例では、ボトムデータ及び重みデータを正方形に行列として並んだ要素データを有する場合で説明する。そこで、以下では、重みデータの行数及び列数を「カーネル数」あるいはカーネル数に応じた単位として「カーネルサイズ」という。ただし、ボトムデータ及び重みデータは、それぞれ長方形でもよい。また、畳み込みフォワード演算における重みデータの1回の移動量、並びに、畳み込みバックワード演算におけるトップ差分データの1回の移動量及び重みデータの1回の移動量を「ストライド数」という場合がある。また、行方向及び列方向いずれにも、ストライド数分の一回の移動が行われる。
図2は、畳み込みフォワード演算及びバックワード演算を説明するための図である。図2では、入力データ10を用いて演算処理を始める第1層から出力データ206と期待値207からトップ差分データ203を生成する第n層までを記載した。ここでは、演算処理層101を第1層とし、演算処理層104を第n−1層とし、演算処理層103を第n層として、第n層まで各演算処理層101〜104における演算を例に記載した。また、図2中の円で記載した処理は演算処理を表す。演算処理F1は、畳み込みフォワード演算を表す。演算処理F2は、畳み込みバックワードの重み差分演算を表す。また、演算処理F3は、畳み込みバックワードのボトム差分演算を表す。
演算処理装置1は、演算処理層101において入力データ10及び第1層での重みデータ202に対して演算処理F1で表される畳み込みフォワードを行い、演算結果209を算出する。その後は、図示しないが、同様に次の第2層において、前の層の演算結果209及び第2層での重みデータ202に対して同様に演算処理F1で表される畳み込みフォワード演算を行う。これらを繰り返し、最後の第n層である演算処理層103は、同様に演算処理層104の演算結果209から取得したボトムデータ201及び第n層での重みデータ202に対して演算処理F1で表される畳み込みフォワード演算を行う。さらに、演算処理層103は、出力データ206と期待値207とを比較して、トップ差分データ203を算出する。ここで、入力データ10は、第2層〜第n層におけるボトムデータ201にあたるため、以下では、第1層のボトムデータ201として扱う。また、第n層の出力データ20は、第1層〜第n−1層における演算結果209にあたる。
さらに続けて、バックワード演算を説明すると、演算処理装置1は、演算処理層103において、トップ差分データ203及びボトムデータ201に対して演算処理F2で表される畳み込みバックワードの重み差分演算を行い、重み差分データ204を算出する。さらに、演算処理装置1は、重み差分データ204を用いて重みデータ202を更新する。ここで、図2における破線の矢印が重みデータ202の更新の処理を表す。具体的には、演算処理装置1は、重み差分データ204に学習率を乗算して、新たな重みデータ202を算出する。
また、演算処理装置1は、フォワード演算で使用した重みデータ202及びトップ差分データ203に対して演算処理F3で表される畳み込みバックワードのボトム差分演算を行い、ボトム差分データ205を算出する。
ここで、図2では、最後の層である演算処理層103を例に図示したが、他の層においても同様の演算が行われる。ただし、他の層では、演算処理装置1は、トップ差分データ203として1つ後の層で算出されたボトム差分データ205を用いる。
次に、図3を参照して、演算処理装置1の詳細について説明する。図3は、演算処理装置のブロック図である。図3に示すように、演算処理装置1は、記憶装置としてのメモリ11、第1データ制御部12、第2データ制御部13、レジスタファイル(RF:Register File)411〜413,421〜423及び431〜433を有する。また、演算処理装置1は、演算部51〜53及びポインタ制御部16を有する。
ここで、レジスタファイル411〜413は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル411〜413を区別しない場合、「レジスタファイル410」という。また、レジスタファイル421〜423は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル421〜423を区別しない場合、「レジスタファイル420」という。また、レジスタファイル431〜433は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル431〜433を区別しない場合、「レジスタファイル430」という。また。演算部51〜53は、いずれも同じ機能を有する。そこで、以下では、演算部51〜53を区別しない場合、「演算部50」という。
メモリ11は、計算に用いる各種データを格納する記憶部である。例えば、メモリ11は、ボトムデータ201及び重みデータ202を格納する。さらに、メモリ11は、後述する演算部51〜53により算出されたトップ差分データ203及び重み差分データ204も格納する。
レジスタファイル410,420及び430は、演算時に演算に用いるデータが一時的に格納される記憶部である。レジスタファイル410,420及び430は、本実施例では、各演算部50にそれぞれ1つずつの3つが割り当てられる。
レジスタファイル410は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる一方のデータを格納する。また、レジスタファイル420は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる他方のデータを格納する。さらに、レジスタファイル430は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算における演算結果が格納される。
第1データ制御部12は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ11からデータを読み出し、各演算部50に対応するレジスタファイル410それぞれに格納する。
第1データ制御部12は、畳み込みフォワード演算の場合、演算に用いるボトムデータ201の要素データをメモリ11から読み込み、各演算部50に対応するレジスタファイル410それぞれに格納する。
畳み込みバックワードの重み差分演算の場合、第1データ制御部12は、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、指定された先頭位置からボトムデータ201の要素データを1行ずつメモリ11から読み込み、各演算部50に対応するレジスタファイル410に格納する。
ここで、畳み込みバックワード演算を行う場合、トップ差分データ203は、その1行1列の位置をボトムデータ201の1行1列の位置に合わせた位置から行方向にストライド数ずつ移動される。以下では、1行1列を一致させた位置を初期位置という。そして、トップ差分データ203は、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数まで、ボトムデータ201の初期位置から行方向にストライド数ずつ移動される。以下では、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数を、「最大移動数」という。
第1データ制御部12は、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の数分まで繰り返す。ただし、レジスタファイル410の個数が最大移動数分以上ある場合、第1データ制御部12は、最大移動数分行うと、要素データの読込及びレジスタファイル410への格納を終了する。
次に、レジスタファイル410に格納した要素データを用いた演算が完了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置をストライド数分列方向に移動させ、ボトムデータ201の要素データの1行ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。ボトムデータ201とトップ差分データ203とが正方形である場合、列方向にストライド数分ずつ初期位置からトップ差分データ203を移動させると、最大移動数の回数の移動を行うと、トップ差分データ203は、ボトムデータ201からはみ出す。そこで、第1データ制御部12は、最大移動数の回数、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納を繰り返す。
第1データ制御部12は、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納が、最大移動数回終了していない場合、同様の処理を最大移動数の回数に達するまで繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、第1データ制御部12は、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、トップ差分データ203の要素データを1行ずつ読み込み、各演算部50に対応するそれぞれのレジスタファイル410に格納する。
第1データ制御部12は、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の個数分繰り返す。ただし、レジスタファイル410の個数がトップ差分データ203の行数分以上ある場合、第1データ制御部12は、行数分行うと、要素データの読込及びレジスタファイル410への格納を終了する。
次に、レジスタファイル410に格納した要素データを用いた演算が終了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置を1行下の行に移動させ、トップ差分データ203の要素データを1行ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。第1データ制御部12は、重みデータ202の行数、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納を繰り返す。
第1データ制御部12は、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納が、最大移動数回終了していない場合、同様の処理を最大移動回数に達するまで繰り返す。
第2データ制御部13は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ11からデータを読み出し、各演算部50に対応するレジスタファイル420に格納する。
第2データ制御部13は、畳み込みフォワード演算の場合、演算に用いる重みデータ202の要素データを、配置されたレジスタファイル420の数分だけメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。
また、畳み込みバックワードの重み差分演算の場合、第2データ制御部13は、要素データの読み込みの先頭位置としてトップ差分データ203の先頭の指定を受ける。そして、第2データ制御部13は、指定された先頭位置から1行分のトップ差分データ203の要素データを、配置されたレジスタファイル420の数分だけメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。すなわち、第2データ制御部13は、各演算部50に対応するレジスタファイル420の全てに同じ要素データを格納する。
レジスタファイル420に格納した要素データを用いた演算が終了した後、第2データ制御部13は、行分演算の終了の通知を演算部50から受ける。そして、第2データ制御部13は、トップ差分データ203における読み込みの先頭位置を1行下の行の先頭に移動する。そして、第2データ制御部13は、先頭位置から1行分のトップ差分データ203の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込み、レジスタファイル420に格納する。第2データ制御部13は、先頭位置からの1行分の要素データの読み込み及びレジスタファイル420への格納を繰り返す。
第2データ制御部13は、最大移動数の回数、要素データの読み込み及びレジスタファイル420への格納を行った時点で、演算処理が終了していない場合、トップ差分データ203における読み込みの先頭位置をトップ差分データ203の先頭に移動する。そして、第2データ制御部13は、演算処理が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、第2データ制御部13は、要素データの読み込みの先頭位置として重みデータ202の先頭の指定を受ける。そして、第2データ制御部13は、指定された先頭位置から1行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。すなわち、第2データ制御部13は、各演算部50に対応するレジスタファイル420の全てに同じ要素データを格納する。
レジスタファイル420に格納した要素データを用いた演算が終了した後、第2データ制御部13は、行分演算の終了の通知を演算部50から受ける。そして、第2データ制御部13は、重みデータ202における読み込みの先頭位置を1行下の行の先頭に移動する。そして、第2データ制御部13は、先頭位置から1行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込み、レジスタファイル420に格納する。第2データ制御部13は、先頭位置からの1行分の要素データの読み込み及びレジスタファイル420への格納を繰り返す。
第2データ制御部13は、最大移動数の回数、要素データの読み込み及びレジスタファイル420への格納を行った時点で、演算処理が終了していない場合、重みデータ202における読み込みの先頭位置を重みデータ202の先頭に移動する。そして、第2データ制御部13は、演算処理が終了するまで、同様の処理を繰り返す。
演算部50は、レジスタファイル410及び420に格納された要素データを用いて、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算を実行し、演算結果をレジスタファイル430に格納する。図4は、演算部の詳細を表すブロック図である。
図4に示すように、演算部50は、並列に配置されたFMAの演算を行う積和演算部501〜503を有する。各積和演算部501〜503は、異なる計算経路を形成する。演算部50は、行う演算に合わせて使用する積和演算部501〜503の数を変更することができる。また、レジスタファイル430は、積和演算部501〜503に対応するレジスタファイル301〜303を有する。以下に、演算部50による畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算の詳細を説明する。
畳み込みバックワードの重み差分演算の場合、演算部50は、算出する重みデータ202のカーネル数の積和演算部501〜503を使用して以下の演算を繰り返す。積和演算部503は、重みデータ202のカーネル数個目の積和演算部である。この場合、レジスタファイル410には、ボトムデータ201の1行分のデータが行の先頭から順に格納される。また、レジスタファイル420には、トップ差分データ203の1行分のデータが行の先頭から順に格納される。
演算部50は、レジスタファイル410に格納されたボトムデータ201における先頭ポインタの位置の指定をポインタ制御部16から受ける。より詳しくは、演算部50は、最初にレジスタファイル410に格納されたボトムデータ201の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から受ける。その後、演算部50は、1回の積和演算を計算する毎に、レジスタファイル410に格納されたボトムデータ201の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から順次受ける。演算部50は、行の最後の要素データからカーネル数前の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部16から受ける。
積和演算部501は、レジスタファイル410におけるポインタ制御部16により指定された先頭ポインタの位置のボトムデータ201の要素データを読み込む。続いて、積和演算部502〜503は、順次先頭ポインタから1つずつ進めた位置のボトムデータ201の要素データを読み込む。具体的には、また、積和演算部502は、先頭ポインタの位置から1つ進めた位置のボトムデータ201の要素データを読み込む。また、積和演算部503は、先頭ポインタの位置からカーネル数分進めた位置のボトムデータ201の要素データを読み込む。
また、演算部50は、レジスタファイル420に格納されたトップ差分データ203における先頭ポインタの位置の指定をポインタ制御部16から受ける。より詳しくは、演算部50は、最初にレジスタファイル420に格納されたトップ差分データ203の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から受ける。その後、演算部50は、1回の積和演算を計算する毎に、レジスタファイル420に格納されたトップ差分データ203の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から順次受ける。演算部50は、行の最後の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部16から受ける。
積和演算部501〜503は、レジスタファイル420におけるポインタ制御部16により指定された先頭ポインタの位置のトップ差分データ203の要素データを読み込む。すなわち、積和演算部501〜503は、同じトップ差分データ203の要素データを読み込む。
そして、積和演算部501〜503は、読み込んだボトムデータ201の要素データとトップ差分データ203の要素データとを乗算する。次に、積和演算部501〜503は、対応するレジスタファイル311〜313に格納されたデータを読み出す。そして、積和演算部501〜503は、読み出したデータと乗算結果を加算し、対応するレジスタファイル311〜313に格納する。ここで、レジスタファイル311〜313は、初期値として0が格納される。積和演算部501は、先頭ポインタが最後の位置に達するまで計算を繰り返す。
各レジスタファイル311〜313に格納された値が、重み差分データ204の1行のそれぞれの値の算出の中間値にあたる。
この計算により、演算部50は、ボトムデータ201の1行に対してトップ差分データ203を先頭に重ね、その後スライド数分ずつずらしながら重なった各要素データの積を合計する積和演算を行い、各積和演算の結果の合計を求める行分演算が行える。行分演算が完了すると、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に送信する。その後、演算部50は、レジスタファイル410及び420に新たに格納された要素データを用いて重み差分積和演算を繰り返す。ここで、演算部50は、畳み込みバックワードの重み差分演算を最大移動数分行う間、各行の要素データにおいて先頭からの位置が同じ要素データを用いた重み差分積和演算の結果を、レジスタファイル430の同じ位置の値に加算していく。この計算を、畳み込みバックワードの重み差分演算を最大移動数の回数繰り返すことで、レジスタファイル311〜313に格納された中間値に順次値が加算され、最終的に、重み差分データ204の1行分の値が算出される。
畳み込みバックワードの重み差分演算を最大移動数分行った場合、演算部50は、演算結果をメモリ11が有する重み差分データ204に格納する。その後、全ての重み差分データ204の算出が終わっていなければ、演算部50は、新たな重み差分データ204の要素データの算出として、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、演算部50は、トップ差分データ203の列数の積和演算部501〜503を使用して以下の演算を繰り返す。積和演算部503は、トップ差分データ203の列数個目の積和演算部である。また、演算部50は、レジスタファイル430の中の算出するボトム差分データ205の行数のレジスタファイル301〜303を用いる。
レジスタファイル410には、トップ差分データ203の1行分のデータが行の先頭から順に格納される。また、レジスタファイル420には、重みデータ202の1行分のデータが行の先頭から順に格納される。
演算部50は、レジスタファイル420に格納された重みデータ202の行の先頭の要素データから順に計算毎にストライド数ずつ進んだ要素データを示す先頭ポインタの指定をポインタ制御部16から受ける。また、演算部50は、レジスタファイル431に格納されたボトム差分データ205の行の先頭から順に計算毎にストライド数ずつ進んだ要素データを示すポインタの指定をポインタ制御部16から受ける。
積和演算部501〜503は、レジスタファイル410に格納されたトップ差分データ203のポインタが示す位置から順に要素データを読み込む。すなわち、積和演算部501〜503は、トップ差分データ203の1行分のそれぞれ異なる値を格納する。
また、積和演算部501〜503のうち先頭及び先頭からストライド数番目ずつの積和演算部は、レジスタファイル420に格納された重みデータ202の行の先頭から計算毎にストライド数ずつ進めた位置の要素データの読み込みを繰り返す。また、積和演算部501〜503のうち先頭のストライド数内の所定番目及びそこからストライド数番目ずつの積和演算部は、重みデータ202の1行のうちの先頭ポインタの位置から計算毎にストライド数ずつ進めた要素データの読み込みを計算毎に繰り返す。このように、積和演算部501〜503は、先頭からストライド数番目の1つ手前の積和演算部が、要素データを読み込むまで1つずつずらした要素データの読み込みを行う。
そして、積和演算部501〜503は、読み込んだトップ差分データ203の要素データ及び重みデータ202を乗算する。そして、積和演算部501〜503は、レジスタファイル430が有するレジスタファイル301〜303に設定された先頭ポインタから計算毎にストライド数ずつ進めたレジスタフィル301〜303からデータを取得する。言い換えれば、積和演算部501〜503は、自己に対応するレジスタファイル301〜303のうち計算回数から1を減算した数にストライド数を乗算した数番目のレジスタファイル301〜303の値を取得し、乗算結果を加算して、値の取得元に格納する。ただし、格納するレジスタファイル301〜303を表す番号が配置されたレジスタファイル301〜303の数を超えた場合、すなわち、ボトム差分データ205の列数を超えた場合、積和演算部501〜503は、超えた分の数番目のレジスタファイル301〜303に対して値の読み込み及び格納を行う。
例えば、積和演算部501は、1番目のレジスタファイル301に対応する。そこで、ストライド数1であれば、積和演算部501は、1回目の計算では、レジスタファイル301の値を取得して乗算結果を加算した値を格納し直す。2回目の計算では、積和演算部501は、レジスタファイル302の値を取得し乗算結果を加算した値を格納し直す。また、ストライド数が2であれば、1回目の計算は同じであるが、2回目の計算では、積和演算部501は、3番目のレジスタファイル301〜302の値を取得し乗算結果を加算した値を格納し直す。
積和演算部501〜503は、レジスタファイル420に格納されたトップ差分データ203の1行分の要素データ全てについて重み差分積和演算を行うまで同様の処理を繰り返し行分演算を行う。
この行分演算を重みデータ202の行数分行った場合、演算部50は、演算結果をメモリ11が有するボトム差分データ205に格納する。その後、全てのボトム差分データ205の算出が終わっていなければ、演算部50は、新たなボトム差分データ205の要素データの算出として、同様の処理を繰り返す。
さらに、図1の最終層の第n層である演算処理層103の場合、演算部50は、出力データをモニタなどの出力装置(不図示)へ出力しユーザに演算結果を提供する。例えば、画像認識の場合、演算部50は、認識結果を出力装置へ出力する。
ポインタ制御部16、畳み込みバックワードの重み差分演算の場合、最初にレジスタファイル410における先頭ポインタを、レジスタファイル410に格納されたボトムデータ201の先頭に設定する。また、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420に格納されたトップ差分データの先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル410における先頭ポインタをトップ差分データ203の行においてストライド数分移動した位置に設定する。また、ポインタ制御部16は、レジスタファイル420におけるポインタを1つ移動した位置に設定する。そして、レジスタファイル410における先頭ポインタの移動をボトムデータ201の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル410の先頭に戻す。すなわち、レジスタファイル410における先頭ポインタは、ボトムデータ201の次の行の先頭に設定される。また、ポインタ制御部16は、レジスタファイル420におけるポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420におけるポインタは、トップ差分データ203の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードの重み差分演算が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420に格納された重みデータ202の行の先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル420における先頭ポインタを重みデータ202の行上でストライド数分移動した位置に設定する。そして、レジスタファイル420における先頭ポインタの移動を重みデータ202の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420における先頭ポインタは、重みデータ202の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードのボトム差分演算が終了するまで、同様の処理を繰り返す。
さらに、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算について詳細に説明する。
まず、図5を参照して、畳み込みバックワードの重み差分演算を実行する場合について説明する。図5は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図5では、演算処理装置1は、12行12列に要素データが並んだボトムデータ201及び8行8列に要素データが並んだトップ差分データ203を用いる。ボトムデータ201は、要素データb00〜b143を有する。また、トップ差分データ203は、ボトムデータ201及び5行5列の重みデータ202を用いて、ストライド数が1の場合に求められたものとし、要素データt00〜t63を有する。さらに、重み差分データ204は、5行5列となり、その各要素データをw00〜w24と表す。
さらに、本実施例では、重み差分データ204の行数の演算部50が用いられる。これにより、演算部50は、行方向への移動を行うことで、全てのボトムデータ201に対する畳み込みバックワード重み差分演算を行うことができる。例えば、図5では、5個の演算部51〜53が用いられる。また、本実施例では、各演算部50は、5つの積和演算部511〜514を有する。積和演算部511〜514は、図4における積和演算部501〜503にあたる。さらに、レジスタファイル431〜433は、それぞれ内部に5つのレジスタファイル310〜314を有する。レジスタファイル310〜314は、図4におけるレジスタファイル301〜303にあたる。
第1データ制御部12は、畳み込みバックワードの重み差分演算で用いるボトムデータ201及びトップ差分データ203のサイズを予め記憶する。例えば、第1データ制御部12は、表示装置及び入力装置を用いて設定された設定値により、ボトムデータ201及びトップ差分データ203のサイズ(あるいはカーネル数)を取得して記憶する。
第1データ制御部12は、ボトムデータ201における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データb00〜b11のデータを読み込む。そして、第1データ制御部12は、要素データb00〜b11をボトムデータ格納用のレジスタファイル411に格納する。
また、第1データ制御部12は、ボトムデータ201における次の1行の要素データをメモリ11から読み込む。そして、第1データ制御部12は、ボトムデータ格納用のレジスタファイル412に読み込んだ要素データを格納する。例えば、第1データ制御部12は、要素データb12〜b23をボトムデータ格納用のレジスタファイル412に格納する。
このように、第1データ制御部12は、重み差分データ204の行数、1行毎の要素データのメモリ11から読み込み及び異なるボトムデータ格納用のレジスタファイル411〜413(以降、これを単にレジスタファイル411,412,413とする。)への格納を繰り返す。例えば、第1データ制御部12は、要素データb48〜b59をレジスタファイル413に格納する。
また、第2データ制御部13は、トップ差分データ203における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第2データ制御部13は、トップ差分データ203の要素データt00〜t07をメモリ11から読み込む。そして、第2データ制御部13は、レジスタファイル421〜423に要素データt00〜t07を格納する。
ここで、演算部51を例に演算部50による計算を説明する。積和演算部510〜514は、レジスタファイル411に格納されたボトムデータ201の1行のうちの先頭ポインタが示す要素データから順にそれぞれ異なる5つの要素データb00〜b04を読み込む。ここで、読み込む要素データの数は、重み差分データ204の数である。さらに、積和演算部510〜514は、レジスタファイル421に格納されたトップ差分データ203の1行のうちの先頭ポインタが示す要素データt00を読み込む。そして、積和演算部510〜514は、ボトムデータ201の要素データとトップ差分データ203の要素データ203とを乗算する。さらに、積和演算部510〜514は、レジスタファイル430の中の対応するレジスタファイル310〜314に格納された値にそれぞれ乗算結果を加算する。
次に、レジスタファイル411における先頭ポインタが1つ移動される。また、レジスタファイル412における先頭ポインタが1つ移動される。そして、積和演算部510〜514は、それぞれレジスタファイル411に格納されたボトムデータ201の1行のうちの移動された先頭ポインタが示す要素データから5つの要素データb01〜b05を読み込む。さらに、積和演算部510〜514は、レジスタファイル421に格納されたトップ差分データ203の1行のうちの更新された先頭ポインタが示す要素データt01を読み込む。そして、積和演算部510〜514は、ボトムデータ201の要素データとトップ差分データの要素データとを乗算する。さらに、積和演算部510〜514は、レジスタファイル431の中の対応するレジスタファイル310〜314に格納された値にそれぞれ乗算結果を加算する。
このように、積和演算部510〜514は、計算毎にレジスタファイル411において1つずつ移動される先頭ポインタの位置から5つの要素データをそれぞれ読み込むことを繰り返す。さらに、積和演算部510〜514は、計算毎にレジスタファイル412において1つずつ移動される先頭ポインタが示す要素データを読み込むことを繰り返す。そして、積和演算部510〜514は、読み込んだ要素データを乗算し、乗算結果を対応するレジスタファイル310〜314に加算していくことを繰り返す。
これにより、積和演算部510は、b00×t00+b01×t01+・・・b07×t07を算出する。同様に、積和演算部511は、b01×t00+b02×t01+・・・b08×t07を算出する。積和演算部512は、b02×t00+b03×t01+・・・b09×t07を算出する。同様に、積和演算部513は、b03×t00+b04×t01+・・・b10×t07を算出する。そして、積和演算部514は、b04×t00+b05×t01+・・・b011×t07を算出する。レジスタファイル310〜314には、重み差分データ204の要素データw00〜w05の計算途中の中間値が格納される。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果であるw06〜09,・・・,w20〜w24の中間値をそれぞれ演算結果格納用のレジスタファイル432〜433に格納する。
次に、第1データ制御部12により、レジスタファイル411には、ストライド数分先の行の要素データb12〜b23が格納され、レジスタファイル412には、ストライド数分先の行の要素データb24〜b35が格納され、レジスタファイル413には、要素データb36〜b47が格納される。また、第2データ制御部13により、レジスタファイル421〜423には、要素データt08〜t15が格納される。
演算部51は、1回目と同様に、レジスタファイル411に格納された要素データb12〜b23とレジスタファイル421に格納された要素データt08〜t15とを用いて畳み込みバックワードの重み差分演算を行う。積和演算部510〜514は、対応するレジスタファイル310〜314に格納された値に算出結果を足し込んでいくことで、重み差分データ204の要素データw00〜w05の中間値を更新する。演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果を足し込んでいくことで、演算結果としてレジスタファイル432〜433に格納された重み差分データ204の要素データw06〜09,・・・,w20〜w24の中間値を更新する。
このように、第1データ制御部12は、ボトムデータ201の先頭の行から順にストライド数ずつ先の行の要素データをレジスタファイル410に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル420に格納する。同様に、第1データ制御部12及び第2データ制御部13は、1行ずつずらした行を先頭にしてレジスタファイル411〜413及び421〜423に各要素データを格納する。そして、演算部51〜53は、レジスタファイル411〜413及び421〜423に格納された要素データを用いて重み差分演算を実行する。これにより、レジスタファイル431〜433それぞれのレジスタファイル311〜313に重み差分データ204の要素データw00〜w24が格納される。各演算部51〜54は、算出したレジスタファイル431〜433それぞれのレジスタファイル311〜313の値を、メモリ11に重み差分データ204の要素データw00〜w24として格納する。
ここで、図6を参照して、図5における畳み込みバックワードの重み差分演算時のレジスタファイル411からの要素データの読み出しについて詳細に説明する。図6は、畳み込みバックワードの重み差分演算時の要素データの読み出しを説明するための図である。状態461〜468はそれぞれ、演算部51による、ボトムデータ201の最初の1列を読み込んだ際の1〜8回目の計算時の状態を表す。ここでは、一例として、レジスタファイル411が、配列450〜454という5列の配列を有する。
積和演算部510〜514がレジスタファイル411から所望の要素データを読み出すためには、実際には、図6に示すクロスバスイッチ470が配置される。そして、図6における状態461〜468は、要素データb00〜b11がレジスタファイル411に格納された場合の1〜8回目の計算時のそれぞれの状態を表す。
各状態461〜468では、ポインタ制御部16は、太枠で囲んだ要素データの先頭に先頭ポインタを配置する。そして、各状態461〜468において太枠で囲んだ要素データがその計算において読み出される要素データとなる。
状態461で示される1回目の計算では、ポインタ制御部16は、要素データb00に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb00を配列450から取得する。積和演算部511は、先頭ポインタから2番目の要素データb01を配列451から取得する。積和演算部512は、先頭ポインタから3番目の要素データb02を配列452から取得する。積和演算部513は、先頭ポインタから4番目の要素データb03を配列453から取得する。積和演算部514は、先頭ポインタから5番目の要素データb04を配列454から取得する。
状態462で示される2回目の計算では、ポインタ制御部16は、先頭ポインタを1つ進め要素データb01に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb01を配列451から取得する。積和演算部511は、先頭ポインタから2番目の要素データb02を配列452から取得する。積和演算部512は、先頭ポインタから3番目の要素データb03を配列453から取得する。積和演算部513は、先頭ポインタから4番目の要素データb04を配列454から取得する。積和演算部514は、先頭ポインタから5番目の要素データb05を配列450から取得する。
状態463で示される3回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb02に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb02を配列452から取得する。積和演算部511は、先頭ポインタから2番目の要素データb03を配列453から取得する。積和演算部512は、先頭ポインタから3番目の要素データb04を配列454から取得する。積和演算部513は、先頭ポインタから4番目の要素データb05を配列450から取得する。積和演算部514は、先頭ポインタから5番目の要素データb06を配列451から取得する。
状態464で示される4回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb03に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb03を配列453から取得する。積和演算部511は、先頭ポインタから2番目の要素データb04を配列454から取得する。積和演算部512は、先頭ポインタから3番目の要素データb05を配列450から取得する。積和演算部513は、先頭ポインタから4番目の要素データb06を配列451から取得する。積和演算部514は、先頭ポインタから5番目の要素データb07を配列452から取得する。
状態465で示される5回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb04に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb04を配列454から取得する。積和演算部511は、先頭ポインタから2番目の要素データb05を配列450から取得する。積和演算部512は、先頭ポインタから3番目の要素データb06を配列451から取得する。積和演算部513は、先頭ポインタから4番目の要素データb07を配列452から取得する。積和演算部514は、先頭ポインタから5番目の要素データb08を配列453から取得する。
状態466で示される6回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb05に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb05を配列450から取得する。積和演算部511は、先頭ポインタから2番目の要素データb06を配列451から取得する。積和演算部512は、先頭ポインタから3番目の要素データb07を配列452から取得する。積和演算部513は、先頭ポインタから4番目の要素データb08を配列453から取得する。積和演算部514は、先頭ポインタから5番目の要素データb09を配列454から取得する。
状態467で示される7回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb06に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb06を配列451から取得する。積和演算部511は、先頭ポインタから2番目の要素データb07を配列452から取得する。積和演算部512は、先頭ポインタから3番目の要素データb08を配列453から取得する。積和演算部513は、先頭ポインタから4番目の要素データb09を配列454から取得する。積和演算部514は、先頭ポインタから5番目の要素データb10を配列450から取得する。
状態468で示される8回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb07に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb07を配列452から取得する。積和演算部511は、先頭ポインタから2番目の要素データb08を配列453から取得する。積和演算部512は、先頭ポインタから3番目の要素データb09を配列454から取得する。積和演算部513は、先頭ポインタから4番目の要素データb10を配列450から取得する。積和演算部514は、先頭ポインタから5番目の要素データb11を配列451から取得する。
このように、5つの配列450〜454を用いることで、積和演算部510〜514は、異なる配列450〜454から要素データを読み出すため、コンフリクトを起さず要素データを読み出すことができる。そして、積和演算部510〜514は、状態461〜468で読み込んだ要素データを用いて積和演算を行うことで、1行分の積和演算を実行する。
ここで、図7A、7B、8A及び8Bを参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図7A及び7Bは、畳み込みバックワードの重み差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図8A及び8Bは、畳み込みバックワードの重み差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、演算部51〜53が5つ存在し、それぞれが5つの積和演算部510〜514を有する場合で説明する。演算部53は、5番目の演算部とする。また、レジスタファイル411〜413は、演算部51〜53に対応して5つ存在する場合で説明する。レジスタファイル413は、5番目のレジスタファイルとする。この場合も、12行12列のボトムデータ201及び5行5列の重みデータ202を用いて畳み込みフォワード演算を行い算出したトップ差分データ203を使用する。
ストライド数が1の場合、最初に、図7Aの状態471に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb48〜b59が格納される。さらに、レジスタファイル421〜423には、要素データt00〜t07が格納される。
演算部51の積和演算部510は、計算毎に要素データb00〜b07をレジスタファイル411から順次読み込む。また、演算部51の積和演算部511は、計算毎に要素データb01〜b08をレジスタファイル411から順次読み込む。また、演算部51の積和演算部514は、計算毎に要素データb04〜b11をレジスタファイル411から順次読み込む。演算部52〜53のそれぞれの各積和演算部510〜514も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部510〜514は、それぞれ対応するレジスタファイル421〜423から要素データt00〜t07を計算毎に順次読み込む。そして、演算部51〜53の各積和演算部510〜514は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
次に、状態471の演算が終了すると、状態472に示すように、レジスタファイル411〜413には、状態471で格納されていた要素データの次の1行分の要素データが格納される。また、状態472に示すように、レジスタファイル421〜423には、状態471で格納されていた要素データの次の1行分の要素データが格納される。そして、演算部51〜53の各積和演算部510〜514は、状態471と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態471の計算結果に加算していく。
このように、演算が終了する毎に、前の状態で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部510〜514は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
トップ差分データ203は、8行8列であり、トップ差分データ203の1行を用いた演算を8行分行うことで1つの重み差分データ204を算出することができる。そこで、8回の演算をおこなうことで、演算部51〜53は、重み差分データ204の全ての要素を算出できる。そこで、状態474は、8回目の計算時の状態を表す。
ここで、算出される重み差分データ204の各要素データを、ボトムデータ201やトップ差分データ203と同様に、1行1列目から順にw00〜w24とする。演算部51の積和演算部510は、状態471〜474までの8回の演算結果を順次加算していくことで、初期位置にトップ差分データ203を配置した状態の重み差分データ204の要素データw00を算出する。また、演算部51の積和演算部511は、初期位置からトップ差分データ203を1列ずらした位置に配置した状態の重み差分データ204の要素データw01を算出する。また、演算部51の積和演算部512は、トップ差分データ203を初期位置から2列ずらした位置に配置した状態の重み差分データ204の要素データw02を算出する。また、演算部51の積和演算部513は、トップ差分データ203を初期位置から3列ずらした位置に配置した状態の重み差分データ204の要素データw03を算出する。また、演算部51の積和演算部514は、トップ差分データ203を初期位置から4列ずらした位置に配置した状態の重み差分データ204の要素データw04を算出する。トップ差分データ203を初期位置から4列ずらした位置は、言い換えれば、トップ差分データ203の8列目とボトムデータ201の12列目とが一致する位置である。以上のことから、演算部51は、初期位置からトップ差分データ203を行方向に移動させることで算出される重み差分データ204の要素データw00〜w04を算出する。
同様に、演算部52は、初期位置から1列下げた位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw05〜w09を算出する。そして、演算部53は、初期位置から4列下げた位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw20〜w24を算出する。初期位置から4列下げた位置は、言い換えれば、トップ差分データ203の8行目とボトムデータ201の12行目とが一致する位置である。
このように、図7A及び7Bに記載した状態471〜474における演算が終了した時点で、演算部51〜53は、重み差分データ204の全ての要素データw00〜w24を算出し終え、畳み込みバックワードの重み差分演算が完了する。
また、ストライド数が2の場合、ボトムデータ201が12行12列であり、重みデータ202が5行5列でカーネルが5であるとすると、トップ差分データ203は、4行4列となる。
この場合、最初に、図8Aの状態481に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb48〜b59が格納される。さらに、レジスタファイル421〜423には、要素データt00〜t03が格納される。
演算部51の積和演算部510は、スライド数が2であるので、計算毎に先頭ポインタが示す要素データb00から1つ飛びでb02、b04及びb06をレジスタファイル411から順次読み込む。また、演算部51の積和演算部511は、計算毎に先頭ポインタの次の要素データb01から1つ飛びでb03、b05、b07をレジスタファイル411から順次読み込む。また、演算部51の積和演算部514は、計算毎に先頭ポインタから4つ先の要素データb04、b06、b08、b10をレジスタファイル411から順次読み込む。演算部52〜53のそれぞれの各積和演算部510〜514も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部510〜514は、それぞれ対応するレジスタファイル421〜423から1行分の要素データt00〜t03を計算毎に順次読み込む。そして、演算部51〜53の各積和演算部510〜514は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
次に、状態481の演算が終了すると、状態482に示すように、レジスタファイル411〜413には、状態481で格納した行の2ストライド先の1行分の要素データが格納される。また、状態482に示すように、レジスタファイル421〜423には、状態481で格納されていた行の2ストライド先の1行分の要素データが格納される。そして、演算部51〜53の各積和演算部510〜514は、状態481と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態481の計算結果に加算していく。
このように、演算が終了する毎に、前の状態で格納されていた行の2ストライド先の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部501〜503は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
トップ差分データ203は、8行8列であり、ストライド数が2の場合、トップ差分データ203の1行を用いた演算を4行分行うことで1つの重み差分データ204を算出することができる。そこで、4回の演算をおこなうことで、演算部51〜53は、重み差分データ204の全ての要素を算出できる。
ここで、算出される重み差分データ204の各要素データを、ボトムデータ201やトップ差分データ203と同様に、1行1列目から順にw00〜w24とする。演算部51の積和演算部510は、状態481〜484までの4回の演算結果を順次加算していくことで、初期位置にトップ差分データ203を配置した状態の重み差分データ204の要素データw00を算出する。また、演算部51の積和演算部511は、初期位置からトップ差分データ203を1つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw01を算出する。また、演算部51の積和演算部512は、トップ差分データ203を初期位置から2つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw02を算出する。また、演算部51の積和演算部513は、トップ差分データ203を初期位置から3つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw03を算出する。また、演算部51の積和演算部514は、トップ差分データ203を初期位置から4つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw04を算出する。以上のことから、演算部51は、初期位置からトップ差分データ203を行方向に移動させることで算出される重み差分データ204の要素データw00〜w04を算出する。
同様に、演算部52は、初期位置から1つ分のストライド数ずらした位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw05〜w09を算出する。そして、演算部53は、初期位置から4つ分のストライド数ずらした位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw20〜w24を算出する。ここで、トップ差分データ203が4行4列で、ストライド数が2の場合、12行12列のボトムデータ201の12行目及び12列目は計算に使用されない。
このように、図8A及び8Bに記載した状態481〜484における演算が終了した時点で、演算部51〜53は、重み差分データ204の全ての要素データw00〜w24を算出し終え、畳み込みバックワードの重み差分演算が完了する。
次に、図9及び10を参照して、演算部51における畳み込みバックワードの重み差分積和演算の詳細についてさらに説明する。図9は、畳み込みバックワードの重み差分演算の1回目の計算における演算部を表す図である。図10は、畳み込みバックワードの重み差分演算の2回目の計算における演算部を表す図である。
まず、畳み込みバックワードの重み差分積和演算を開始する場合、レジスタファイル411に要素データb00〜b11が格納される。また、レジスタファイル421にトップ差分データ203の要素データt00〜t07が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データb00にレジスタファイル411における先頭ポインタ163を設定する。その後、積和演算部510〜514の1回の計算が終了する毎に先頭ポインタ163を1つずつ移動させる。
演算部51の積和演算部510は、レジスタファイル411の先頭ポインタ163の位置の要素データを順次取得することで、点線631で囲われた部分の要素データb00〜b07を計算毎に順次取得する。また、演算部51の積和演算部510は、レジスタファイル421の先頭から要素データt00〜t07を計算毎に順次取得する。そして、演算部51の積和演算部510は、取得した要素データb00〜b07と要素データt00〜t07とをそれぞれ乗算する。次に、演算部51の積和演算部510は、レジスタファイル310に格納された重み差分データ204の要素データw00の値を取得する。ここで、要素データw00の初期値は0である。そして、演算部51の積和演算部510は、各乗算結果とレジスタファイル310に格納された要素データw00の値を合計し、計算結果をレジスタファイル310に格納する。
演算部51の積和演算部514は、レジスタファイル411の先頭ポインタ163から4つ先の要素データを順次取得することで、点線632で囲われた部分の要素データb04〜b11を計算毎に順次取得する。また、演算部51の積和演算部514は、レジスタファイル421の先頭から要素データt00〜t07を計算毎に順次取得する。そして、演算部51の積和演算部514は、取得した要素データb04〜b11と要素データt00〜t07とをそれぞれ乗算する。次に、演算部51の積和演算部514は、レジスタファイル314に格納された重み差分データ204の要素データw04の値を取得する。ここで、要素データw04の初期値は0である。そして、演算部51の積和演算部514は、各乗算結果とレジスタファイル314に格納された要素データw04の値を合計し、計算結果をレジスタファイル314に格納する。
次に、ポインタ制御部16は、先頭ポインタ163を1つ下の行の先頭に移動させ図10の状態とする。そして、ポインタ制御部16は、レジスタファイル411に格納された要素データb12にレジスタファイル411における先頭ポインタ163を設定する。その後、積和演算部510〜514の1回の計算が終了する毎にポインタを1つずつ移動させる。
演算部51の積和演算部510は、レジスタファイル411の先頭ポインタ163の位置の要素データを順次取得することで、点線633で囲われた部分の要素データb12〜b19を計算毎に順次取得する。また、演算部51の積和演算部510は、レジスタファイル421の先頭から要素データt08〜t15を計算毎に順次取得する。そして、演算部51の積和演算部510は、取得した要素データb12〜b19と要素データt08〜t15とをそれぞれ乗算する。次に、演算部51の積和演算部510は、レジスタファイル310に格納された重み差分データ204の要素データw00の値を取得する。ここで、2回目の計算の前に、要素データw00には、1回目の計算結果が格納されている。そして、演算部51の積和演算部510は、各乗算結果とレジスタファイル310に格納された要素データw00の値を合計し、計算結果をレジスタファイル310に格納する。
演算部51の積和演算部514は、レジスタファイル411の先頭ポインタ163から4つ先の要素データを順次取得することで、点線634で囲われた部分の要素データb16〜b23を計算毎に順次取得する。また、演算部51の積和演算部514は、レジスタファイル421の先頭から要素データt08〜t15を計算毎に順次取得する。そして、演算部51の積和演算部514は、取得した要素データb16〜b23と要素データt08〜t15とをそれぞれ乗算する。次に、演算部51の積和演算部514は、レジスタファイル314に格納された重み差分データ204の要素データw04の値を取得する。ここで、2回目の計算の前に、要素データw04には、1回目の計算結果が格納されている。そして、演算部51の積和演算部514は、各乗算結果とレジスタファイル314に格納された要素データw04の値を合計し、計算結果をレジスタファイル314に格納する。
その後、ポインタ制御部16は、先頭ポインタ163のストライド数分の移動を6回繰り返し畳み込みバックワードの重み差分積和演算における重み差分データ204の要素データw01〜w04の算出を終了する。
次に、図11を参照して、畳み込みバックワードのボトム差分演算を実行する場合について説明する。図11は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図11では、演算処理装置1は、8行8列に要素データが並んだトップ差分データ203及び5行5列に要素データが並んだ重みデータ202を用いる。重みデータ202は、要素データw00〜w24を有する。また、トップ差分データ203は、12行12列のボトムデータ201及び重みデータ202を用いて、ストライド数が1の場合に求められたものであり、要素データt00〜t63を有する。
さらに、本実施例では、トップ差分データ203の行数の演算部51〜53が用いられる。これにより、演算部51〜53は、トップ差分データ格納用のレジスタファイル411〜413のデータの入れ替えを行わずに、全てのボトムデータ201に対する畳み込みバックワードのボトム差分演算を行うことができる。例えば、図11では、7個の演算部51〜53が用いられる。ここでは、演算部53が7番目の演算部とする。さらに、演算部51〜53は、図4における積和演算部501〜503としてそれぞれ8個の積和演算部520〜527を有する。また、レジスタファイル431〜433は、図4におけるレジスタファイル301〜303としてそれぞれ算出するボトム差分データ205の行数と同数の12個のレジスタファイル320〜331を有する。また、ここでは、積和演算部520〜527には、順番に0〜8の番号が振られており、さらに、レジスタファイル320〜331には、順番に0〜11の番号が振られているものとして説明する。
第1データ制御部12は、畳み込みバックワードの重み差分演算で用いるトップ差分データ203、重みデータ202及びボトムデータ201のサイズを予め記憶する。例えば、第1データ制御部12は、予め表示装置及び入力装置を用いて設定された設定値の入力により、トップ差分データ203、重みデータ202及びボトムデータ201のサイズ及び重みデータ202のサイズ(あるいはカーネル数)を取得して記憶する。
第1データ制御部12は、トップ差分データ203における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt00〜t07のデータを読み込む。そして、第1データ制御部12は、要素データt00〜t07をレジスタファイル411に格納する。
また、第1データ制御部12は、トップ差分データ203における次の1行の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt08〜t15のデータを読み込む。そして、第1データ制御部12は、要素データt08〜t15をレジスタファイル412に格納する。
第1データ制御部12は、トップ差分データ203の行数、1行毎の要素データのメモリ11から読み込み及び異なるレジスタファイル411〜413への格納を繰り返す。例えば、第1データ制御部12は、要素データt56〜t63をレジスタファイル413に格納する。
また、第2データ制御部13は、重みデータ202における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第2データ制御部13は、要素データw00〜w04をメモリ11から読み込む。そして、第2データ制御部13は、レジスタファイル421〜423に要素データw00〜w04を格納する。
演算部51は、レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw00〜w04とを用いてボトム差分積和演算を行い、ボトム差分データ205の要素データb00〜b11の仮の値を算出する。そして、演算部51は、演算結果用のレジスタファイル431にボトム差分データ205の要素データb01〜b11の値を格納する。
ここで、演算部51の積和演算部520〜527による積和演算の詳細について説明する。
積和演算部520〜527は、レジスタファイル411に格納された要素データt00〜t07の先頭から順にそれぞれ要素データt00〜t07を取得する。また、積和演算部520〜527は、レジスタファイル421の先頭の要素データw00を取得する。そして、積和演算部520〜527は、取得した要素データt00〜t07と要素データw00とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号を有するレジスタファイル320〜327からそれぞれ要素データb00〜b07を取得する。ここで、レジスタファイル320〜331には、初期値として0が格納される。そして、積和演算部520〜527は、それぞれが有する要素データt00〜t07と要素データw00との乗算結果をそれぞれが取得した要素データb00〜b07に加算し、加算結果を要素データb00〜b07の取得元のレジスタファイル320〜327に格納する。
次に、積和演算部520〜527は、それぞれが取得した要素データt00〜t07を保持する。また、積和演算部520〜527は、レジスタファイル421の先頭の次の要素データw01を取得する。そして、積和演算部520〜527は、保持する要素データt00〜t07と要素データw01とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号の次の番号を有するレジスタファイル321〜328からそれぞれ要素データb01〜b08を取得する。そして、積和演算部520〜527は、それぞれが有する要素データt00〜t07と要素データw01との乗算結果をそれぞれが取得した要素データb01〜b08に加算し、加算結果を要素データb01〜b08の取得元のレジスタファイル321〜328に格納する。
このように、積和演算部520〜527は、k回目(k=1〜5)の計算の場合、レジスタファイル421の先頭からk個ずらした位置の要素データw(00+k−1)を取得する。そして、積和演算部520〜527は、保持する要素データt00〜t07と取得した要素データw(00+k)とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号のからk個ずつずらした番号を有するレジスタファイル(320+k−1)〜(327+k−1)からそれぞれ要素データb(00+k−1)〜b(07+k−1)を取得する。そして、積和演算部520〜527は、乗算結果をそれぞれが取得した要素データb(00+k−1)〜b(07+k−1)に加算し、加算結果を要素データb(00+k−1)〜b(07+k−1)の取得元のレジスタファイル(320+k−1)〜(327+k−1)に格納する。これにより、積和演算部520〜527は、ボトム差分データ205の要素データb01〜b11の算出を完了する。
演算部52〜53の積和演算部520〜527も、それぞれレジスタファイル412〜413及び432〜433に格納された要素データを用いて、演算部51と同様のボトム差分積和演算を行う。そして、演算部52〜53は、演算結果である要素データb12〜b23,b24〜b35,・・・,b84〜b95の仮の値をそれぞれレジスタファイル432〜433に格納する。
次に、レジスタファイル411〜413は、保持するデータを維持する。また、第2データ制御部13により、レジスタファイル421〜423には、要素データw05〜w09が格納される。
演算部51は、レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw05〜w09とを用いて、前回と同様にボトム差分積和演算を行う。演算部51は、レジスタファイル431のポインタが示す位置にボトム差分データ205の値を足しこんでいくことで、ボトム差分データ205の要素データb12〜b23の値をレジスタファイル431に格納する。そして、演算部51は、レジスタファイル431に格納されたボトム差分データ205の要素データb12〜b23の値をメモリ11に書き込む。
演算部51は、同様に、順次レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw10〜w24とを用いて、ボトム差分積和演算を行う。演算部51は、レジスタファイル431のポインタが示す位置にボトム差分データ205の値を足しこんでいくことで、ボトム差分データ205の要素データb24〜b35,b36〜47,b48〜b59の値を算出し、算出結果をメモリ11に書き込んでいく。ここで、演算部51は、メモリ11に書きこんだ演算結果は、レジスタファイル431から削除していく。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果をレジスタファイル432〜433の値に足しこんでいく。そして、レジスタファイル420に重みデータ202の最後の行の要素データw20〜w24が格納された状態で演算を行った時点で、演算部51〜53は、ボトム差分積和演算を終了し、各ボトム差分データ205の値を確定する。そして、演算部51〜53は、確定したボトム差分データ205の値をメモリ11に書き込む。
このように、第1データ制御部12は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル411〜413に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に演算毎に1行ずつずらしながら要素データをレジスタファイル421〜423に格納する。そして、演算部51〜53は、カーネル数の演算を行うと演算を終了する。
ここで、図12を参照して、図11における畳み込みバックワードのボトム差分演算時のレジスタファイル413への要素データの読み出し及び格納について詳細に説明する。図12は、畳み込みバックワードのボトム差分演算時の要素データの読み出し及び格納を説明するための図である。状態701〜705はそれぞれ、演算部51による、ボトムデータ201の最初の1列を読み込んだ際の1〜5回目の計算時の状態を表す。ここでは、一例として、レジスタファイル431が、配列710〜717という7列の配列を有する。
積和演算部520〜527がレジスタファイル431に対する所望の要素データの読み出し及び書き込みを行うためには、実際には、図12に示すクロスバスイッチ70が配置される。そして、図12における状態701〜705は、要素データb00〜b11がレジスタファイル431に格納された場合の1〜5回目の計算時のそれぞれの状態を表す。
各状態701〜705では、ポインタ制御部16は、太枠で囲んだ要素データの先頭に先頭ポインタを配置163する。そして、各状態701〜705において太枠で囲んだ要素データがその計算において読み出される要素データとなる。畳み込みバックワードのボトム差分演算では、積和演算部520〜527は、ボトム差分データ205の要素データb00〜b11をレジスタファイル431から読み出す。そして、積和演算部520〜527は、重みデータ202とトップ差分データ203との乗算結果を読み出した要素データb00〜b11に加算してレジスタファイル431の読み出し元の位置に再度格納する。以下に、各状態701〜705の詳細を説明する。
状態701で示される1回目の計算では、ポインタ制御部16は、要素データb00に先頭ポインタを配置する。積和演算部520は、先頭ポインタが示す要素データb00を配列710から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb00を格納する。積和演算部521は、先頭ポインタから2番目の要素データb01を配列711から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb01を格納する。積和演算部522は、先頭ポインタから3番目の要素データb02を配列712から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb02を格納する。積和演算部523は、先頭ポインタから4番目の要素データb03を配列713から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb03を格納する。積和演算部524は、先頭ポインタから5番目の要素データb04を配列714から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb04を格納する。積和演算部525は、先頭ポインタから6番目の要素データb05を配列715から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb05を格納する。積和演算部526は、先頭ポインタから7番目の要素データb06を配列716から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb06を格納する。積和演算部527は、先頭ポインタから6番目の要素データb07を配列717から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb07を格納する。
状態702〜705では、ポインタ制御部16は、先頭ポインタを1つずつ進めていく。積和演算部520は、破線矢印で示すように先頭ポインタが示す位置のデータに対して読み出し及び格納を行う。積和演算部521は、破線矢印で示すように先頭ポインタから2番目のデータに対して読み出し及び格納を行う。積和演算部522は、破線矢印で示すように先頭ポインタから3番目のデータに対して読み出し及び格納を行う。積和演算部523は、破線矢印で示すように先頭ポインタから4番目のデータに対して読み出し及び格納を行う。積和演算部524は、破線矢印で示すように先頭ポインタから5番目のデータに対して読み出し及び格納を行う。積和演算部525は、破線矢印で示すように先頭ポインタから6番目のデータに対して読み出し及び格納を行う。積和演算部526は、破線矢印で示すように先頭ポインタから7番目のデータに対して読み出し及び格納を行う。積和演算部527は、破線矢印で示すように先頭ポインタから8番目のデータに対して読み出し及び格納を行う。
このように、7つの配列710〜717を用いることで、積和演算部520〜527は、異なる配列710〜717から要素データを読み出すため、データの読み出し及び書き込み時にコンフリクトの発生を回避する。
次に、図13A〜13C、14A及び14Bを参照して、レジスタファイル411〜413、421〜423及び431〜433に格納される要素データの遷移について説明する。図13A〜13Cは、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図14A及び14Bは、畳み込みバックワードのボトム差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、トップ差分データ203が8行8列で、カーネルサイズが5の場合を例に説明する。
ストライド数が1の場合、積和演算部520〜527は、トップサイズである8とストライド数である1とを乗算した8個が演算に用いられる。そして、最初に、図13Aの状態721に示すように、レジスタファイル411には、要素データt00〜t07が格納される。また、レジスタファイル412には、要素データt08〜t15が格納される。また、レジスタファイル413には、要素データt56〜t63が格納される。また、レジスタファイル421〜423には、要素データw00〜w04が格納される。
演算部51の積和演算部520〜527は、先頭から順に要素データt00〜t07をレジスタファイル411からそれぞれ読み込む。演算部52〜53のそれぞれの各積和演算部520〜527も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部520〜527は、それぞれ対応するレジスタファイル421〜423から要素データw00〜w04を先頭から順に計算毎に読み込む。そして、演算部51〜53の各積和演算部520〜526は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜527は、乗算結果を番号が1つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。これは、各積和演算部520〜527が、自己と同じ番号から終了した計算回数だけ多い番号を有するレジスタファイル320〜331が保持する値に乗算結果を足し込む処理である。これにより、演算部51は、ボトム差分データ205の要素データb00〜b11を算出し、演算部52〜53は、ボトム差分データ205の要素データb12〜b23,・・・,b84〜b95の仮の値を算出する。
次に、状態721の演算が終了すると、次の計算状態である状態722に移行する。この場合、レジスタファイル411〜413は、状態721と同様の状態である。また、レジスタファイル421〜423には、状態721で格納されていた要素データの次の1行分の要素データw05〜w09が格納される。そして、演算部51〜53の各積和演算部520〜527は、状態721と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜526は、乗算結果を番号が1つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。これにより、演算部51〜53は、ボトム差分データ205の要素データb12〜b23,b24〜b35,・・・,b96〜b107の仮の値を算出する。そして、演算部51〜53は、計算結果を隣の演算部52〜53が状態721の計算で算出したボトム差分データ205の要素データb12〜b23,b24〜b35,・・・,b84〜b95の仮の値に加算する。ただし、演算部53は、隣の演算部が無いので加算する計算結果として0を用いる。
このように、演算が終了する毎に、図13A〜13Cに記載した前の状態721〜724で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部521〜527は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ205の仮の値を算出する。そして、演算部51〜53は、算出した仮の値を隣の演算部52〜53が1つ前の状態721〜724で算出したボトム差分データ205の仮の値に加算しレジスタファイル431〜433に格納する。
このような演算を、演算部51〜53は、カーネル数だけ繰り返す。そして、演算部51は、状態721〜725において、ボトム差分データ205の要素データb00〜b11,b12〜b23,・・・,b48〜b59を算出する。また、演算部52〜53は、状態725におけるボトム差分データ205の要素データb60〜b71,・・・,b132〜b143をそれぞれの値として確定する。
このように、演算部51〜53は、状態721〜724における演算が終了した時点で、ボトム差分データ205の全ての要素データb00〜b143を算出し終え、畳み込みバックワードの重み差分演算が完了する。
ストライド数が2の場合、積和演算部520〜535は、トップサイズである8とストライド数である2とを乗算した16個が演算に用いられる。最初に、図14Aの状態731に示すように、レジスタファイル411には、要素データt00〜t07が格納される。また、レジスタファイル412には、要素データt08〜t15が格納される。また、レジスタファイル413には、要素データt56〜t63が格納される。また、レジスタファイル421〜423には、ストライド数の行数分の要素データw00〜w09が格納される。
演算部51の積和演算部520,522,・・・,534は、レジスタファイル411の先頭から順番に異なる要素データt00〜t07をそれぞれ読み込む。また、演算部51の積和演算部521,523,・・・,535も同様に、レジスタファイル411の先頭から順番に異なる要素データt00〜t07をそれぞれ読み込む。次に、演算部51の積和演算部520,522,・・・,534は、計算毎に要素データw00、w02及びw04をレジスタファイル421から順次読み込む。また、演算部51の積和演算部521,523,・・・,535は、計算毎に要素データw01及びw03をレジスタファイル421から順次読み込む。そして、演算部51の積和演算部520〜535は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜535は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。これは、各積和演算部520〜534が、終了した計算回数に2を乗算した数だけ自己と同じ番号より多い番号を有するレジスタファイル320〜335が保持する値に乗算結果を足し込む処理である。
次に、演算部51の積和演算部520〜535は、トップ差分データ203の値を保持する。また、演算部51の積和演算部520,522,・・・,534は、計算毎に次の行の要素データw05、w07及びw09をレジスタファイル421から順次読み込む。また、演算部51の積和演算部521,523,・・・,535は、計算毎に次の行の要素データw06及びw08をレジスタファイル421から順次読み込む。そして、演算部51の積和演算部520〜534は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜534は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。
次に、状態731の演算が終了すると、次の計算状態である状態732に移行する。この場合、レジスタファイル411〜413は、状態731と同様の状態である。また、レジスタファイル421〜423には、状態731で格納されていた要素データの次の2行分の要素データw10〜w19が格納される。そして、演算部51〜53の各積和演算部520〜535は、状態731と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜535は、乗算結果を番号が2つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。
次に、状態732の演算が終了すると、次の計算状態である図14Bの状態733に移行する。この場合、レジスタファイル411〜413は、状態732と同様の状態である。また、レジスタファイル421〜423には、状態732で格納されていた要素データの次の2行分の要素データw20〜w29が格納される。そして、演算部51〜53の各積和演算部520〜534は、状態731と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜534は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。
このように、演算が終了する毎に、前の状態731〜732で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413に格納される。また、演算が終了する毎に、前の状態721〜724で格納されていた要素データの次のストライド数の行分の要素データが421〜423に格納される。そして、演算部51〜53の各積和演算部521〜535は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ205の仮の値を算出する。そして、演算部51〜53は、算出した仮の値を番号が2つ大きい演算部52〜53が1つ前の状態731〜732で算出したボトム差分データ205の仮の値に加算しレジスタファイル431〜433に格納する。
このような演算を、演算部51〜53は、カーネル数だけ繰り返してボトム差分データ205を算出することで、畳み込みバックワードの重み差分演算を完了する。
ここで、図15及び16を参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図15は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の1行目の計算時の演算部を表す図である。また、図16は、ストライド数が1の場合の畳み込みバックワードの重み差分演算における2行目の計算における演算部を表す図である。この場合も、8行8列のトップ差分データ203、5行5列の重みデータ202及び12行12列のボトムデータ201を用いる。
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル411にトップ差分データ203の要素データt00〜t07が格納される。また、レジスタファイル421に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データt00にレジスタファイル411におけるポインタ166を設定する。その後、積和演算部520〜527による読み込み毎にポインタ166を1つずつ移動させる。また、ポインタ制御部16は、最初にレジスタファイル431におけるデータの読み出し及び格納の位置として要素データb00の位置に先頭ポインタ165を設定する。その後、ポインタ制御部16は、積和演算部520〜527の計算が終了する毎に先頭ポインタ165を1つずつ移動させる。
演算部51の積和演算部520は、計算毎にレジスタファイル421の先頭から1つずつ進めた位置の要素データw00〜w04を順次取得する。また、演算部51の積和演算部520は、レジスタファイル411のポインタ166が示す位置から要素データt00を取得する。そして、演算部51の積和演算部520は、取得した要素データw00〜w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部520は、レジスタファイル431の計算毎に1つ進む先頭ポインタ165が示す位置に格納されたボトム差分データ205の要素データb00〜b04の値を取得する。ここで、要素データb00〜b11の初期値は0である。そして、演算部51の積和演算部520は、各乗算結果とレジスタファイル431から取得した要素データb00〜b04の値を合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部527は、レジスタファイル411のポインタ166が示す要素データt07を取得する。また、演算部51の積和演算部527は、レジスタファイル421の先頭から要素データw00〜w04を計算毎に順次取得する。そして、演算部51の積和演算部527は、要素データt07と要素データw00〜w04とをそれぞれ乗算する。次に、演算部51の積和演算部527は、レジスタファイル431の計算毎に1つ進む先頭ポインタ165から8番目の位置に格納されたボトム差分データ205の要素データb07〜b11の値を取得する。ここで、要素データb07〜b11の初期値は0である。そして、演算部51の積和演算部527は、各乗算結果とレジスタファイル431から取得した要素データb07〜b11の値を合計し、計算結果を先頭ポインタ165から8番目の位置に格納する。これにより、積和演算部520〜527は、ボトム差分データ205の要素データb00〜b11を算出する。
次に、ポインタ制御部16は、先頭ポインタ165を1つ下の行の先頭に移動させる。そして、ポインタ制御部16は、レジスタファイル431に格納された要素データb12に先頭ポインタ165を設定する。その後、積和演算部520〜527の1回の計算が終了する毎にポインタを1つずつ移動させる。また、レジスタファイル411に格納されたトップ差分データ203の要素データt00〜t07が維持される。そして、ポインタ制御部16は、ポインタ166を要素データt00の位置に戻す。また、レジスタファイル421に重みデータ202の次の行の要素データw05〜w09が格納される。これにより、レジスタファイル411〜413は、図16に示す2行目の計算を実行する状態となる。
そして、演算部51の積和演算部520〜527は、先頭ポインタ165及びポインタ166を用いて1行目と同様の演算を行い、ボトム差分データ205の要素データb12〜b23を算出する。
演算部52〜53の積和演算部520〜527も、レジスタファイル412〜432及びレジスタファイル413〜433に格納されたデータ及び先頭ポインタ165及びポインタ166を用いて演算部51と同様の計算を行う。そして、演算部52〜53は、上述した計算と同様の計算を繰り返していくことでボトム差分データ205の要素データb00〜b143の算出を完了する。
さらに、図17を参照して、ストライド数が2の場合について説明する。図17は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算における1行目の計算における演算部を表す図である。この場合も、8行8列のトップ差分データ203、5行5列の重みデータ202及び12行12列のボトムデータ201を用いる。
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル411にトップ差分データ203の要素データt00〜t03が格納される。また、レジスタファイル421に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データt00にレジスタファイル411におけるポインタ166を設定する。その後、積和演算部520及び521、522及び523、524及び525、526及び527による読み込み毎にポインタ166を1つずつ移動させる。また、ポインタ制御部16は、最初にレジスタファイル431におけるデータの読み出し及び格納の位置として要素データb00の位置に先頭ポインタ165を設定する。その後、ポインタ制御部16は、積和演算部520〜527の計算が終了する毎に先頭ポインタ165をストライド数である2つずつ移動させる。
演算部51の積和演算部520は、計算毎にレジスタファイル421の先頭から2つずつ進めた位置の要素データw00,w02,w04を順次取得する。また、演算部51の積和演算部520は、レジスタファイル411のポインタ166が示す要素データt00を取得する。そして、演算部51の積和演算部520は、取得した要素データw00,w02,w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部520は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165が示す位置に格納されたボトム差分データ205の要素データb00,b02,b04の値を順次取得する。ここで、要素データb00〜b11の初期値は0である。そして、演算部51の積和演算部520は、各乗算結果とレジスタファイル431から取得した要素データb00,b02,b04の値とを合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部521は、レジスタファイル411のポインタ166が示す要素データt00を取得する。また、演算部51の積和演算部521は、レジスタファイル421の先頭次のデータから2つずつ進めた位置の要素データw01,w03を順次取得する。そして、演算部51の積和演算部521は、要素データt00と要素データw01及びw03とをそれぞれ乗算する。次に、演算部51の積和演算部521は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165の次の位置に格納されたボトム差分データ205の要素データb01,b03の値を順次取得する。そして、演算部51の積和演算部521は、各乗算結果とレジスタファイル431から取得した要素データb01,b03の値とを合計し、計算結果を先頭ポインタ165の次の位置に格納する。
次に、ポインタ制御部16は、レジスタファイル411におけるポインタ166を1つ進める。これにより、ポインタ166は、要素データt01を示す位置に移動される。
演算部51の積和演算部522は、計算毎にレジスタファイル421の先頭から2つずつ進めた位置の要素データw00,w02,w04を順次取得する。また、演算部51の積和演算部522は、レジスタファイル411のポインタ166が示す要素データt01を取得する。そして、演算部51の積和演算部522は、取得した要素データw00,w02,w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部522は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165が示す位置からストライド数である2つ分移動した位置に格納されたボトム差分データ205の要素データb02,b04,b06の値を順次取得する。そして、演算部51の積和演算部522は、各乗算結果とレジスタファイル431から取得した要素データb02,b04,b06の値とを合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部523は、レジスタファイル411のポインタ166が示す要素データt01を取得する。また、演算部51の積和演算部523は、レジスタファイル421の先頭次のデータから2つずつ進めた位置の要素データw01,w03を順次取得する。そして、演算部51の積和演算部521は、要素データt01と要素データw01,w03とをそれぞれ乗算する。次に、演算部51の積和演算部521は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165の隣の位置から2つ隣の位置に格納されたボトム差分データ205の要素データb03,b05の値を取得する。そして、演算部51の積和演算部521は、各乗算結果とレジスタファイル431から取得した要素データb03,b05との値を合計し、計算結果を先頭ポインタ165の隣の位置から2つ隣の位置に格納する。
演算部51の積和演算部524〜527も、ポインタ166及び先頭ポインタ165を用いて同様の演算を行い、ボトム差分データ205の要素データb07〜b11を算出する。
さらに、図18及び図19を参照して、本実施例に係る畳み込みバックワードのボトム差分演算の概念について説明する。図18は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。図19は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。
各積和演算部520〜527には、上部に記載されたデータが入力される。そして、各積和演算部520〜527は、それぞれの下に記載された乗算を行う。そして、各積和演算部520〜527は、乗算結果を矢印で結ばれた要素データb00〜b11に加算していく。
ストライド数が1の場合、例えば、積和演算部520は、t00×w00,t00×w01,t00×w02,t00×w03及びt00×w04を順次行う。そして、積和演算部520は、t00×w00を要素データb00に足し込む。また、積和演算部520は、t00×w01を要素データb01に足し込む。また、積和演算部520は、t00×w02を要素データb02に足し込む。また、積和演算部520は、t00×w03を要素データb03に足し込む。また、積和演算部520は、t00×w04を要素データb04に足し込む。
このように、演算を行うことで、破線枠740に示すように、乗算結果は、斜め方向に加算される。これにより、演算結果741に示すように、各要素データb00〜b05まで加算する乗算結果の数が増加し、その後、b11に向かって減少する。すなわち、要素データb00〜b05は、演算結果742に示すように、要素データt00〜t07に対して要素データw00〜w04を乗算した結果を1つずつずらしながら足し込んだ結果に一致する。
ストライド数が2の場合は、図19に示すように、積和演算部520,522,524及び526は、要素データt00〜t03をそれぞれが取得し、それに対して、要素データw0から1つ飛ばしの要素データw02,w04を順次乗算する。また、積和演算部521,523,525及び527は、要素データt00〜t03をそれぞれが取得し、それに対して、要素データw01から1つ飛ばしの要素データw01及びw03を順次乗算する。
すなわち、ストライド数が2の場合は、破線枠750に示すように、乗算結果は、1つ飛ばしの斜め方向に加算される。これにより、演算結果751に示すように、各要素データb00〜b05まで加算する乗算結果の数が1つおきに増加し、その後、b11に向かって1つおきに減少する。すなわち、要素データb00〜b05は、演算結果752に示すように、要素データt00〜t07に対して要素データw00〜04をスライド数ずつずらして乗算した結果を1つずつずらしながら足し込んだ結果に一致する。
次に、図20を参照して、畳み込みバックワードの重み差分演算処理の詳細な流れについて説明する。図20は、畳み込みバックワードの重み差分演算のフローチャートである。
例えば、図3及び図4で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS101)。
演算部50としてカーネルサイズ分の数の演算器が使用する演算器として割り当てられる。さらに、各演算部50は、カーネルサイズ分の積和演算部501〜503を割当てる。また、レジスタファイル430は、カーネルサイズ分のレジスタファイル301〜303を演算結果格納用のレジスタファイルとして割り当てる(ステップS102)。
ポインタ制御部16は、レジスタファイル410の先頭ポインタ163及びレジスタファイル420のポインタを初期化する(ステップS103)。
第1データ制御部12は、指定された先頭行のボトムデータ201の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS104)。
演算部50の積和演算部501〜503は、レジスタファイル410の先頭ポインタ163から順にボトムデータ201の要素データを1つずつ読み込む。また、演算部50の積和演算部501〜503は、レジスタファイル420のポインタが示すトップ差分データ203の1つの要素データを読み込む(ステップS105)。
次に、演算部50の積和演算部501〜503は、読み込んだボトムデータ201の要素データに読み込んだトップ差分データ203を乗算し、乗算結果を取得する(ステップS106)。
次に、演算部50の積和演算部501〜503は、レジスタファイル430の割り当てられたレジスタファイル301〜303から重み差分データ204の値を取得する(ステップS107)。
そして、演算部50の積和演算部501〜503は、取得した重み差分データ204に乗算結果を加算する(ステップS108)。
そして、演算部50の積和演算部501〜503は、加算結果を、レジスタファイル430の割り当てられたレジスタファイル301〜303に格納し直し更新する(ステップS109)。
次に、演算部50は、トップ差分データ203の1行分の計算が完了したか否かを判定する(ステップS110)。トップ差分データ203の1行分の計算が完了していない場合(ステップS110:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ163及びレジスタファイル420のポインタを1つシフトさせ(ステップS111)、ステップS105へ戻る。
これに対して、トップ差分データ203の1行分の計算が完了した場合(ステップS110:肯定)、演算部50は、ボトムデータ201の指定された行に対する演算が完了したか否かを判定する(ステップS112)。
ボトムデータ201の指定された行に対する演算が完了していない場合(ステップS112:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ163をストライドだけ分シフトする(ステップS113)。
さらに、ポインタ制御部16は、レジスタファイル420のポインタを1つシフトする(ステップS114)。その後、処理は、ステップS104へ戻る。
これに対して、ボトムデータ201の指定された行に対する演算が完了した場合(ステップS112:肯定)、演算部50は、ボトムデータ201の全ての行について演算が終了したか否かを判定する(ステップS115)。
演算を行っていない行がある場合(ステップS115:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行からストライド数分先の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行から1行先の行を先頭行として指定する(ステップS116)。その後、演算部50は、ステップS103へ戻る。
これに対して、ボトムデータ201の全ての行について演算が終了した場合(ステップS115:肯定)、演算部50は、畳み込みバックワードの重み差分演算処理を終了する。
次に、図21を参照して、畳み込みバックワードのボトム差分演算処理の詳細な流れについて説明する。図21は、畳み込みバックワードのボトム差分演算のフローチャートである。
例えば、図4及び図5で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS201)。
演算部50は、トップ差分データ203の列数であるトップサイズにストライド数を乗算した数分の積和演算部501〜503を演算に割り当てる。また、レジスタファイル430は、ボトムデータ201の列数であるボトムサイズの数分の演算結果格納用のレジスタファイル301〜303を演算に割り当てる(ステップS202)。
ポインタ制御部16は、レジスタファイル410のポインタ166及びレジスタファイル430の先頭ポインタ165を初期化する(ステップS203)。
第1データ制御部12は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行からストライド数の行分の重みデータ202の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS204)。
演算部50の積和演算部501〜503は、レジスタファイル410のポインタ166が示すトップ差分データ203の要素データを読み込む。また、演算部50の積和演算部501〜503は、レジスタファイル420の先頭から計算回数番目の重み差分データ204の要素データを読み込む(ステップS205)。
次に、演算部50の積和演算部501〜503は、読み込んだ重み差分データ204の要素データに読み込んだトップ差分データ203を乗算し、乗算結果を取得する(ステップS206)。
次に、演算部50の積和演算部501〜503は、レジスタファイル430の先頭ポインタ165が示す位置から自己の番号分進んだ位置のボトム差分データ205の要素データの値を取得する(ステップS207)。ここで、自己の番号とは、積和演算部501〜503において、積和演算部を1番としてその後1つずつ連番で数を割当てた番号を指す。
そして、演算部50の積和演算部501〜503は、取得したボトム差分データ205に、乗算結果を加算する(ステップS208)。
そして、演算部50の積和演算部501〜503は、加算結果を、ボトム差分データ205を取得したレジスタファイル301〜303に格納することで更新する(ステップS209)。
そして、演算部50は、トップサイズ分の演算が完了したか否かを判定する(ステップS210)。トップサイズ分の演算が完了していない場合(ステップS210:否定)、ポインタ制御部16は、レジスタファイル410のポインタ166及びレジスタファイル430の先頭ポインタ165を1つシフトし(ステップS211)、ステップS205へ戻る。
これに対して、トップサイズ分の演算が完了した場合(ステップS210:肯定)、演算部50は、トップ差分データ203の指定された行に対する演算が完了したか否かを判定する(ステップS212)。
トップ差分データ203の指定された行に対する演算が完了していない場合(ステップS212:否定)、ポインタ制御部16は、レジスタファイル410のポインタ166を1つシフトする(ステップS213)。
さらに、ポインタ制御部16は、レジスタファイル430の先頭ポインタ165をストライド数分シフトする(ステップS214)。その後、処理は、ステップS204へ戻る。
これに対して、トップ差分データ203の指定された行に対する演算が完了した場合(ステップS212:肯定)、演算部50は、カーネル数分の演算が終了したか否かを判定する(ステップS215)。
カーネル数分の演算を行っていない場合(ステップS215:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行の次の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行の次の行を先頭行として指定する(ステップS216)。その後、演算部50は、ステップS203へ戻る。
これに対して、カーネル数分の演算が終了した場合(ステップS215:肯定)、演算部50は、畳み込みバックワードのボトム差分演算処理を終了する。
以上に説明したように、本実施例に係る演算処理装置は、演算に使用する行列に並んだデータの1行ずつの演算をまとめて行い、その演算結果を用いて行列に並んだデータ同士の演算を行う。この場合、各演算部は、異なる行の演算を行うため、同じデータを同時に用いることはない。さらに、各演算部に配置された積和演算部は、畳み込みバックワードの重み差分演算の場合、それぞれが異なるボトムデータを読み込み、かつ、全てが同じトップデータを読み込む。また、各演算部に配置された積和演算部は、畳み込みバックワードのボトム差分演算の場合、それぞれが異なるトップ差分データを読み込み、かつ、全てが同じ重みデータを読み込む。これにより、データの読み込み回数を抑えることができ、且つ読み込みのコンフリクトの発生を軽減することができ、効率的にバックワード演算を行うことができる。したがって、コストの増加を抑えつつ演算処理速度を向上させることができる。
図22は、複数の演算部によるボトムデータ及びトップデータの指定を説明するための図である。以下では、複数の演算部50によるボトムデータ201及びトップ差分データ203の指定の方法を説明する。
例えば、縦横各々Nの画素数を持つN×Nサイズを有する画像データにおいて、演算部50は、画像データの左上から指定した行と指定したストライド数に基づいて移動した先の座標点(i、j)を求める。そして、演算部50は、その座標点と指定されたカーネルサイズmに基づいて定義される矩形領域としてボトムデータ201を読み込む。演算部50は、この読み込んだボトムデータ201を元に畳み込み演算を実施し、1×1サイズへ調節した上でボトムデータ201を格納する。そのため、その演算結果であるトップ差分データ203のサイズ(以下トップサイズ)は、予め設定したパッド数を用いて、(N+2*pad―m)/ストライド数+1のサイズに調節される。またボトムデータ201あるいはトップ差分データ203が複数ある場合には全てのデータを連続して演算できるように、そのデータ数を使用するボトムデータ201の枚数であるCiあるいは算出されるトップ差分データ203の枚数であるCoで指定することも行なう。
図23は、複数の演算部を用いた場合の畳み込み演算の全体のフローチャートである。まず、演算部50は、図23で指定したトップサイズ分、例えば(N+2*pad―m)/ストライド数+1の分が、演算の使用に割り当てられる(ステップS11)。
1つの演算部50による演算処理は実施例に示した処理と同様である。各演算部50は、行単位のボトムデータ201及び共通の重みデータ202を読み込む(ステップS12)。例えば、トップサイズが8であり、ストライド数が1の場合には、最初の演算部50に対してはb00〜b11が読み込まれ、次の演算部50に対してはb12〜b23が読み込まれ、そして8番目の最後の演算部50に対してはb84〜b95が読み込まれる。このように行単位でボトムデータ201が、各演算部50に読み込まれる。また、ストライド数が2以上の場合には、各演算部50に与えるボトムデータ201は、ストライド数で指定された行数分を用意される。重みデータについては1行分ずつ追加し、全ての演算部50に共通のデータとして与えられる。
そして、ボトムデータ201及び1行分の共通の重みデータ202を使用して、各演算部50は、演算処理を行う(ステップS13)。その後、各演算部50は、それぞれに対応したレジスタファイル430にその演算処理結果を格納する(ステップS14)。
その後、演算部50は、カーネルサイズ分の演算が終了したか否かを判定する(ステップS15)。カーネルサイズの演算が終了していない場合(ステップS15:否定)、演算部50は、ボトムデータ201の行数をスライド数分シフトする。そして、演算部50は、シフト先のボトムデータ201の要素データと、それぞれに共通の重みデータ202とを用いて演算処理を行ない(ステップS16)、ステップS14へ戻る。例えば、最初の演算部50に対してはb12〜b23が追加され、次の演算部50に対してはb24〜b35が追加され、そして8番目の最後の演算部50に対してはb96〜b107が追加される。すなわち、各演算部50には、行単位でボトムデータ201が読み込まれる。演算部50は、重みデータ202の次の行の要素データを読み込み、同様に演算処理を行ない、その演算処理結果を2回目以降の演算については前回の(2回目のときは最初)の演算結果に加算し格納する。例えば、カーネル数が5の場合には、演算部50は、5回計算することで、トップ差分データ203の値に対する演算が完了し、その演算結果を取得できる。また、特に各演算部50毎の演算処理となるステップS11〜S16については、畳み込みバックワードの重み差分演算の場合の詳細フローは図20と同じであり、畳み込みバックワードのボトム差分演算の場合の詳細フローは図21と同じである。
また、ボトムデータ201のデータ数Ciが複数ある場合、演算部50は、指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了したか否かを判定する(ステップS17)。
指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了していない場合(ステップS17:否定)、演算部50は、次のボトムデータ201、あるいはトップ差分データ203を指定する(ステップS18)。その後、処理は、ステップS12へ戻る。
一方、指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了した場合(ステップS17:肯定)、演算部50は、演算処理を終了する。例えばCiが20の場合、演算部50は、同じ計算を20回繰り返すことで、同様にトップ差分データ203の値に対する演算が完了し、その演算結果を取得できることになる。
図24は、複数の演算部を用いた畳み込みフォワード演算のプログラムの記述例を説明するための図である。畳み込みフォワード演算は、図24に示すようにボトムデータ201(bottom_y)とトップ差分データ203(top_x)とを用いた演算は乗算及び加算で表現できる。畳み込みフォワード演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
図25は、複数の演算部を用いた畳み込みバックワードの重み差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードの重み差分演算は、図25に示すようにボトムデータ201(bottom_y)とトップデータ202(top_x)とを用いた演算は乗算及び加算で表現できる。この場合、重み差分データ(ew)が算出される。畳み込みバックワードの重み差分演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
図26は、畳み込みバックワードのボトム差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードのボトム差分演算は、図26に示すようにボトムデータ201(bottom_y)とトップ差分データ203(top_x)と用いた演算は乗算及び加算で表現できる。この場合、ボトム差分データ205(bottom_ey)が算出される。畳み込みバックワードのボトム差分演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
(ハードウェア構成)
図27は、演算処理装置のハードウェア構成図である。図27に示すように、演算処理装置1は、メインメモリ91、CPU(Central Processing Unit)92、I/O(Input/Output)コントローラ93、ハードディスク94及びGPU95を有する。さらに、GPU95は、チップ96及びメモリ99を有する。そして、チップ96には、演算器97及び内蔵メモリ98が搭載される。
一例として、CPU92は、ニューラルネットワークを管理するソフトウェアが動作し、そのソフトウェアが使用するボトムデータ201や重みデータ202がメインメモリ91に格納される。そして、ニューラルネットワークを管理するソフトウェアが演算をGPU95に依頼する。その際、GPU95上の資源を用いて演算が実行できるように、メモリ99に、ボトムデータ201及び重みデータ202が移動される。
演算器97は、演算部50の機能を実現する。また、メモリ99が、メモリ11の機能を実現する。そして、内蔵メモリ98は、レジスタファイル410,420及び430の機能を実現する。この場合、演算器97は、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現する。例えば、メモリ99に演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、演算器97は、メモリ99から各種プログラムを読み出し実行することで、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現することができる。このように、上記実施例で説明した各機能はGPU95によって実現することができる。
また、他の例として、CPU92上で動作するニューラルネットワークを管理するソフトウェアが、演算をCPU92の他のコアに依頼してもよい。その場合、CPU92が、演算部50の機能を実現する。また、ハードディスク94が、メモリ11の機能を実現する。そして、メインメモリ91が、レジスタファイル410〜430の機能を実現する。ハードディスク94は、I/Oコントローラ93を介してCPU92とデータの送受信を行う。この場合、CPU92は、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現する。例えば、ハードディスク94に、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、CPU92は、ハードディスク94から各種プログラムを読み出し実行することで、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現することができる。このように、上記実施例で説明した各機能を、演算処理装置1が有するGPU95以外のCPU92を用いて実現することもできる。
1 演算処理装置
11 メモリ
12 第1データ制御部
13 第2データ制御部
16 ポインタ制御部
50〜53 演算部
201 ボトムデータ
202 重みデータ
203 トップ差分データ
204 重み差分データ
205 ボトム差分データ
206 出力データ
207 期待値
209 演算結果
301〜303,310〜314,320〜331 レジスタファイル
410〜413,420〜423,430〜433 レジスタファイル
510〜514,520〜527 積和演算部

Claims (5)

  1. 第1行列を表す第1データ及び第2行列を表す第2データをそれぞれ格納するデータ格納部と、
    複数の演算部と、
    前記演算部毎に配置され、前記データ格納部に格納された前記第1データの異なる第1所定行をそれぞれが格納し、且つ、前記第1行列における格納した第1所定行から列方向にストライド数移動した次の第1所定行に格納情報を順次入れ替えていく複数の第1格納部と、
    前記演算部毎に配置され、前記データ格納部に格納された前記第2データの同じ連続する所定数の要素データの集まりをそれぞれが格納し、且つ、先頭から順に前記所定数の要素データを順次入れ替えて格納していく複数の第2格納部と、
    前記演算部毎に複数配置され、対応する前記第1格納部に格納された前記第1所定行に含まれる要素データのうち前記第1所定行における先頭の要素データから所定間隔ずつ移動した位置の要素データを先頭として前記所定数の要素データの集まりである異なる第1要素データをそれぞれが取得し、且つ、前記第2格納部に格納された前記所定数の要素データの集まりである同じ第2要素データを対応する前記第2格納部からそれぞれが取得し、取得した前記第1要素データと前記第2要素データとを乗算し、対応する前記第1格納部に格納された前記第1所定行及び対応する前記第2格納部に格納された前記所定数の要素データの集まり入れ替えられる毎の乗算結果を累積加算した値を基に前記第1データと前記第2データとを用いた演算を実行する積和演算部と
    を備えたことを特徴とする演算処理装置。
  2. 複数の前記演算部は、前記第1データ又は前記第2データのサイズを基に演算を行う自己の数を決定し、且つ、前記第1データ又は前記第2データのサイズの何れか一方及び前記第2データの移動量を基に前記演算部が有する第2演算部の数を決定することを特徴とする請求項1に記載の演算処理装置。
  3. 各前記積和演算部は、それぞれ前記第1所定行の先頭から1つずつ先の番号の前記第1要素データを先頭として演算毎にストライド数ずつ進めた前記第1要素データを取得し、且つ、前記第2格納部に格納された前記所定数の要素データの集まりに含まれる連番で並ぶ前記第2要素データを演算毎に番号順に取得し、取得した前記第1要素データ及び前記第2要素データを乗算した値を前の演算結果に加算する演算を繰り返すことを特徴とする請求項1又は2に記載の演算処理装置。
  4. 各前記積和演算部は、前記第1所定行に含まれる連番で並ぶ前記第1要素データのうち、番号順に異なる前記第1要素データをそれぞれが取得し、且つ、前記第2格納部に格納された前記所定数の要素データの集まりに含まれる連番で並ぶ前記第2要素データを演算毎に番号順に取得し、取得した前記第1要素データ及び前記第2要素データを乗算した値を、前の演算においてストライド数先の積和演算部が算出した演算結果に加算する演算を繰り返すことを特徴とする請求項1又は2に記載の演算処理装置。
  5. 第1行列を表す第1データ及び第2行列を表す第2データをそれぞれ格納した記憶装置に接続する演算処理装置の制御方法であって、
    前記記憶装置に格納された前記第1データの異なる第1所定行を、積和演算器を複数有する演算器毎に配置された複数の第1格納装置のそれぞれに格納し、且つ、前記第1行列における格納した第1所定行から列方向にストライド数移動した次の第1所定行に格納情報を順次入れ替えていき
    前記記憶装置に格納された前記第2データの同じ連続する所定数の要素データの集まりを前記演算器毎に配置された複数の第2格納装置のそれぞれに格納し、且つ、先頭から順に前記所定数の要素データを順次入れ替えて格納していき、
    対応する前記記憶装置に格納された前記第1所定行に含まれる要素データのうち前記第1所定行における先頭の要素データから所定間隔ずつ移動した位置の要素データを先頭として前記所定数の要素データの集まりである異なる第1要素データをそれぞれの前記積和演算器に取得させ、且つ、前記記憶装置に格納された前記所定数の要素データの集まりである同じ第2要素データを対応する前記第2格納装置からそれぞれの前記積和演算器に取得させ、取得した前記第1要素データと前記第2要素データとの乗算を各前記積和演算器に実行させ、
    対応する前記記憶装置に格納された前記第1所定行及び前記所定数の要素データの集まり入れ替えられる毎の乗算結果を累積加算した値を基に前記第1データと前記第2データとを用いた演算を各前記積和演算器に実行させる
    ことを特徴とする演算処理装置の制御方法。
JP2016254339A 2016-12-27 2016-12-27 演算処理装置及び演算処理装置の制御方法 Active JP6972547B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016254339A JP6972547B2 (ja) 2016-12-27 2016-12-27 演算処理装置及び演算処理装置の制御方法
US15/782,881 US10642622B2 (en) 2016-12-27 2017-10-13 Arithmetic processing device and control method of the arithmetic processing device

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016254339A JP6972547B2 (ja) 2016-12-27 2016-12-27 演算処理装置及び演算処理装置の制御方法

Publications (2)

Publication Number Publication Date
JP2018106559A JP2018106559A (ja) 2018-07-05
JP6972547B2 true JP6972547B2 (ja) 2021-11-24

Family

ID=62629807

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016254339A Active JP6972547B2 (ja) 2016-12-27 2016-12-27 演算処理装置及び演算処理装置の制御方法

Country Status (2)

Country Link
US (1) US10642622B2 (ja)
JP (1) JP6972547B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10740434B1 (en) 2018-04-20 2020-08-11 Perceive Corporation Reduced dot product computation circuit
US11468145B1 (en) 2018-04-20 2022-10-11 Perceive Corporation Storage of input values within core of neural network inference circuit
US11783167B1 (en) 2018-04-20 2023-10-10 Perceive Corporation Data transfer for non-dot product computations on neural network inference circuit
US11205115B1 (en) 2018-04-20 2021-12-21 Perceive Corporation Neural network inference circuit
US11995533B1 (en) 2018-12-05 2024-05-28 Perceive Corporation Executing replicated neural network layers on inference circuit
US11347297B1 (en) 2019-01-23 2022-05-31 Perceive Corporation Neural network inference circuit employing dynamic memory sleep
US11797345B2 (en) * 2019-04-30 2023-10-24 Prakash C R J Naidu Hardware accelerator for efficient convolution processing
US11868901B1 (en) 2019-05-21 2024-01-09 Percieve Corporation Compiler for optimizing memory allocations within cores
US11151695B1 (en) * 2019-08-16 2021-10-19 Perceive Corporation Video denoising using neural networks with spatial and temporal features

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5226171A (en) * 1984-12-03 1993-07-06 Cray Research, Inc. Parallel vector processing system for individual and broadcast distribution of operands and control information
US5577262A (en) * 1990-05-22 1996-11-19 International Business Machines Corporation Parallel array processor interconnections
JP2001067338A (ja) 1999-08-30 2001-03-16 Mitsubishi Precision Co Ltd 高速たたみ込み演算方式とその演算器および高速補間方式と高速補間器
US6401106B1 (en) * 2000-08-07 2002-06-04 Systems On Silicon, Inc. Methods and apparatus for performing correlation operations
US20070271325A1 (en) * 2006-05-08 2007-11-22 Nvidia Corporation Matrix multiply with reduced bandwidth requirements
JP5184824B2 (ja) 2007-06-15 2013-04-17 キヤノン株式会社 演算処理装置及び方法
JP5376920B2 (ja) * 2008-12-04 2013-12-25 キヤノン株式会社 コンボリューション演算回路、階層的コンボリューション演算回路及び物体認識装置
JP5742366B2 (ja) 2011-03-28 2015-07-01 ヤマハ株式会社 デジタル信号処理装置およびプログラム
JP6314628B2 (ja) 2014-04-28 2018-04-25 株式会社デンソー 演算処理装置
JP2018022339A (ja) * 2016-08-03 2018-02-08 富士通株式会社 演算処理装置及び演算処理装置の制御方法
JP6786948B2 (ja) * 2016-08-12 2020-11-18 富士通株式会社 演算処理装置及び演算処理装置の制御方法
JP6958027B2 (ja) * 2017-07-03 2021-11-02 富士通株式会社 演算処理装置及び演算処理装置の制御方法

Also Published As

Publication number Publication date
US20180181406A1 (en) 2018-06-28
US10642622B2 (en) 2020-05-05
JP2018106559A (ja) 2018-07-05

Similar Documents

Publication Publication Date Title
JP6972547B2 (ja) 演算処理装置及び演算処理装置の制御方法
JP6786948B2 (ja) 演算処理装置及び演算処理装置の制御方法
JP6958027B2 (ja) 演算処理装置及び演算処理装置の制御方法
JP7329533B2 (ja) 演算を加速するための方法および加速器装置
US11537687B2 (en) Spatial locality transform of matrices
JP6900487B2 (ja) ハードウェアにおける平均プーリングの実行
JP7021904B2 (ja) 畳み込み神経網処理方法及び装置
JP6764954B2 (ja) プログラマブル二次元画像プロセッサ上の畳み込みニューラルネットワーク
US10831702B2 (en) Efficient utilization of systolic arrays in computational processing
JP6794854B2 (ja) 演算処理装置及び演算処理装置の制御方法
CN111937009A (zh) 脉动卷积神经网络
CN116663604A (zh) 替选循环限制
US10248384B2 (en) Arithmetic processing device and control method for arithmetic processing device
JP6927320B2 (ja) 推論装置、畳み込み演算実行方法及びプログラム
EP3093757B1 (en) Multi-dimensional sliding window operation for a vector processor
JP2021516382A (ja) 機械学習のための画像変換
CN108073549B (zh) 卷积运算装置及方法
EP1763769A2 (en) A bit serial processing element for a simd array processor
US11763131B1 (en) Systems and methods for reducing power consumption of convolution operations for artificial neural networks
WO2018235357A1 (ja) 演算装置、演算方法及びプログラム
WO2022160704A1 (zh) 一种图像处理方法、装置、计算机设备及存储介质
CN109726798B (zh) 一种数据处理方法及装置
JP2018525730A (ja) スライディングウィンドウ演算
WO2022160706A1 (zh) 一种数据处理方法、装置、计算机设备及存储介质
KR102372869B1 (ko) 인공 신경망을 위한 행렬 연산기 및 행렬 연산 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190910

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200716

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20200901

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20201029

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20210323

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210518

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20211018

R150 Certificate of patent or registration of utility model

Ref document number: 6972547

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150