JP2021501947A - メモリ・ネットワーク・プロセッサ - Google Patents
メモリ・ネットワーク・プロセッサ Download PDFInfo
- Publication number
- JP2021501947A JP2021501947A JP2020524772A JP2020524772A JP2021501947A JP 2021501947 A JP2021501947 A JP 2021501947A JP 2020524772 A JP2020524772 A JP 2020524772A JP 2020524772 A JP2020524772 A JP 2020524772A JP 2021501947 A JP2021501947 A JP 2021501947A
- Authority
- JP
- Japan
- Prior art keywords
- message
- node
- nodes
- routing information
- data
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
- G06F15/16—Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
- G06F15/163—Interprocessor communication
- G06F15/173—Interprocessor communication using an interconnection network, e.g. matrix, shuffle, pyramid, star, snowflake
- G06F15/17337—Direct connection machines, e.g. completely connected computers, point to point communication networks
- G06F15/17343—Direct connection machines, e.g. completely connected computers, point to point communication networks wherein the interconnection is dynamically configurable, e.g. having loosely coupled nearest neighbor architecture
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
- G06F15/16—Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
- G06F15/163—Interprocessor communication
- G06F15/173—Interprocessor communication using an interconnection network, e.g. matrix, shuffle, pyramid, star, snowflake
- G06F15/17306—Intercommunication techniques
- G06F15/17312—Routing techniques specific to parallel machines, e.g. wormhole, store and forward, shortest path problem congestion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L45/00—Routing or path finding of packets in data switching networks
- H04L45/74—Address processing for routing
- H04L45/745—Address table lookup; Address filtering
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Networks & Wireless Communication (AREA)
- Mathematical Physics (AREA)
- Signal Processing (AREA)
- Multimedia (AREA)
- Advance Control (AREA)
- Multi Processors (AREA)
- Devices For Executing Special Programs (AREA)
- Executing Machine-Instructions (AREA)
- Complex Calculations (AREA)
- Hardware Redundancy (AREA)
Abstract
Description
発明者がMichael B. Doerr、Carl S. Dobbs、Michael B. Solka、Michael R. Trocino、Kenneth R. Faulkner、Keith M. Bindloss、Sumeer Arya、John Mark Beardslee、およびDavid A. Gibsonである、「Memory−Network Processor with Programmable Optimizations(プログラム可能な最適化を有するメモリ・ネットワーク・プロセッサ)」と題する米国特許第9,430,369号明細書は、あらゆる点で完全に本明細書に示されているように全体が参照により本明細書に組み入れられる。
図1を参照すると、マルチ・プロセッサ・システム(MPS)の一実施形態を例示する構成図が描かれている。例示する実施形態では、MPS10は、複数のプロセッサ要素(processor element、PE)と、データおよび命令を互いに通信するように連結された、動的に構成可能なコミュニケータまたは動的に構成可能な通信要素と呼ばれることもある複数のデータ・メモリ・ルータ(data memory router、DMR)とを含む。本明細書で使用するとき、PEはまた、PEノードと呼ばれることもあり、DMRはまた、DMRノードと呼ばれることもある。
●2つのデータパス、それぞれ(サイクルあたり)以下が可能:
○1つ/2つの16×16の積算、または1つの32×16の積算
○1つ/2つの16ビット加算/減算、または1つの32ビット加算/減算
○40ビットのバレルシフト
○32ビットの論理動作
●40ビットの累積、2つの40ビットアキュムレータ
○(サイクルあたり)データパスを一緒に遂行することができる:
○1つの32×32積算または積和演算
●1つの32ビット浮動小数点加算/減算/積算
○3つのアドレス生成ユニット(Address Generation Unit、AGU)
○3つのロード:srcA(ソースA)、srcB(ソースB)、srcC(ソースC)
○2つのロードおよび1つの記憶:srcA、srcB、dstD(宛先D)
○8つの基底レジスタおよび8つのインデックスレジスタ
●GPレジスタファイル
○16×32ビットレジスタまたは8×64ビットレジスタとしてアクセス可能な32×16ビットレジスタ
●命令復号:
○64ビットの従来型アセンブリ命令
○128ビットのHyperOp命令
○IMは任意の64ビット整列で128ビット/サイクルを提供する
●反復ループハードウェア
○ゼロ・オーバーヘッド・ルーピング
○3つの一次インデックスレジスタを使用して、3つのレベルの入れ子をサポートする
○4つの二次基底レジスタ/インデックスレジスタの自動増分
●ループバッファ
○1つまたは複数の内部ループ中に命令フェッチ電力を低減する
●8つのベースレジスタB0〜B7
○B0は、アドレス指定モードで値ゼロをもたらす
○B0は、スタックポインタ(SP相対アドレス指定モード)として使用される
●8つのインデックスレジスタI0〜I7
○I0は、アドレス指定モードで値ゼロをもたらす
○I0は、他のAGU算術用一時レジスタとして使用することができる(このレジスタは、レジスタマップでは、I0ではなくGR0と呼ばれる)
●7つのストライドレジスタS1〜S7
○Snは、InまたはBnと共に使用される
●3レベルの反復ループ用ハードウェアサポート
○一次ループインデックスは、I1、I2、I3である
●二次インデックスまたは基底レジスタ用の4つの追加増分
○インデックスレジスタI4〜I7
○基底レジスタB4〜B7
○ストライドレジスタS4〜S7による増分
○開始アドレス/一時レジスタT4〜T7
●REPEATは、先行するHyperX世代に類似し、以下の改善を伴う:
●一次ループインデックスI1、I2、I3
●ループの終わりに増分される、最大4つまでのベースレジスタ/インデックスレジスタ、すなわちI4/B4、I5/B5、I6/B6、I7/B7を選択するオプション。
●反復ループ情報は、ループ命令を規定するラベルの前でループレジスタの中にロードされる。
●REPEAT命令およびそのラベルにより、命令のグループを決定する。
●反復バッファ使用法は、コンパイル時に決定され、フラグによりREPEAT命令の中で示される。
●あらゆる反復ループの最初の命令は、性能および電力の理由で、反復バッファの中に常にロードされる。
●バッファは、64ビットまたは128ビットの命令を保持することができる。
●最大12個の64ビットエントリを利用可能である。128ビット命令用に、2つのエントリを使用する。
●ループの最初の命令をバッファに入れる以外のどんなことのためにもバッファを使用するために、ループ全体は、バッファに収まらなければならない。
●B4〜B7―4つの追加基底レジスタ。
●I4〜I7―4つの追加インデックスレジスタ。
●S4〜S7―4つの追加ストライドレジスタ。
●T4〜T7―基底レジスタまたはインデックスレジスタを初期化するために使用する4つの追加レジスタ。
●P0〜P3:
○DP試験命令により設定される
○DPのタイミングに従って設定される
●GP0およびGP1
○AGU試験命令により設定される(図6に例を示す)
○AGUのタイミングに従って設定される
●TEST動作を実行する
●結果として得られる条件を確認する
●選択された述語フラグを設定する
●GP0、GP1―AGU命令により使用される
●P0、P1―DP命令により、典型的にはDP0で使用される
●P2、P3―DP命令により、典型的にはDP1で使用される
●1:平均をとるため
●8:
●16:ACCH=ACC[31:16]を記憶するため
●15:
Z[15:0]=MAX((X[15:0]+Y[15:0]),(X[31:16]+Y[31:16]))+TLUオフセット
Z[31:16]=MAX((X[31:16]+Y[15:0]),(X[15:0]+Y[31:16]))+TLUオフセット
Z[15:0]=MAX((X[15:0]+Y[15:0]),(X[31:16]+Y[31:16]))+TLUオフセット
Max*(0,x1+y1)−Max*(x1,y1):Max*(0,x0+y0)−Max*(x0,y0)
Z[31:16]=MAX(0,(X[31:16]+Y[31:16]))+TLUオフセット−(MAX(X[31:16],Y[31:16]))+TLUオフセット)
Z[15:0]=MAX(0,(X[15:0]+Y[15:0]))+TLUオフセット−(MAX(X[15:0],Y[15:0])+TLUオフセット)
ACCn+1=Max*(ACCn+1,Max*(x1,y1)):ACCn=Max*(ACCn,Max*(x0,y0))
ACCn+1=Max*(ACCn+1,x0+y0):ACCn=Max*(ACCn,x1+y)
ACCn+1=MAX(ACCn+1,(X[15:0]+Y[15:+1]))+TLUオフセット
ACCn=MAX(ACCn,(X[31:16]+Y[31:+16]))+TLUオフセット
ACCn+1=Max*(ACCn+1,x0−y0):ACCn=Max*(ACCn,x1−y1)
ACCn+1=MAX(ACCn+1,(X[15:0]−Y[15:0]))+TLUオフセット
ACCn=MAX(ACCn,(X[31:16]−Y[31:16]))+TLUオフセット
●任意のDMRデータメモリの場所への読出し/書込みのアクセス
●任意のDMRメモリ・マップド・レジスタへの読出し/書込みのアクセス
●任意のPE命令メモリの場所への読出し/書込みのアクセス
●PE状態および制御レジスタへの読出し/書込みのアクセス
●クロック制御レジスタへの読出し/書込みのアクセス
●ハードウェアブレーク挿入を除くブレークポイント制御
●PEウェイクアップ制御
●パリティ制御
●PEメッセージ受渡し
●PEプログラマ・レジスタ・アクセス
●IOバス上のメモリおよび周辺機器
●ポイント・ツー・ポイント・メッセージ―任意の他の単一ノードから情報を読み出す、または書き込むことができるようにする。
●マルチ・ポイント・メッセージ―単一メッセージを用いてエンド・ポイント・ノードのグループに読み出す、または書き込むことができるようにする。
●応答メッセージ―ユーザが直接生成しない。他のメッセージの肯定応答を提供するために、メッセージバスが使用する。
●安全な構成メッセージ―チップ用のセキュリティを構成するために使用するメッセージの形態。
図20を参照すると、HyperOpデータパスのある実施形態が示されている。例示するように、HyperOpデータパスは、DP0およびDP1として識別される2つのデータパスを含む。DP0およびDP1の各々は、同一であってよく、積算回路、加算回路、シフタ回路だけではなく、データパスを通してオペランドを移動させるための追加回路も含んでよい。マルチ・プロセッサ・アレイ内の所与のPEは、図20に描くHyperOpデータパスを含んでよいことが留意される。
●C―機能動作/アルゴリズムを記述する基準コード。
●ASM―64ビット命令を使用して動作/アルゴリズムをどのように実装するかの1つまたは複数の例。ASMはまた、二重DPにアクセスするためにベクトル組込関数(vector intrinsic)(擬似ASM命令)を使用する例を含む。ベクトル組込関数は、HyperOp命令にマッピングされる、ASMに似た命令である。
●HyperOp―128ビット命令を使用して動作/アルゴリズムをどのように実装するかの1つまたは複数の例。
add16s M1.H,M2.H,M3.H
add16s M1.L,M2.L,M3.L
|A| ld32 M1,%A; //32ビットのM1からSIMDデータをロードする
|B| ld32 M2,%B; //32ビットのM2からSIMDデータをロードする
|DP1| add16s %AH,%BH,%ACC2; //ACC2=M1[0]+M2[0]
|DP0| add16s %AL,%BL,%ACC0; //ACC0=M1[1]+M2[1]
|D| dst16 %ACC2_ACC0,M3; //32ビットのM3にSIMDの結果を記憶する
sub16 %r2,$10,%r8
{
|A| ld16 %r2,%AL; //16ビットのR2をロードする
|C| ld16 $10,%CLH; //16ビットの即値10をロードする
|DP1| sub16s %AL,%CLH,%D1; //D1=R2−10
|D| st16 %D1,%r8; //16ビットのR8に結果を記憶する
}
load immedは、スロットCを使用して、%Cレジスタの16ビットセグメントをロードするが、スロットBを使用して、%Bレジスタの16ビットセグメントをロードすることができるに留意されたい。
int16 a,b,c,d,e;
if(a>b)
e=c+d;
//仮定:
//aは%R2の中にある
//bは%R3の中にある
//cは%R4の中にある
////dは%R5の中にある
//eは%R6の中にある
//%R7をtmpとして使用する
tcmp16s GT %R2,%R3,%P0
add16s %R4,%R5,%R7
cmov16 (%P0) %R7,%R6
{
|A| ld16s %R2,%AL; //16ビットのR2をロードする
|B| ld16s %R3,%BL; //16ビットのR3をロードする
|DP0| tcmp16s GT %AL,%BL,%P0; //R2>R3を試験して、述語P0を設定する
}
{
|A| ld16s %R4,%AH; //16ビットのR4をロードする
|B| ld16s %R5,%BH; //16ビットのR5をロードする
|DP0| add16s %AH,%BH,%D0; //D0=R4+R5
|D| st16 (%P0) %D0,%R6; //P0が真であれば、16ビットのR6に結果を記憶する
}
{
|A| ld32 %R2.d,%A; //32ビットのR2:R3をロードする
|B| ld32 %R4.d,%B; //32ビットのR4:R5をロードする
|DP1| tcmp16s GT %AH,%AL,%P0; //R2>R3を試験して、述語P0を設定する
|DP0| add16s GT %BH,%BL,%D0; //D0=R4+R5
}
{
|D| st16 (%P0) %D0,%R6; //P0が真であれば、16ビットのR6に結果を記憶する
}
●ASMモデルでの条件付実行は、CMOVを用いる場合だけ利用できる
●tempレジスタに結果を計算することを必要とし、次いで条件付きで宛先に移動させる
●HyperOpモデルでの条件付実行は、条件がスロットに独立して適用できるようにする
●述語型実行は、同じ命令ではなく前の命令で設定された述語フラグPnを使用する
●条件付記憶は、別個の命令のスロットDで行われる
●後続のHyperOpで条件付記憶を隠すことが可能であってよい
int16 a[2],b[2],c[2],d[2],e[2];
if(a[0]>b[0])
e[0]=c[0]+d[0];
if(a[1]>b[1])
e[1]=c[1]+d[1];
//仮定:
//a[0]、a[1]は%R2、%R3の中にある
//b[0]、b[1]は%R4、%R5の中にある
//c[0]、c[1]は%R6、%R7の中にある
//d[0]、d[1]は%R8、%R9の中にある
//e[0]、e[1]は%R10、%R11の中にある
//%R12、%R13をtempとして使用する
tcmp16s GT %R2,%R4,%P1
tcmp16s GT %R3,%R5,%P0
add16s %R6,%R8,%R12
add16s %R7,%R9,%R13
cmov16 (%P1) %R12,%R10
cmov16 (%P0) %R13,%R11
{
|A| ld32 %R2.D,%A; //32ビットのR2:R3をロードする
||B| ld32 %R4.D,%B; //32ビットのR4:R5をロードする
|DP1| tcmp16s GT %AH,%BH,%P1; //R2>R4を試験して、述語P1を設定する
|DP0| tcmp16s GT %AL,%BL,%P0; //R3>R5を試験して、述語P0を設定する
}
{
|A| ld32 %R6.D,%A; //32ビットのR6:R7をロードする
|B| ld32 %R8.D,%B; //32ビットのR8:R9をロードする
|DP1| add16s %AH,%BH,%D1; //D1=R6+R8
|DP0| add16s %AL,%BL,%D0; //D0=R7+R9
|D| dst16 (%P1 %P0) %D1_D0,%R10.D; //P1が真である場合、16ビットのR10にD1を記憶し、P0が真である場合、
//16ビットのR11にD0を記憶する
}
●条件付実行はスロットD命令に適用される
●SIMD述語実行モードを使用する
●if(%P1 %P0) {…}
●%P1は上位ワードを制御する
●%P0は下位ワードを制御する
int16 a[N],b[N];
int16 i,j;
j=0;
for(i=0,i<N;i++)
{
if(a[i]<>0)
b[j++]=a[i];
}
//仮定:
//iとして%I1を使用する
//jとして%I2を使用する
//%B1はa[]を指す
//%B2はb[]を指す
//一時的GRとして%I0を使用する
gmovi $0,%I2 //I2=0
repeat $0,$N−1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B1+%I1],%I0 //I0=a[i]
//EXに%I0をロードして、FDで使用するときに+4サイクル機能停止する
gtcmps NE %I0,$0,%GP0 //a[i]<>0を試験し、述語GP0を設定する
cmov16 (%GP0) 0[%B1+%I1],0[%B2+%I2] //GP0が真である場合、16ビットのb[j]にa[i]を移動する
gadd (%GP0) %I2,$1,%I2 //GP0が真であれは、j++する
L_loop_end:
サイクル:2+N(1+4+3)=2+8N
gmovi $0,%I2 //I2=0
repeat $0,$N−1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i]<>0を試験し、述語P0を設定する
cmov16 (%P0) 0[%B1+%I1],0[%B2+%I2] //P0が真である場合、16ビットのb[j]にa[i]を移動する
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、j++する
L_loop_end:
サイクル:2+N(2+3+1)=2+6N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmovi $0,%I2 //I2=0
repeat $0,$N−1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //16ビットのa[i]をロードする
|DP0| mov16s %AL,%D0;
|DP1| tcmp16 NE %AL,$0,%P0; //a[i]<>0を試験して、述語P0を設定する
}
{
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にa[i]を移動する
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
{
|G| gadd (%P0) %I2,$1,%I2 ・・P0が真である場合、j++する
}
L_loop_end:
サイクル:2+N(1+1+3+1)=2+6N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2 //I2=0,S2=1
repeat $0,$N−1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
{|A| ld16 0[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC0;|DP0| tcmp16 NE %AL,$0,%P0;}
{|A| ld16 1[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC1;|DP0| tcmp16 NE %AL,$0,%P1;}
{|A| ld16 2[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC2;|DP0| tcmp16 NE %AL,$0,%P2;}
{|A| ld16 3[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC3;|DP0| tcmp16 NE %AL,$0,%P3;}
//EXの中に%P0を設定して、FDで使用するときに+1サイクル機能停止する
{|A| incr (%P0) $(__i2Mask);|D| st16 (%P0) %ACC0,0[%B2+%I2];}
{|A| incr (%P1) $(__i2Mask);|D| st16 (%P1) %ACC1,0[%B2+%I2];}
{|A| incr (%P2) $(__i2Mask);|D| st16 (%P2) %ACC2,0[%B2+%I2];}
{|A| incr (%P3) $(__i2Mask);|D| st16 (%P3) %ACC3,0[%B2+%I2];}
L_loop_end:
サイクル:1+N/4(4+1+4)=1+2.25N
//PE0を使用して、入力アレイa[]上で試験を遂行する:
for(i=0;i<N;i++)
{
if(a[i]<>0)
sendToPE1(a[i]);
}
//PE1を使用して、疎の出力アレイb[]を保存する:
idx=0;
while(1)
{
tmp=recvFromPE0();
b[idx++]=tmp;
}
//仮定:
//%B1はa[]を指し、iは%I1の中にある
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16 NE 0[%B1+%I1],$0,%P0;
cmov16 (%P0) 0[%B1+%I1],PE0_PE1_QPORT;
L_loop_end:
PE0サイクル:1+2N
//仮定:
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2 //I2=0,S2=1
L_loop:
jmp L_loop; //Qポート上で無限ループする
{
|A| incr $(__i2Mask); //I2+=S2;次の命令のために役立つ更新
|B| ld16 PE0_PE1_QPORT,%BL;
|DP0| mov16 %BL,%D0;
|D| st16 %D0,0[%B2+%I2]; //記憶にはI2の現在の値(更新されず)を使用する
}
●2つのPEを使用することにより、EXで%GP0を設定して、FDで使用するときの機能停止を回避する
int16 a[N],b[N];
int16 i,j;
j=0;
for(i=0;i<N;i++)
{
if(a[i]<>0) { b[j++]=i;}
}
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov $0,%I2
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B1+%I1],%I0 //一時的I0の中にa[i]をロードする
//EXに%I0をロードして、FDで使用するときに+4サイクル機能停止する
gtcmps NE %I0,$0,%GP0 //a[i]<>0を試験し、述語GP0を設定する
cmov16 (%GP0) %I1,0[%B2+%I2] //GP0が真である場合、16ビットのb[j]にiを移動する
gadd (%GP0) %I2,$1,%I2 //GP0が真である場合、増分j++する
L_loop_end:
サイクル:2+N(1+4+3)=2+8N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov16 $0,%I2
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i]<>0を試験し、述語P0を設定する
cmov16 (%P0) %I1,0[%B2+%I2] //P0が真である場合、16ビットのb[j]にiを移動する
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、増分j++する
L_loop_end:
サイクル:2+N(2+3+1)=2+6N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov16 $0,%I2
repeat $0,$N−1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i+0]<>0を試験し、述語P0を設定する
tcmp16s NE 1[%B1+%I1],$0,%P1 //a[i+1]<>0を試験し、述語P1を設定する
tcmp16s NE 2[%B1+%I1],$0,%P2 //a[i+2]<>0を試験し、述語P2を設定する
tcmp16s NE 3[%B1+%I1],$0,%P3 //a[i+3]<>0を試験し、述語P3を設定する
add16s (%P0)%I1,$0,0[%B2+%I2] //P0が真である場合、16ビットのb[j]にi+0を移動する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、増分j++する
add16s (%P1) %I1,$1,0[%B2+%I2] //P1が真である場合、16ビットのb[j]にi+1を移動する
gadd (%P1) %I2,$1,%I2 //P1が真である場合、増分j++する
add16s(%P2) %I1,$2,0 [%B2+%I2]//P2が真である場合、16ビットのb[j]を移動する
gadd (%P2) %I2,$1,%I2 //P2が真である場合、増分j++する
add16s (%P3) %I1,$3,0[%B2+%I2] //P3が真である場合、16ビットのb[j]にi+3を移動する
gadd (%P3) %I2,$1,%I2 //P3が真である場合、増分j++する
L_loop_end:
サイクル:2+N/4(4+8)=2+3N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmov $0,$1,%I2,%S2
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //ALの中にa[i]をロードする
||DP0| mov16 %AL,%D0; //D0にa[i]を移動する
|D| st16 %D0,%I0; //一時的I0の中にD0=a[i]を記憶する
}
//EXの中に%I0を書き込み、FDで使用するときに+4サイクル機能停止する
{
|B| ld16 %I1,%BH; //BHの中にiをロードする
|DP0| mov16s %BH,%D0; //D0にiを移動する
|G| gtcmps NE %I0,$0,&GP0; //a[i]<>0を試験し、述語P0を設定する
}
{
|A| incr (%GP0) $(__i2Mask); //GP0が真である場合、増分j++する
|D| st16 (%GP0) %D0,0[%B2+%I2]; //GP0が真である場合、16ビットのb[j]にiを移動する
}
L_loop_end:
サイクル:2+N(1+4+2)=2+7N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //ALの中にa[i]をロードする
|B| ld16 %I1,%BL; //BLの中にiをロードする
|DP1| tcmp16s NE %AL,$0,%P0; //a[i]<>0を試験し、述語P0を設定する
|DP0| mov %BL,%D0; //D0にiを移動する、記憶するための準備
}
//EXの中に%P0を書き込み、FDで使用するときに+4サイクル機能停止する
{
|A| incr (%P0) $(__i2Mask); //P0が真である場合、増分j++する
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にiを移動する
}
L_loop_end:
サイクル:2+N(1+4+1)=2+6N
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N−1,$5 %I1,L_loop_start,L_loop_end
L_loop_start:
//一時的GRの中にa[]から次の5つの値をロードする
{|A| ld16 0[%B1+%I1],%AL;|DP0| mov16s %AL,%D0;|D| st16 %D0,%T4;}
{|A| ld16 1[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T5;}
{|A| ld16 2[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T6;}
{|A| ld16 3[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T7;}
{|A| ld16 4[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%I0;}
//if(a[i]<>0) { b[j++]=i;} //a[i+0]を試験する
{|A| ld16 %I1,%AH;|G| gtcmpi16 NE %T4,$0,%GP0;|DP0| add16s %AH,$0,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+1]<>0) { b[j++]=i+1;} //a[i+1]を試験する
{|G| gtcmpi16 NE %T5,$0,%GP0;|DP0| add16s %AH,$1,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+2]<>0) { b[j++]=i+2;} //a[i+2]を試験する
{|G| gtcmpi16 %T6,$0,%GP0;|DP0| add16s %AH,$2,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+3]<>0) { b[j++]=i+3;} //a[i+3]を試験する
{|G| gtcmpi16 NE %T7,$0,%GP0;|DP0| add16s %AH,$3,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+4]<>0) { b[j++]=i+4;} //a[i+4]を試験する
{|G| gtcmpi16 NE %I0,$0,%GP0;|DP0| add16s %AH,$4,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
L_loop_end:
サイクル:2+N/5(5+5(2))=2+3N
注:
●5つのGRの中にロードすることによりすべての機能停止を隠すことができる
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N−1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[]の次の5つの値を試験して、P0〜P3に入れる
{|A| ld32 0[%B1+%I1],%A;
|C| ld16 %I1,%CLL; //CLL=I1
|DP1| tcmp16s NE %AH,$0,%P0;
|DP0| tcmp16s NE %AL,$0,%P1;
}
{|B| ld32 2[%B1+%I1],%B;
|DP1| tcmp16s NE %BH,$0,%P2;
|DP0| tcmp16s NE %BL,$0,%P3;
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
//if(a[i]<>0) { b[j++]=i;} //P0を使用する
{|A| incr (%P0) $(__i2Mask);
|DP0| add16s %CLL,$0,%D0;
|D| st16 (%P0) %D0,0[%B2+%I2];
}
//if(a[i+1]<>0) { b[j++]=i+1;} //P1を使用する
{|A| incr (%P1) $(__i2Mask);
|DP0| add16s %CLL,$1,%D0;
|D| st16 (%P1) %D0,0[%B2+%I2];
}
//if(a[i+2]<>0) { b[j++]=i+2;} //P2を使用する
{|A| incr (%P2) $(__i2Mask);
|DP0| add16s %CLL,$2,%D0;
|D| st16 (%P2) %D0,0[%B2+%I2];
}
//if(a[i+3]<>0) { b[j++]=i+3;} //P3を使用する
{|A| incr (%P3) $(__i2Mask);
|DP0| add16s %CLL,$3,%D0;
|D| st16 (%P3) %D0,0[%B2+%I2];
}
L_loop_end:
サイクル:2+N/4(2+3+4)=2+2.25N
注:
●4つのPnを用いてすべての機能停止を隠すことができるわけではない
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N−1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[]の次の4つの値を試験して、P0〜P3に入れる
{
|A| ld32 0[%B1+%I1],%A; //ロードする、AH=a[i+0]、AL=a[i+1]
|C| ld16 $a,%CLL; //CLL=&a[0]
|DP1| tcmp16s NE %AH,$0,%P0; //a[i+0]<>0を試験して、述語P0を設定する
|DP0| tcmp16s NE %AL,$0,%P1; //a[i+1]<>0を試験して、述語P1を設定する
}
{
|B| ld32 2[%B1+%I1],%B; //ロードする、BH=a[i+2]、BL=a[i+3]
|DP1| tcmp16s NE %BH,$0,%P2; //a[i+2]<>0を試験して、述語P2を設定する
|DP0| tcmp16s NE %BL,$0,%P3; //a[i+3]<>0を試験して、述語P3を設定する
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する(INCR命令)
//if(a[i]<>0) { b[j++]=i;}
{
|A| incr (%P0) $(__i2Mask); //P0が真である場合、増分j++する
|B| ld16t 0[%B1+%I1],%B; //タグ付データをロードするB={&a[i]:a[i]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i]−&a[0]=i
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にiを記憶する
}
//if(a[i+1]<>0) { b[j++]=i+1;}
{
|A| incr (%P1) $(__i2Mask); //P1が真である場合、増分j++する
|B| ld16t 1[&B1+%I1],%B; //タグ付データをロードするB={&a[i+1]:a[i+1]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+1]−&a[0]=i+1
|D| st16 (%P1) %D0,0[%B2+%I2]; //P1が真である場合、16ビットのb[j]にi+1を記憶する
}
//if(a[i+2]<>0) { b[j++]=i+2;}
{
|A| incr (%P2) $(__i2Mask); //P2が真である場合、増分j++する
|B| ld16t 2[&B1+%I1],%B; //タグ付データをロードするB={&a[i+2]:a[i+2]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+2]−&a[0]=i+2
|D| st16 (%P2) %D0,0[%B2+%I2]; //P2が真である場合、16ビットのb[j]にi+2を記憶する
}
//if(a[i+3]<>0) { b[j++]=i+3;}
{
|A| incr (%P3) $(__i2Mask); //P3が真である場合、増分j++する
|B| ld16t 3[&B1+%I1],%B; //タグ付データをロードするB={&a[i+3]:a[i+3]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+3]−&a[0]=i+3
|D| st16 (%P3) %D0,0[%B2+%I2]; //P3が真である場合、16ビットのb[j]にi+3を記憶する
}
L_loop_end:
サイクル:2+N/4(2+3+4)=2+2.25N
●タグ付ロードLD16Tは、16ビットデータ(下位16ビットに)およびそのアドレスを(上位16ビットに)パックされたデータとしてロードする
●データインデックスは、データアドレス(またはタグ)であり、すなわち、アレイの開始である
int16 a[N],b[N],c[N];
int16 i,j;
for(i=0;i<N;i++)
{
j=b[i];
a[i]=c[j];
}
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2の中にあると仮定する
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B2+%I1],%I2
//EXの中に%I2を設定して、FDで使用するときに+4サイクル機能停止する
mov16 0[%B4+%I2],0[%B1+%I1]
L_loop_end:
サイクル:1+N(1+4+1)=1+6N
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2の中にあると仮定する
repeat $0,$N−1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{|A| ld16 0[%B2+%I1],%AL;|DP0| mov %AL,%D0;|D| st16 %D0,%I2}
//EXの中に%I2を設定して、FDで使用するときに+4サイクル機能停止する
{|B| ld16 0[%B4+%I2],%BL;|DP0| mov %BL,%D0;|D| st16 %D0,0[%B1+%I1]};
L_loop_end:
サイクル:1+N(1+4+1)=1+6N
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2〜%I7の中にあると仮定する
//j0=b[0];j1=b[1];
{|A| ld32 0[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I2I3;}
//j2=b[2]; j3=b[3];
{|A| ld32 2[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I4I5;}
//j4=b[4]; j5=b[5];
{|A| ld32 4[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I6I7;}
//EXの中に%I2、%I3を設定して、FDで使用するときに+1サイクル機能停止する
repeat $0,$N−1,$6 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[i+0]=c[j0];a[i+1]=c[j1];j0=b[i+6];j1=b[i+7];
{|A| ld16 0[%B4+%I2],%AL;|B| ld16 0[%B4+%I3],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,0[%B1+%I1];}
{|A| ld32 6[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I2I3;}
//a[i+2]=c[j2];a[i+3]=c[j3];j2=b[i+8];j3=b[i+9];
{|A| ld16 0[%B4+%I4],%AL;|B| ld16 0[%B4+%I5],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,2[%B1+%I1];}
{|A| ld32 8[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I4I5;}
//a[i+4]=c[j4];a[i+5]=c[j5];j4=b[i+10];j5=b[i+11];
{|A| ld16 0[%B4+%I6],%AL;|B| ld16 0[%B4+%I7],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,4[%B1+%I1];}
{|A| ld32 10[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %ACC0,%I6I7;}
//I1〜I7の中にロードされた最終値を無視する
L_loop_end:
サイクル:3+1+1+N/6(6)=5+N
●インデックスjは、1サイクルでb[i]から対でロードされる
●2つのc[j]は、1サイクルで対としてロードされ、a[i]に記憶される
●6つのインデックスレジスタを使用することにより、EXでのインデックスの設定およびFDでのインデックスの使用というパイプラインバブルを回避する
int16 a[N],b[N],c[N];
int16 i;
int32 sum=0;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
sum+=a[i]*c[i];
}
repeat $0,$N−1,$2,IDX_i,L_loop_start,L_loop_end
movx16s $0,%ACC2
movx16s $0,%ACC0
L_loop_start:
vtcmp16s GT 0[BP_a+IDX_i],0[BP_b+IDX_i],%P1P0;
cmov16 (%P1) 0[BP_a+IDX_i],$0,%R0
cmov16 (%P0) 1[BP_1+IDX_i],$0,%R1
vmulaa16s %R0.D,0[BP_c+IDX_i],%ACC2_ACC0
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:3+N/2(4)+1=4+2N
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define IDX_i %I1
repeat $0,$N−1,$2,IDX_i,L_loop_start,L_loop_end
{|DP1| movx16s $0,%ACC2;|DP0| movx16s $0,%ACC0;}
L_loop_start:
{|A| ld32 0[BP_a+IDX_i],%A;|B| ld32 0[BP_b+IDX_i],%B;
|DP1| tcmp16s GT %AH,%BH,%P1;|DP0| tcmp16s GT %AL,%BL,%P0;}
{|C| ld32 0[BP_c+IDX_i],%B;
|DP1| mulaa16s (%P1) %AH,%BH,%ACC2;|DP0| mulaa16s (%P0) %AL,%BL,%ACC0;}
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:1+N/2(2)+1=2+N
●DP1およびDP0を使用して、繰返しiおよびi+1を並列に処理する
●合計を%ACC0および%ACC2の中に分割し、次いで最後に組み合わせる
●述語フラグ%P1および%P0を使用して、累積を%ACC2および%ACC0の中で独立に制御する
Cコード
int16 a[N],b[N],c[N];
int16 i;
int32 sum=0;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
sum+=a[i]*c[i];
}
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
repeat $0,$N−1,$4,IDX_i,L_loop_start,L_loop_end
{|DP1| movx16s $0,%ACC2;|DP0| movx16s $0,%ACC0;}
L_loop_start:
{|A| ld64 0[BP_a+IDX_i],%AB;|C| ld64 0[BP_b+IDX_i],%C;
|DP1| dtcmp16s GT %A,%CH,%P3P2;
|DP0| dtcmp16s GT %B,%CL,%P1P0;}
{|C| ld64 0[BP_c+IDX_i],%C;
|DP1| dmulaa16s (%P3P2) %A,%CH,%ACC2;
|DP0| dmulaa16s (%P1P0) %B,%CL,%ACC0;}
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:2+N/4(2)+1=3+0.5N
●繰返しi〜i+3を並列に処理する:
●iおよびi+1をDP1で
●i+2およびi+3をDP0で
●DP0は二重動作を遂行し、DP1は二重動作を遂行する
●合計を%ACC0および%ACC2の中に分割し、次いで最後に組み合わせる
●述語フラグ%P0〜P3使用して、積の累積を%ACC0および%ACC2の中で独立に制御する
●b[]およびc[]は、64ビットアクセスが作動するために、a[]と異なるDMRでなければならない
int16 a[N],b[N],c[N],d[N];
int16 i;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
d[i]=a[i]*c[i];
}
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define BP_d %B4
#define IDX_i %I1
repeat $0,$N−1,$2,IDX_i,L_loop_start,L_loop_end
L_loop_start:
vtcmp16s GT [BP_a+IDX_i],[BP_b+IDX_i],%P1P0
vmul16s (%P1P0) [BP_a+IDX_i],[BP_c+IDX_i],[BP_d+IDX_i]
L_loop_end:
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define BP_d %B4
#define IDX_i %I1
repeat $0,$N−1,$2,IDX_i,L_loop_start,L_loop_end
L_loop_start:
{|A| ld32 0[BP_a+IDX_i],%A;|B| ld32 0[BP_b+IDX_i],%B;
|DP1| tcmp16s GT %AH,%BH,%P1;|DP0| tcmp16s GT %AL,%BL,%P0;}
{|C| ld32 0[BP_c+IDX_i],%C;
|DP1| mul16s %AH,%CLH,%D1;|DP0| mul16s %AL,%CLL,%D0;
|D| dst16 (%P1P0) %D1_D0,0[BP_d+IDX_i];}
L_loop_end:
●DP1およびDP0を使用して、繰返しiおよびi+1を並列に処理する
●述語フラグ%P1および%P0を使用して、16ビット:16ビットの記憶を独立に制御する(SIMDモード)
absq=abs(q);
if(absq<qmin) {
qmin2=qmin;
qmin=absq;
imin=i;
}
else if(absq<qmin2) {
qmin2=absq;
}
//iminおよびqminはパックされたデータimin_qminとして記憶されている(偶数アドレス)と仮定する
abs16s q,absq //absq=abs(q)
tcmp16 LT absq,qmin,%P1 //P1=(absq<qmin)
jmp (!%P1) L_else PNT //!P1が真である場合、qmin更新をスキップする
tcmp16 LT absq,qmin2,%P0 //P0=(absq<qmin2)―スロットを遅延する
L_if: //qminおよびqmin2を更新する:
mov16 qmin,qmin2 //qmin2=qmin
jmp L_end
dmov16 i,absq,imin_qmin //qmin=absq,imin=i−スロットを遅延させる
L_else:
jmp (!%P0) L_end PNT DLY
nop //スロットを遅延させる
mov16 absq,qmin2 //qmin2だけを更新する
L_end:
abs16s q,absq
tcmp16 LT absq,qmin,%P1
jmp (!%P1) L_else PNT
tcmp16 LT absq,qmin2,%P0 //遅延スロットで実行される
L_if:
mov16 qmin,qmin2
jmp L_end
dmov16 i,absq,imin_qmin //遅延スロットで実行される
L_else:
jmp (!%P0) L_end PNT DLY
mov16 absq,qmin2 //JMPの後に実行され、遅延スロットでは実行されない
L_end:
absq=abs(q);
if(absq<qmin) {
qmin2=qmin;
qmin=absq;
imin=i;
}
else if(absq<qmin2) {
qmin2=absq;
}
//iminおよびqminはパックされたデータimin_qminとして記憶されている(偶数アドレス)と仮定する
abs16s q,absq //absq=abs(q)
tcmp16s LT absq,qmin,%P1 //P1=(absq<qmin)
tcmp16s LT absq,qmin2,%P0 //P0=(absq<qmin2)
cmov16 (%P1) qmin,qmin2 //P1が真である場合、qmin2=qmin
cmov16 (%P1) absq,qmin //P1が真である場合、qmin=absq
cmov16 (%P1) i,imin //P1が真である場合、imin=i
cmov16 (!%P1&%P0) absq,qmin2 //他にP0が真である場合、qmin2=absq
サイクル:7
{|A| ld16 q、AL;
|B| ld16 i,%BL;
|DP1| mov16 %BL,%ACC3; //ACC3=i
|DP1| abs16s %AL,%ACC1; //ACC1L=absq
|D| dst16 %ACC3_ACC1,%ACC3;} //ACC3H=i,ACC3L=absq
{|A| ld32 imin_qmin,%A; //AH=imin,AL=qmin
|B| ld16 qmin2,%BL; //BL=qmin2
|DP1| tcmp16 LT %ACC3L,%AL,%P1; //P1=(absq<qmin)
|DP0| tcmp16 LT %ACC1L,%BL,%P0;} //P0=(absq<qmin2)
{|DP1| if(%P1) cmov32 %ACC3,%A,%ACC2; //P1が真である場合、{ACC2H=i,ACC2L=absq}
//そうではない場合、{ACC2H=imin,ACC2L=qmin}
|DP0| if(%P1) cmov16 %AL,%BL,%ACC0; //ACC0=(P1) ? qmin2:qmin
|D| st32 %ACC2,imin_qmin;} //imin:qmin=ACC2H:ACC2Lに更新する
{|DP0| if(!%P1&%P0) cmov16 %ACC3L,%ACC0L,%ACC0; //そうではない場合、ACC0L=(P0) ? absq:qmin
|D| st16 %ACC0,qmin2;} //qmin2=ACC0Lに更新する
サイクル:4
●P1および%P0を使用して、IF試験およびELSE IF試験のブール代数の結果を保持する
●iminおよびqminは、パックされた16:16としてメモリに記憶されていると仮定する
●CSELと共に%P1および%P0を使用して、可能である場合には対で状態変数を条件付きで更新する
int16 a,b,c,d,e;
void test() {
a=(b<c)&&(d<e);
}
tcmp16s LT b,c %P0 //P0=(b<c)
tcmp16s LT d,e,%P1 //P1=(d<e)
cmov16 (%P0&%P1) $1,$0,a //a=(P0&P1)1:0
●コンパイラは、&&演算子を&演算子と置換する:
●a=(b<c)&(d<e)
int16 a,b,c,d,e;
void test() {
a=(b<c)&&(d<e);
}
tcmp16s LT b,c,%R0 //R0=(b<c)
tcmp16s LT d,e,%R1 //R1=(d<e)
and16 %R0,%R1,a //a=R0&R1
●コンパイラは、&&演算子を&演算子に置換する:
●a=(b<c)&(d<e)
int16 a,b,c,d,e,f;
if((a<b)&(c<e)|(d>f))
foo();
tcmp16s LT a,b,%R1 //R1=(a<b)
tcmp16s LT c,e,%R2 //R2=(c<e)
tand16 NZ %R1,%R2,%P0 //P0=(a<b)&(c<e)
tcmp16s GT d,f,%P1 //P1=(d>f)
jsr (%P0|%P1) foo //P0|P1が真であれば、foo()を実行する
●AND16ではなくTAND16を使用する
●Pnは、TEST以外、ALU動作ではdstDになることはできないことに留意されたい
int16 a,b,c,d,e,f,result;
result=((a<b)&(c<e)|(d>f));
tcmp16s LT a,b,%R1 //R1=(a<b)
tcmp16s LT c,e,%R2 //R2=(c<e)
and16 %R1,%R2,%R3 //P3=(a<b)&(c<e)
tcmp16s GT d,f,%R4 //R4=(d>f)
or16 %R3,%R4,result //result=(R3|R4)
Claims (20)
- 装置であって、
複数のプロセッサを含むマルチプロセッサと、
散在した配列で前記複数のプロセッサに連結した複数のメッセージノードであって、前記複数のメッセージノードのうちの特定のメッセージノードは、
ペイロードおよびルーティング情報を含む第1のメッセージを受信し、
前記ルーティング情報および前記マルチプロセッサの動作情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードを選択し、
前記異なるメッセージノードに基づき、前記第1のメッセージの前記ルーティング情報を修正して、第2のメッセージを生成し、
前記異なるメッセージノードに前記第2のメッセージを送付する
ように構成された複数のメッセージノードと
を備える装置。 - 前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項1に記載の装置。
- 前記ルーティング情報は、前記特定のメッセージノードから、前記第1のメッセージの宛先として指定された、前記複数のメッセージノードのうちの別のメッセージノードに至る相対オフセットを示す情報を含む、請求項1に記載の装置。
- 前記特定のメッセージノードは、
前記第1のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第3のメッセージを生成し、
前記複数のメッセージノードの対応する1つに前記複数の第3のメッセージの各々を送付する
ようにさらに構成される、請求項1に記載の装置。 - 前記第1のメッセージは、前記動作情報の少なくとも一部分を含む、請求項1に記載の装置。
- 前記異なるメッセージノードを選択するために、前記特定のメッセージノードは、宛先を指定する前記第1のメッセージに含まれる情報を使用して、前記特定のメッセージノードに含まれるテーブルから次の宛先を取り出すようにさらに構成される、請求項1に記載の装置。
- 方法であって、
マルチ・プロセッサ・アレイに含まれる複数のメッセージノードのうちの特定のメッセージノードにより、ペイロードおよびルーティング情報を含む第1のメッセージを受信するステップと、
前記特定のメッセージノードにより、前記ルーティング情報および前記マルチ・プロセッサ・アレイの動作情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードを選択するステップと、
前記特定のメッセージノードにより、前記異なるメッセージノードに基づく第2のメッセージを生成するステップと、
前記特定のメッセージノードにより、前記異なるメッセージノードに前記第2のメッセージを送付するステップと
を備える方法。 - 前記第2のメッセージを生成する前記ステップは、前記第1のメッセージの前記ルーティング情報を修正して、前記第2のメッセージに含まれる修正ルーティング情報を生成するステップを含む、請求項7に記載の方法。
- 前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項7に記載の方法。
- 前記ルーティング情報は、前記特定のメッセージノードから、前記第1のメッセージの宛先として指定された、前記複数のメッセージノードのうちの別のメッセージノードに至る相対オフセットを示す情報を含む、請求項7に記載の方法。
- 前記特定のメッセージノードにより、前記マルチ・プロセッサ・アレイに含まれる処理要素からリクエストを受信し、前記特定のメッセージノードにより、前記リクエストに基づき第3のメッセージを生成する、請求項7に記載の方法。
- 前記第1のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第3のメッセージを生成するステップと、
前記複数のメッセージノードのうちの対応する1つに前記複数の第3のメッセージの各々を送付するステップと
をさらに備える、請求項7に記載の方法。 - テーブルから、前記特定のメッセージノードにより、前記ルーティング情報の少なくとも一部を使用して、前記第1のメッセージに関する次の宛先を示す情報を取り出すステップをさらに備える、請求項7に記載の方法。
- 装置であって、
ペイロードおよびルーティング情報を含む第1のメッセージを受信するように構成された、メッセージバスに連結されたルータ回路と、
ネットワークプロセッサ回路であって、
前記ルーティング情報、およびマルチ・プロセッサ・アレイに関する動作情報に基づき、前記メッセージバスを介して一緒に連結された、複数のメッセージノードのうちの特定のメッセージノードを選択し、
前記特定のメッセージノードに基づき、前記第1のメッセージの前記ルーティング情報を修正して、第2のメッセージを生成する
ように構成されたネットワークプロセッサ回路と
を備え、
前記ルータ回路は、前記特定のメッセージノードに前記第2のメッセージを送付するようにさらに構成される装置。 - 前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項14に記載の装置。
- 前記ルーティング情報は、前記第1のメッセージの宛先として指定された、複数のメッセージノードのうちの所与のメッセージノードに至る相対オフセットを示す情報を含む、請求項14に記載の装置。
- 前記動作情報を記憶するように構成された構成回路をさらに備える、請求項14に記載の装置。
- 前記第1のメッセージは、前記動作情報の少なくとも一部分を含む、請求項14に記載の装置。
- 前記ネットワークプロセッサ回路は、前記マルチ・プロセッサ・アレイに含まれる処理要素からリクエストを受信し、前記リクエストに基づき第3のメッセージを生成するように構成され、前記ルータ回路は、前記第3のメッセージに含まれる情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードに前記第3のメッセージを送付するようにさらに構成される、請求項14に記載の装置。
- 複数のエントリを記憶するように構成されたテーブルをさらに備え、前記ネットワークプロセッサ回路は、前記第1のメッセージに含まれる情報を使用して前記テーブルから次の宛先を取り出すようにさらに構成される、請求項14に記載の装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2023094618A JP2023113879A (ja) | 2017-11-03 | 2023-06-08 | メモリ・ネットワーク・プロセッサ |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201762581512P | 2017-11-03 | 2017-11-03 | |
US62/581,512 | 2017-11-03 | ||
PCT/US2018/058873 WO2019090032A1 (en) | 2017-11-03 | 2018-11-02 | Memory network processor |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2023094618A Division JP2023113879A (ja) | 2017-11-03 | 2023-06-08 | メモリ・ネットワーク・プロセッサ |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2021501947A true JP2021501947A (ja) | 2021-01-21 |
JP7295104B2 JP7295104B2 (ja) | 2023-06-20 |
Family
ID=64362725
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2020524772A Active JP7295104B2 (ja) | 2017-11-03 | 2018-11-02 | メモリ・ネットワーク・プロセッサ |
JP2023094618A Pending JP2023113879A (ja) | 2017-11-03 | 2023-06-08 | メモリ・ネットワーク・プロセッサ |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2023094618A Pending JP2023113879A (ja) | 2017-11-03 | 2023-06-08 | メモリ・ネットワーク・プロセッサ |
Country Status (6)
Country | Link |
---|---|
US (3) | US10747709B2 (ja) |
EP (1) | EP3704593A1 (ja) |
JP (2) | JP7295104B2 (ja) |
CN (2) | CN117194311A (ja) |
TW (2) | TWI714903B (ja) |
WO (1) | WO2019090032A1 (ja) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111124994B (zh) * | 2019-11-29 | 2022-11-11 | 苏州浪潮智能科技有限公司 | 一种数据传输方法、装置、gpu及可读存储介质 |
US11500641B2 (en) * | 2020-10-07 | 2022-11-15 | Huawei Technologies Co., Ltd. | Devices, methods, and media for efficient data dependency management for in-order issue processors |
KR102578292B1 (ko) | 2020-12-15 | 2023-09-15 | 한국과학기술연구원 | 컴퓨터 메모리 효율성이 향상된 물체/영역 검출 및 분류 시스템 |
TWI775259B (zh) * | 2020-12-29 | 2022-08-21 | 新唐科技股份有限公司 | 直接記憶體存取裝置與使用其的電子設備 |
FR3121239A1 (fr) * | 2021-03-24 | 2022-09-30 | Thales | Système de communication comprenant une pluralité de processeurs et au moins un commutateur, et un procédé de communication associé |
TW202247046A (zh) * | 2021-05-19 | 2022-12-01 | 神盾股份有限公司 | 基於卷積運算的資料處理方法及電路 |
TWI783673B (zh) * | 2021-09-09 | 2022-11-11 | 英業達股份有限公司 | 具有頻寬切換功能之伺服器系統 |
GB2605471B (en) * | 2021-09-30 | 2023-11-01 | Imagination Tech Ltd | Processor with hardware pipeline |
GB2605664B (en) | 2021-09-30 | 2023-03-29 | Imagination Tech Ltd | Processor with hardware pipeline |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS62109451A (ja) * | 1985-11-04 | 1987-05-20 | インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション | データ伝送ネットワークの通信パス確立・不可用性データ収集方法 |
JPH0728763A (ja) * | 1993-07-15 | 1995-01-31 | Fujitsu Ltd | 放送通信方法および放送ルーティング装置 |
JP2006277635A (ja) * | 2005-03-30 | 2006-10-12 | Nec Corp | 情報処理システムとjob実行方法 |
JP2012146201A (ja) * | 2011-01-13 | 2012-08-02 | Toshiba Corp | オンチップルータ及びそれを用いたマルチコアシステム |
WO2013098993A1 (ja) * | 2011-12-28 | 2013-07-04 | 富士通株式会社 | 計算機システム,通信制御装置及び計算機システムの制御方法 |
JP2017123197A (ja) * | 2012-11-21 | 2017-07-13 | コーヒレント・ロジックス・インコーポレーテッド | 分散型プロセッサを有する処理システム |
Family Cites Families (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS5833572B2 (ja) * | 1977-10-21 | 1983-07-20 | 株式会社東芝 | 情報処理方式 |
US5459836A (en) | 1990-02-09 | 1995-10-17 | Unisys Corporation | Inter-processor communication net |
KR970007251B1 (ko) | 1994-02-25 | 1997-05-07 | 한국전기통신공사 | 다중버스용 실시간 멧세지 전송장치 및 그 제어방법 |
US6226706B1 (en) | 1997-12-29 | 2001-05-01 | Samsung Electronics Co., Ltd. | Rotation bus interface coupling processor buses to memory buses for interprocessor communication via exclusive memory access |
US7861071B2 (en) * | 2001-06-11 | 2010-12-28 | Broadcom Corporation | Conditional branch instruction capable of testing a plurality of indicators in a predicate register |
US7471643B2 (en) * | 2002-07-01 | 2008-12-30 | Panasonic Corporation | Loosely-biased heterogeneous reconfigurable arrays |
US6865662B2 (en) * | 2002-08-08 | 2005-03-08 | Faraday Technology Corp. | Controlling VLIW instruction operations supply to functional units using switches based on condition head field |
US8037224B2 (en) * | 2002-10-08 | 2011-10-11 | Netlogic Microsystems, Inc. | Delegating network processor operations to star topology serial bus interfaces |
JP2006127460A (ja) * | 2004-06-09 | 2006-05-18 | Renesas Technology Corp | 半導体装置、半導体信号処理装置、およびクロスバースイッチ |
US7505734B2 (en) * | 2004-09-10 | 2009-03-17 | Nivis, Llc | System and method for communicating broadcast messages in a mesh network |
TWI350525B (en) * | 2006-08-18 | 2011-10-11 | Realtek Semiconductor Corp | Memory management apparatus and method for optical storage system |
US7941499B2 (en) | 2007-03-06 | 2011-05-10 | Freescale Semiconductor, Inc. | Interprocessor message transmission via coherency-based interconnect |
US7761687B2 (en) * | 2007-06-26 | 2010-07-20 | International Business Machines Corporation | Ultrascalable petaflop parallel supercomputer |
US9043478B2 (en) | 2009-12-15 | 2015-05-26 | Qualcomm Innovation Center, Inc. | Methods and apparatus for using a distributed message bus for ad hoc peer-to-peer connectivity |
JP5815717B2 (ja) | 2010-10-15 | 2015-11-17 | コーヒレント・ロジックス・インコーポレーテッド | マルチプロセッサシステムにおける通信の無効化 |
US9760526B1 (en) | 2011-09-30 | 2017-09-12 | EMC IP Holdings Company LLC | Multiprocessor messaging system |
US20140025884A1 (en) * | 2012-07-18 | 2014-01-23 | Netronome Systems, Inc. | Transactional Memory that Performs a Statistics Add-and-Update Operation |
WO2014092968A1 (en) * | 2012-12-13 | 2014-06-19 | Coherent Logix, Incorporated | Multiprocessor system with improved secondary interconnection network |
KR20140126189A (ko) * | 2013-04-22 | 2014-10-30 | 삼성전자주식회사 | 프로세서의 멀티 실행 모드 지원 장치 및 방법 |
EP3005078A2 (en) * | 2013-05-24 | 2016-04-13 | Coherent Logix Incorporated | Memory-network processor with programmable optimizations |
CN105306076A (zh) * | 2014-06-30 | 2016-02-03 | 深圳市中兴微电子技术有限公司 | 一种基于MAP算法的Turbo译码方法及装置 |
-
2018
- 2018-11-02 US US16/178,738 patent/US10747709B2/en active Active
- 2018-11-02 EP EP18804849.0A patent/EP3704593A1/en active Pending
- 2018-11-02 WO PCT/US2018/058873 patent/WO2019090032A1/en active Search and Examination
- 2018-11-02 CN CN202311152590.5A patent/CN117194311A/zh active Pending
- 2018-11-02 JP JP2020524772A patent/JP7295104B2/ja active Active
- 2018-11-02 CN CN201880084620.4A patent/CN111527485B/zh active Active
- 2018-11-05 TW TW107139222A patent/TWI714903B/zh active
- 2018-11-05 TW TW109142450A patent/TWI798605B/zh active
-
2020
- 2020-07-17 US US16/931,864 patent/US11550750B2/en active Active
-
2022
- 2022-10-20 US US17/969,871 patent/US11829320B2/en active Active
-
2023
- 2023-06-08 JP JP2023094618A patent/JP2023113879A/ja active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS62109451A (ja) * | 1985-11-04 | 1987-05-20 | インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション | データ伝送ネットワークの通信パス確立・不可用性データ収集方法 |
JPH0728763A (ja) * | 1993-07-15 | 1995-01-31 | Fujitsu Ltd | 放送通信方法および放送ルーティング装置 |
JP2006277635A (ja) * | 2005-03-30 | 2006-10-12 | Nec Corp | 情報処理システムとjob実行方法 |
JP2012146201A (ja) * | 2011-01-13 | 2012-08-02 | Toshiba Corp | オンチップルータ及びそれを用いたマルチコアシステム |
WO2013098993A1 (ja) * | 2011-12-28 | 2013-07-04 | 富士通株式会社 | 計算機システム,通信制御装置及び計算機システムの制御方法 |
JP2017123197A (ja) * | 2012-11-21 | 2017-07-13 | コーヒレント・ロジックス・インコーポレーテッド | 分散型プロセッサを有する処理システム |
Non-Patent Citations (1)
Title |
---|
澤村 徹: "「無線LANのセッティングは難しい」は昔の話 手間いらずの簡単セッティング機能を検証", 月刊ウィンドウズ スタート 6月号, vol. No.132.2006.JUN, JPN6022045931, 29 April 2006 (2006-04-29), pages 66 - 67, ISSN: 0004915486 * |
Also Published As
Publication number | Publication date |
---|---|
JP7295104B2 (ja) | 2023-06-20 |
TW201923614A (zh) | 2019-06-16 |
CN111527485A (zh) | 2020-08-11 |
US20190138492A1 (en) | 2019-05-09 |
US11829320B2 (en) | 2023-11-28 |
JP2023113879A (ja) | 2023-08-16 |
US20210034566A1 (en) | 2021-02-04 |
TW202121194A (zh) | 2021-06-01 |
US11550750B2 (en) | 2023-01-10 |
TWI714903B (zh) | 2021-01-01 |
TWI798605B (zh) | 2023-04-11 |
CN117194311A (zh) | 2023-12-08 |
CN111527485B (zh) | 2023-09-12 |
US20230061478A1 (en) | 2023-03-02 |
US10747709B2 (en) | 2020-08-18 |
EP3704593A1 (en) | 2020-09-09 |
WO2019090032A1 (en) | 2019-05-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11829320B2 (en) | Memory network processor | |
JP7264955B2 (ja) | プログラム可能な最適化を有するメモリネットワークプロセッサ | |
US7617384B1 (en) | Structured programming control flow using a disable mask in a SIMD architecture | |
US8495603B2 (en) | Generating an executable version of an application using a distributed compiler operating on a plurality of compute nodes | |
TWI806550B (zh) | 處理器操作方法、相關電腦系統、及非暫時性電腦可存取儲存媒體 | |
JP2022539844A (ja) | 静止再構成可能データ・プロセッサ | |
JP5818351B2 (ja) | ヘテロジニアス黙示的及び明示的プロセッシング要素のコンピュータ的一体化のための方法、プログラムおよびコンピュータプログラム | |
US20110231616A1 (en) | Data processing method and system | |
US20210232394A1 (en) | Data flow processing method and related device | |
WO2012068494A2 (en) | Context switch method and apparatus | |
US8949777B2 (en) | Methods and systems for mapping a function pointer to the device code | |
KR20220036950A (ko) | 순수 함수 신경망 가속기 시스템 및 아키텍처 | |
US9477628B2 (en) | Collective communications apparatus and method for parallel systems | |
US20050283756A1 (en) | Method and system to automatically generate performance evaluation code for multi-threaded/multi-processor architectures | |
US10803007B1 (en) | Reconfigurable instruction | |
US12111779B2 (en) | Node identification allocation in a multi-tile system with multiple derivatives | |
Meakin | Multicore system design with xum: The extensible utah multicore project | |
CN117348930A (zh) | 指令处理装置、指令执行方法、片上系统和板卡 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A529 | Written submission of copy of amendment under article 34 pct |
Free format text: JAPANESE INTERMEDIATE CODE: A529 Effective date: 20200701 |
|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20210922 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20220914 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20221108 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20230131 |
|
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: 20230509 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20230608 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 7295104 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |