JPH06103083A - 部分和計算方法 - Google Patents

部分和計算方法

Info

Publication number
JPH06103083A
JPH06103083A JP4252508A JP25250892A JPH06103083A JP H06103083 A JPH06103083 A JP H06103083A JP 4252508 A JP4252508 A JP 4252508A JP 25250892 A JP25250892 A JP 25250892A JP H06103083 A JPH06103083 A JP H06103083A
Authority
JP
Japan
Prior art keywords
partial sum
sum
calculated
parallel
partial
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.)
Pending
Application number
JP4252508A
Other languages
English (en)
Inventor
Ichiro Kushima
伊知郎 久島
Masahiro Uminaga
正博 海永
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP4252508A priority Critical patent/JPH06103083A/ja
Publication of JPH06103083A publication Critical patent/JPH06103083A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

(57)【要約】 【目的】スーパースカラ的なプロセッサ、すなわち2〜
8程度の、命令レベルの並列度を持つプロセッサを対象
として、部分和列を高速に、かつ、補助的記憶領域を必
要とせずに計算する方法を提供する。 【構成】ステップ553から555で、配列dの隣り合
う2つおよび3つの要素の和を計算し(t0,t1,t2とす
る)、ステップ556で、これまで求めた最後の部分和
の値sumと、今計算したt0,t1,t2の値とを足し合わせる
ことにより、新しく3つの部分和(a[i],a[i+1],a[i+
2])を計算する。ステップ556での3つの加算は並列
実行する。また、ステップ556と、次の繰り返しのス
テップ553〜555も、オーバーラップ実行する。こ
れらの並列実行により、スーパースカラ的プロセッサの
持つ並列度を最大限に有効利用した計算ができる。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明はスーパースカラプロセッ
サにより部分和を高速に計算する方法に関する。
【0002】
【従来の技術】部分和とは、数列d(i)(1≦i≦n)が与
えられた時、 a(i) = d(1) + d(2) + … + d(i) という式で求められる数列a(i)である。
【0003】部分和を求めるプログラムは、通常次のよ
うな、リカレンスを持つプログラムになる(記述言語は
FORTRAN)。 a(1) = a(1) …(101) DO 10 i = 2,n …(102) a(i) = a(i-1) + d(i) …(103) 10 CONTINUE …(104) リカレンスとは、ある項a(i)が前の項a(i-1)(厳密には
以前の項)を用いて計算される式(数列)のことであ
る。
【0004】リカレンスを持つプログラムでは、ある項
の計算と次の項の計算を並列に行うことはできない。例
えば部分和の場合、一つ前の(項を求めるための)加算
が終わらないうちに次の(項を求めるための)加算を始
めることはできない。従って、n=1000の場合、加算に4
クロックかかる計算機で実行するとすれば、このループ
は通常、少なくとも4000(=4*1000)クロック程度かか
る。
【0005】しかし、理想的なマルチプロセッサ(この
意味は後述)であれば、カスケード和法と呼ばれる手法
で、部分和の計算を40クロック程度に低減できる。カス
ケード和法については、例えばホックニー、ジェスホー
プ共著、奥川、黒住共訳、「並列計算機」(1984
年)共立出版、205頁〜207頁に記載されている
が、以下では、これを簡単に説明する。
【0006】カスケード和法の概念を図2を用いて説明
する。図2では要素の数が8の時、部分和の計算がどの
ように行われるかを示している。まず、隣り合う配列要
素(d(1)とd(2)、d(2)とd(3)、d(3)とd(4)…)同志の和
を計算する(201)。それらをS1..2,S2..3,S
3..4…とおく。次に、d(1),S1..2,S2..3,S3..4,
…について、一つ間をおいて隣り合う要素(d(1)とS
2..3、S1..2とS3..4、S2..3とS4..5、…)同志の和
を計算する(202)。それらをS1..3,S1..4,S
2..5,…とおく。最後に、d(1),d(2),S1..3,S1..
4,S2..5…について、3つ間をおいて隣り合う要素(d
(1)とS2..5、d(2)とS3..6、S1..3とS4..7…)同志
の和を計算する(203)。以上により、部分和列S
1..2,S1..3,S1..4,S1..5,S1..6,S1..7,S
1..8が求まる。ステップ201で行われる7つの加算
は、互いに独立であるので、一斉に実行できる。ステッ
プ202、203で行う加算も同様に一斉に実行でき
る。一般に要素数がnの場合、n個の一斉加算をlog2
回行えばよい。n=1000の場合、1000個の一斉加算を10
(≒log21000)回行えばよい。すなわち、プロセッサエレ
メント数が1000個のマルチプロセッサで、個別の加算の
完了が4クロックという想定で、さらに転送オーバーヘ
ッドが0の理想的なマルチプロセッサであれば、全体処
理を計40(=4×10)クロックで部分和の計算が完了でき
る。
【0007】
【発明が解決しようとする課題】上記従来技術を用いれ
ば、プロセッサエレメントが配列要素数以上あるような
理想的なマルチプロセッサ(いわゆる超並列計算機)
で、部分和の計算が高速にできる。しかし、スーパース
カラ的なプロセッサで実行する場合には使えない。
【0008】スーパースカラプロセッサは、連続する2
個又はそれ以上の命令を同時にフェッチ・デコードし、
その中から並列に実行できる命令を選択し、並列実行す
るプロセッサである。このため、スーパースカラプロセ
ッサは、複数の実行ユニットを備えているが、現状では
同一種類の実行ユニットを複数実装するよりも、整数演
算ユニット、浮動小数点加減算ユニット、浮動小数点乗
算ユニット、分岐ユニット、ロード/ストアユニットな
どの異なった種類の実行ユニットのみを実装している場
合が多い。並列にフェッチ・デコード可能な命令の数
(命令多重度)により、2−スカラ、4−スカラ、など
と呼ぶ。
【0009】スーパースカラプロセッサの命令多重度は
せいぜい10以下(多くは2〜4)であり、上記のカス
ケード和法を適用できない。その結果、少なくとも(加
算クロック数)×(要素数)のクロック数が必要であ
る。また、カスケード法は、補助的な記憶領域(配列)
を余分に必要とする。すなわち、要素数をnとすると、
元の配列の約log2n倍の大きさが必要である。
【0010】本発明の目的は、スーパースカラ的なプロ
セッサ、すなわち2〜8程度の、命令レベルの並列度を
持つプロセッサを対象として部分和列を高速に、しかも
補助的記憶領域を必要とすることなく計算する方法を提
供することにある。
【0011】
【課題を解決するための手段】上記目的は、プロセッサ
の持つ並列度が許す範囲で、並列に加算を行えるような
計算方法を実施することによって達成される。すなわ
ち、部分和a(i-1)(=d(1)+d(2)+…+d(i-1))が既に求ま
っているとき、a(i),a(i+2),…,a(i+N-1)を、a(i-1)を
用いて並列に計算する。ここで、Nは「加算命令に必要
なサイクル数−1」程度の値とする。
【0012】まず、以下の式により、t0,t1,…,tN-1を
逐次計算する。 t0 = d(i) t1 = t0 + d(i+1) t2 = t1 + d(i+2) ‥‥‥ tN-1 = tN-2 + d(i+N-1) 次に、以下の式によりa(i), a(i+1), …, a(i+N-1)の計
算を並列実行する。 a(i) = a(i-1) + t0 a(i+1) = a(i-1) + t1 a(i+2) = a(i-1) + t2 ‥‥‥ a(i+N-1) = a(i-1) + tN-1 a(i+N-1)は、さらに次のN個の部分和(a(i+N)からa(i+
2N-1))を計算するのに使われる。このようにN個ずつ
部分和を計算していく。
【0013】
【作用】N=3, n=1000の場合で説明する。本発明の方法
では、t0,t1,t2を計算する部分(以降(A)と呼ぶ)
と、a(i),a(i+1),a(i+2)を計算する部分(以降(B)と
呼ぶ)に大きく分かれる。添字計算に現れる加算はここ
では無視すると、(A)では加算が2回、(B)では加
算が3回必要であるが、このうち(B)での加算は互い
に独立であり、並列に実行できる。また、(A)での加
算はフロー依存があるので、並列には実行できないが、
(B)と(A)はある程度並列に実行することができ
る。というのは、(B)を計算している間に、必要なt
0,t1,t2の値を壊さない範囲で、次のN個の部分和を計
算するための(A)の計算を実行できるからである。そ
の逆についても同様である。これらにより、スーパース
カラプロセッサに好適の並列度を持つようになる。
【0014】このことを、図3に示す本発明の計算方法
の概念図を使って説明する。図3では、<と>で囲まれ
た部分が、(A)により計算された値を示す。Sn..mは
d(n)+d(n+1)+…+d(m)を表す。そして、この値を用いて
(B)での計算がどのように行われるか、データの流れ
を示している。
【0015】まず、<と>で囲まれた部分が予めすべて
計算されているとする。すると、上から順に加算を実行
していけば部分和が生成できる。縦に並んだ加算は1回
の繰り返し分である。例えば加算301は、a(3)と<S
4..6>の和を計算してa(6)に格納し、それを加算302
などに渡す。
【0016】図3では、加算の完了が4クロックという
想定であれば、フロー依存にともなう待ちは3回に1回
発生する。即ち、個別の加算を4/3クロックごとに実行
できることになり、全体で約1333(=1000*4/3)クロック
となる。一方、(A)の加算は1回の繰り返し単位で2
個加算があり、繰り返しは333回であるので、計約666個
であり、フロー依存の意味で独立な演算木が333個であ
り、明らかに、666クロックで実行できる。その結果、
全体の計算を約2000(=1333+666)クロックで実行できる
ことになる。
【0017】そしてさらに、(B)の計算と(A)の計
算をうまくシャッフルすれば、部分和計算のフロー依存
に伴う待ちが解消され、実際には2000クロックよりも速
く実行できる。
【0018】
【実施例】以下、本発明の一実施例を説明する。以下に
示すC言語による部分和計算プログラムを対象に考え
る。ただし、配列要素は浮動小数点型とする。 a[0] = d[0]; …(401) for (i = 1; i <= n; i++) { …(402) a[i] = a[i-1] + d[i]; …(403) } …(404) これを、次のようなスーパースカラプロセッサで実行す
る。 ・実行ユニットは、浮動小数点加減算器が1個、ロード
/ストアユニットが1個、整数演算器(ALU)が2
個、分岐ユニットが1個で構成される。 ・命令多重度は2である。すなわち、可能ならば同時に
2つの命令を発行できる。(可能というのは、2つの命
令が同一の実行ユニットを共用したり、2つの命令の間
に依存関係が存在したりすることがないということであ
る。) ・浮動小数点加減算の完了に4クロック、ロード/スト
アの完了に2クロック、整数演算のおよび分岐の完了に
は1クロックそれぞれかかる。 ・一度に2要素分のデータをロード/ストアする命令を
持つ。 ・各命令はパイプライン実行される。すなわち、可能な
らば各クロックごとに新たな命令を発行できる。
【0019】このような想定で、従来の方法で上記のプ
ログラムに示す計算を行うと、ループ1回あたり加算に
かかるクロック数は少なくとも4クロックである。従っ
て、n=1000の場合プログラム全体では約4000(=4*1000)
クロックかかることになる。本発明による計算方法で
は、これを以下のプログラムように計算する。以下に示
すプログラムも上記と同様にC言語で記述されている。
ただし、ここでは最終的なプログラムをいきなり提示す
るのではなく、従来のループ最適化技法、すなわち、ル
ープ展開やソフトウェアパイプライニングを施す前のプ
ログラムをまず示している。その後、既存の最適化技法
を施したプログラムを示す。
【0020】 sum=0; …(501) for (i = 0; (n -= 3) >= 0; i += 3) { …(502) t0= d[i+0]; …(503) t1=t0+d[i+1]; …(504) t2=t1+d[i+2]; …(505) a[i+0]=t0+sum; a[i+1] =t1+sum; a[i+2] =sum= t2+sum; …(506) } …(507) rest: …(508) for (n += 3; --n >= 0; i++) { …(509) a[i] = sum = sum + d[i]; …(510) } …(511) このプログラムは2つのループ、(502)-(507)と(509)-
(511)から成るが、ループ(502)-(507)が主ループであ
る。主ループでは1回のイテレーション、すなわち繰り
返し演算で3要素分の部分和の計算を行う。後半のルー
プは、要素数が3の倍数でないとき、余った分(1個か
2個)を計算する。ステップ(506)で3つの文が一行に
書かれているのは、これらの3つの計算が理論的には並
列に実行できることを意味している。ステップ(503)-(5
05)の3つの計算は並列には実行できないので別の行に
書かれている。
【0021】図1は、主ループの部分をフローチャート
にしたものである。まず、変数sumとiを0にする(ステ
ップ550)。次に、nから3を引く(ステップ55
1)。そして、nが0以上かどうかを調べ(ステップ5
52)、そうでなければ終了する。0以上であれば、d
[i]をt0に、t0+d[i+1]をt1に、t1+d[i+2]をt2にそれぞ
れ代入する(ステップ553、554、555)。即ち
ここでは、配列dの隣り合った2つおよび3つの要素の
和を計算し、その結果を変数t0からt2に格納している。
次に、t0+sumをa[i]に、t1+sumをa[i+1]に、t2+sumをa
[i+2]をそれぞれ代入する(ステップ556)。即ちこ
こでは、t0,t1,t2の値と、前回のイテレーションで計算
した最後の部分和の値(sum)を使って次の3個分の部
分和を求めている。そして、a[i+2]をsumに代入する
(ステップ556)し、iに3を加えて(ステップ55
7)、ステップ551から処理を繰り返す。
【0022】次に、(501)-(511)のプログラムに対し
て、4倍のループ展開を施す。ループ展開とは、ループ
内部を複数コピーして展開し、ループ反復を減らすとと
もに、ループ内部の独立した命令を増やすことにより並
列実行の可能性を高めるような最適化である。以下のプ
ログラムがその結果である。
【0023】 sum1=0; …(601) for (i = 0; (n -= 12) >= 0; i += 12) { …(602) t0= d[i+0]; t3= d[i+3]; t6= d[i+6]; t9 = d[i+9]; …(603) t1=t0+d[i+1]; t4=t3+d[i+4]; t7=t6+d[i+7]; t10=t9 +d[i+10];…(604) t2=t1+d[i+2]; t5=t4+d[i+5]; t8+t7+d[i+8]; t11=t10+d[i+11];…(605) a[i+2] =sum2= t2+sum1; a[i+1] =t1+sum1; a[i+0]=t0+sum1; …(606) a[i+5] =sum1= t5+sum2; a[i+4] =t4+sum2; a[i+3]=t3+sum2; …(607) a[i+8] =sum2= t8+sum1; a[i+7] =t7+sum1; a[i+6]=t6+sum1; …(608) a[i+11]=sum1=t11+sum2; a[i+10]=t10+sum2; a[i+9]=t9+sum2; …(609) } …(610) rest: …(611) for (n += 12; --n >= 0; i++) { …(612) a[i] = sum1 = sum1 + d[i]; …(613) } …(614) このプログラムはループを4倍に展開しているので、1
回のイテレーションで12要素分の処理を行う。配列の
要素数が12の倍数でないときは、先程と同様に、余っ
た部分の処理を後半のループ((612)-(614))で行う。
なお、一行に複数の文が書かれているときは、やはりそ
れらの計算が理論的に並列に実行可能であることを示し
ている。このプログラムを見ると、1行に必ず3又は4
個の文が書かれており、ループ展開しない場合に比べて
並列度が向上していることがわかる。
【0024】次に、(601)-(614)のプログラムに対し
て、ソフトウェアパイプライニングと呼ばれるループ最
適化技法を施す。ソフトウェアパイプライニングとは、
ループ本体をいくつかのステージに分解し、異なるイテ
レーションに属する異なるステージの実行を並列に行え
るようにする最適化である。例えば、ループ本体がステ
ージ1とステージ2に分けられるとし、かつ、ステージ
2はステージ1の後に実行しなければならないとする
と、前回のイテレーションに属するステージ2の実行
と、今回のイテレーションに属するステージ1の実行を
並列に行えるようにループの構造を再構成するものであ
る。ここではまず、(601)-(614)のプログラムの主ルー
プの演算構造と、ステージ分割の仕方を図4に示す。
【0025】図4の前半のステージ(ステージ1)で
は、配列dの各要素をロードし(651)、その隣り合
う2つ要素の和を計算し(652)、さらにその結果を
用いて隣り合う3つの要素の和を計算する(653)。
プログラムが4倍にループ展開されているので、各ルー
プごとに上記ステージ1の計算を4回行う。図4の後半
のステージ(ステージ2)では、前回の繰り返しで求め
られた最後の部分和の値sum(654)と、ステージ1
で求められた配列要素または隣り合う配列要素の和とを
加え(655)、配列aにストアする(656)。
【0026】図4の演算構造に対し、ステージ1とステ
ージ2でソフトウェアパイプライニングを構成したプロ
グラムを以下に示すが、まず先に、作業レジスタと演算
の詳細な実行順序を陽には指定しないソースコードを示
す。
【0027】 sum1 = 0; …(701) if ((n -= 12) < 12) …(702) goto rest; …(703) t0= d[i+0]; t3= d[i+3]; t6= d[i+6]; t9 = d[i+9]; …(704) t1=t0+d[i+1]; t4=t3+d[i+4]; t7=t6+d[i+7]; t10= t9+d[i+10]; …(705) t2=t1+d[i+2]; t5=t4+d[i+5]; t8=t7+d[i+8]; t11=t10+d[i+11]; …(706) for (i = 12; (n -= 12) >= 0; i += 12) { …(707) a[i+2] =sum2= t2+sum1; a[i+1] =t1+sum1; a[i+0]=t0+sum1; …(708) a[i+5] =sum1= t5+sum2; a[i+4] =t4+sum2; a[i+3]=t3+sum2; …(709) a[i+8] =sum2= t8+sum1; a[i+7] =t7+sum1; a[i+6]=t6+sum1; …(710) a[i+11]=sum1=t11+sum2; a[i+10]=t10+sum2; a[i+9]=t9+sum2; …(711) t0= d[i+0]; t3= d[i+3]; t6= d[i+6]; t9 = d[i+9]; …(712) t1=t0+d[i+1]; t4=t3+d[i+4]; t7=t6+d[i+7]; t10=t9 +d[i+10];…(713) t2=t1+d[i+2]; t5=t4+d[i+5]; t8+t7+d[i+8]; t11=t10+d[i+11];…(714) } …(715) a[i+2] =sum2= t2+sum1; a[i+1] =t1+sum1; a[i+0]=t0+sum1; …(716) a[i+5] =sum1= t5+sum2; a[i+4] =t4+sum2; a[i+3]=t3+sum2; …(717) a[i+8] =sum2= t8+sum1; a[i+7] =t7+sum1; a[i+6]=t6+sum1; …(718) a[i+11]=sum1=t11+sum2; a[i+10]=t10+sum2; a[i+9]=t9+sum2; …(719) rest: …(720) n += 12; …(721) for (; --n >= 0; i++) { …(722) a[i] = sum1 = sum1 + d[i]; …(723) } …(724) ループ本体部((708)-(714))について少し補足説明す
る。 ・まず、ステップ(708)-(711)でステージ2、すなわ
ち、前回のイタレーションの後半部を先に実行する。こ
れにより演算チェイニングのための中継レジスタ(t0,t
1,…)の使用を完了させる。 ・ステップ(713)-(714)でステージ1、すなわち、今回
のイタレーションの前半部を実行する。実行の結果は演
算チェイニングのための中継レジスタに設定される。 ・逆依存の制約に反しない、すなわち、中継レジスタへ
の設定が、使用を追い越さない範囲で、命令の並び替え
(スケジューリング)が可能である。
【0028】さて次に、主ループ部分について、レジス
タと演算の実行順序を陽に指定し、オブジェクトプログ
ラムと1対1に対応するプログラムを以下に示す。 u2 ← t2+u5; w0〜w1 ← d[i+0]〜d[i+1]; …(801) t1 ← t1+u5; w2〜w3 ← d[i+2]〜d[i+3]; …(802) u0 ← t0+u5; w4〜w5 ← d[i+4]〜d[i+5]; …(803) t1 ← w0+w1; w6〜w7 ← d[i+6]〜d[i+7]; …(804) u5 ← u5+u2; a[i+2] ← u2; …(805) t4 ← t4+u2; t0 ← w0; …(806) u3 ← t3+u2; a[i+0]〜a[i+1] ← u0〜u1; …(807) t4 ← w2+w4; w8〜w9 ← d[i+8]〜d[i+9]; …(808) u8 ← t8+u5; d[i+5] ← u5; …(809) u7 ← t7+u5; t3 ← w3; …(810) u6 ← t6+u5; a[i+3]〜a[i+4] ← u3〜u4; …(811) t7 ← w6+w7; w10〜w11 ← d[i+10]〜d[i+11]; …(812) u5 ← t11+u8; a[i+8] ← u8; …(813) u10← t10+u8; t6 ← w6; …(814) u9 ← t9+u8; a[i+6]〜a[i+7] ← u6〜u7; …(815) t11← w9+wa; …(816) t2 ← t1+w2; a[i+11]← u5; …(817) t5 ← t4+w5; t9 ← w9; …(818) t8 ← t7+w8; Bcc Loop …(819) t11← t10+w11; a[i+9]〜a[i+10] ← u9〜u10; …(820) ←はデータの移動(代入)を表し、〜は2要素ロード/
ストア命令のためのロケーションの連結を表す。;で区
切られた操作が一つの機械命令に相当する。一行に2つ
の操作が書かれているのは、対象としている計算機が命
令多重度2のスーパースカラプロセッサ、すなわち一度
に2命令を発行できるプロセッサだからである。例え
ば、(801)行は、レジスタt2とレジスタu5を加えてそれ
をレジスタu2に設定する命令(左側)と、配列要素a[i+
0]とa[i+1]をメモリからロードし、それをレジスタw0お
よびレジスタw1に設定する命令(右側)を同時に発行す
る。また、このプログラムは前後の命令でインタロッ
ク、すなわち、リソースの競合などによる待ちが起こら
ないようにしているので、各命令が毎クロック発行でき
る。
【0029】図5は、図4の演算構造図に、ステップ(8
01)-(820)のプログラムで使用されている論理レジスタ
(w0,w1,u0,u1など)を付加したものである。例えば、
ロード751は、d[i]の値をレジスタw0にロードするこ
とを示し、加算752は、レジスタw0とレジスタw1を加
えてその結果をレジスタt1に設定することを示してい
る。
【0030】ステップ(801)-(820)によれば、ループ本
体部が20クロック程度で実行できることがわかる。n=10
00の場合、ループ繰り返し回数は83(=1000/12)であるの
で、1000要素の部分和計算が1660(=83*20)+αで計算で
きる。ループ外のオーバーヘッド(+α)は100クロック
以下であると推定されるので、結局1800クロック以下で
部分和を計算できる。
【0031】
【発明の効果】部分和計算を単純に行えば、たとえ並列
に数命令が実行できるスーパースカラプロセッサであっ
ても、少なくとも(加算命令のクロック数)*(要素
数)のクロック数がかかる。部分和計算にリカレンスが
存在する、すなわち、個々の加算は並列またはオーバー
ラップさせて実行できないからである。加算に4クロッ
クかかり、要素数が1000だとすると、全体で4000クロッ
クである。実際にはメモリからのデータのロードやスト
アが加わるのでこれよりさらに時間がかかる。
【0032】本発明の計算方法によれば、個々の加算は
並列またはオーバーラップさせて実行できるので、上記
の場合の部分和の計算を2000クロック以下で実行できる
という効果がある。しかも余分なデータ領域をほとんど
必要としない。
【図面の簡単な説明】
【図1】本発明の一実施例の部分和計算方法を示すフロ
ーチャートである。
【図2】カスケード和法(従来技術)の計算方法の概念
図である。
【図3】本発明による計算方法の概念図である。
【図4】ループ展開後の主ループの演算構造を示す図で
ある。
【図5】図4に、レジスタ情報を付加した図である。
【符号の説明】
651…配列要素のロード、652…隣り合う配列要素
の加算、654…前回の繰り返しで求められた部分和の
値、655…654の値との加算、655…部分和配列
へのストア。

