(57)【要約】【課題】汎用性を有するＮビット幅のレジスタとＮビット幅の加算器とでＮビット幅の複数の数の総和計算が可能な総和計算方法を提供する。【解決手段】総和計算方法は、Ｎ（２以上の自然数）ビット幅の２進数である複数の数を受け取り、複数の数の同一のビット位置にある１の個数を計数することにより、第ｎ（＝１〜Ｎ）ビット位置の１の個数を各ｎに対して求め、複数Ｍ（２以上の自然数）個のＮビット幅のレジスタにより構成されるＮ列Ｍ行の行列の第ｎ列に、第ｎビット位置の１の個数を表わす２進数を、第１行が最下位ビットで第Ｍ行が最上位ビットとなるように列方向に格納し、第ｍ（＝１〜Ｍ−１）行のＮビット幅のレジスタの最下位ビット以外の格納内容を右（最下位方向）に１ビットシフトして第ｍ＋１行のＮビット幅のレジスタの格納内容に加算する演算を第１行から順番に第Ｍ−１行まで実行することにより総和を求める各段階を含む。【選択図】図４
2011107972.tif 000002
【特許請求の範囲】
【請求項１】
（ａ）Ｎ（Ｎは２以上の自然数）ビット幅の２進数である複数の数を受け取り、
（ｂ）前記複数の数の同一のビット位置にある１の個数を計数することにより、第ｎ（ｎは１〜Ｎの範囲の数）ビット位置の１の個数を各ｎに対して求め、
（ｃ）複数Ｍ（ＭはＮと等しいか又は異なる２以上の自然数）個のＮビット幅のレジスタにより構成されるＮ列Ｍ行の行列の第ｎ列に、前記第ｎビット位置の１の個数を表わす２進数を、第１行が最下位ビットで第Ｍ行が最上位ビットとなるように列方向に格納し、
（ｄ）第ｍ（ｍは１〜Ｍ−１の範囲の数）行の前記Ｎビット幅のレジスタの最下位ビット以外の格納内容を右（最下位方向）に１ビットシフトして第ｍ＋１行の前記Ｎビット幅のレジスタの格納内容に加算する演算を第１行から順番に第Ｍ−１行まで実行することにより総和を求める
各段階を含むことを特徴とする総和計算方法。
【請求項２】
前記Ｎビット幅の２進数の第Ｎビットが符号ビットである場合、前記行列の第Ｎ列の格納内容を退避させて第Ｎ列を０にしてから前記段階（ｄ）を実行し、前記段階（ｄ）により求まった前記総和から前記第Ｎ列の格納内容が表現する２進数を減算することを特徴とする請求項１記載の総和計算方法。
【請求項３】
前記段階（ａ）は前記複数の数を前記行列のＮビット幅のレジスタの各行に格納し、前記段階（ｂ）は前記行列の各列の１の個数の総数を表わす２進数を汎用レジスタに格納し、前記段階（ｃ）は、前記汎用レジスタに格納された前記行列の各列の１の個数の総数を表わす２進数を前記行列の列方向に格納することを特徴とする請求項１記載の総和計算方法。
【請求項４】
Ｎ（Ｎは２以上の自然数）ビット幅の２進数の加算を行なう第１の演算器と、
Ｎビット幅の２進数の１の個数を計数する第２の演算器と、
複数Ｍ（ＭはＮと等しいか又は異なる２以上の自然数）個のＮビット幅のレジスタにより構成され行方向と列方向とにアクセス可能なＮ列Ｍ行の行列レジスタファイルと、
Ｎビット幅の少なくとも１つの汎用レジスタファイルと
を含む数値演算装置。
【請求項５】
命令デコードユニットを更に含み、前記命令デコードユニットは、Ｎビット幅の２進数を前記行列レジスタファイルの指定行に格納する動作と、前記行列レジスタファイルの指定列にある１の個数を前記第２の演算器に計数させる動作と、を実行可能であることを特徴とする請求項４記載の数値演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本願開示は、一般に数値計算方法及び装置に関し、詳しくは総和を計算する方法及び装置に関する。
【背景技術】
【０００２】
ディジタル信号処理においては、数値表現の精度（ビット数）が信号処理品質に影響する。ＤＳＰプロセッサ等による数値演算のように、カスタマイズされたハードウェアではなくソフトウェアによる信号処理を行なう場合、レジスタや演算器のビット幅は１６ビットや３２ビット等のように固定規格で製造されている。従って、固定サイズのハードウェア資源でさまざまな精度の演算に対応する必要がある。
【０００３】
種々の数値計算のうちでも総和演算は、平均値や内積を求めるなどのために頻繁に用いられ、数値演算の最も基本的な演算の１つである。総和計算では、一般に、逐次得られる中間和に個々の値を一つずつ足し込んでいく累積演算が実行される。この際、N個の値の和を求める場合には、有効桁が最大でｌｏｇ２Ｎ増加することが知られている。従って、有効桁の増加に対処しながら累積演算を行なっていく必要がある。例えば、１６ビットの複数の数値の総和を求める場合には、３２ビットのレジスタと加算器とを用意し、３２ビットで加算演算を行い、結果を３２ビットで保持する等の対策が必要になる。累積結果の桁あふれについては、ガードビットと呼ばれる付加ビットを備えた内部レジスタで中間累積値を保持することにより対処することも考えられるが、この場合も加算については、付加ビットの分まで実行する必要がある。
【０００４】
このように、Ｎビット幅の数値の総和を求めるために、幅がＮビットよりも大きいハードウェアが必要になったり、総和のためだけの特殊なレジスタ及び加算器が必要になったりする。即ち、プロセッサのワード幅とは異なるサイズのレジスタや加算器等、累積演算以外の用途が余りない専用ハードウェア資源を導入する必要がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平５−１８９９９８号公報
【特許文献２】特開平５−３１８８８０号公報
【特許文献３】特開昭６３−１９５７７１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
以上を鑑みると、汎用性を有するＮビット幅のレジスタとＮビット幅の加算器とでＮビット幅の複数の数の総和計算が可能な総和計算方法及び数値演算装置が望まれる。
【課題を解決するための手段】
【０００７】
総和計算方法は、Ｎ（Ｎは２以上の自然数）ビット幅の２進数である複数の数を受け取り、前記複数の数の同一のビット位置にある１の個数を計数することにより、第ｎ（ｎは１〜Ｎの範囲の数）ビット位置の１の個数を各ｎに対して求め、複数Ｍ（ＭはＮと等しいか又は異なる２以上の自然数）個のＮビット幅のレジスタにより構成されるＮ列Ｍ行の行列の第ｎ列に、前記第ｎビット位置の１の個数を表わす２進数を、第１行が最下位ビットで第Ｍ行が最上位ビットとなるように列方向に格納し、第ｍ（ｍは１〜Ｍ−１の範囲の数）行の前記Ｎビット幅のレジスタの最下位ビット以外の格納内容を右（最下位方向）に１ビットシフトして第ｍ＋１行の前記Ｎビット幅のレジスタの格納内容に加算する演算を第１行から順番に第Ｍ−１行まで実行することにより総和を求める各段階を含むことを特徴とする。
【０００８】
また数値演算装置は、Ｎ（Ｎは２以上の自然数）ビット幅の２進数の加算を行なう第１の演算器と、Ｎビット幅の２進数の１の個数を計数する第２の演算器と、複数Ｍ（ＭはＮと等しいか又は異なる２以上の自然数）個のＮビット幅のレジスタにより構成され行方向と列方向とにアクセス可能なＮ列Ｍ行の行列レジスタファイルと、Ｎビット幅の少なくとも１つの汎用レジスタファイルとを含む。
【発明の効果】
【０００９】
本願開示の少なくとも１つの実施例によれば、Ｎビット幅のレジスタとＮビット幅の加算器とでＮビット幅の複数の数の総和計算が可能となる。より詳しくは、幅がＮより大きい加算器や特殊レジスタを設けることなく、有効桁Ｎ＋Ｍ−１の累積演算を行うことが可能となる。
【図面の簡単な説明】
【００１０】
【図１】数値演算装置の実施例の構成の一例を示す図である。
【図２】数値演算装置が実行する命令の一例を示す表である。
【図３】行列レジスタファイルを模式的に示す図である。
【図４】総和計算の処理の流れを示すフローチャートである。
【図５】外部メモリのメモリ空間内に配置された総和計算対象となる複数のデータを示す図である。
【図６】初期化動作に使用される命令の一例を示す図である。
【図７】複数のデータを行列レジスタファイルにロードする命令列の一例を示す図である。
【図８】図７の命令列を実行することにより行列レジスタファイルに格納された図５の１６個のデータを示す図である。
【図９】行列レジスタファイルの各列レジスタ毎に1の数を求め汎用レジスタに累積する命令列の一例を示す図である。
【図１０】汎用レジスタに格納された桁累積値を行列レジスタファイルの列レジスタにロードする命令列の一例を示す図である。
【図１１】桁累積値を列レジスタにロードした状態の行列レジスタファイルの格納値の一例を示す図である。
【図１２】正規化処理の処理手順の一例を示すフローチャートである。
【図１３】符号列累積値退避を説明するための図である。
【図１４】第１行から順番に行レジスタの格納内容をシフトしながら上の行の格納内容に加え合わせていく順次行加算処理を実行する命令列の一例を示す図である。
【図１５】第１行から順番に行レジスタの格納内容をシフトしながら上の行の格納内容に加え合わせていく順次行加算処理を模式的に示す図である。
【図１６】順次行加算処理を実行後の行列レジスタファイルの状態を示す図である。
【図１７】符号相殺処理を説明するための図である。
【発明を実施するための形態】
【００１１】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。
【００１２】
図１は、数値演算装置の実施例の構成の一例を示す図である。図１に示す数値演算装置１０は、命令デコードユニット１１、命令フェッチユニット１２、プログラムカウンタユニット１３、算術論理演算器１４、累積演算器１５、行列レジスタファイル１６、汎用レジスタファイル１７、及びデータアクセスユニット１８を含む。各部間のデータの伝送を行なうデータバスとしてｉバス１９、ｂバス２０、ａバス２１、及びｄバス２２が設けられている。図１に示す数値演算装置１０は、演算対象のデータのビット幅が１６ビットである例を示すが、ビット幅は１６ビットに限られるものではなく、３２ビットや６４ビットであってよい。
【００１３】
プログラムカウンタユニット１３は、実行する命令のメモリ空間でのアドレスを指し示すプログラムカウンタ値を順次インクリメントする。命令フェッチユニット１２は、プログラムカウンタユニット１３から供給されるプログラムカウンタ値に応じた命令アドレスを出力し、外部のメモリ中の当該命令アドレスから命令語をフェッチする。命令フェッチユニット１２は、獲得した命令語を命令デコードユニット１１に供給する。命令デコードユニット１１は、供給された命令語をデコードし、デコード結果に応じて制御信号ｃ１乃至ｃ６を出力して各部を制御することにより、当該命令語を実行するように各部を動作させる。
【００１４】
図２は、数値演算装置１０が実行する命令の一例を示す表である。図１に示す算術論理演算器１４は、命令デコードユニット１１からの制御信号ｃ５に応じて動作し、１６ビット幅の算術処理、比較処理、論理演算処理、シフト演算処理等を実行する。図２に示す表中のｓｅｔ命令、ｍｏｖ命令、ｓｈｒａｄｄ命令、ｓｕｂ命令の実行において、算術論理演算器１４が使用される。これは図２の表中の制御信号ｃ５の欄を見れば分かる。算術論理演算器１４は、ｉバス１９からのデータｉ２、ａバス２１からのデータａ５、及びｂバス２０からのデータｂ４の少なくとも1つから求めたデータを、データｄ５としてｄバス２２に送出する。
【００１５】
図１に示す累積演算器１５は、ｂバス２０からのデータｂ３中においてビット値が１のビットの個数を数えて得られる値を、ａバス２１からのデータａ４の値に加算し、得られた加算値をデータｄ４としてｄバス２２に送出する。図２に示す表中のｂａｃ命令の実行において、累積演算器１５が使用される。累積演算器１５の動作は、命令デコードユニット１１からの制御信号ｃ４に応じて制御される。
【００１６】
図１に示す行列レジスタファイル１６は、複数Ｍ個のＮビット幅のレジスタにより構成され、行方向と列方向とにアクセス可能なＮ列Ｍ行のレジスタである。Ｍ及びＮは２以上の自然数であり、ＭはＮと等しいか又は異なってよい。図１に示す例では、Ｎ及びＭは共に１６である。１６個の１６ビット幅の行レジスタのうちの所望の１つのレジスタを指定して、そのレジスタに行方向に格納されたデータをアクセス可能である。また１６個の１６ビット幅の列レジスタのうちの所望の１つのレジスタを指定して、そのレジスタに列方向に格納されたデータをアクセス可能である。
【００１７】
図３は、行列レジスタファイル１６を模式的に示す図である。１６×１６のマトリクス状に並んだ正方形の各々が、１ビットのデータを格納するレジスタ要素である。図３には、行方向にデータを格納する行レジスタ２５として、３つのレジスタが示してある。第１行の行レジスタ２５をｒ０、第６行の行レジスタ２５をｒ５、第１６行の行レジスタ２５をｒ１５として示してある。各行レジスタ２５は１６ビット幅であり、左端が最上位ビットＭＳＢ、右端が最下位ビットＬＳＢである。同様の行レジスタ２５が合計で１６個設けられていることになる。また更に図３には、列方向にデータを格納する列レジスタ２６として３つのレジスタが示してある。第１列の列レジスタ２６をｃ０、第４列の列レジスタ２６をｃ３、第１６列の列レジスタ２６をｃ１５として示してある。各列レジスタ２６は１６ビット幅であり、上端が最上位ビットＭＳＢ、下端が最下位ビットＬＳＢである。同様の列レジスタ２６が合計で１６個設けられていることになる。
【００１８】
図２の表中に示すｂａｃ命令の実行において、累積演算器１５にｂバス２０から供給されるデータｂ３は、行列レジスタファイル１６からｂバス２０にデータｂ２として送出したデータである。図２に示すｂａｃ命令の例では、行列レジスタファイル１６の第９列（０から数えて８番目の列）である列レジスタｃ８の値が、制御信号ｃ３に応答して、ｂバス２０にデータｂ２として送出されている。この列レジスタｃ８の値に含まれる１の個数（ビット値が１であるビットの個数）が、累積演算器１５により計数されることになる。
【００１９】
図１に示す汎用レジスタファイル１７は、３２個の１６ビット幅のレジスタｇ０乃至ｇ３１を含む。これらの汎用レジスタｇ０乃至ｇ３１は、通常のレジスタであり、列方向へのアクセスができる必要はない。また汎用レジスタの数は３２個でなくとも、適宜十分な数であればよい。汎用レジスタファイル１７は、命令デコードユニット１１からの制御信号ｃ２に応じて制御される。図２の表中の制御信号ｃ２の欄を見れば分かるように、汎用レジスタファイル１７は、ｓｅｔ命令、ｍｏｖ命令、ｌｄ命令、ｂａｃ命令、ｓｕｂ命令の実行において使用される。
【００２０】
図１に示すデータアクセスユニット１８は、データアドレスを出力し、外部メモリの当該データアドレスに出力データを書き込んだり、当該データアドレスから入力データを読み込んだりする。データアクセスユニット１８は、命令デコードユニット１１からの制御信号ｃ１に応じて制御される。図２の表中の制御信号ｃ１の欄を見れば分かるように、データアクセスユニット１８は、ｌｄ命令の実行において使用される。
【００２１】
図４は、総和計算の処理の流れを示すフローチャートである。図１の数値演算装置１０が総和計算のプログラムを実行することにより、図４に示す総和計算が実行される。まずステップＳ１において、初期化動作が実行される。即ち、総和を計算する要素が格納されている領域の先頭アドレスを汎用レジスタに転送する。
【００２２】
図５は、外部メモリのメモリ空間内に配置された総和計算対象となる複数のデータを示す図である。メモリの８０００番地から８０３２番地に格納される図示の１６個のデータについて、総和を求める例について以下に説明する。なお総和計算の対象となるデータの個数は１６に限定されるものではなく、図１の構成が許す最大ビット数以下の桁数に総和の桁数が収まる限りは、任意の数のデータを総和計算の対象としてよい。
【００２３】
図６は、初期化動作に使用される命令の一例を示す図である。図６に示すｓｅｔ命令は、８０００番地を示すアドレス値“８０００”を汎用レジスタファイル１７の汎用レジスタｇ１にセットする命令である。これにより、総和を計算する対象である複数のデータが格納されている領域の先頭アドレスが汎用レジスタｇ１に設定される。
【００２４】
図４のステップＳ２で、要素ロード動作が実行される。即ち図１の行列レジスタファイル１６に総和を計算する対象である複数の要素をロードする。この動作には、図２の表中に示すｌｄ命令が用いられる。
【００２５】
図７は、複数のデータを行列レジスタファイルにロードする命令列の一例を示す図である。図７に示すように、順次実行される１６個のｌｄ命令において、汎用レジスタｇ１の格納値からのオフセットとして０〜３２を指定することにより、８０００＋０番地から８０００＋３２番地の１６個のデータを行列レジスタファイル１６の各行に格納する。即ち、命令デコードユニット１１によりｌｄ命令を実行することで、１６ビット幅の２進数を行列レジスタファイル１６の各指定行に格納する。
【００２６】
図８は、図７の命令列を実行することにより行列レジスタファイル１６に格納された図５の１６個のデータを示す図である。図８において、例えば、行列レジスタファイル１６の行レジスタｒ１５には、“００００１１１０００００１０００”が格納されている。これは、十進数で３５９２であり、図５に示す８０００＋０番地に格納されるデータに対応する。また行レジスタｒ０には、“１１１０１０００１１０１１００１”が格納されている。これは、十進数で−５９２７であり、図５に示す８０００＋３２番地に格納されるデータに対応する。なおこの例では、１６ビット幅の２進数の第１６ビットが符号ビットであり、２の補数表現が用いられている。
【００２７】
図４のステップＳ３で、桁累積演算が実行される。即ち、行列レジスタファイル１６の各列レジスタ毎に1の数を求め、求めた１の個数を個別に汎用レジスタに累積する。総和計算の対象となるデータ個数が１６であれば、各列レジスタ毎に1の数を求め、求めた１の個数を汎用レジスタファイル１７の汎用レジスタに個別に格納すればよい。総和計算の対象となるデータ個数が例えば３２であれば、最初の１６個のデータについて１の数を求める処理が終了後、次の１６個のデータを行列レジスタファイル１６にロードして、同様に各列レジスタ毎に1の数を求めることになる。このようにして求めた２回目の１６個のデータから求めた１の個数は、汎用レジスタに既に格納されている１回目の１６個のデータから求めた１の個数に累積的に加算される。
【００２８】
図９は、行列レジスタファイルの各列レジスタ毎に1の数を求め汎用レジスタに累積する命令列の一例を示す図である。図９に示すように、順次実行される１６個のｂａｃ命令において、列レジスタｃ０乃至ｃ１５と汎用レジスタｇ１６乃至ｇ３１とを指定することにより、それぞれの列レジスタ内の１の個数の計数値が対応する汎用レジスタに累積される。即ち例えば、“ｂａｃ  ｇ１６，ｃ０”を実行することにより、行列レジスタファイル１６の列レジスタｃ０内の１の個数が計数され、この計数値が汎用レジスタｇ１６の格納値に加算される。具体的には、汎用レジスタファイル１７のうちの指定の汎用レジスタｇ１６の値が累積演算器１５にデータａ４として供給され、行列レジスタファイル１６のうちの指定の列レジスタｃ０の値が累積演算器１５にデータｂ３として供給される。累積演算器１５は、データｂ３中においてビット値が１のビットの個数を数えて得られる値を、データａ４の値に加算し、得られた加算値をデータｄ４としてｄバス２２に送出する。このｄバス２２の値は、指定の汎用レジスタｇ１６に格納される。このようにして、総和計算対象の複数の数の同一のビット位置にある１の個数を計数することにより、第ｎ（ｎは１〜１６の範囲の数）ビット位置の１の個数を各ｎに対して求め、その結果を各汎用レジスタに格納できる。
【００２９】
図４のステップＳ４で、総和計算対象の全ての要素を処理したか否かを判断する。全ての要素の処理が完了していない場合には、ステップＳ１に戻り、以下の処理を繰り返す。先頭アドレスが同一でありオフセットのみが異なる要素を対象とするのであれば、ステップＳ１をスキップして、ステップＳ２以降を繰り返せばよい。
【００３０】
ステップＳ５で、桁累積ロード処理を実行する。即ち、汎用レジスタファイル１７の各汎用レジスタに格納された桁累積値（各列毎の１の個数の累積値）を行列レジスタファイル１６の各列レジスタにロードし直す。この動作は、図２の表中に示されるｍｏｖ命令により実行される。
【００３１】
図１０は、汎用レジスタに格納された桁累積値を行列レジスタファイルの列レジスタにロードする命令列の一例を示す図である。図１０に示すように、順次実行される１６個のｍｏｖ命令において、列レジスタｃ０乃至ｃ１５と汎用レジスタｇ１６乃至ｇ３１とを指定することにより、汎用レジスタから対応する列レジスタにデータが転送される。即ち例えば、“ｍｏｖ  ｃ０，ｇ１６”を実行することにより、汎用レジスタファイル１７の指定の汎用レジスタｇ１６に格納されるデータが、算術論理演算器１４にデータａ５として供給される。算術論理演算器１４は、このデータａ５の値をデータｄ５としてｄバス２２に送出する。このｄバス２２の値は、データｄ３として、行列レジスタファイル１６の指定の列レジスタｃ０に格納される。このようにして、複数Ｍ個のＮビット幅のレジスタ（この例ではＭ、Ｎともに１６）により構成されるＮ列Ｍ行の行列の第ｎ列に、第ｎビット位置の１の個数を表わす２進数を、第１行が最下位ビットで第Ｍ行が最上位ビットとなるように列方向に格納する。
【００３２】
図１１は、桁累積値を列レジスタにロードした状態の行列レジスタファイルの格納値の一例を示す図である。図１１に示す行列レジスタファイル１６の格納値の例は、図８に示す行列レジスタファイル１６の格納値の例に対応する。例えば列レジスタｃ０に着目すると、図８の列レジスタｃ０には、９個の１が含まれている。９を２進数で表現すると“１００１”である。これに対応して、図１１に示す行列レジスタファイル１６の列レジスタｃ０には、２進数の９である“００００００００００００１００１”が格納されている。ここで、第１行ｒ０が最下位ビットであり、第１６行ｒ１５が最上位ビットとなるように、値が列方向に格納されている。
【００３３】
最後に図４のステップＳ６で、正規化処理が実行される。即ち、行列レジスタファイル１６の複数の列レジスタによって間接的に表現されている総和の値を、単一の値に変換する。ここで、「列レジスタによって間接的に表現されている総和の値」とは、以下のように説明される。まず２進数表現の約束事として、個々の値の第ｎビット位置のビット値（０又は１）は２ｎ−１の重みを有する。例えば十進数の５という数は、２進数で“１０１”であるが、これは１×２３−１＋０×２２−１＋１×２１−１＝５ということである。即ち、５という数に対する２ｎ−１の寄与分が第ｎビットの値によって示される。また例えば十進数の６という数は、２進数で“１１０”であるが、これは１×２３−１＋１×２２−１＋０×２１−１＝６ということである。ここで、これら２つの数５と６との和を２の冪乗の各桁毎に求めると、２×２３−１＋１×２２−１＋１×２１−１＝１１となる。即ち、５と６とにおいて、第３ビット位置の１の個数が２個であるから２×２３−１となり、第２ビット位置の１の個数が１個であるから１×２２−１となり、第１ビット位置の１の個数が１個であるから１×２１−１となる。このように、総和計算の対象となった個々の値の第ｎビット位置の１の個数が全部で例えばｍであったということは、総和に対する２ｎ−１の寄与分がｍであるということである。具体的に説明すると、前述のように図１１の列レジスタｃ０の値は９である。同様に、列レジスタｃ１５〜ｃ０の値を並べると、それぞれ１０、８、７、９、８、１０、９、６、７、８、６、９、１１、５、１０、９となる。ここで第ｎ列の値にその桁の位置に応じた２ｎ−１の重み掛けて、１６個の数の合計を求めれば−６７７５１となる。この値は、総和計算で求めるべき値、即ち図５の１６個の値の総和に等しい。なお２の補数表現を用いているので、最上位ビットは−２１５の重みとなる。このように図１１に示されるような行列レジスタファイル１６の格納値は、第ｎ列の値が２ｎ−１の重みを有するという暗黙の約束事を加味すれば、既に総和値を間接的に表現していることになる。図４のステップＳ６では、行列レジスタファイル１６の複数の列レジスタによって間接的に表現されている総和の値を、単一の２進数の値に変換する。
【００３４】
図１２は、正規化処理の処理手順の一例を示すフローチャートである。ステップＳ１において、符号列累積値退避を実行する。即ち、列レジスタｃ１５が表す符号ビットの列累積値を汎用レジスタｇ２に退避し、列レジスタｃ１５の各ビットをゼロにクリアする。具体的には、“ｍｏｖ  ｇ２，ｃ１５”の命令実行により、列レジスタｃ１５の値が汎用レジスタｇ２に格納される。また“ｓｅｔ  ｃ１５，０”の命令実行により、列レジスタｃ１５の各ビットの値が０に設定される。
【００３５】
図１３は、符号列累積値退避を説明するための図である。図１３に示すように、行列レジスタファイル１６の１６行×１６列のうちで、最上位ビットに対応する第１６列（即ち列レジスタｃ１５）は符号ビットの列であり、そこには負の重みを持つビットが格納されている。また第１６列を除く第１〜１５列には、正の重みを持つビットが格納されている。符号列累積値退避では、負の重みを持つビット（正確にはその重み付け和）を汎用レジスタｇ２に転送して退避させる。また第１６列の各ビットはゼロにリセットする。なおここで符号列累積値と呼ぶのは、符号ビット列を構成する各行の最上位ビットのうちで、第１行（図１１の行レジスタｒ０）の最上位ビットは−２１５の重みを有し、第ｍ行（行レジスタｒｍ−１）の最上位ビットは−２１５＋ｍ−１の重みを有するからである。
【００３６】
図１２のステップＳ２で、順次行加算を実行する。即ち、行レジスタｒ０から順番に、行レジスタの内容をシフトしながら上の行の内容に加え合わせていく。この際、着目行をその上の行に足し込むときに、着目行の最下位ビットはそのままにして、着目行の最上位ビット（第１６ビット）から第２ビットまでを右（最下位方向）に１ビットシフトして、上の行の格納内容に加算する。即ち、第ｍ（ｍは１〜Ｍ−１の範囲の数）行のＮビット幅のレジスタの最下位ビット以外の格納内容を右（最下位方向）に１ビットシフトして第ｍ＋１行のＮビット幅のレジスタの格納内容に加算する演算を第１行から順番に第Ｍ−１行まで実行する。
【００３７】
図１４は、第１行から順番に行レジスタの格納内容をシフトしながら上の行の格納内容に加え合わせていく順次行加算処理を実行する命令列の一例を示す図である。図１４において、最初の２つの命令ｍｏｖとｓｅｔとは、前述の符号列累積値退避処理を行なうためのものである。その後の順次実行される１６個のｓｈｒａｄｄ命令において、着目行レジスタｒ０乃至ｒ１４と、右（最下位方向）ビットシフト量“１”と、加算先の行レジスタｒ１乃至ｒ１５とを指定することにより、それぞれの着目行レジスタの内容が加算先のレジスタの内容に加算される。即ち例えば、“ｓｈｒａｄｄ  ｒ１，ｒ０，１”を実行することにより、行列レジスタファイル１６の行レジスタｒ０の値が右（最下位方向）に１ビットシフトされ、そのシフト後の値が行レジスタｒ１に加算される。具体的には、行列レジスタファイル１６の行レジスタｒ０の値をデータｂ２としてｂバス２０に出力し、行レジスタｒ１の値をデータａ３としてａバス２１に出力する。算術論理演算器１４は、ｂバス２０のデータｂ４（上記データｂ２）及びａバス２１のデータａ５（上記データａ３）を受け取り、ｉバス１９を介して命令デコードユニット１１から受け取るデータｉ２が示す“１”だけデータｂ４を右（最下位方向）にシフトし、シフト後の値をデータａ５に加算し、加算後の値をデータｄ５としてｄバス２２に出力する。なお一度にビットシフトと加算とが実行できない場合には、シフト後の値を一度汎用レジスタファイル１７に格納し、更に汎用レジスタファイル１７から読み出したシフト後の値を加算先の値に加算すればよい。行列レジスタファイル１６は、ｄバス２２上のデータｄ３（上記データｄ５）を受け取り、行レジスタｒ１に格納する。このようにして、各行レジスタｒ０乃至ｒ１４の内容を、右（最下位方向）に１ビットシフトし、シフト後の値を対応する行レジスタｒ１乃至ｒ１５に加算する。
【００３８】
図１５は、第１行から順番に行レジスタの格納内容をシフトしながら上の行の格納内容に加え合わせていく順次行加算処理を模式的に示す図である。図１５に示すように、行レジスタｒ０の最下位ビット３２はそのままにして、最上位ビット（第１６ビット）から第２ビットまでのビット列３１を矢印で示すように右（最下位方向）に１ビットシフトして、シフト後のビット列３１を上の行の格納内容に加算する。行レジスタｒ０の最下位ビット３２は、行列レジスタファイル１６の現在の位置（一番右下の位置）にそのままの値で保持される。同様にして、残りの行レジスタｒ１乃至ｒ１４の内容を、右（最下位方向）に１ビットシフトし、シフト後の値を対応する行レジスタｒ２乃至ｒ１５に順次加算する。なおこの際、順次加算処理を行なうので、その加算処理は累積加算処理となる。即ち例えば行レジスタｒ３に加算される行レジスタｒ２の内容は、行レジスタｒ０，ｒ１，及びｒ２の内容の累積和となっている。
【００３９】
図１６は、順次行加算処理を実行後の行列レジスタファイル１６の状態を示す図である。行列レジスタファイル１６において、各列の第１行の要素が各列に列方向に格納された２進数値の最下位ビットであり、第１６行の要素が最上位ビットである。従って、上記の順次行加算処理は、２ｍ−１の重みを有する第ｍ行を右（最下位方向）１ビットシフトすることにより、２ｍの重みを有する第ｍ＋１行に重みを合わせて（即ち桁を合わせて）加算していることになる。従って、順次行加算処理により全行の和をとることになり、行列レジスタファイル１６の全体により間接的に表現されていた総和値を、単一の２進数値に変換することができる。結果として得られる総和値は、図１６に示すビットｂ３０〜ｂ０の３１ビットにより表わされることになる。行列レジスタファイル１６の一番右側の列が総和値の下位ビットｂ１４〜ｂ０となるのは、各行を上の行に加算するときに、各行の累積値の最下位ビットをそのまま一番右側の列に残しているからである。また行列レジスタファイル１６の最上行（第１６行）が総和値の上位ビットｂ３０〜ｂ１５となるのは、最後に第１５行の行レジスタｒ１４を右（最下位方向）に１ビットシフトして第１６行の行レジスタｒ１５に加算した結果が、そのまま第１６行の位置に格納されているからである。このようにして、順次行加算処理を実行することにより、符号を無視した正の重みを有するビットの重み付け和、即ち符号を無視した正の総和値を求めることができる。
【００４０】
図１２のステップＳ３で、符号無し数として比較して、ｒ１５≧ｇ２であるか否かを判定する。ここでｒ１５は、前記の正の総和値の上位ビットｂ３０〜ｂ１５に相当し、ｇ２は、汎用レジスタｇ２に退避された負の重みを持つビット（正確にはその重み付け和）である。ｒ１５≧ｇ２である場合、符号を考慮した総和は０以上であることになり、ステップＳ４に進む。ステップＳ４では、図２の表中に示されるｓｕｂ命令により符号相殺処理を実行する。即ち、“ｓｕｂ  ｒ１５，ｇ２”を実行することにより、汎用レジスタｇ２の内容をレジスタｒ１５から減算する。具体的には、汎用レジスタファイル１７の汎用レジスタｇ２の値と行列レジスタファイル１６の行レジスタｒ１５の値とを算術論理演算器１４に供給し、算術論理演算器１４により減算を実行し、減算結果を行レジスタｒ１５に格納する。
【００４１】
図１７は、符号相殺処理を説明するための図である。この符号相殺処理では、順次行加算処理により求められた符号を無視した総和値（正の寄与分の総和）から、汎用レジスタに退避していた符号列累積値（負の寄与分の総和）を減算することにより、符号を考慮した総和値を求める。図１７には、順次行加算処理により求められた符号を無視した総和値の上位ビット４０（図１６の上位１６ビットｂ３０〜ｂ１５）と下位ビット４１（図１６の下位１５ビットｂ１４〜ｂ０）が示される。この符号を無視した総和値（ストレートバイナリである正の重み付け和）の上位１６ビット４０から、汎用レジスタに退避した符号列累積値４２を減算する。符号を無視した総和値の上位１６ビット４０から符号列累積値４２を減算した結果が、符号を考慮した総和値の上位１６ビット４３となる。また符号を無視した総和値の下位ビット４１が、そのまま、符号を考慮した総和値の下位１５ビット４４となる。
【００４２】
図１２のステップＳ５で、符号付き数として比較して、ｒ１５＜０であるか否かを判定する。即ち、行レジスタｒ１５の最上位ビット（第１６ビット）が１であるか否かを判定する。ｒ１５＜０である場合、即ち行レジスタｒ１５の最上位ビットが１である場合、正方向への桁あふれが生じていることが分かる。この場合、ステップＳ６において、正の飽和処理を実行する。具体的には、ｓｅｔ命令により、２１５−１を行列レジスタファイル１６の行レジスタｒ１５に格納するとともに、２１５−１を行列レジスタファイル１６の行レジスタｒ０に格納する。ここで行レジスタｒ１５が符号付き総和の上位１６ビット（符号１ビット＋値１５ビット）となり、行レジスタｒ０の下位１５ビットが符号付き総和の下位１５ビットとなる。ステップＳ５の判定でｒ１５が０以上である場合、即ち行レジスタｒ１５の最上位ビットが０である場合、桁あふれが生じていないので、そのまま処理を終了する。この場合、行レジスタｒ１５が符号付き総和の上位１６ビットとなり、列レジスタｃ０の最上位ビットを除いたビット（図１６のｂ１４〜ｂ０）が符号付き総和の下位１５ビットとなる。なお列レジスタｃ０の内容を行レジスタｒ０に転送することにより、桁あふれがある場合と同様に、行レジスタｒ０の下位１５ビットが符号付き総和の下位１５ビットとなるようにしてもよい。
【００４３】
図１２のステップＳ３の判定の結果ｒ１５≧ｇ２でない場合、符号を考慮した総和は０より小さいことになり、ステップＳ７に進む。ステップＳ７では、図２の表中に示されるｓｕｂ命令により符号相殺処理を実行する。即ち、“ｓｕｂ  ｒ１５，ｇ２”を実行することにより、汎用レジスタｇ２の内容をレジスタｒ１５から減算する。
【００４４】
次にステップＳ８で、符号付き数として比較して、ｒ１５≧０であるか否かを判定する。即ち、行レジスタｒ１５の最上位ビット（第１６ビット）が０であるか否かを判定する。ｒ１５≧０である場合、即ち行レジスタｒ１５の最上位ビットが０である場合、負方向への桁あふれが生じていることが分かる。この場合、ステップＳ９において、負の飽和処理を実行する。具体的には、ｓｅｔ命令により、−２１６を行列レジスタファイル１６の行レジスタｒ１５に格納するとともに、−２１６を行列レジスタファイル１６の行レジスタｒ０に格納する。ここで行レジスタｒ１５が符号付き総和の上位１６ビット（符号１ビット＋値１５ビット）となり、行レジスタｒ０の下位１５ビットが符号付き総和の下位１５ビットとなる。ステップＳ８の判定でｒ１５が０より小さい場合、即ち行レジスタｒ１５の最上位ビットが１である場合、桁あふれが生じていないので、そのまま処理を終了する。この場合、行レジスタｒ１５が符号付き総和の上位１６ビットとなり、列レジスタｃ０の最上位ビットを除いたビット（図１６のｂ１４〜ｂ０）が符号付き総和の下位１５ビットとなる。なお列レジスタｃ０の内容を行レジスタｒ０に転送することにより、桁あふれがある場合と同様に、行レジスタｒ０の下位１５ビットが符号付き総和の下位１５ビットとなるようにしてもよい。
【００４５】
上記説明した構成において、前述のように、図１に示す行列レジスタファイル１６は、複数Ｍ個のＮビット幅のレジスタにより構成され、行方向と列方向とにアクセス可能なＮ列Ｍ行のレジスタである。Ｍ及びＮは２以上の自然数であり、ＭはＮと等しいか又は異なってよい。ＭがＮより小さく、例えばＭ＝１５でＮ＝１６である場合、列レジスタの値を読み出すときには、１５ビットの値を読み出して第１６ビットの値は０として扱えばよい。ＭがＮより大きい場合には、指定列のＭビットを分割してＮビット毎にｂａｃ演算を実行すればよい。但し、Ｎビット毎に分割するのであれば、Ｎ×Ｎの行列レジスタファイル１６が複数個設けられているのと同様となる。従って、通常の構成では、ＭはＮと等しいか或いは小さい数であってよい。なお行列レジスタファイル１６は、列方向にアクセス可能である点において特殊ではあるが、行方向には通常のＮビット幅のレジスタとして使用できるので、総和計算以外の他の用途において使用することができる。またｂａｃ命令の累積演算については、ビット値が１であるビットの個数を数える機能としては既存のものが存在するので、それを加算機能と組み合わせて累積演算を行なってもよい。また累積演算器１５をハードウェアとして新たに設ける構成を採用するとしても、比較的単純な回路構成により実現できるので、Ｎビット幅以上のビット幅の加算器、バス、レジスタ等を必要とすることなく最低限の専用回路のみで総和計算を実現できる。
【００４６】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【符号の説明】
【００４７】
１０  数値演算装置
１１  命令デコードユニット
１２  命令フェッチユニット
１３  プログラムカウンタユニット
１４  算術論理演算器
１５  累積演算器
１６  行列レジスタファイル
１７  汎用レジスタファイル
１８  データアクセスユニット
【図１】
2011107972.tif 000003
【図２】
2011107972.tif 000004
【図３】
2011107972.tif 000005
【図４】
2011107972.tif 000006
【図５】
2011107972.tif 000007
【図６】
2011107972.tif 000008
【図７】
2011107972.tif 000009
【図８】
2011107972.tif 000010
【図９】
2011107972.tif 000011
【図１０】
2011107972.tif 000012
【図１１】
2011107972.tif 000013
【図１２】
2011107972.tif 000014
【図１３】
2011107972.tif 000015
【図１４】
2011107972.tif 000016
【図１５】
2011107972.tif 000017
【図１６】
2011107972.tif 000018
【図１７】
2011107972.tif 000019