• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ベンチマークテストに対する、コンパイルの影響)

ベンチマークテストに対するコンパイルの影響

このQ&Aのポイント
  • ベンチマークテストでは、効率化オプションが組み込まれた連立1次方程式のGauss掃出し法の性能を評価しています。
  • Visual Studio 2010以上では、Any CPUおよび32bit(X86)と64bit(X64)のプラットフォーム環境を選択できます。
  • コンパイルしたプログラムが、64bitCPU×1のマシンでインストールされた場合、32bitCPU×2のマシンとして解釈される可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

No.3です。 http://www.4gamer.net/games/032/G003263/20090903008/ や他の並列化の説明を見る限り勝手には並列化しないように思いますが、実行してCPUの使用率を見れば大体のことは分かるはずです。 それと最適化しないオプション/Odで書いたプログラム通りの実行ができるはずです。 http://msdn.microsoft.com/ja-jp/library/vstudio/59a3b321.aspx Visual Studioを使ったことがないので、インターネットの情報だけですが。 一般的なコンパイラでは、指定しない限り過度な最適化はしないようになっているはずです。 計算順序を入れ替えて最適化をするオプションもよくありますが、計算結果の丸めの関係で場合によっては結果がかなり変わってくることもありますので、通常は勝手にされることはないはずです。最適化しないオプションにすると、式通りに実行するプログラムができます。

noname#221368
質問者

お礼

 わざわざVisual Studioの事を調べて頂いて、ありがとうございます。  Visual Studio 2010環境での並列プログラミングは、参考URLにあったparallel_forやparallel_foreachを含むTPLを使うしか選択肢がありません(Task Parallel Library。PTLじゃありませんでした(^^;))。コンパイラーは並列最適化を行わないので、TPL向けにコードを書き直す必要もあります。またテスト中なので、デバックモードでもありました。  なので並列化の可能性なんて考えもしなかったのですが、32bitより64bitが遅いと分かった時、過去の経験から、「それでも信用ならないのがMSさんだ」と、邪推した訳です。マニュアルにもヘルプにも書かれていない制限なり仕様なりには、けっこう出くわして、致命的になりかけた時もあったので・・・。  勝手な並列化が原因だとすると、調べても時間ばっかり食いそうだ。もし似た経験を持つ人がいたら、即答が返って来るのがここだ。まず質問してみよう、と思いました。  #3の捕捉にあげた記事の日付は2010年です。64bit×1のマシンは、Ver.2010からTPLがサポートされる事を知って個人的に導入したQuad Coreマシンなので、導入は2009年とはっきりおぼえています。ただしこれは、出来合いのハンドメイドを購入したものです。  64bit×2マシン(Dell)は会社ので、昨日試したところ仮想32bitモードは、64bit Native実行より2倍以上速かったです。マシン管理者に問い合わせたところ、導入は2011年11月だが、製品としてはその前からあった、ということでした。  結論としては、少なくとも2009~2010年頃の市販機は、64bit性能を使い切っていなかった、という事になると思います。  プログラムと開発を職業にしてる者としては、安易に「64bitの方が速いさ」と思い込んでた事に気づいて、今回はちょっとショックを受けました。  ・・・気を付けよう・・・。

noname#221368
質問者

補足

 いちおう納得できた事と、管理者から「そろそろ打ち切ったら?」の連絡が来ましたので、これで締め切らせて頂きます。  丁寧にVisual Studioの事を調べて頂き、ありがとうございました。#2さんも、ありがとうございました。

その他の回答 (3)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

Visual Studioがどのようなオプションがあるのか分かりませんが、 No.2でTacosanさんが書かれているように、並列化はできていないような気がします。 UNIX系のOSしか最適化はやったことが無いのですが、いろいろなオプション指定が必要だったりします。マニュアルをしっかり見て挑戦してみてください。 計算を速くするには、コンパイラが並列化しやすいプログラムにする必要が有ります。コンパイラオプションを指定しただけではあまり速くなりません。市販のコンパイラでは、最適化情報が出力される設定があるはずですが、それを見ながらソースコードを書き換えていきます。 まずベクトル化(IntelのCPUの場合はSSEを利用)を目指してプログラムを書き、それが難しいときには並列化だけでもできるように書きます。実際には最適化情報を頼りにやります。 掃出し法はベクトル化が多分やりやすいですから、ちゃんと作れば速くなると思います。 本当に速くしたいのでしたら、LAPACKなどのライブラリを使うことをお勧めします。 内部でBLASを使っているようですので、自分で書くよりも一桁程度高速化が期待できるように思います(確かめていませんが) 無料で使えるものとしてACMLがあり、openMPを使った並列化にも対応しています。

