デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4419  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

発端は

OpenMPにおける変数の扱いと並列リダクション

の記事の中ほど、lastprimitive指示句の使い方を示すサンプルのプログラムと実行結果。

0~9の合計なのに35と出力されているんですよ。

※彼とその他の人の間で色々あることは知っていますが、僕はそこに関わるつもりは一切ありませんので念のため

 

僕の手元の環境で試してみたら

cl /openmp [filename]

でコンパイルすると実行結果は45でした。しかし、/Oxを付けると17になりました。OpenMPを使って最適化をかけた時になんかあるんでしょうね。

でも僕はそっち方面には疎いし、生憎興味もありませんので、この件はここにて中断。

 

そんなわけでOpenMPの指定pragmaは取っ払って最適化をかけたソースを見てみました。こういう最適化は前からあったんだけど、最近見てなかったので忘れてました。

例えばこんなループと結果出力があった場合

    for ( i = 0; i < 10; i++ ) {
        x += i;
        y += i;
    }
    printf( "%d,%d\n", x, y );

VCにて最適化指定/Oxだと(VS2008で確認・OFFSET $SG2581はprintfに渡している書式文字列です)

    push    45                    ; 0000002dH
    push    45                    ; 0000002dH
    push    OFFSET $SG2581
    call    _printf

g++で最適化指定-O3だと(gcc 4.3.4で確認・$LC0はprintfに渡している書式文字列です)

    movl    $45, 8(%esp)
    movl    $45, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf

どちらもループなんて消えて計算結果のみがそのままprintfの引数として渡されています

何が言いたいかと言うと

並列化とかテンプレートメタプログラミングとかイラネ

勿論結論は冗談ですよ^^;

投稿日時 : 2010年7月30日 1:36

コメント

# re: 最適化でちょっと感動 2010/07/30 10:07 Jitta
ぶはは!某社長の所で書いたことは、コンパイラーがやってくれていたのか!!

# re: 最適化でちょっと感動 2010/07/30 10:08 Soda
最近のコンパイラ賢いですよねぇ。
ヘタに人間が書くよりも効率がいいコードを吐き出してるしw

35は、2コアの環境で、5+6+7+8+9でした。
最後のi=9のスレッドの合計だから、デフォルトだとそうなるんですねぇ。
結果が45になったときは、並列に動作してないんでしょうねぇ。
iに対するスレッド番号を表示させると、どんな組み合わせになっているかわかりやすかったです。


# re: 最適化でちょっと感動 2010/07/30 10:59 かたぎり
やばい、本気で、笑ったwwww
そのprintf処理はないわーw


# re: 最適化でちょっと感動 2010/07/30 15:01 あんどちん
皆さんコメントありがとうございます。

昔から「分かり切ってる処理」に関する最適化って強力なものがありましたからね。memcpy/memsetなんかだと関数呼ばずにインライン展開するとか。
今回の例だと定数の和だからコンパイラ的には最適化しやすいんでしょうね。
# 勿論OpenMPを使ったコードにすると上記のようなコードにはなりませんが

最近ってCPUの性能が上がって処理速度が向上したからコンパイラの最適化をかけずにそのまま実行しても遅さを感じない事も多いので、出力結果を気にしなくなってしまいがちですが、たまにこういうことでコンパイラの賢さを見ると感動しますね

Post Feedback

タイトル
名前
Url:
コメント: