発端は
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の引数として渡されています。
何が言いたいかと言うと
並列化とかテンプレートメタプログラミングとかイラネ
勿論結論は冗談ですよ^^;