アカウント名:
パスワード:
> コード中の多重ループの個所において、ループの順序を入れ替える> ことによってメモリアクセスの高速化などが期待できるようだ。
「ね、こういう順序でアクセスするようにコード書かなきゃ遅くなるでしょ」っていう実例見せて授業してる私の立場は?
組み込み系だと、本当にコンパイラのバグで最適化をすると動かなくなることが、 (PC上のプログラミングと比べると)結構発生します。
なので、
それも組み込み系で....
ではなく、「組み込み系だからこそ」かと。
まあ普通は、最適化オプションを切るよりは、 コンパイラのバグを避けるような記述に書き換えるんですが。
元コメの者ではありませんが具体例を挙げてみると、ルネサスの Mxx 利用のプロジェクトで、C コンパイラが吐いた asm レベルで問題があったので、チーム内で参照する書いてはいけないイディオム集とコードレビューで対応していました。組み込みだと、怪しい振る舞いのコンパイラでも管理できるならそのまま使うので、リビジョンアップもしないでプロジェクトを回すことは珍しくない。なお、プロジェクト終わってから最新版に上げたら、修正されていたことは確認しました。
gccの最適化のおかげで動かなくなった事例 [srad.jp]。#598754 [srad.jp]のリンク先にあるコミットログには「GCCのアグレッシブな最適化のおかげで壊れた」みたいなことが書いてあります。
むしろブートローダや組み込みのような制約の多い環境の方が、最適化の負の面(メモリ使用量の増加とか)の影響を受けやすいんじゃないですかね。
今時はマシになった気がするけど、デバイスバシバシ叩く物だと下手な最適化するとご丁寧に叩く順番を変えたりキャッシュに入れたままで後の処理をしようとしてくれるものだから最適化やれませんよ。# そのために__volatile__とか#pragmaがあるんだろ!と言われればそれまでですが。
そういうのは局地的に最適化禁止してやればいいのとどうしょうもない所はインラインアセンブラで対処すればいいんでしょうけど、コンパイラの挙動をきちんと把握するのは骨が折れる。と言うかコーディング規則の人がそういうあたり気をつかうのを嫌って一律にあーだこーだと言い出すから(以下自粛
# しかし、どれが使って大丈夫かくらいは覚えといて損はないのかも
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
身近な人の偉大さは半減する -- あるアレゲ人
教育者泣かせ (スコア:3, おもしろおかしい)
> コード中の多重ループの個所において、ループの順序を入れ替える
> ことによってメモリアクセスの高速化などが期待できるようだ。
「ね、こういう順序でアクセスするようにコード書かなきゃ遅くなるでしょ」
っていう実例見せて授業してる私の立場は?
Re:教育者泣かせ (スコア:1)
Re:教育者泣かせ (スコア:3, 興味深い)
組み込み系だと、本当にコンパイラのバグで最適化をすると動かなくなることが、
(PC上のプログラミングと比べると)結構発生します。
なので、
ではなく、「組み込み系だからこそ」かと。
まあ普通は、最適化オプションを切るよりは、
コンパイラのバグを避けるような記述に書き換えるんですが。
Re:教育者泣かせ (スコア:1, 興味深い)
> (PC上のプログラミングと比べると)結構発生します。
8-16bit時代には頻繁にあったのは事実だけど、それでもバグありコードが最適化を切るとたまたま動いていたということのほうが多かったと思うよ。
なので、なんでもかんでもコンパイラのせいにするの態度はどうかなあ。
Re:教育者泣かせ (スコア:1, 参考になる)
元コメの者ではありませんが具体例を挙げてみると、ルネサスの Mxx 利用のプロジェクトで、
C コンパイラが吐いた asm レベルで問題があったので、チーム内で参照する書いてはいけない
イディオム集とコードレビューで対応していました。
組み込みだと、怪しい振る舞いのコンパイラでも管理できるならそのまま使うので、
リビジョンアップもしないでプロジェクトを回すことは珍しくない。
なお、プロジェクト終わってから最新版に上げたら、修正されていたことは確認しました。
Re:教育者泣かせ (スコア:3, 興味深い)
gccの最適化のおかげで動かなくなった事例 [srad.jp]。#598754 [srad.jp]のリンク先にあるコミットログには「GCCのアグレッシブな最適化のおかげで壊れた」みたいなことが書いてあります。
むしろブートローダや組み込みのような制約の多い環境の方が、最適化の負の面(メモリ使用量の増加とか)の影響を受けやすいんじゃないですかね。
Re:教育者泣かせ (スコア:1)
今時はマシになった気がするけど、デバイスバシバシ叩く物だと下手な最適化するとご丁寧に叩く順番を変えたりキャッシュに入れたままで後の処理をしようとしてくれるものだから最適化やれませんよ。
# そのために__volatile__とか#pragmaがあるんだろ!と言われればそれまでですが。
そういうのは局地的に最適化禁止してやればいいのとどうしょうもない所はインラインアセンブラで対処すればいいんでしょうけど、コンパイラの挙動をきちんと把握するのは骨が折れる。と言うかコーディング規則の人がそういうあたり気をつかうのを嫌って一律にあーだこーだと言い出すから(以下自粛
# しかし、どれが使って大丈夫かくらいは覚えといて損はないのかも
Re: (スコア:0)
> ご丁寧に叩く順番を変えたりキャッシュに入れたままで後の処理をしようとしてくれるものだから
これが言語仕様に従った正しい動作ですから、ちゃんとvolatile入れて式の評価順序は手で強制してくださあい。
そうしなければ「間違ったプログラムがたまたま正しく動く」状態のままです。