一部のOSではCコンパイラーの最適化が制限されている理由とは?

このQ&Aのポイント
  • 一部のOSではCコンパイラーの最適化が制限されている理由とその影響について解説します。
  • 最適化の結果としてのサイズの削減や不要な命令の実行防止などが挙げられます。
  • また、インテルコンパイラーについても同じような制限があるのかについても触れます。
回答を見る
  • ベストアンサー

1バイトは地球を救う?言語の質問でないですけど

本来なら、アセンブラーというカテゴリーがあれば、そちらで質問したかったのですが C/C++コンパイラーの最適化オプションやコンパイラーの種類のことも ありますので、こちらの質問になっています。 今あるOSでも、一部、ディストリビューションとして出されているものが Cコンパイラーの最適化を書けない状態で今でも出荷をしているのですが 興味本位の最適化から、 ・サイズの削減  →L3キャッシュへの格納率の向上&メモリアクセス阻止  →HDDやSSDの転送量削減 ・不要な命令の実行防止 →CPUが1つの不要な命令を実行することの無駄&ついでに速度向上 ・L3キャッシュ格納率が低下するが、不要なジャンプ命令の実行防止 により、1マイクロW以下でも構わないので、それが本当に 今の電力事情の日本や、地球の温暖化対策もなるのでしょうか? また、上記のような最適化結果を向上させる為に、使用できたと仮定して インテルコンパイラーは同じようなことを言えるでしょうか? このような状態にする為に、OSを再ビルドするのに、電力がかかる、という ツッコミだけはご遠慮願います。 よろしくお願いします。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

最適化がOSに占める割合次第ですが最適化された分、他の処理が動作して食いつぶすって事はありそうですね。 あとサイズ最適化と速度最適化は往々にして両立しません。 >により、1マイクロW以下でも構わないので、それが本当に >今の電力事情の日本や、地球の温暖化対策もなるのでしょうか? 通常のパソコンの使い方だと命令の消費するパワーよりもGPUやモニタやHDDやCPU自体の待機動作パワーの方が食っている気がします。短時間でスタンバイに入るほうが省電力でしょうね。 >インテルコンパイラーは同じようなことを言えるでしょうか? 質問の意味がわかりません。

ymda
質問者

補足

ありがとうございます。 この質問は、どちらかといいますと、意識して節電することができる 普通のPCのことではなく、OSのデーモンだけが節電の便りとなってしまう 遠隔でのデータベースサーバーを含むことです。 もし、OS、及び、アプリケーションのセット(例えば、OS+Apache+PHP)が 最適化されていないのと、全部ひっくるめて最適化がされている場合では やはり違うのでしょうか? もちろん、一般的にスタンバイやディスプレイ、HDDの回転をとめれば 話は速いのですが、そうではなく 使用中で、ある程度の高負荷がPCにかかっている時も含みます。 インテルコンパイラーを1つ上げたのは、容量を犠牲にするかわりに 非常に速度を向上させるコンパイラですので、CPU上で1命令にかかる 電力が等しいと考えて、削減された命令数分、節電になるのかな?と 考えた所です。 今は、どちらかといえば、パソコンの普及率よりも、携帯電話(スマホ除く)の 普及率のが高いですから、サーバーに対してはパソコンよりも携帯電話から アクセスする機会が普通に増えてくるはずですので。。。。

その他の回答 (6)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.7

1マイクロWって適当に挙げた例だと思っていたのですが 本気で1マイクロWですか? たとえ1億台あってもたった100Wの節約にしかならないのですが、 これって規模に対してほとんど誤差みたいなものではないです?

ymda
質問者

お礼

ありがとうございます。 CPU製造メーカーも、どの命令が何Wかかるというのは、一切公表されていない どころか、公表不能な数字なはずです。 代わりに相当古いCPUであれば、1命令あたりの必要クロック数というのが 公表されていた時期も・・・ 今でもあるものはありますね。 この必要クロック数を減らすと、アイドル状態が存在するOSであれば そのクロック分(=命令分)同一のCPUであれば、相応に 電力が節約できるのではないでしょうか? 例えで、、1命令で1μWと仮定しましたが、いくつかの要素が重なって アイドル状態が増えれば、1命令ですまない最適化も可能かもしれません。 ちなみに、ほぼ同時期に出ているCPUであれば、高速なCPUでアイドル状態が 多いよりも、低速なCPUで負荷がかかっているほうのが、電力は食わないはずです。 (普通に節電設定するだけでも同じことですが)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

