(57)【特許請求の範囲】
【請求項１】
複数のプロセッサを用いて配列Ａと配列Ｂとの配列演算を実行する配列演算処理装置において、
前記各プロセッサが、
メモリ上に設けられる任意指定サイズの作業領域と、
メモリ上に設けられて、配列Ｂを分割した分割配列Ｂを記憶する記憶領域と、
メモリ上に設けられて、配列Ａを分割した分割配列Ａを、前記作業領域のサイズに応じて分割した分割配列単位Ａの集まりの形で記憶する記憶領域と、
分割配列Ａの記憶領域に記憶される分割配列単位Ａを他プロセッサの前記作業領域に転送する処理と、前記作業領域に記憶される分割配列単位Ａを他プロセッサの分割配列Ａの記憶領域に転送する処理とを交互に実行する転送手段と、
分割配列Ａの記憶領域に初期配置される分割配列単位Ａと、分割配列Ｂの記憶領域に記憶される分割配列Ｂとの配列演算を実行し、さらに、他プロセッサから転送されてきて前記作業領域あるいは分割配列Ａの記憶領域に記憶される分割配列単位Ａと、分割配列Ｂの記憶領域に記憶される分割配列Ｂとの配列演算を実行する演算手段とを備えることを、
特徴とする配列演算処理装置。
【請求項２】
請求項１記載の配列演算処理装置において、
前記転送手段は、前記演算手段が分割配列Ａの記憶領域に記憶される分割配列単位Ａを用いて配列演算を実行しているときには、その配列演算と並行させて他プロセッサの前記作業領域への転送処理を実行し、前記演算手段が前記作業領域に記憶される分割配列単位Ａを用いて配列演算を実行しているときには、その配列演算と並行させて他プロセッサの分割配列Ａの記憶領域への転送処理を実行することを、
特徴とする配列演算処理装置。
【請求項３】
請求項１又は２に記載の配列演算処理装置において、
前記転送手段は、循環先となる他プロセッサに対して分割配列単位Ａを転送することを、
特徴とする配列演算処理装置。
【請求項４】
請求項３に記載の配列演算処理装置において、
前記転送手段がプロセッサの台数に応じた規定回数の転送処理を終了するときに、プロセッサ台数が偶数であるのか奇数であるのかを判断して、奇数であることを判断する場合には、前記作業領域に記憶される分割配列単位Ａを分割配列Ａの記憶領域に複写することで、分割配列Ａの記憶領域に記憶される分割配列単位Ａを初期配置のものに戻す複写手段を備えることを、
特徴とする配列演算処理装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、複数のプロセッサを用いて配列Ａと配列Ｂとの配列演算を実行する配列演算処理装置に関し、特に、大きな作業領域を必要とすることなく配列演算を実行できるようにする配列演算処理装置に関する。
【０００２】
【従来の技術】
単一プロセッサ型計算機で、配列Ａと配列Ｂとの配列演算を行って配列Ｃを求める場合には、図２４に示すように、同一メモリ上に配列を展開することになる。しかるに、このような配列演算を並列計算機で行う場合には、各プロセッサのメモリに同じ配列を全て展開するのは現実的でないことから、図２５に示すように、配列を各プロセッサで分割して演算する方法を採っている。
【０００３】
このような分割演算処理構成を採る場合にあって、最初に割り付けられた配列部分のみの演算を行うことで演算処理が達成される場合には何ら問題はないものの、最初に割り付けられた配列部分以外の配列部分を必要とする場合には、各プロセッサに作業領域を用意して、この作業領域を使ってプロセッサ間通信でもって配列部分を交換していく処理を行うことになる。例えば、配列Ｂの分割配列Ｂｉを各プロセッサに常駐させる場合には、図２６に示すように、もう一方の配列Ａの分割配列Ａｉを交換していくことになる。
【０００４】
従来では、このとき用意する作業領域として、交換対象となる配列部分と同じ大きさを持つものを要求するという構成を採っていた。すなわち、配列Ｂの分割配列Ｂｉを各プロセッサに常駐させ、配列Ａの分割配列Ａｉを交換していく場合には、図２７に示すように、分割配列Ａｉと同じ大きさを持つ作業領域を用意して、これを使って分割配列Ａｉを交換していくことで、配列Ａと配列Ｂとの配列演算を行うという構成を採っていたのである。
【０００５】
【発明が解決しようとする課題】
しかしながら、このような従来技術に従っていると、交換対象となる配列部分と同じ大きさを持つ作業領域が必要となることから、メモリ消費量が増大するという問題点があった。
【０００６】
また、並列計算機では、プロセッサ数の可変性も考慮して、作業領域として使用するメモリ量も柔軟性が要求され、従来技術のように固定的な一意の大きさを持つ作業領域を用意するという方法は好ましいものではない。
【０００７】
本発明はかかる事情に鑑みてなされたものであって、複数のプロセッサを用いて配列Ａと配列Ｂとの配列演算を実行するときにあって、大きな作業領域を必要とすることなく配列演算を実行できるようにする新たな配列演算処理装置の提供を目的とする。
【０００８】
【課題を解決するための手段】
図１に本発明の原理構成を図示する。
図中、１は並列計算機を構成する複数のプロセッサであって、配列Ａと配列Ｂとの配列演算を実行するものである。
【０００９】
この各プロセッサ１は、メモリ上に設けられる指定されたサイズを持つ作業領域１０と、メモリ上に設けられて、配列Ｂを分割した分割配列Ｂを記憶する記憶領域１１と、メモリ上に設けられて、配列Ａを分割した分割配列Ａを、作業領域１０のサイズに応じて分割した分割配列単位Ａの集まりの形で記憶する記憶領域１２と、転送手段１４と、演算手段１５とを備える。
この転送手段１４は、分割配列Ａの記憶領域１２に記憶される分割配列単位Ａを他プロセッサの作業領域１０に転送する処理と、作業領域１０に記憶される分割配列単位Ａを他プロセッサの分割配列Ａの記憶領域１２に転送する処理とを交互に実行する。
演算手段１５は、分割配列Ａの記憶領域１２に初期配置される分割配列単位Ａと、分割配列Ｂの記憶領域１１に記憶される分割配列Ｂとの配列演算を実行し、さらに、他プロセッサから転送されてきて作業領域１０あるいは分割配列Ａの記憶領域１２に記憶される分割配列単位Ａと、分割配列Ｂの記憶領域１１に記憶される分割配列Ｂとの配列演算を実行する。
この構成を採るときにあって、転送手段１４が循環先となる他プロセッサに対して分割配列単位Ａを転送するという構成を採る場合にあって、転送手段１４がプロセッサの台数に応じた規定回数の転送処理を終了するときに、プロセッサ台数が偶数であるのか奇数であるのかを判断して、奇数であることを判断する場合には、作業領域１０に記憶される分割配列単位Ａを分割配列Ａの記憶領域１２に複写することで、分割配列Ａの記憶領域１２に記憶される分割配列単位Ａを初期配置のものに戻す複写手段を備えることがある。
【００１０】
【作用】
図２ないし図７に従って、このように構成される本発明の動作について具体的に説明する。
【００１１】
ここで、この具体例では、行列積演算を想定しており、第１番目のプロセッサ１（図中のＩＰ＝１）には、縦分割の分割配列単位Ａ１／Ａ２が初期展開されるとともに、縦分割の分割配列Ｂｉ１（ｉ＝１〜６）からなる分割配列Ｂ１が常駐展開され、第２番目のプロセッサ１（図中のＩＰ＝２）には、縦分割の分割配列単位Ａ３／Ａ４が初期展開されるとともに、縦分割の分割配列Ｂｉ２（ｉ＝１〜６）からなる分割配列Ｂ２が常駐展開され、第３番目のプロセッサ１（図中のＩＰ＝３）には、縦分割の分割配列単位Ａ５／Ａ６が初期展開されるとともに、縦分割の分割配列Ｂｉ３（ｉ＝１〜６）からなる分割配列Ｂ３が常駐展開されている。
【００１２】
ここで、行列積演算の演算規則に従って、Ａ１の列数とＢ１ｊ（ｊ＝１〜３）の行数とは等しく、Ａ２の列数とＢ２ｊ（ｊ＝１〜３）の行数とは等しく、Ａ３の列数とＢ３ｊ（ｊ＝１〜３）の行数とは等しく、Ａ４の列数とＢ４ｊ（ｊ＝１〜３）の行数とは等しく、Ａ５の列数とＢ５ｊ（ｊ＝１〜３）の行数とは等しく、Ａ６の列数とＢ６ｊ（ｊ＝１〜３）の行数とは等しくなる。
【００１３】
なお、この具体例では、配列Ａを３台のプロセッサ１で可能な限り等分割し、これを更に作業領域１０のサイズで可能な限り等分割することでＡ１〜Ａ６を生成することを想定していることから、この２つの等分割が不可能である場合には、サイズ的には、「Ａ１＝Ａ３＝Ａ５」で、「Ａ２＝Ａ４」で、「Ａ１≠Ａ２≠Ａ６」の関係がある。また、配列Ｂを３台のプロセッサ１で可能な限り等分割するとともに、Ａ１〜Ａ６の列数に応じて分割することでＢｉｊ（ｉ＝１〜６，ｊ＝１〜３）を生成することを想定していることから、この等分割が不可能である場合には、サイズ的には、「Ｂ１１＝Ｂ１２＝Ｂ３１＝Ｂ３２＝Ｂ５１＝Ｂ５２」で、「Ｂ２１＝Ｂ２２＝Ｂ４１＝Ｂ４２」で、「Ｂ１３＝Ｂ３３＝Ｂ５３」で、「Ｂ２３＝Ｂ４３」で、「Ｂ６１＝Ｂ６２」で、「Ｂ１１≠Ｂ２１≠Ｂ１３≠Ｂ２３≠Ｂ６１≠Ｂ６３」の関係がある。
【００１４】
このようにして、図２の上段のように分割配列Ｂ／分割配列単位Ａが初期配置されると、各プロセッサ１の演算手段１５は、分割配列Ｂと、分割配列Ａの第１段目に展開される分割配列単位Ａとの行列積演算に従い、図２の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ１×Ｂ１１，Ａ３×Ｂ３２，Ａ５×Ｂ５３」を算出する。
【００１５】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の作業領域１０（図中では配列Ｗで記述）に転送することで、図２の下段に示すように、各々の作業領域１０に「Ａ５，Ａ１，Ａ３」を展開する。
【００１６】
続いて、各プロセッサ１の演算手段１５は、分割配列Ｂと、作業領域１０に展開される分割配列単位Ａとの行列積演算に従い、図２の下段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ５×Ｂ５１，Ａ１×Ｂ１２，Ａ３×Ｂ３３」を算出する。
【００１７】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに転送することで、図３の上段に示すように、各々の分配配列Ａの第１段目に「Ａ３，Ａ５，Ａ１」を展開する。
【００１８】
続いて、各プロセッサ１の演算手段１５は、分割配列Ｂと、分割配列Ａの第１段目に展開される分割配列単位Ａとの行列積演算に従い、図３の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ３×Ｂ３１，Ａ５×Ｂ５２，Ａ１×Ｂ１３」を算出する。
【００１９】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の作業領域１０に転送することで、図３の下段に示すように、各々の作業領域１０に「Ａ１，Ａ３，Ａ５」を展開する。このようにして一巡した「Ａ１，Ａ３，Ａ５」は、図４に示すように、同一プロセッサ１内の元の分割配列Ａの第１段目に複写されることになる。
【００２０】
続いて、各プロセッサ１の演算手段１５は、分割配列Ｂと、分割配列Ａの第２段目に展開される分割配列単位Ａとの行列積演算に従い、図５の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ２×Ｂ２１，Ａ４×Ｂ４２，Ａ６×Ｂ６３」を算出する。
【００２１】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の作業領域１０に転送することで、図５の下段に示すように、各々の作業領域１０に「Ａ６，Ａ２，Ａ４」を展開する。
【００２２】
続いて、各プロセッサ１の演算手段１５は、分割配列Ｂと、作業領域１０に展開される分割配列単位Ａとの行列積演算に従い、図５の下段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ６×Ｂ６１，Ａ２×Ｂ２２，Ａ４×Ｂ４３」を算出する。
【００２３】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに転送することで、図６の上段に示すように、各々の分配配列Ａの第２段目に「Ａ４，Ａ６，Ａ２」を展開する。
【００２４】
続いて、各プロセッサ１の演算手段１５は、分割配列Ｂと、分割配列Ａの第２段目に展開される分割配列単位Ａとの行列積演算に従い、図６の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ４×Ｂ４１，Ａ６×Ｂ６２，Ａ２×Ｂ２３」を算出する。
【００２５】
続いて、各プロセッサ１の転送手段１４は、演算の終了した分割配列単位Ａを循環先となる他プロセッサ１の作業領域１０に転送することで、図６の下段に示すように、各々の作業領域１０に「Ａ２，Ａ４，Ａ６」を展開する。このようにして一巡した「Ａ２，Ａ４，Ａ６」は、図７に示すように、同一プロセッサ１内の元の分割配列Ａの第２段目に複写されることになる。
【００２６】
以上の処理に従って、配列Ａと配列Ｂとの行列積演算が完了することになるが、この演算処理の高速化を図るために、図８に示すように、転送手段１４は、演算手段１５が分割配列Ａの記憶領域１２に記憶される分割配列単位Ａを用いて行列積演算を実行しているときには、その行列積演算と並行させて、その分割配列単位Ａを他プロセッサの作業領域１０へ転送し、演算手段１５が作業領域１０に記憶される分割配列単位Ａを用いて配列演算を実行しているときには、その行列積演算と並行させて、その分割配列単位Ａを他プロセッサの分割配列Ａの記憶領域１２へ転送していくことが好ましい。
【００２７】
このように、本発明では、複数のプロセッサを用いて配列Ａと配列Ｂとの配列演算を実行するときにあって、交換対象となる配列部分と同じ大きさを持つ作業領域１０を用意する必要がなくなって、任意サイズの小さな作業領域１０を用意すれば足りることから、メモリ消費量を削減できるようになる。
【００２８】
そして、この作業領域１０のサイズは任意に指定できることから、本発明を用いることで、メモリ消費量の削減を優先するときには、作業領域１０のメモリサイズを小さく設定し、処理速度を優先するときには、通信回数を削減しベクトル効率を高めるために、作業領域１０のメモリサイズを大きく設定するというように、利用者プログラムの希望する態様に従って配列演算を実行できるようになる。
【００２９】
【実施例】
以下、行列Ａと行列Ｂとを行列積演算することで行列Ｃを求める実施例に従って本発明を詳細に説明する。
【００３０】
最初に、利用者プログラムが与える各パラメータの意味について説明する。ここで、ＮＰは動作させるプロセッサ１の台数であって、システムが与えるものである。
【００３１】
行列Ａの行数をＭ、行列Ａの列数をＮ、行列Ｂの行数をＮ、行列Ｂの列数をＬ、行列Ｃの行数をＭ、行列Ｃの列数をＬ、行列Ａを含んでＮＰで割り切れる列数ＮＲを持つＭ行×ＮＲ列の配列Ａ、行列Ｂを含んでＮＰで割り切れる行数ＮＲ／列数ＬＲを持つＮＲ行×ＬＲ列の配列Ｂ、行列Ｃを含んでＮＰで割り切れる列数ＬＲを持つＭ行×ＬＲ列の配列Ｃ、ＮＰで割り切れる列数ＮＢＰＥを持つＭ行×ＮＢＰＥ列の作業配列Ｗ、配列Ａの列数ＮＲをＮＰで分割した列数ＮＤ、配列Ｂ及び配列Ｃの列数ＬＲをＮＰで分割した列数ＬＤ、作業配列Ｗの列数ＮＢＰＥをＮＰで分割した列数ＮＢＬを定義する。ここで、作業配列Ｗが、図１に示した作業領域１０に相当するものである。
【００３２】
図９（ａ）に、行列Ａ／配列Ａに関しての各パラメータ値、図９（ｂ）に、行列Ｂ／配列Ｂに関しての各パラメータ値、図１０（ａ）に、行列Ｃ／配列Ｃに関しての各パラメータ値、図１０（ｂ）に、作業配列Ｗに関しての各パラメータ値を図示する。なお、これらの図では「ＮＰ＝３」を想定している。
【００３３】
このように、行列Ａ／行列Ｂ／行列Ｃ／作業配列Ｗをプロセッサ１の台数に応じて縦分割して各プロセッサ１に分割配置することになることから、列数ＮＤは行列Ａの分割幅となり、列数ＬＤは行列Ｂ及び行列Ｃの分割幅となり、列数ＮＢＬは作業配列Ｗの分割幅となる。
【００３４】
次に、以下に説明する処理フローで用いる各値の意味について説明する。
ＮＥＰＥは、行列Ａがまたがるプロセッサ１の台数、ＬＥＰＥは、行列Ｂ及び行列Ｃがまたがるプロセッサ１の台数、ＭＯＤＮＰＥは、行列Ａがまたがる最後のプロセッサ１に展開される行列Ａの列数、ＭＯＤＬＰＥは、行列Ｂ及び行列Ｃがまたがる最後のプロセッサ１に展開される行列Ｂ及び行列Ｃの列数、ＬＯＯＰＮは、配列Ａの分割幅ＮＤを作業配列Ｗの分割幅ＮＢＬで割った商、ＭＯＤＮは、配列Ａの分割幅ＮＤを作業配列Ｗの分割幅ＮＢＬで割った余り、ＬＯＯＰＮＦは、行列Ａがまたがる最後のプロセッサ１に展開される行列Ａの列数ＭＯＤＮＰＥを作業配列Ｗの分割幅ＮＢＬで割った商、ＭＯＤＮＦは、行列Ａがまたがる最後のプロセッサ１に展開される行列Ａの列数ＭＯＤＮＰＥを作業配列Ｗの分割幅ＮＢＬで割った余り、ＩＰは、１から始まるプロセッサ１の識別番号である。
【００３５】
すなわち、ＭＯＤＮＰＥは、図９（ａ）の例で説明するならば、第３番目のプロセッサ１に展開される行列Ａの列数であり、ＭＯＤＬＰＥは、図９（ｂ），図１０（ａ）の例で説明するならば、第３番目のプロセッサ１に展開される行列Ｂ及び行列Ｃの列数であり、ＬＯＯＰＮは、図９（ａ）の例で説明するならば、列数ＮＤが列数ＮＢＬを１つ包含することから“１”の値をとり、ＭＯＤＮは、図９（ａ）の例で説明するならば、ＬＯＯＰＮが“１”であることに対応して“ＮＤ−１×ＮＢＬ”の値をとり、ＬＯＯＰＮＦは、図９（ａ）の例で説明するならば、列数ＭＯＤＮＰＥが列数ＮＢＬを１つ包含することから“１”の値をとり、ＭＯＤＮＦは、ＬＯＯＰＮＦが“１”であることに対応して“ＭＯＤＮＰＥ−１×ＮＢＬ”の値をとる。
【００３６】
ここで、行列Ａが、プロセッサ台数と作業配列Ｗの分割幅ＮＢＬとにより、図９（ａ）のように縦分割されるときには、行列積演算の演算規則に従って、行列Ｂは、図９（ｂ）に示すように、この分割形態と同一形式に従って横分割されることになる。すなわち、分割される行列Ａの列数と同じ分割形態に従って、行列Ｂの行数が分割されることになる。
【００３７】
また、図２ないし図７で説明したように、各プロセッサ１に分割配置される行列Ａの第１段目の小分割部分（ＮＢＬによる分割部分）に対して処理を行い、続いて第２段目の小分割部分に対して処理を行うという順序でもって巡回的に処理を行っていくことになることから、列数ＮＤの行列Ａ部分を持つプロセッサ１については、“ＬＯＯＰＮ＋１”が巡回予定回数となって、最後の巡回時に処理する列数がＭＯＤＮとなり、列数ＭＯＤＮＰＥの行列Ａ部分を持つプロセッサ１については、“ＬＯＯＰＮＦ＋１”が巡回予定回数となって、その最後の巡回時に処理する列数がＭＯＤＮＦとなる。但し、「“ＬＯＯＰＮＦ＋１”≦“ＬＯＯＰＮ＋１”」の関係式が成立することから、最終的な巡回予定回数は、“ＬＯＯＰＮ＋１”である。
【００３８】
次に、以下に説明する処理フローで用いる計算ブロックの各表示値の意味について説明する。
ＮＸＴは、プロセッサ１の台数に応じて分割された配列Ａの各分割部分の先頭を指すポインタであり、“０”〜“ＮＰ−１”をとる。ＩＯＦは、プロセッサ１の台数に応じて分割された作業配列Ｗの各分割部分の先頭を指すポインタであり、“０”〜“（ＮＰ−１）×ＮＢＬ”をとる。ＩＮＮは、プロセッサ１の台数に応じて分割された配列Ａの各分割部分が持つ各小分割部分（ＮＢＬによる分割部分）の先頭を指すポインタであり、“０”〜“ＬＯＯＰＮ×ＮＢＬ”をとる。ＩＩＯＦは、配列Ａの全体を指すポインタであり、“ＮＸＴ×ＮＤ＋ＩＮＮ”をとる。ＩＰＰＣは、配列Ｂの縦方向の演算対象領域番号であり、“１”〜“ＮＰ”をとる。ＭＯＦは、行列Ｂの縦方向の計算開始位置を指すポインタであり、“０”〜“（ＮＰ−１）×ＮＤ”をとる。
【００３９】
図１１（ａ）に、図９（ａ）を例とするＮＸＴ／ＩＮＮ／ＩＩＯＦの値、図１１（ｂ）に、図９（ｂ）を例とするＩＰＰＣ／ＭＯＦの値、図１２に、図１０（ｂ）を例とするＩＯＦの値を図示する。
【００４０】
図１３ないし図１８に、各プロセッサ１が行列Ａと行列Ｂとを行列積演算することで行列Ｃを求めるときに実行する処理フローの一実施例を図示する。次に、これらの処理フローに従って本発明を詳細に説明する。
【００４１】
プロセッサ１は、行列積演算の指示を受け取ると、図１３ないし図１７の処理フローに示すように、先ず最初に、ステップ１で、動作させるプロセッサ１の台数ＮＰが奇数なのか偶数なのかを調べる。
【００４２】
図８で説明したように、本発明では、分割配置される配列Ａの行列部分と、分割配置される配列Ｂの行列部分との行列積演算を実行している間に、その演算中の配列Ａ部分を循環先となる他プロセッサ１の作業配列Ｗへ転送していくとともに、作業配列Ｗに展開される配列Ａの行列部分と、分割配置される配列Ｂの行列部分との行列積演算を実行している間に、その演算中の配列Ａ部分を循環先となる他プロセッサ１の分割配置の配列Ａへ転送していく構成を採る。
【００４３】
図８（ｂ）に示すように、この２つの転送処理をペアーとして見るならば、プロセッサ１の台数ＮＰが偶数のときには、後述する具体例からも分かるように、このペアーの転送処理の終了時点で処理が完了するのに対して、プロセッサ１の台数ＮＰが奇数のときには、図２ないし図７の具体例からも分かるように、このペアーの転送処理の半分の時点で処理が完了することになる。これから、このステップ１では、どの時点で処理を完了させるのか認識するために、プロセッサ１の台数ＮＰが奇数なのか偶数なのかを調べるのである。
【００４４】
続いて、ステップ２で、列数Ｎを列数ＮＤで割った商に“１”を加えたものをＮＥＰＥに入れることで、行列Ａがまたがるプロセッサ台数のＮＥＰＥを求める。続いて、ステップ３で、列数Ｎを列数ＮＤで割った余りをＭＯＤＮＰＥに入れることで、行列Ａがまたがる最後のプロセッサ１に展開される行列Ａの列数ＭＯＤＮＰＥを求める。
【００４５】
続いて、ステップ４で、列数Ｌを列数ＬＤで割った商に“１”を加えたものをＬＥＰＥに入れることで、行列Ｂ及び行列Ｃがまたがるプロセッサ台数のＬＥＰＥを求める。続いて、ステップ５で、列数Ｌを列数ＬＤで割った余りをＭＯＤＬＰＥに入れることで、行列Ｂ及び行列Ｃがまたがる最後のプロセッサ１に展開される行列Ｂ及び行列Ｃの列数ＭＯＤＬＰＥを求める。
【００４６】
続いて、ステップ６で、列数ＮＤを列数ＮＢＬで割った商をＬＯＯＰＮに入れることで、巡回予定回数“ＬＯＯＰＮ＋１”を求めるのに必要となるＬＯＯＰＮを求めるとともに、そのときの余りをＭＯＤＮに入れることで、その最後の巡回時に処理する列数ＭＯＤＮを求める。
【００４７】
続いて、ステップ７で、列数Ｎが列数ＮＲに等しいか否かを判断して、等しくないことを判断するときには、ステップ８に進んで、列数ＭＯＤＮＰＥを列数ＮＢＬで割った商をＬＯＯＰＮＦに入れることで、巡回予定回数“ＬＯＯＰＮＦ＋１”を求めるのに必要となるＬＯＯＰＮＦを求めるとともに、そのときの余りをＭＯＤＮＦに入れることで、その最後の巡回時に処理する列数ＭＯＤＮＦを求める。一方、ステップ７で等しいことを判断するときには、ステップ８の処理を省略する。
【００４８】
続いて、ステップ９で、作業配列Ｗの分割幅となる列数ＮＢＬを、作業配列Ｗの計算列数を格納するＮＢＬＷに格納する。なお、このＮＢＬＷについては上述していない。
【００４９】
続いて、ステップ１０で、行列Ｂ及び行列Ｃの分割幅となる列数ＬＤを、行列Ｂ及び行列Ｃがまたがる最後のプロセッサ１に展開される行列Ｂ及び行列Ｃの列数を格納するＬＦＮＬＰＥに仮に入れる。なお、このＬＦＮＬＰＥについては上述していない。
【００５０】
続いて、ステップ１１で、列数ＭＯＤＬＰＥが“０”であるのか否かを判断して、“０”でないことを判断するときには、ステップ１２に進んで、ＬＦＮＬＰＥの内容をこのＭＯＤＬＰＥに書き換える。一方、ステップ１１で“０”であることを判断するときには、ステップ１２の処理を省略する。このステップ１０ないしステップ１２の処理に従って、ＬＦＮＬＰＥには、行列Ｂ及び行列Ｃがまたがる最後のプロセッサ１に展開される行列Ｂ及び行列Ｃの正確な列数が入ることになる。
【００５１】
続いて、ステップ１３で、行列Ｃの領域（１：Ｍ，１：ＬＤ）をクリアする。続いて、ステップ１４で、巡回回数を表示する巡回カウンタＩＩＩ  に“０”を入れる。続いて、ステップ１５で、巡回カウンタＩＩＩ  のカウント値を１つカウントアップする。この時点では、巡回カウンタＩＩＩ  のカウント値は“１”となる。なお、この巡回カウンタＩＩＩ  については上述していないが、図２ないし図７の左側部分に示す「ＩＩＩ  ＝１，２」は、この巡回カウンタＩＩＩ  のカウント値を示している。続いて、ステップ１６で、配列Ｂの縦方向の演算対象領域番号を表示するＩＰＰＣに、初期値として自プロセッサ番号ＩＰを入れる。
【００５２】
続いて、ステップ１７で、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮ＋１”に到達したのか否かを判断して、到達を判断するときには、ステップ１８に進んで、最後の巡回時に処理する列数ＭＯＤＮを、作業配列Ｗの計算列数を格納するＮＢＬＷに格納する。続いて、ステップ１９で、列数ＭＯＤＮが“０”であるのか否かを判断して、“０”であることを判断するときには、全処理を終了し、“０”でないことを判断するときには、次に説明するステップ２０の処理に進む。一方、ステップ１７で未到達を判断するときには、ステップ１８／ステップ１９の処理を省略する。
【００５３】
続いて、ステップ２０で、配列Ａから作業配列Ｗへのデータ転送準備として、分割された配列Ａの各分割部分が持つ各小分割部分（ＮＢＬによる分割部分）の先頭を指すポインタＩＮＮに、“（ＩＩＩ−１）×ＮＢＬ”を入れる。ここで、ＩＩＩ  は巡回カウンタＩＩＩ  のカウント値であり、この“（ＩＩＩ−１）×ＮＢＬ”は、現在行列積演算対象となっている小分割部分の先頭を指すことになる。このポインタＩＮＮの指す小分割部分のデータが転送対象となる。
【００５４】
続いて、ステップ２１で、転送回数を表示する転送回数カウンタＩＷに“−１”を入れる。続いて、ステップ２２で、転送回数カウンタＩＷのカウント値を２つカウントアップする。この時点では、転送回数カウンタＩＷのカウント値は“１”となる。なお、この転送回数カウンタＩＷについては上述していないが、図２ないし図７の左側部分に示す「ＩＷ＝１，３」は、この転送回数カウンタＩＷのカウント値を示している。
【００５５】
続いて、ステップ２３で、転送回数カウンタＩＷのカウント値が“１”であるのか否かを判断して、“１”でないことを判断するときは、ステップ２４に進んで、後述するステップ３５の処理に従って実行に入る作業配列Ｗから配列Ａへのデータ転送終了を確認する。一方、ステップ２３で“１”であることを判断するときは、初めて行列積演算に入ることを意味しているのでステップ２４の処理を省略する。なお、ステップ２３で、プロセッサ台数ＮＰが“１”であることを判断するときにも、ステップ２４の処理を省略することになる。
【００５６】
続いて、ステップ２５で、配列Ａから作業配列Ｗへのデータ転送準備として、自プロセッサ番号ＩＰがプロセッサ台数ＮＰと一致するのか否かを判断する。すなわち、自プロセッサ番号ＩＰが、最終のプロセッサ番号であるのか否かを判断するのである。
【００５７】
このステップ２５で、自プロセッサ番号ＩＰが最終のプロセッサ番号であることを判断するときには、ステップ２６に進み、配列Ａのデータの転送先となるプロセッサ番号が循環先の“１”であることに対応して、分割された配列Ａの各分割部分の先頭を指すポインタＮＸＴに“０”を入れる。一方、自プロセッサ番号ＩＰが最終のプロセッサ番号でないことを判断するときには、ステップ２７に進み、配列Ａのデータの転送先となるプロセッサ番号が自プロセッサ番号ＩＰに“１”を加算したものであることに対応して、ポインタＮＸＴに自プロセッサ番号ＩＰを入れる。すなわち、プロセッサ番号は“１”から始まり、ＮＸＴは“０”から始まることを考慮して、ポインタＮＸＴに自プロセッサ番号ＩＰを入れるのである。
【００５８】
このステップ２６／ステップ２７処理を終了すると、続いて、ステップ２８で、配列Ａから作業配列Ｗへのデータ転送準備として、転送先となる作業配列Ｗの格納場所を示すＩＯＦに、“ＮＸＴ×ＮＢＬ”を入れる。
【００５９】
このようにして、ステップ２０で転送対象を設定し、ステップ２５ないしステップ２８で転送先を設定すると、続いて、ステップ２９で、転送対象として設定したポインタＩＮＮの指す配列Ａの小分割部分のデータを、転送先として設定したプロセッサ番号“ＮＸＴ＋１”のプロセッサ１の持つ作業配列Ｗへ転送する。すなわち、自分の持つ配列Ａ部分（１：Ｍ，１＋ＩＮＮ：ＮＢＬＷ＋ＩＮＮ）のデータを、プロセッサ番号“ＮＸＴ＋１”のプロセッサ１の持つ作業配列Ｗ（１：Ｍ，１＋ＩＯＦ：ＮＢＬＷ＋ＩＯＦ）に転送するのである。
【００６０】
続いて、ステップ３０で、後述する図１８の処理フローに従い、行列Ｂの縦方向の計算開始位置を指すポインタＭＯＦと、演算対象となる行列Ｂの計算列数を表示するＬＤＷと、演算対象となる行列Ａの計算列数及び行列Ｂの計算行数を表示するＮＤＷとを設定する。なお、このＬＤＷ／ＮＤＷについては上述していない。
【００６１】
このステップ３０での設定処理が終了すると、ステップ２９でのデータ転送処理と並行して、続いて、ステップ３１で、このステップ３０で設定したＭＯＦ／ＬＤＷ／ＮＤＷを使い、巡回カウンタＩＩＩ  のカウント値の指す配列Ａ部分のデータの行列積演算を実行する。すなわち、自分の持つ配列Ａ部分（１：Ｍ，１＋ＩＮＮ：ＮＤＷ＋ＩＮＮ）のデータと、自分の持つ配列Ｂ部分（１＋ＭＯＦ＋ＩＮＮ：ＮＤＷ＋ＭＯＦ＋ＩＮＮ，１：ＬＤＷ）のデータとの行列積演算を実行するのである。
【００６２】
続いて、ステップ３２で、プロセッサ台数ＮＰが奇数で、転送回数カウンタＩＷのカウント値が“ＮＰ−１”以上になったのか否かを判断して、この条件が成立するときには、配列Ａ部分のデータ転送が一巡したことを意味するので、巡回カウンタＩＩＩ  のカウント値を１つカウントアップして行われる次の巡回処理レベルに進むべく後述するステップ４４に進む。
【００６３】
一方、ステップ３２での条件が成立しないときには、ステップ３３に進んで、ステップ２９のデータ転送処理が終了することを確認する。続いて、ステップ３４で、作業配列Ｗから配列Ａへのデータ転送準備として、配列Ａの格納場所を示すポインタＩＩＯＦに、“ＮＸＴ×ＮＤ＋ＩＮＮ”を入れる。
【００６４】
このようにして、ステップ３４で転送先を設定すると、続いて、ステップ３５で、転送対象となる作業配列Ｗのデータを、転送先として設定したプロセッサ番号“ＮＸＴ＋１”のプロセッサ１に展開されるポインタＩＩＯＦの指す配列Ａ部分へ転送する。すなわち、自分の持つ作業配列Ｗ（１：Ｍ，１：ＮＢＬＷ）のデータを、プロセッサ番号“ＮＸＴ＋１”のプロセッサ１に展開されるポインタＩＩＯＦの指す配列Ａ部分（１：Ｍ，１＋ＩＩＯＦ：ＮＢＬＷ＋ＩＩＯＦ）に転送するのである。
【００６５】
続いて、ステップ３６で、作業配列Ｗと配列Ｂとの行列積演算を行うために、配列Ｂの縦方向の演算対象領域番号ＩＰＰＣの値を１つ減算する。続いて、ステップ３７で、ステップ３６で減算したＩＰＰＣの値が“０”となったか否かを判断して、“０”となることを判断するときには、続いて、ステップ３８で、ＩＰＰＣに最終のプロセッサ番号であるＮＰを入れる。一方、ステップ３７で“０”でないことを判断するときには、ステップ３８の処理を省略する。
【００６６】
続いて、ステップ３９で、後述する図１８の処理フローに従い、行列Ｂの縦方向の計算開始位置を指すポインタＭＯＦと、演算対象となる行列Ｂの計算列数を表示するＬＤＷと、演算対象となる行列Ａの計算列数及び行列Ｂの計算行数を表示するＮＤＷとを設定する。
【００６７】
このステップ３９での設定処理が終了すると、ステップ３５での転送処理と並行して、続いて、ステップ４０で、このステップ３９で設定したＭＯＦ／ＬＤＷ／ＮＤＷを使い、作業配列Ｗ部分のデータの行列積演算を実行する。すなわち、自分の持つ作業配列Ｗ部分（１：Ｍ，１：ＮＤＷ）のデータと、自分の持つ配列Ｂ部分（１＋ＭＯＦ＋ＩＮＮ：ＮＤＷ＋ＭＯＦ＋ＩＮＮ，１：ＬＤＷ）のデータとの行列積演算を実行するのである。
【００６８】
続いて、ステップ４１で、配列Ａと配列Ｂとの行列積演算を行うために、配列Ｂの縦方向の演算対象領域番号ＩＰＰＣの値を１つ減算する。続いて、ステップ４２で、ステップ４１で減算したＩＰＰＣの値が“０”となったか否かを判断して、“０”となることを判断するときには、続いて、ステップ４３で、ＩＰＰＣに最終のプロセッサ番号であるＮＰを入れる。一方、ステップ４２で“０”でないことを判断するときには、ステップ４３の処理を省略する。
【００６９】
続いて、ステップ４４で、転送回数カウンタＩＷの値に“２”を加算した“ＩＷ＋２”の値が、プロセッサ台数ＮＰより大きくなったか否かを判断して、大きくなっていないことを判断するときはステップ２２に戻って、巡回カウンタＩＩＩ  のカウント値を同一値に保持したままで行われる同一巡回処理レベルの処理を進めていく。
【００７０】
一方、ステップ４４で大きくなったことを判断するときには、ステップ４５に進んで、プロセッサ台数ＮＰが奇数であるのか偶数であるのかを判断する。
このステップ４５で、プロセッサ台数ＮＰが奇数であることを判断するときには、ステップ４６に進み、ステップ２９のデータ転送処理の終了を確認する。すなわち、プロセッサ台数ＮＰが奇数であるときには、ステップ３２を介してステップ４４に飛ぶことで、ステップ２９のデータ転送処理の終了を確認していないことから、これを確認するのである。そして、続くステップ４７で、配列Ａのデータがシフトされたまま元に戻されておらず、作業配列Ｗ上に元の順序で格納されていることに対応して、同一プロセッサ１内で、作業配列Ｗのデータを配列Ａ（１：Ｍ，１＋ＩＮＮ：ＮＢＬＷ＋ＩＮＮ）に複写する。一方、プロセッサ台数ＮＰが偶数であることを判断するときには、ステップ４８に進み、ステップ３５のデータ転送処理の終了を確認する。
【００７１】
このステップ４７／ステップ４８の処理を終了すると、続いて、ステップ４９で、巡回カウンタＩＩＩ  のカウント値が、巡回予定回数“ＬＯＯＰＮ＋１”に到達したのか否かを判断して、到達を判断するときには、全処理を終了し、未到達を判断するときには、巡回カウンタＩＩＩ  のカウント値を１つカウントアップして行われる次の巡回処理レベルに進むべく、ステップ１５に戻る。
【００７２】
以上の処理に従って、利用者プログラムの指定する任意のサイズの作業領域１０を使って、行列Ａと行列Ｂとの行列積演算が実行されることになる。なお、以上の処理では説明を省略したが、行列積演算の結果は配列Ｃに格納され、これらの格納値が累積加算されることで最終的な演算値が求められることになる。
【００７３】
次に、図１８の処理フローに従い、上述のステップ３０／ステップ３９で実行するＭＯＦ／ＬＤＷ／ＮＤＷの設定処理について説明する。
上述のステップ３０／ステップ３９の処理に入ると、図１８の処理フローに示すように、先ず最初に、ステップ１で、行列Ｂの縦方向の計算開始位置を指すポインタＭＯＦに、“（ＩＰＰＣ−１）×ＮＤ”を入れる。
【００７４】
続いて、ステップ２で、演算対象となる行列Ｂの計算列数を表示するＬＤＷに、初期値として列数ＬＤを入れる。
続いて、ステップ３で、「列数ＭＯＤＬＰＥが“０”でなく、かつ、（自プロセッサ番号ＩＰがプロセッサ台数ＮＰに等しい、または、自プロセッサ番号ＩＰがプロセッサ数ＬＥＰＥに等しい）」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ４に進んで、計算列数ＬＤＷに列数ＬＦＮＬＰＥを入れてからステップ９に進む。
【００７５】
続いて、ステップ５で、「自プロセッサ番号ＩＰがプロセッサ数ＬＥＰＥより大きく、かつ、列数ＭＯＤＬＰＥが“０”でない」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ６に進んで、計算列数ＬＤＷに列数“０”を入れてからステップ９に進む。
【００７６】
続いて、ステップ７で、「自プロセッサ番号ＩＰがプロセッサ数ＬＥＰＥ以上で、かつ、列数ＭＯＤＬＰＥが“０”で、かつ、列数Ｌと列数ＬＲとが異なる」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ８に進んで、計算列数ＬＤＷに列数“０”を入れてからステップ９に進む。
【００７７】
続いて、ステップ９で、演算対象となる行列Ａの計算列数及び行列Ｂの計算行数を表示するＮＤＷ（計算列数ＮＤＷと略記する）に、初期値として作業配列Ｗの計算列数ＮＢＬＷを入れる。
【００７８】
続いて、ステップ１０で、「列数Ｎが列数ＮＲに等しく、かつ、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮ＋１”に等しい」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ１１に進んで、計算列数ＮＤＷに列数ＭＯＤＮを入れて全処理を終了する。
【００７９】
続いて、ステップ１２で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”でなく、かつ、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥより大きい」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ１３に進んで、計算列数ＬＤＷに列数“０”を入れる。
【００８０】
続いて、ステップ１４で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”でなく、かつ、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮ＋１”に等しく、かつ、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥより小さく、かつ、列数ＭＯＤＮが“０”でない」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ１５に進んで、計算列数ＮＤＷに列数ＭＯＤＮを入れて全処理を終了する。
【００８１】
続いて、ステップ１６で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”でなく、かつ、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮＦ＋１”に等しく、かつ、（演算対象領域番号ＩＰＰＣがプロセッサ台数ＮＰに等しい、または、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥに等しい）」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ１７に進んで、計算列数ＮＤＷに列数ＭＯＤＮＦを入れて全処理を終了する。
【００８２】
続いて、ステップ１８で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”でなく、かつ、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮＦ＋１”より大きく、かつ、（演算対象領域番号ＩＰＰＣがプロセッサ台数ＮＰに等しい、または、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥに等しい）」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ１９に進んで、計算列数ＬＤＷに列数“０”を入れて全処理を終了する。
【００８３】
続いて、ステップ２０で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”で、かつ、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥ以上）」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ２１に進んで、計算列数ＬＤＷに列数“０”を入れて全処理を終了する。
【００８４】
続いて、ステップ２２で、「列数Ｎが列数ＮＲと異なり、かつ、列数ＭＯＤＮＰＥが“０”で、かつ、巡回カウンタＩＩＩ  のカウント値が巡回予定回数“ＬＯＯＰＮ＋１”に等しく、かつ、演算対象領域番号ＩＰＰＣがプロセッサ数ＮＥＰＥより小さい」という条件が成立するか否かを判断して、この条件が成立するときには、ステップ２３に進んで、計算列数ＮＤＷに列数ＭＯＤＮを入れて全処理を終了する。
このようにして、この図１８の処理フローに従って、行列Ｂの縦方向の計算開始位置を指すポインタＭＯＦに、“（ＩＰＰＣ−１）×ＮＤ”が設定され、演算対象となる行列Ｂの計算列数を表示するＬＤＷに、列数ＬＤか、列数ＬＦＮＬＰＥか、列数“０”が設定され、演算対象となる行列Ａの計算列数及び行列Ｂの計算行数を表示するＮＤＷに、列数ＮＢＬか、列数ＭＯＤＮか、列数ＭＯＤＮＦか、列数“０”が設定され、これらのＭＯＦ／ＬＤＷ／ＮＤＷを使うことで、図１３ないし図１７の処理フローで実行する行列積演算のデータ範囲が正確に画定されることになる。
【００８５】
図２ないし図７に、このように構成される本発明の動作の具体例を示した。この具体例では、プロセッサ台数ＮＰが“３”という奇数もので開示したが、次に、プロセッサ台数ＮＰが偶数の具体例について開示する。
【００８６】
図１９ないし図２３に、プロセッサ台数ＮＰが“４”という偶数の場合の動作具体例を図示する。なお、ここでは、図１で使用した用語を用いている。
この具体例では、第１番目のプロセッサ１（図中のＩＰ＝１）には、分割配列単位Ａ１／Ａ２が初期展開されるとともに、分割配列Ｂｉ１（ｉ＝１〜８）からなる分割配列Ｂ１が常駐展開され、第２番目のプロセッサ１（図中のＩＰ＝２）には、分割配列単位Ａ３／Ａ４が初期展開されるとともに、分割配列Ｂｉ２（ｉ＝１〜８）からなる分割配列Ｂ２が常駐展開され、第３番目のプロセッサ１（図中のＩＰ＝３）には、分割配列単位Ａ５／Ａ６が初期展開されるとともに、分割配列Ｂｉ３（ｉ＝１〜８）からなる分割配列Ｂ３が常駐展開され、第４番目のプロセッサ１（図中のＩＰ＝４）には、分割配列単位Ａ７／Ａ８が初期展開されるとともに、分割配列Ｂｉ４（ｉ＝１〜８）からなる分割配列Ｂ４が常駐展開されていることを想定している。
【００８７】
ここで、行列積演算の演算規則に従って、Ａ１の列数とＢ１ｊ（ｊ＝１〜４）の行数とは等しく、Ａ２の列数とＢ２ｊ（ｊ＝１〜４）の行数とは等しく、Ａ３の列数とＢ３ｊ（ｊ＝１〜４）の行数とは等しく、Ａ４の列数とＢ４ｊ（ｊ＝１〜４）の行数とは等しく、Ａ５の列数とＢ５ｊ（ｊ＝１〜４）の行数とは等しく、Ａ６の列数とＢ６ｊ（ｊ＝１〜４）の行数とは等しく、Ａ７の列数とＢ７ｊ（ｊ＝１〜４）の行数とは等しく、Ａ８の列数とＢ８ｊ（ｊ＝１〜４）の行数とは等しくなる。
【００８８】
このようにして、図１９の上段のように分割配列Ｂ／分割配列単位Ａが初期配置されると、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、分割配列Ａの第１段目に展開される分割配列単位Ａとの行列積演算に従い、図１９の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ１×Ｂ１１，Ａ３×Ｂ３２，Ａ５×Ｂ５３、Ａ７×Ｂ７４」を算出する。
【００８９】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の作業配列Ｗに並列的に転送していくことで、図１９の下段に示すように、各々の作業配列Ｗに「Ａ７，Ａ１，Ａ３，Ａ５」を展開する。
【００９０】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、作業配列Ｗに展開される分割配列単位Ａとの行列積演算に従い、図１９の下段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ７×Ｂ７１，Ａ１×Ｂ１２，Ａ３×Ｂ３３，Ａ５×Ｂ５４」を算出する。
【００９１】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに並列的に転送していくことで、図２０の上段に示すように、各々の分配配列Ａの第１段目に「Ａ５，Ａ７，Ａ１，Ａ３」を展開する。
【００９２】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、分割配列Ａの第１段目に展開される分割配列単位Ａとの行列積演算に従い、図２０の上段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ５×Ｂ５１，Ａ７×Ｂ７２，Ａ１×Ｂ１３、Ａ３×Ｂ３４」を算出する。
【００９３】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の作業配列Ａに並列的に転送していくことで、図２０の下段に示すように、各々の作業配列Ｗに「Ａ３，Ａ５，Ａ７，Ａ１」を展開する。
【００９４】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、作業配列Ｗに展開される分割配列単位Ａとの行列積演算に従い、図２０の下段に示すハッチング部分を行列積演算することで、行列積演算値「Ａ３×Ｂ３１，Ａ５×Ｂ５２，Ａ７×Ｂ７３，Ａ１×Ｂ１４」を算出する。
【００９５】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに並列的に転送していくことで、図２１の上段に示すように、各々の分配配列Ａの第１段目に「Ａ１，Ａ３，Ａ５，Ａ７」を元のように展開する。ここまでが、巡回カウンタＩＩＩ  のカウント値が“１”の処理である。
【００９６】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、分割配列Ａの第２段目に展開される分割配列単位Ａとの行列積演算に従い、図２１の上段に示すハッチング部分／＊部分を行列積演算することで、行列積演算値「Ａ２×Ｂ２１，Ａ４×Ｂ４２，Ａ６×Ｂ６３、Ａ８×Ｂ８４」を算出する。なお、図中では、「Ｂ８４」を「＊」で表してある。
【００９７】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の作業配列Ｗに並列的に転送していくことで、図２１の下段に示すように、各々の作業配列Ｗに「Ａ８，Ａ２，Ａ４，Ａ６」を展開する。
【００９８】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、作業配列Ｗに展開される分割配列単位Ａとの行列積演算に従い、図２１の下段に示すハッチング部分／＊部分を行列積演算することで、行列積演算値「Ａ８×Ｂ８１，Ａ２×Ｂ２２，Ａ４×Ｂ４３，Ａ６×Ｂ６４」を算出する。なお、図中では、「Ｂ６４」を「＊」で表してある。
【００９９】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに並列的に転送していくことで、図２２の上段に示すように、各々の分配配列Ａの第２段目に「Ａ６，Ａ８，Ａ２，Ａ４」を展開する。
【０１００】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、分割配列Ａの第２段目に展開される分割配列単位Ａとの行列積演算に従い、図２２の上段に示すハッチング部分／＊部分を行列積演算することで、行列積演算値「Ａ６×Ｂ６１，Ａ８×Ｂ８２，Ａ２×Ｂ２３、Ａ４×Ｂ４４」を算出する。なお、図中では、「Ｂ４４」を「＊」で表してある。
【０１０１】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の作業配列Ａに並列的に転送していくことで、図２２の下段に示すように、各々の作業配列Ｗに「Ａ４，Ａ６，Ａ８，Ａ２」を展開する。
【０１０２】
続いて、各プロセッサ１は、図１３ないし図１８の処理フローに従って、分割配列Ｂと、作業配列Ｗに展開される分割配列単位Ａとの行列積演算に従い、図２２の下段に示すハッチング部分／＊部分を行列積演算することで、行列積演算値「Ａ４×Ｂ４１，Ａ６×Ｂ６２，Ａ８×Ｂ８３，Ａ２×Ｂ２４」を算出する。なお、図中では、「Ｂ２４」を「＊」で表してある。
【０１０３】
このとき、各プロセッサ１は、図１３ないし図１８の処理フローに従って、この演算対象の分割配列単位Ａを循環先となる他プロセッサ１の分割配列Ａに並列的に転送していくことで、図２３の上段に示すように、各々の分配配列Ａの第２段目に「Ａ２，Ａ４，Ａ６，Ａ８」を元のように展開する。
【０１０４】
このようにして、配列Ａと配列Ｂとの行列積演算が完了することになる。
図示実施例について説明したが、本発明はこれに限定されるものではない。例えば、実施例では、行列積演算を例にして本発明を開示したが、本発明はこれに限られるものではなく他の配列演算に対してもそのまま適用できるのである。
【０１０５】
【発明の効果】
以上説明したように、本発明によれば、複数のプロセッサを用いて配列Ａと配列Ｂとの配列演算を実行するときにあって、交換対象となる配列部分と同じ大きさを持つ作業領域を用意する必要がなくなって、任意サイズの小さな作業領域を用意すれば足りることから、メモリ消費量を削減できるようになる。
【０１０６】
そして、この作業領域のサイズは任意に指定できることから、本発明を用いることで、メモリ消費量の削減を優先するときには、作業領域のメモリサイズを小さく設定し、処理速度を優先するときには、通信回数を削減しベクトル効率を高めるために、作業領域のメモリサイズを大きく設定するというように、利用者プログラムの希望する態様に従って配列演算を実行できるようになる。
【０１０７】
そして、必要な部分だけの領域を参照する構成を採っていることから、同じ領域を０クリアすることなく繰り返し使用して配列演算を進めることができ、効率的な配列演算を実行できるようになる。
【図面の簡単な説明】
【図１】本発明の原理構成図である。
【図２】本発明の処理の説明図である。
【図３】本発明の処理の説明図である。
【図４】本発明の処理の説明図である。
【図５】本発明の処理の説明図である。
【図６】本発明の処理の説明図である。
【図７】本発明の処理の説明図である。
【図８】本発明の処理の説明図である。
【図９】利用者が与えるパラメータの説明図である。
【図１０】利用者が与えるパラメータの説明図である。
【図１１】計算機ブロックの表示値の説明図である。
【図１２】計算機ブロックの表示値の説明図である。
【図１３】各プロセッサの実行する処理フローの一実施例である。
【図１４】各プロセッサの実行する処理フローの一実施例である。
【図１５】各プロセッサの実行する処理フローの一実施例である。
【図１６】各プロセッサの実行する処理フローの一実施例である。
【図１７】各プロセッサの実行する処理フローの一実施例である。
【図１８】行列積の計算量の設定処理フローである。
【図１９】本発明の処理の説明図である。
【図２０】本発明の処理の説明図である。
【図２１】本発明の処理の説明図である。
【図２２】本発明の処理の説明図である。
【図２３】本発明の処理の説明図である。
【図２４】単一プロセッサ型計算機による配列演算の説明図である。
【図２５】並列計算機による配列演算の説明図である。
【図２６】並列計算機による配列演算の説明図である。
【図２７】従来技術の説明図である。
【符号の説明】
１    プロセッサ
１０  作業領域
１１  分割配列Ｂの記憶領域
１２  分割配列Ａの記憶領域
１４  転送手段
１５  演算手段
【図１】
0003628720.tif 000002
【図２】
0003628720.tif 000003
【図３】
0003628720.tif 000004
【図４】
0003628720.tif 000005
【図５】
0003628720.tif 000006
【図６】
0003628720.tif 000007
【図７】
0003628720.tif 000008
【図８】
0003628720.tif 000009
【図９】
0003628720.tif 000010
【図１０】
0003628720.tif 000011
【図１１】
0003628720.tif 000012
【図１２】
0003628720.tif 000013
【図１３】
0003628720.tif 000014
【図１４】
0003628720.tif 000015
【図１５】
0003628720.tif 000016
【図１６】
0003628720.tif 000017
【図１７】
0003628720.tif 000018
【図１８】
0003628720.tif 000019
【図１９】
0003628720.tif 000020
【図２０】
0003628720.tif 000021
【図２１】
0003628720.tif 000022
【図２２】
0003628720.tif 000023
【図２３】
0003628720.tif 000024
【図２４】
0003628720.tif 000025
【図２５】
0003628720.tif 000026
【図２６】
0003628720.tif 000027
【図２７】
0003628720.tif 000028