Claims (5)

    【特許請求の範囲】
  1. 【請求項1】数列d(1),d(2),…,d(n)を与えて、部分和
    列a(1),a(2),…,a(n)(a(i) = d(1)+d(2)+…+d(i))を
    計算機により計算する方法において、あるN(≦n)をあ
    らかじめ定めておき、部分和a(i-1)が既に求まっている
    とき、a(i),a(i+2),…,a(i+N-1)の値の計算を、a(i-1)
    の値を用いて並列実行することを特徴とする部分和計算
    方法。
  2. 【請求項2】請求項1記載の部分和計算方法において、
    部分和a(i-1)が既に求まっているとき、a(i),a(i+2),
    …,a(i+N-1)の値の計算を次のように行う、部分和計算
    方法。 (1)まず以下の式により、t0,t1,…,tN-1を計算す
    る。 t0 = d(i) t1 = t0 + d(i+1) t2 = t1 + d(i+2) ‥‥‥ tN-1 = tN-2 + d(i+N-1) (2)次に以下の式により、a(i),a(i+1),…,a(i+N-1)
    の値の計算を並列実行する。 a(i) = a(i-1) + t0 a(i+1) = a(i-1) + t1 a(i+2) = a(i-1) + t2 ‥‥‥ a(i+N-1) = a(i-1) + tN-1
  3. 【請求項3】請求項2記載の部分和計算方法において、
    上記ステップ(1)の計算とステップ(2)の計算を並
    列実行することを特徴とする、部分和計算方法。
  4. 【請求項4】請求項1記載の部分和計算方法において、
    Nを「加算命令にかかるサイクル数−1」とする、部分
    和計算方法。
  5. 【請求項5】請求項1記載の部分和計算方法に対応する
    部分和計算コードを生成するコンパイラ。