評価は難しいですね。 ・消費電力は、命令によって違います。ある1命令より、同等の2命令の方が電力が少ない、ということもありえます。 ・サイズ最適と速度最適は背反なところがあります。 瞬間の電力が下っても、トータルの電力量は時間が延びた分増える可能性があります。 ・HDD等はある程度のまとまった量で処理するので、数バイトの削減では効果が無い。 また、キャッシュ等のしくみがあり、転送量=実際のアクセスとは限らない マイコンレベルの小規模回路なら総合的な評価もできるでしょうけど、サーバークラスになると複雑すぎますね。

ymda
質問者

お礼

ありがとうございます。 >消費電力は、命令によって違います。ある1命令より、同等の2命令の方が電力が少ない、ということもありえます。 これは、CPUメーカーが精密な試験をすれば、ある程度の値が出てくるかもしれませんが・・・ これは言えるかもしれませんね。 2×3=6の計算をするより、おそらく 2+2+2=8の計算のが、電力が食わないという可能性もあるでしょう。 (かつ、相当古いCPUのうち、掛け算命令がないものですと、 2×3=6より、2+2+2=6のが、掛け算ライブラリを経由しないため、高速です) >・サイズ最適と速度最適は背反なところがあります。 サイズ最適はによる高速化、厳密には、下手にサイズを増やす最適化を行なわずに 普通に実行させたほうが、L3キャッシュのような広大なキャッシュがある場合 高速になるのでは?という実証結果が、個人的にわずかにでています。 gccコンパイルオプション -funroll-loopsの有無で、 同じCPUのL2キャッシュ512kでは、最適化ありのが高速で、ちょっとだけ早い キャッシュ1Mでは、最適化なしのが高速でした。 これは、L2キャッシュにもともとおさまりにくいものを、ループを削減化して 高速化するのと、L2キャッシュにおさめて、メモリアクセスを減らしてキャッシュ内で 完結できたという違いですが、後者ではメモリアクセスが削減できる分 メモリ読み出しにかかる電力が節約できるのでは。。と トータルの電力量が延びないようにするのは、未来のコンパイラの仕事かも しれないですね。(命令ごとの概算電力量が公表されることを前提) >・HDD等はある程度のまとまった量で処理するので、数バイトの削減では効果が無い。 元々、高速化させるために、昔から256バイト?512バイトを最低アクセス単位と していましたが、そのような仕組みがなく1バイトごとにシステムコールにアクセス していたら、そのオーバーヘッド分もあるかもしれません。 でも、このあたりは、もともとの言語の仕様でほとんどバッファリングするように できているはずですので、あまり問題ないかと

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.5

サーバーの省エネを考えるなら、コンピュータの消費電力より、冷却にかかる消費電力を解決した方がはやいよ? 北極圏にデータセンターを移すだけでかなりの省エネ。 日本なら北海道か東北? でも質問には関係ないかなぁ。。。

ymda
質問者

補足

ありがとうございます。 移転とかしてしまえば、確かに省エネですが、(実際に石狩に・・・) そういうのを全くしないのを前提での省エネになるかのことです。

回答No.4

OSを再ビルドするのに人力、お金がかかりすぎてペイしないと思います。

ymda
質問者

補足

一度、OSを再ビルドする環境が整ってしまえば、 OS再ビルドは、OSがもっている簡単なバッチでできます。 言ってしまいますと、FreeBSDですが 以下システム cd /usr/src make buildkernel KERNCONF=GENERIC make buildworld to...syngle mode... make installkernel KERNCONF=GENERIC make installworld インストールされたソフトは cd /usr/ports/ports-mgmt/pkg_replace; make install clean; pkg_replace -aRf か cd /usr/ports/ports-mgmt/portupgrade; make install clean; portupgrade -aRf のような感じです Linuxであれば、SRPMも似たような形で再ビルドできるはずです。 時間がかかるだけの手間ですので、実際に仮想16サーバーを1日もかけずに再ビルドをしています。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

質問文は日本語として意味をなしてない部分が多いのですが、キーワードだけ拾って、回答すると、 ・コンパイル時に最適化を指定するかしないかで消費電力の差はゼロか?  →原理的にはゼロでは無い ・コンパイル時に最適化を指定するかしないかで消費電力の差は意味があるか?  →あまりに小さいので意味が無い

ymda
質問者

補足

