デジタルちんぶろぐ

デジタルな話題

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

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

2010年7月30日 #

発端は

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の引数として渡されています

何が言いたいかと言うと

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

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

posted @ 1:36 | Feedback (4)