2012-03-30 8 views
1

以下私はbneを使って100回のループを試みていますが、より速く実行できるようにコードを修正したいと思います。おそらく何とかノブを取り除いていますか?このコードをどのように改善すればよいですか?このmipsコードを最適化するにはどうすればよいですか?

addi $1, $0, 100 
addi $2, $0, 0 
lw $3, 0($4) 
add $2, $2, $3 
addi $4, $4, 4 
addi $1, $1, -1 
bne $1, $0, -5 
nop 

答えて

5

最初にできることは、分岐遅延スロットを利用することです。 nopはすべてのループで実行されていますが、何も達成していません。 $ 4をインクリメントする命令を入れないでください(なぜなら、あなたはループ計算のためにそれを必要としないからです)。

高速実行の第2ステップは、従属命令を調べることです。たとえば、$ 3を$ 2に追加すると、lwが完了するまで待たなければならず、数回のマシンサイクルがかかることがあります。 $ 1から1を引いても、何も待つ必要はありません。これら2つの命令の順序を逆にすると、ロードが完了するのを待つのではなく、ロードが進行中である間に減算を行うことができます(これはアーキテクチャに依存し、すべてのシステム、特にシミュレータ上には表示されません)。

3番目の手順は、ループを再構築することです。ポインタをインクリメント($ 4)し、各ループでループカウンタ($ 1)を減らしています。なぜそれらを組み合わせていないのですか?あなたは、最初は$ 4が何であるかを知っており、$ 4 +(4 * 100)の最後に$ 4があることを知っています。だから、あなたは$ 4を増やして、それが終わりに達したかどうかを見ることができます。これはループごとに1つの命令を節約するはずです。

1

あなたのコード:(最適化)

addi $1, $0, 100 
1: addi $2, $0, 0   #can replace with mov $2,$0 (easier to understand) 
    lw $3, 0($4)   #don't need an offset, replace with lw $3,($4) 
    add $2, $2, $3 
    addi $4, $4, 4 
    bne $1, $0, 1b 
    addi $1, $1, -1 

私はNOPを削除し、CPUが任意のサイクルを無駄にしないようにBNEとのaddiの指示を入れ替えました。 addiは常に分岐遅延スロットで実行されます。

PS可変長コーダーは、add命令がlwを待たなければならず、部分的に正しいと部分的に間違っていると述べています。アーキテクチャがフォワーディングをサポートしている場合、MIPSアーキテクチャのいくつかの実装と同様に、待つ(ストール)必要はありません。しかし、アーキテクチャが転送をサポートしていない場合(おそらく)、あなたが提案した内容を実行するか、lwに続く2つのadd命令をスワップする必要があります。

+0

CPUがRAMよりも大幅に速く実行され、キャッシュに要求された値を持たず、転送に関係なくデータのロードをストールする必要があります。 –

関連する問題