noname#221368
質問者

補足

 回答ありがとうございます。  でも、並列化したくないんですよ(^^;)。それはベンチマークの目的が、効率化オプションのアルゴリズムの検証だからです。オプションなんて書いたから、皆さん誤解したのかな?。実際には、一般疎行列に対してOrderingの効果を確認してるだけです。  そういう目的なので、PTLも使わず(並列化も行わず)わざわざ64bitCPU×1のマシンを用意していやったのに、32bit対象でコンパイルしたら(最初、このスイッチの事は忘れてました)、32bit×2をエミュレートしているような結果になった・・・。可能な限り演算量に線形な実行時間が欲しいのに、ときどき結果が不安定になる・・・。  それで対象CPUのコンパイラースイッチの事を思い出し、64bit対象でコンパイルしたら、実行速度は3割程度遅くなったが、結果は安定した。  そこで、Visual Studioのコンパイラーは、Microsoftの製品にありがちに、(ヘルプには一言も書いてないくせに)不要に賢いのではないか?。もしくは今の多数CoreのCPUはハードとして、並列処理を自動である程度サポートするのは常識なのか?。・・・などと邪推した訳です(^^;)。  自分でも少々調べてみました。以下のURLに書かれている事が本当なら、#2さんの補足に書いた現象を、自分はすっきり解釈できます。   http://d.hatena.ne.jp/siokoshou/20091102/p1  ・・・でも少々呆れました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「(2)~(4)の結果はほぼ同じで、(1)より2倍速くはなりませんが、3割程度速くなり~」の文は (2)~(4) では (1) より「速い」ことが多い ということでいいでしょうか? もしそうなら, 質問文にある「32bitCPU×2のマシンと解釈しているように見えます」が何を意味しているのかさっぱり分からないんですが. 「(2)~(4)の結果はほぼ同じ」というところから推測するとそのプログラムでは並列計算させていないように見えます (並列計算させないのであれば CPU やコアの数は動作速度に直接影響しないので). そうであれば, この速度の違いは結局のところ「32 bit をターゲットにしたのか 64 bit をターゲットにしたのか」の違いだけとなります. でそうなると CPU アーキテクチャまでまじめに追わないとだめなんだけど, その辺はあまり資料もないんだよな~. うろ覚えですが, 「Intel の CPU では 32 bit ALU しかもっていないので 64 bit 整数演算をしようとすると時間がかかる」という時代があったと聞いた記憶はあります.

noname#221368
質問者

補足

 回答ありがとうございます。  現在の状況は、#3さんの補足に書いた通りです。  ・・・書いた通り、少々呆れました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あなたがどのような結果を得てどのように判断したのかわからない以上「正しい」とも「正しくない」とも言いようがない.

noname#221368
質問者

補足

>・・・「正しい」とも「正しくない」とも言いようがない.  それはそうですね。次の4種類の結果を得ました。いずれも市販PCです。 (1)「Any CPU環境」×「64bit対象」のコンパイル。実行環境は、Intel Quad Core 64bit CPU×1,Windows7 Professional,搭載メモリ8GB。 (2)「Any CPU環境」×「32bit対象」のコンパイル。実行環境は、Intel Quad Core 64bit CPU×1,Windows7 Professional,搭載メモリ8GB。 (3)「Any CPU環境」×「32bit対象」のコンパイル。実行環境は、 Dual Core 32bit CPU×2,Windows7 Ultimate,搭載メモリ2GB。 (4)「Any CPU環境」×「32bit対象」のコンパイル。実行環境は、 Quad Core 64bit CPU×2,Windows7 Ultimate,搭載メモリ8GB。  (1)~(4)のCPUクロックは、いずれも3GHzです。  (2)~(4)の結果はほぼ同じで、(1)より2倍速くはなりませんが、3割程度速くなり、恐らくマシン状態に依存してだと思いますが、結果が不安定になります(ときどき、2倍程度遅くなる)。  (1)の結果は安定しています。(4)がDual Core 32bit CPU×4にならないのが不思議だったのですが、先日同様な質問をしたとき、メーカーによって32/64bit両方で動作するのとそうでないCPUがあると聞きました。(3),(4)のCPUは、いまマシンが手元にないので、残念ながらメーカーがわかりません。  情報としては以上です。どうでしょうか?。

関連するQ&A