JP4252508A 1992-09-22 1992-09-22 部分和計算方法 Pending JPH06103083A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP4252508A JPH06103083A (ja) 1992-09-22 1992-09-22 部分和計算方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP4252508A JPH06103083A (ja) 1992-09-22 1992-09-22 部分和計算方法

Publications (1)

Publication Number Publication Date
JPH06103083A true JPH06103083A (ja) 1994-04-15

Family

ID=17238351

Family Applications (1)

Application Number Title Priority Date Filing Date
JP4252508A Pending JPH06103083A (ja) 1992-09-22 1992-09-22 部分和計算方法

Country Status (1)

Country Link
JP (1) JPH06103083A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002143997A (ja) * 2000-11-10 2002-05-21 Nippon Steel Corp 鋳型内鋳片の状態検知装置、方法、及びコンピュータ読み取り可能な記憶媒体
US6993756B2 (en) 2000-03-03 2006-01-31 Matsushita Electric Industrial Co., Ltd. Optimization apparatus that decreases delays in pipeline processing of loop and computer-readable storage medium storing optimization program

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6993756B2 (en) 2000-03-03 2006-01-31 Matsushita Electric Industrial Co., Ltd. Optimization apparatus that decreases delays in pipeline processing of loop and computer-readable storage medium storing optimization program
JP2002143997A (ja) * 2000-11-10 2002-05-21 Nippon Steel Corp 鋳型内鋳片の状態検知装置、方法、及びコンピュータ読み取り可能な記憶媒体