質問文には、確かに、1マイクロWとかかれています。 ですので、これを1Wで何台分に換算しなおすと、100万台分の PCやサーバーに該当することになります。 ですが、既に日本国内だけで、調査によると、298万台のサーバーが ありますので、単純に1マイクロワットを、298万台で節約すれば、ここで 2.98W普通に節約できることになります。 ※サーバーとして使われているCPU数はこれよりも上回ります もちろん、サーバーを節電型に更新すれば話ははやいのですが、性能型が 必要な場合もあることを考えれば、全部が節電型にいけるわけでもありません。 ここで質問しているのは、本当に、その「あまりに小さい」ことに対する 積み重ねで本当に効果があるか?ってことを質問しています

  • OKWavex
  • ベストアンサー率22% (1222/5383)
回答No.1

なるわけねーだろ

関連するQ&A

  • VBAで高速にデータを処理するコツを教えてください

    いつもお世話になっております。 VBAのことで教えて欲しいことがあります。 EXCEL2000 VBAであるデータを処理するコードを作っています。 データ数は1万行×5列×6シート=30万です。 処理する際のパラメータの違いから、この30万個のデータをfor文を使って繰り返し処理します。 繰り返し回数は20万回です。 一回の処理に1秒かかるとすると1秒×20万回なので、2~3日かかります。 このデータを処理する速度の向上を考えています。 L1キャッシュ→L2キャッシュ→メインメモリ→HDD の順に処理速度(アクセス速度?)が遅くなると調べて分かりました。 30万個のデータを配列(メインメモリ?)に格納する方法は下記のようにすればいいと分かりました。 Dim myData as Variant myData = Worksheets("myData").range("A1:E10000") myDataから1行1列目のデータを取り出すのはmyData(1,1)でできると言うことも分かりました。 そこで質問です。 1.コードの記述により、メインメモリよりも高速なL1キャッシュ、L2キャッシュを意識して使うことはできるのでしょうか。 処理している間ずっと30万個のデータをL1,L2キャッシュに格納しておけば、メインメモリに格納しておくよりも高速に処理ができると単純に考えました。 2.私のPCはVista、Core2Quad Q9450、4GB DRAMです。 VBAでは4つのコアをすべて使って実行すること(CPU使用率100%)はできないと聞きました。 上記の処理を実行する時、1つのコアで処理させるのがいいのか、複数のコアで処理させるのがいいのか、プロセスの優先度はどうすべきか、など、コードの記述以外の方法で処理速度を上げる方法はあるのでしょうか。 3.処理速度を向上させるコツなどありますでしょうか。 4.VBA以外の言語なら4つのコアをフルパワーで使えるよ、というのがありましたら教えてください。 (C言語はそれに該当するというのは聞きました。) よろしくお願いいたします。

  • C++のコンパイラについての質問

    ボーランドと呼ばれるサイトで配布されている、C++コンパイラについての質問なんですが ↓の文章を(説明から抜粋)読んでも何をすればいいのか 解らず困っています、誰か意味の解る人が居たら、回答  お願いします  2. インストール先の bin ディレクトリで次の手順を実行します。 a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。 b. bcc32.cfg ファイルを作成します。このファイルは,Include および Lib パスのコンパイラオプション(コンパイラの -I および -L スイッチ)を設定するものです。ファイルには次の 行を含めてください。 -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib" c. ilink32.cfg ファイルを作成します。このファイルは,Lib パスのリンカオプションを設定するものです。ファイルには 次の行を含めてください。 -L"c:\Borland\Bcc55\lib"

  • C言語について基本的な質問

    この文章の書き方があってるのか、わからいのですが、基礎からキッチリ覚えたいと思っていますので、暇なときにでも、よろしくお願いします。 今、フリーのC言語のコンパイラソフトを使用して、本を片手に ソースを実行して基礎を学んでいる最中です。 そこで質問なんですが、ソースを書いて実行する方法、(今はソフトを使っているのですが)その仕組みは、知っておくべきでしょうか? あと、現在、AFP(金融関係)の資格を勉強しており、将来、携帯端末を利用した提案書のサービスができるようになりたいと思っています。 これを実現させるには、JAVAのほうが近道のような気がしながら、基礎だと思ってC言語から始めましたが、実際はどうなんでしょうか? それとも、どんな仕組みで携帯から動作しているのか?そういう所から詳しくなっていったほうが、いいのでしょうか? 今は両方、同時進行でやっています。言語のほうは、だんだんわかってくると感じるのですが、仕組みになると初歩の段階から、かなり専門的で困っています。 長々、まとまりのない文章になってしまいましたが、職業として真剣に考えていますので、助言いただきたいです。

  • C言語の勉強にあたって

    今からC言語を勉強していく人から質問されたのですが、勉強にあたって、Cのアプリケーション(コンパイラ等)なしに実際のプログラムの動きを勉強する方法はないでしょうか? これでは漠然とした書き方ですが、例えば、インターネットのHP上でプログラミング→コンパイル→実行をシミュレーションできるようなHPはないでしょうか? こういうHPがあると、とりあえずインターネット環境とC言語の参考書があれば簡単に勉強できると思うんです。 そのようなHP、ありましたら教えてください。 何ヶ所かあるようでしたら、使い方が難しくない(初心者向け)ところが良いです。 よろしくお願いします。

  • 勉強の参考にしたいのですが、困っています

    以下の問題を、わかる範囲で結構ですのでどなたか解いて頂けないでしょうか? これは友人から得た過去の問題なのですが答えは配布されておらず、この問題を出題した先生も今は変わってしまっていて聞くに聞けません。 もうすぐ試験で、テスト勉強の参考にしたいのですが、何卒どうかお力添えをお願い致します。 ある企業が現在のチップAlpha の浮動小数点命令のみ9倍高速に実行するチップBeta を開 発した.あるプログラムをBeta で実行したところ浮動小数点演算に要した時間は全体の1/4 であることが判明した. (a) この応用におけるBeta のAlpha に対する速度向上度を求めよ. (b) Alpha でこの応用を実行するとき,浮動小数点演算に要する時間の比率を求めよ. (2)君の会社が販売しているプロセッサは,250MHz で動作するが浮動小数点ハードウェアを 持たないためFP 命令はソフトウェアでエミュレートしている.このチップであるベンチマー クを実行したところ,実行時間は5.00 秒,平均CPI は1.30 で,各タイプの命令の実行数は次 表になっていた. 命令タイプ             命令数 分岐                 7,750,000 整数演算              3,800,000 ロード/ストア            9,750,000 浮動小数点演算(FP 命令数) 17,500,000 (a) 実行時間のうち,浮動小数点演算をエミュレートしている時間(有効数字3 桁)を求めよ. (b) 浮動小数点命令1 個のエミュレートに要している平均命令数を求めよ. [3]君は新プロセッサの主任設計者である.プロセッサとコンパイラの設計は一応完了し,そのまま 発売するか,更に改良するか判断しなければならない.担当者と議論した結果次の2 種の選択肢が有ることが判明した. A. 現状のままにする.このマシンをFuji と呼ぶ.クロックは1GHz で,シミュレータで次のような 結果が得られた. 命令タイプ  CPI   頻度 A        2     40% B        3     25% C        3     25% D        5     10% B. クロックを高速化する.このマシンをShirane と呼ぶ.クロックは1.2GHz で,シミュレータで次 のような結果が得られた. 命令タイプ    CPI    頻度 A          2     40% B          2     25% C          3     25% D          4     10% (1)それぞれのマシンのCPI を求めよ. (2)それぞれのマシンのネイティブMIPS 値を求めよ. (3)Shirane はFuji に比べてどれだけ高速か. (4)コンパイラチームからコンパイラの改良が可能で,次のように命令数を減らせると言ってきた. Fuji に改良コンパイラを用いたマシンをHodaka とよぶ. 命令タイプ   MA に対する実行命令数の比 A             90% B             90% C             85% D             95% Hodaka のCPI を求めよ. (5)Hodaka はFuji に比べてどれだけ高速か. (6)Shirane に新コンパイラを適用したマシンをYari とよぶ.Yari はFuji に比べてどれだけ高速か.

  • C言語について質問です。

    C言語について質問です。    問題:繰り返し命令と階乗の計算 カウンタ用変数nの値を1から10まで1ずつ変化させて、その値を階乗用変数Kiに順次、掛け算していき、10の階乗を求めよ。 ki=1×2×3×4×5×6・・・・・×9×10 <==10! また、1/n!は小数点以下10桁まで求めよ。 実行結果は    n                 n!             1/n!    1                 1             1、0000000000    2                 2             0、5000000000    3                 6             0、1666666667    4                24             0、0416666667    5               120             0、0083333333    6               720             0、0013888889    7              5040             0、0001984127    8             40320             0、0000248016    9            362880             0、0000027557   10           3628800             0、0000002756                            続行するには何かキーを押してください、、、、、、 上のように実行結果が出るようにプログラミングしたいのですがわからないので 分かる方よろしくお願いします。 ちなみに今まで習ってきたのは、if文、switch文、do文、while文、for文なんですがこのプログラミングは、for文でおねがいします。 長文失礼しました。

  • C言語でPICマイコン開発

    今までずっとアセンブラを使い開発していたのですが、XC8コンパイラ+MPLABで C言語を使い開発したいと思っています。 以下の点について教えていただければ助かります。 ・タイマー割り込みについて アセンブラで書く場合、プリスケーラの設定などから計算して 一回の割り込み内で何命令まで書けるかがわかるため割り込みの最中に 再度割り込みが発生するようなことは避けられますが Cで書く場合はどのように回避するのでしょうか? ・コンフィギュレーションの設定の仕方 アセンブラでは__CONFIG _HS_OSC & _CP_OFF ・・・のように書きますが Cではどのように書くのでしょうか。 C言語はわかるので取っ掛かりの部分がわかれば後はすいすいいけると思うのですが。。。 上記とあわせてお勧めの書籍やページなどがありましたら教えていただけないでしょうか。 よろしくお願いします。

  • cのプログラム実行について

    C言語学習の環境を整え、いざコンパイラしようと思ったのですがなぜかコンパイラできません。 bccdev上でちゃんと画面もでて出来るはずなのですが、なぜかコンパイラされた場合の表示が出ません。つまりコンパイラできません。 コンパイラとメイクと再構築のマークは色の表示がでてます。 この場合何が足りない間違っている為に出来ないのかがよく分からず、困ってます。デフォルトプロジェクト編集でインクルードパスはc:\MyDocuments\borland\bcc55\Binになってます。あと実行ファイルは、マークに色がついてないです。 よろしくお願いします。 OsはWindowsMeです。

  • キャッシュミス率の増大2

    キャッシュミス率の増大によって、プロセッサの計算速度が劇的に低下することを具体的な事例を挙げて説明せよ。 という問題です。 実行する命令やデータがキャッシュメモリに入っているなら(これをヒットと言う)、CPUは高速で動作し続けることができる。必要な命令やデータが キャッシュメモリに入っていないときは(ミスヒット)、CPUは低速なDRAMから命令やデータを読み出さなければならず、CPUは処理を一時停止して待 つことになる。ミスヒットが続くと、CPUの処理速度は信じられないほど低下してしまう。だからヒット率の高いキャッシュシステムを実装することは、 CPU設計の最優先課題の1つである。 という答えに行き着きました。合っていますでしょうか?ご教示お願い致します。

  • c言語のワーニングを無くしたい

    c言語のダブルポインタ(char **)の引数渡しで困っています。 ワーニングが取れず、無視して実行するとセグメンテーション違反 となります。 ワーニングを取る方法をご存じないでしょうか? もしくは言語仕様、gcc仕様が要因でしょうか? バージョンはgcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)です。 001 void func(char **p1) 002 { 003 static char *s="AAA"; 004 **p1 = s; 005 } 006 int main(void) 007 { 008 char *q1; 009 func(&q1); 010 return(0); 011 } $ cc -Wall -o pp pp.c pp.c: In function ‘func’: pp.c:5: 警告: assignment makes integer from pointer without a cast 実行すると004行目で 'セグメンテーション違反です (core dumped)'となります。 004行目を *p1 = s; にするとワーニング無しとなり、 問題無くcall側のq1に先頭アドレスがセットされますが、 何か納得がいきません。 ちなみに、最初のcore吐きプログラムのアセンブルリストは 以下のようになります。 (*)位置で変なコードとなっていまが、ワーニングが出て いるので当然なのかもしれません。 (gdb) disass Dump of assembler code for function func: 0x08048354 <func+0>: push %ebp 0x08048355 <func+1>: mov %esp,%ebp 0x08048357 <func+3>: mov 0x8(%ebp),%eax 0x0804835a <func+6>: mov (%eax),%edx 0x0804835c <func+8>: mov 0x8049560,%eax *0x08048361 <func+13>: mov %al,(%edx) 0x08048363 <func+15>: pop %ebp 0x08048364 <func+16>: ret End of assembler dump. そして 004行目を *p1 = s;にした場合が以下となります。 想定通りのコードですが、何故なのかわかりません。 Dump of assembler code for function func: 0x08048354 <func+0>: push %ebp 0x08048355 <func+1>: mov %esp,%ebp 0x08048357 <func+3>: mov 0x8049560,%edx 0x0804835d <func+9>: mov 0x8(%ebp),%eax 0x08048360 <func+12>: mov %edx,(%eax) 0x08048362 <func+14>: pop %ebp 0x08048363 <func+15>: ret End of assembler dump.