アプリ版:「スタンプのみでお礼する」機能のリリースについて

コンパイラの最適化機能を用いて関数func1をコンパイルしたところ、図2-3のようなアセンブリプログラムを生成した。

この時以下の問に答えよ
①:最適化機能により引数a,bの扱いがどのように変わったか答えよ。また、どのような性能上の効果が得られたか答えよ
②:2-2に示すアセンブリプログラム中のfunc1本体先頭「addiu $sp,$sp, -24」から始まる4行は、関数func1のどのような性質により図2-3のような最適化による削除が可能であったか、簡潔に答えよ


func1(int a,int b){
int c;
c=a+b;
return c;
}


あまり分からないんです、
解答お願いいたします!

「コンピューターアーキテクチャ最適化に関す」の質問画像

質問者からの補足コメント

  • アセンブリコードが理解したけど、自分で考えた結果が正しいかどうか分からない、自分で考えた回答は以下に書きます
    ①:
    図2-2の引数a,bはまず拡張したスタック空間にプッシュし、他のレジスタ$3と$2にロードして、$3と$2を利用して計算を行う。
    図2-3、最適化した場合は引数a,bが他のレジスタに経由せず直接に$4と$5で計算する
    ロードとストア命令を削除して、メモリにアクセス時間を略したので、性能上に実行速度が速くなった。

    ②:
    func1は再帰関数ではないので、スタック空間を数回拡張する必要がない、この原因で、スタック空間を拡張するコードを削除することが可能となる


    以上は自分の回答です、間違ったところはありますか?また改善できる点がありますか
    どなたかご教授いただければ幸いです
    よろしくお願いいたします

      補足日時:2020/04/16 00:58

A 回答 (3件)

(2) が本質的に重要なのでこっちを先に書くと, その解答は不完全. 「再帰関数でない」というのは視点として悪くないんだけど, もっときちんと「他の関数を呼び出さない」いわゆる


leaf function
であるということが大事. この関数では leaf function だからスタックフレームが不要だ, ということ. 余計な指摘もしておくと, 「最初の 4行」だけじゃなく
j $31
の直前の 4行も不要になってる.

ちなみに再帰関数であっても tail recursion ならスタックフレームが必須ということでもないし, 逆に再帰関数でなくても他の関数を呼び出す場合には r31 を破壊してしまうので r31 を保存するための領域 (スタックフレーム) は確保しなくちゃならない.

(1) は「変数としてメモリ上におく」代わりに「レジスタに置いたままにする」ことによってメモリアクセスを減らしたので高速化できるよ... だからその解答でおよそ OK. 「他のレジスタ」は指摘しなくてもいいかなって気がする.

ただし, ABI にもよるんだけどこの最適化自体 leaf function であることはおそらく重要. 例えば, 他の関数を呼び出すために $4 を使うとしたら, 「引数 a の値を $4 においたままにする」ことは不可能だよね. あるいは, 「呼び出した関数の中で $5 を壊すかもしれない」としたら, $5 の中身 (引数 b の値) はどこかに保存しなきゃならない.
    • good
    • 0
この回答へのお礼

なるほど、理解しました!
ご回答ありがとうございます。

お礼日時:2020/04/16 13:18

どこまで理解できてどこでわからなくなっているのか, 具体的に書いてくださいな.



まさか, アセンブリプログラムが全く読めないとか, ニーモニックの意味がわからないとか, そんなことはないよね?
    • good
    • 0

>>あまり分からないんです、



「あまり」ということは、そこそこ判っているところもあるのですよね。
判っているところを元に、もう少し考えたらいいのではないですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!