Similar Documents

Publication Publication Date Title
KR102413832B1 (ko) 벡터 곱셈 덧셈 명령
US8966459B2 (en) Processors and compiling methods for processors
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
KR101253549B1 (ko) 쓰레드 당 다중의 동시적 파이프라인을 갖는 멀티쓰레드프로세서
EP0378830B1 (en) Method and apparatus for handling multiple condition codes as for a parallel pipeline computer
US5261113A (en) Apparatus and method for single operand register array for vector and scalar data processing operations
KR100638501B1 (ko) 다중 명령 컴퓨터 프로그램을 구성하는 방법
KR101005718B1 (ko) 포화와 함께 또는 포화 없이 다중 오퍼랜드들의 누산을 위한 프로세서 감소 유닛
US5958042A (en) Grouping logic circuit in a pipelined superscalar processor
US7734899B2 (en) Reducing data hazards in pipelined processors to provide high processor utilization
TWI728068B (zh) 複數乘法指令
KR102201935B1 (ko) 로드-저장 명령
CN111381939B (zh) 多线程处理器中的寄存器文件
US20020169942A1 (en) VLIW processor
US4683547A (en) Special accumulate instruction for multiple floating point arithmetic units which use a putaway bus to enhance performance
US20150212972A1 (en) Data processing apparatus and method for performing scan operations
KR102256188B1 (ko) 데이터 처리장치 및 벡터 오퍼랜드를 처리하는 방법
US20020120923A1 (en) Method for software pipelining of irregular conditional control loops
JPH02227730A (ja) データ処理システム
USRE38599E1 (en) Pipelined instruction dispatch unit in a superscalar processor
Dietz Common Subexpression Induction?
JPH06103083A (ja) 部分和計算方法
JPS6336337A (ja) スカラ/ベクトル命令の融合スケジユ−リング処理方式
Moon Increasing Instruct ion-level Parallelism through Multi-way Branching
JPH08115220A (ja) ループ最適化方法