Gentoo Archives: gentoo-commits

From: "Naohiro Aota (naota)" <naota@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo commit in xml/htdocs/doc/ja: gcc-optimization.xml
Date: Fri, 27 Apr 2012 06:35:51
Message-Id: 20120427063533.43A7C2004B@flycatcher.gentoo.org
1 naota 12/04/27 06:35:33
2
3 Added: gcc-optimization.xml
4 Log:
5 New transaltion. gcc-optimization.xml
6
7 Revision Changes Path
8 1.1 xml/htdocs/doc/ja/gcc-optimization.xml
9
10 file : http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/doc/ja/gcc-optimization.xml?rev=1.1&view=markup
11 plain: http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/doc/ja/gcc-optimization.xml?rev=1.1&content-type=text/plain
12
13 Index: gcc-optimization.xml
14 ===================================================================
15 <?xml version='1.0' encoding='UTF-8'?>
16 <!DOCTYPE guide SYSTEM "/dtd/guide.dtd">
17 <!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/ja/gcc-optimization.xml,v 1.1 2012/04/27 06:35:33 naota Exp $ -->
18
19 <guide>
20 <title>コンパイル最適化ガイド</title>
21
22 <author title="Author">
23 <mail link="nightmorph"/>
24 </author>
25
26 <abstract>
27 このガイドは、安全で分別のあるCFLAGSとCXXFLAGSを使ったコンパイル済みコードの最適化の導入を提供します。
28 また、一般的な最適化の裏側にある理論について述べます。
29 </abstract>
30
31 <!-- The content of this document is licensed under the CC-BY-SA license -->
32 <!-- See http://creativecommons.org/licenses/by-sa/2.5 -->
33 <license/>
34
35 <version>3</version>
36 <date>2012-04-22</date>
37 <!-- Original revision: 1.19 -->
38
39 <chapter>
40 <title>はじめに</title>
41 <section>
42 <title>CFLAGSとCXXFLAGSとは?</title>
43 <body>
44
45 <p>
46 CFLAGSとCXXFLAGSは、ソースコードをコンパイルするときに使われるオプションを
47 GNUコンパイラコレクションであるgccに伝えるために使われる環境変数です。
48 CFLAGSはCで書かれたソースコード、CXXFLAGSはC++で書かれたソースコード用になります。
49 </p>
50
51 <p>
52 これらはプログラムのデバッグメッセージの量を減らすのに使われたり、
53 エラーや警告のレベルを増加させたり、また、もちろん生成されるコードの最適化にも使われたりします。
54 <uri
55 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Invoking-GCC.html#Invoking-GCC">GNU
56 gcc ハンドブック</uri>に利用可能なフラグとその働きの完全なリストが記載されています。
57 </p>
58
59 </body>
60 </section>
61 <section>
62 <title>どのように使われているのでしょうか?</title>
63 <body>
64
65 <p>
66 CFLAGSとCXXFLAGSは二通り使われ方があります。
67 一つ目は、プログラム毎にautomakeにより生成されたMakefileと共に使う方法です。
68 </p>
69
70 <p>
71 しかしながら、この方法はPortageツリーの中にあるパッケージをインストールする際に使うべきではありません。
72 二つ目は、CFLAGSとCXXFLAGSを<path>/etc/make.conf</path>で設定する方法です。
73 この方法を使えば、全てのパッケージはあなたが設定したフラグでコンパイルされるでしょう。
74 </p>
75
76 <pre caption="/etc/make.conf内のCFLAGS">
77 CFLAGS="-march=athlon64 -O2 -pipe"
78 CXXFLAGS="${CFLAGS}"
79 </pre>
80
81 <p>
82 見てわかるとおり、CXXFLAGSはCFLAGSの中にある全てのフラグが設定されています。
83 これでやりたいことはほぼ十分できています。
84 CXXFLAGSの中に追加のフラグを定義する必要はありません。
85 </p>
86
87 </body>
88 </section>
89 <section>
90 <title>よくある誤解</title>
91 <body>
92
93 <p>
94 CFLAGSとCXXFLAGSは、
95 ソースコードから小さくて早いバイナリを得るにはとても効果的な方法である一方で、
96 ソースコード中の機能を損なったり、バイナリのサイズが膨れ上がったり、実行速度を低下させたり、
97 コンパイルの失敗さえも引き起こす場合もあります!
98 </p>
99
100 <p>
101 CFLAGSは特効薬ではありません。これらは自動的にあなたのシステムを早くしたり、
102 ディスク上のスペースが少なくなるようバイナリを縮めてはくれないでしょう。
103 たくさんのフラグを、システムを最適化する目的で追加することは、
104 確実に失敗します。払った労力に見合う実入りを得るにも限度と言うものがあります。
105 </p>
106
107 <p>
108 インターネットでは挑戦的なCFLAGSやCXXFLAGSの自慢も見受けられますが、
109 それらはいい影響を与えるよりも、悪影響を及ぼす可能性の方がはるかに高いです。
110 そもそも最適化フラグは、特定の場合に、
111 特定の目的の為に使われるよう設計されたと言うことを肝に銘じておきましょう。
112 とあるひとつのフラグが、ソースコードのごく一部を良くするからといって、
113 あなたのマシンにインストールされる全てをコンパイルするのに適しているという意味ではないのです!
114 </p>
115
116 </body>
117 </section>
118 <section>
119 <title>準備はできましたか?</title>
120 <body>
121
122 <p>
123 リスクを伴うことを理解したところで、
124 あなたのコンピュータのために確実で安全な最適化を見ていきましょう。
125 そうすれば、この先、<uri
126 link="http://bugs.gentoo.org">Bugzilla</uri>で開発者に歓迎される役立つ報告をすることができます。
127 (開発者は、大抵、問題が再現するか確かめるために、
128 最小限のCFLAGSでパッケージを再コンパイルすることを要求します。
129 挑戦的なフラグはコードを破壊しうることを覚えておいてください。)
130 </p>
131
132 </body>
133 </section>
134 </chapter>
135
136 <chapter>
137 <title>最適化について</title>
138 <section>
139 <title>基本</title>
140 <body>
141
142 <p>
143 CFLAGSとCXXGLAGSの使用目的は、
144 あなたのシステム向けにあつらえた、
145 可能な限り早くて小さな、かつ完全に動作するコードを生成することです。
146 時には、これらの条件は相互に排他的ですので、
147 うまく動作すると分かっている組み合わせをここでは使うことにします。
148 原則的には、お手持ちのCPUアーキテクチャ向けに利用可能な良い最適化が用意されています。
149 後ほど私たちは積極的なフラグについて言及するので、
150 あなたの探しているものも見つかるでしょう。
151 <c>gcc</c>マニュアルに載っている(数えきれないほど)たくさんあるフラグについては議論せず、
152 基本的で最もよく知られているフラグを対象にします。
153 </p>
154
155 <note>
156 フラグが実際にどう働くか確証が得られないときはいつでも<uri
157 link="http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimize-Options.html#Optimize-Options">gccマニュアル</uri>の関連する章を参照してください。
158 もしそれでもわからないときには、Googleで検索したり、<c>gcc</c>
159 <uri link="http://gcc.gnu.org/lists.html">メーリングリスト</uri>を調べてみてください。
160 </note>
161
162 </body>
163 </section>
164 <section>
165 <title>-march</title>
166 <body>
167
168 <p>
169 まず最初に、一番重要なフラグは<c>-march</c>です。
170 これはお手持ちのプロセッサ<uri
171 link="http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3">アーキテクチャ</uri>のためのコードを生成するようコンパイラに伝えます。
172 つまり、特定のCPU向けのコードを生成すべきであるといっているのです。
173 CPUが違えば、性能が異なり、異なる命令セットをサポートし、コードの実行方法も違います。
174 <c>-march</c>フラグは、あなたのCPUの全ての性能、特徴、命令セット、癖などに合わせて特化したコードを生成するようにコンパイラに伝えます。
175 </p>
176
177 <p>
178 たとえ<path>/etc/make.conf</path>に書いてあるCHOST変数を一般的なアーキテクチャに設定していても、
179 <c>-march</c>を設定すれば、プログラムは指定したプロセッサ向けに最適化されるでしょう。
180 x86とx86-64のCPUは(とりわけ)<c>-march</c>フラグを使うべきです。
181 </p>
182
183 <p>
184 どんな種類のCPUを使っていますか?以下のコマンドを実行すれば、それが分かります:
185 </p>
186
187 <pre caption="CPU情報の取得">
188 $ <i>cat /proc/cpuinfo</i>
189 </pre>
190
191 <p>
192 では実際に<c>-march</c>を見てみましょう。この例は古いPentium IIIチップ向けです:
193 </p>
194
195 <pre caption="/etc/make.conf: Pentium III向け">
196 CFLAGS="-march=pentium3"
197 CXXFLAGS="${CFLAGS}"
198 </pre>
199
200 <p>
201 こちらはAMD64向けになります:
202
203 </p>
204
205 <pre caption="/etc/make.conf: AMD64向け">
206 CFLAGS="-march=athlon64"
207 CXXFLAGS="${CFLAGS}"
208 </pre>
209
210 <p>
211 もしどのCPUを使っているのか分からない場合は、
212 <c>-march=native</c>を使うこともできるでしょう。
213 このフラグが設定されると、GCCはプロセッサを判別して、
214 自動的にふさわしいフラグを設定するでしょう。
215 <brite>しかしながら、
216 このフラグは異なるCPU向けにパッケージをコンパイルする目的では使用すべきではありません!
217 </brite>
218 </p>
219
220 <p>
221 例えば、あるコンピュータでパッケージをコンパイルして、
222 しかしそれらを別のコンピュータで実行しようとしている場合
223 (処理の早いコンピュータで、古くて遅いマシンのためにビルドしているときなど)、
224 <c>-march=native</c>を<e>使わない</e>でください。
225 "native"というのはコンパイルしているマシンのCPUタイプ<e>のみ</e>に特化して、
226 アプリケーションのコードを生成することを意味しています。
227 AMD Athlon 64上で<c>-march=native</c>と共にビルドされたアプリケーションは、
228 古いVIA C3では実行することができないでしょう。
229 </p>
230
231 <p>
232 また、<c>-mtune</c>と<c>-mcpu</c>フラグも利用可能です。これらのフラグは
233 たいてい<c>-march</c>フラグが利用不可能な場合にのみ使われます。
234 例えば特定のプロセッサアーキテクチャは<c>-mtune</c>や<c>-mcpu</c>が必要になるかもしれません。
235 残念ながら、<c>gcc</c>の挙動はそれぞれのフラグの振る舞いが、
236 あるアーキテクチャから近いアーキテクチャであってもあまり一貫性はありません。
237 </p>
238
239 <p>
240 x86とx86-64のCPUにおいて、<c>-march</c>は全ての利用可能な命令セットと正しいABIを使い、
241 そのCPUに特化したコードを生成するでしょう。
242 そのため古かったり種類の異なるCPUとの後方互換性は持っていません。
243 もし現在Gentooを動かしているシステム以外でそのコードを走らせるつもりがないならば、
244 <c>-march</c>を使い続けてください。
245 i386やi486のような古いCPU向けにコードを生成する必要があるときのみ、
246 <c>-mtune</c>の使用を考慮するべきでしょう。
247 <c>-mtune</c>は<c>-march</c>よりも一般的なコードを生成します。
248 特定のコードにチューニングしますが、利用可能な命令セットやABIを考慮しないのです。
249 <c>-mcpu</c>はx86やx86-64のシステム上では非推奨となっているので、使わないでください。
250 </p>
251
252 <p>
253 x86/x86-64でない(SparcやAlpha、PowerPCのような)CPUでのみ、
254 <c>-march</c>の代わりに<c>-mtune</c>や<c>-mcpu</c>が必要になるでしょう。
255 これらのアーキテクチャ上では、<c>-mtune</c>/<c>-mcpu</c>は(x86/x86-64上での)<c>-march</c>と同じように振る舞うでしょう・・・しかしフラグの名前は違うのです。
256 繰り返しますが、<c>gcc</c>の振る舞いとフラグ名はアーキテクチャを超えて一貫していないので、
257 システムでどのフラグを使うべきなのかを<c>gcc</c><uri
258 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/submodel-options.html#submodel-options">マニュアル</uri>
259 で必ず確認してください。
260 </p>
261
262 <note>
263 更なる<c>-march</c>/<c>-mtune</c>/<c>-mcpu</c>の設定についての情報は、
264 あなたのアーキテクチャに適した<uri
265 link="/doc/ja/handbook/">gentooインストールハンドブック</uri>の5章を読んでみてください。
266 また、<c>gcc</c>マニュアルの<uri
267 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/submodel-options.html#submodel-options">アーキテクチャ特有のフラグ</uri>のリストに、
268 <c>-march</c>と<c>-mcpu</c>と<c>-mtune</c>の違いについてもっと詳しい説明が書いてあります。
269 </note>
270
271 </body>
272 </section>
273 <section>
274 <title>-O</title>
275 <body>
276
277 <p>
278 次は<c>-O</c>フラグについてです。これは全体の最適化レベルをコントロールします。
279 特にこの最適化レベルを上げることによって、ソースコードのコンパイルの時間がいくらか増えたり、
280 よりたくさんのメモリを使用するようになります。
281 </p>
282
283 <p>
284 <c>-O</c>の設定には5つあります。
285 <c>-O0</c>、<c>-O1</c>、<c>-O2</c>、<c>-O3</c>、そして<c>-Os</c>です。
286 これらの中からひとつだけ選び、
287 <path>/etc/make.conf</path>の中で使ってみてください。
288 </p>
289
290 <p>
291 <c>-O0</c>を除いて、<c>-O</c>の設定はいずれもいくつかの追加フラグを有効にします。
292 なので、どの<c>-O</c>レベルで、どのフラグが有効になり、そのフラグにどんな効果があるのかを学ぶために、gccマニュアルの<uri
293 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/optimize-options.html#optimize-options">最適化フラグ</uri>
294 の章を読んで確認しましょう。
295 </p>
296
297 <p>
298 それぞれの最適化レベルについてみてみましょう:
299 </p>
300
301 <ul>
302 <li>
303 <c>-O0</c>: このレベル("O"のあとにゼロが続いてます)は、
304 完全に最適化をオフにします。
305 CFLAGSやCXXFLAGSの中に<c>-O</c>が定義されていない場合のデフォルトです。
306 コードが最適化されないので、普通は使われません。
307 </li>
308 <li>
309 <c>-O1</c>: これは最も基本的な最適化レベルです。
310 コンパイラはコンパイル時間をたくさんかけることなく、
311 高速でサイズの小さなバイナリを生成しようと試みるでしょう。
312 これは非常に基本的な最適化しかおこないませんが、その代わり、いつでもうまくいくはずです。
313 </li>
314 <li>
315 <c>-O2</c>: <c>-O1</c>から更に踏み込みます。
316 これは特別な理由がない限り<e>推奨される</e>最適化レベルです。
317 <c>-O2</c>は<c>-O1</c>により有効になるものに加え、さらにいくつかのフラグを有効にします。
318 <c>-O2</c>を使うと、コンパイラは、サイズが大きくなったり、
319 たくさんの時間がかかったりしないように、コードのパフォーマンスを増加させようと試みます。
320 </li>
321 <li>
322 <c>-O3</c>: これは最高の最適化レベルであり、また最もリスクが高いです。
323 このフラグを有効にしてコンパイルすると長い時間がかかるでしょうし、
324 それどころか<e>このフラグと<c>gcc</c> 4.xを使ってシステム全体を作るべきではありません。</e>
325 <c>gcc</c>の振る舞いが3.xバージョンからかなり変わってしまっています。
326 3.xでは、<c>-O3</c>は実行時間が<c>-O2</c>よりもわずかに早くなっていましたが、
327 これはもはや<c>gcc</c> 4.xでは当てはまりません。
328 全てのパッケージを<c>-O3</c>と共にコンパイルすることは、
329 たくさんのメモリを必要とする大きなバイナリができあがり、
330 さらにはコンパイルエラーや(エラーを含む)予期しないプログラムの動作をする確率が、
331 かなり上昇します。
332 このようにプラス面よりもマイナス面が勝っています。
333 払った労力に見合う実入りを得るにも限度がある、という原則を肝に銘じてください。
334 <b><c>-O3</c>を使うことは<c>gcc</c> 4.xでは推奨されていません。</b>
335 </li>
336 <li>
337 <c>-Os</c>: このレベルはバイナリのサイズを重視して最適化するでしょう。
338 これは<c>-O2</c>フラグの中で、
339 生成されるバイナリのサイズが増えないものを全て有効にします。
340 CPUのキャッシュが小さかったり、
341 ディスクストレージスペースが極端に限られている場合などに非常に有効でしょう。
342 しかしながら、かなりの数の問題を引き起こしかねません。それが、
343 portageツリーの中のたくさんのebuildでこのフラグが除外されている理由でもあります。
344 <c>-Os</c>を使うことは推奨されていません。
345 </li>
346 </ul>
347
348 <p>
349 前述の通り、<c>-O2</c>が推奨される最適化レベルです。
350 もしパッケージのコンパイルが失敗する場合は、<c>-O3</c>を使っていないか確認してください。
351 うまくいかなかった場合は、
352 CFLAGSとCXXFLAGSを(エラー報告や問題の調査向けに)<c>-O1</c>や<c>-O0 -g2 -ggdb</c>
353 のように、最適化レベルを低く設定し、パッケージを再コンパイルしてみましょう。
354 </p>
355
356 </body>
357 </section>
358 <section>
359 <title>-pipe</title>
360 <body>
361
362 <p>
363 よく使うフラグに<c>-pipe</c>があります。
364 このフラグは、生成されるバイナリ自体には何の影響もありませんが、コンパイル処理が早くなります。
365 これはコンパイルにおける各処理間で一時ファイルを使う代わりに、
366 より多くのメモリを使うことになりますが、パイプを使うように指示します。
367 メモリに余裕のないシステムの場合、gccがもしかすると強制終了するかもしれません。
368 そのような場合はこのフラグを使わないでください。
369 </p>
370
371 </body>
372 </section>
373 <section>
374 <title>-fomit-frame-pointer</title>
375 <body>
376
377 <p>
378 これは生成されるバイナリのサイズを減少させるために設計されているフラグで、
379 よく利用されています。
380 (<c>-O0</c>を除く)全ての<c>-O</c>のレベルで、このフラグを有効にしても(x86-64のように)デバッグ作業の阻害をしないアーキテクチャでは有効になります。
381 しかしながら、場合によっては明示的に有効にする必要があるかもしれません。
382 GNU <c>gcc</c>マニュアルによれば、全てのアーキテクチャにおいて、
383 <c>-O</c>を使えば有効になる訳ではありません。
384 特にx86においては明示的に指定する必要があります。
385 しかしながらx86上でこのフラグを使えば、デバッグはほとんど不可能になってしまいます。
386 </p>
387
388 <p>
389 特に、Javaで書かれたアプリケーションの不具合修正をとても難しくます。
390 もっとも、Javaだけがこのフラグの影響を受けるわけではありませんが。
391
392 このように、このフラグは役立つ一方でデバッグを難しくしているのです。
393 特にバックトレースは役に立たなくなります。
394 しかしながら、そんなにソフトウェアのデバッグを行う予定がなく、
395 他に<c>-ggdb</c>のようなデバッグ関連のCFLAGSを追加していないのであれば、
396 <c>-fomit-frame-pointer</c>を試しに使ってみてもいいでしょう。
397 </p>
398
399 <impo>
400 <!--
401 source for this info:
402 http://www.coyotegulch.com/products/acovea/aco5p4gcc40.html
403 -->
404 <c>-fomit-frame-pointer</c>と似ている<c>-momit-leaf-frame-pointer</c>フラグを組み合わせて<e>使わない</e>でください。
405 後者のフラグを使うのはやめてください。<c>-fomit-frame-pointer</c>のみで十分です。
406 そのうえ、<c>-momit-leaf-frame-pointer</c>はコードの性能に悪影響を及ぼすことがわかっています。
407
408 </impo>
409
410 </body>
411 </section>
412 <section>
413 <title>-msse, -msse2, -msse3, -mmmx, -m3dnow</title>
414 <body>
415
416 <p>
417 これらのフラグは、<uri
418 link="http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions">SSE</uri>、<uri
419 link="http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions#SSE2">SSE2</uri>、<uri
420 link="http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions#SSSE3">SSE3</uri>、<uri
421 link="http://ja.wikipedia.org/wiki/MMX">MMX</uri>、<uri
422 link="http://ja.wikipedia.org/wiki/3DNow!">3DNow!</uri>のx86とx86-64アーキテクチャ向け命令セットを有効にします。
423 これらは主にマルチメディアやゲーム、その他の浮動小数点を多用する計算処理に有用です。
424 その他にも有用な数学用機能の向上をいくつか含んでいます。
425 比較的新しいCPUならば、これらの命令セットに対応しています。
426 </p>
427
428 <impo>
429 CPUがこれらをサポートしているかどうかは<c>cat /proc/cpuinfo</c>を実行して確認してください。
430 その出力にサポートされているこれらの命令セットが表示されます。
431 <b>pni</b>が実際はSSE3の別名であることに注意してください。
432 </impo>
433
434 <p>
435 通常、正しい<c>-march</c>を使っている限り、
436 これらのどのフラグも<path>/etc/make.conf</path>に加える必要はありません
437 (例えば<c>-march=nocona</c>は<c>-msse3</c>を有効にします)。
438 いくつかの注意すべき例外は、比較的新しいVIAとAMD64のCPUです。
439 これらは(SSE3のような)命令をサポートしますが、<c>-march</c>では有効になりません。
440 これらのCPUについては、<c>cat /proc/cpuinfo</c>の出力を確認した後に、
441 ふさわしい追加フラグを有効にする必要があるでしょう。
442 </p>
443
444 <note>
445 x86とx86-64特有のフラグの<uri
446 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options">リスト</uri>
447 を確認しましょう。
448 -marchで適切にCPUを指定することによって、どの命令セットが有効になるのか確認することができます。
449 もし命令がリストの中にあったら、改めて指定する必要はありません。
450 なぜならそれらは正しい<c>-march</c>を使えば有効になるでしょうから。
451 </note>
452
453 </body>
454 </section>
455 </chapter>
456
457 <chapter>
458 <title>最適化FAQ</title>
459 <section>
460 <title>-funroll-loopsや-fomg-optimizeを使ったら早くなったんだけど!</title>
461 <body>
462
463 <p>
464 いいえ違います。フラグを付け加えれば付け加えるほど最適化されると言う誰かに騙されて、
465 してやったと勘違いしているだけです。
466 システム全体で挑戦的なフラグを使うことはあなたのアプリケーションを傷つけるでしょう。
467 <c>gcc</c> <uri
468 link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Optimize-Options.html#Optimize-Options">マニュアル</uri>では<c>-funroll-loops</c>と<c>-funroll-all-loops</c>を使うとバイナリは大きくなり、
469 実行も遅くなると述べています。
470 またいくつかの理由から、これらの二つのフラグと同時に、
471 <c>-ffast-math</c>や<c>-fforce-mem</c>や<c>-fforce-addr</c>などの似たようなフラグが、
472 速度を最大限誇示したい人たちの間で、
473 とても人気を博しています。
474 </p>
475
476 <p>
477 ここで本当に問題なのは、これらのフラグは危険なほどに挑戦的なフラグということです。
478 それらのフラグが何をやらかしているのか、<uri link="http://forums.gentoo.org">Gentoo Forums</uri>
479 と<uri link="http://bugs.gentoo.org">Bugzilla</uri>あたりをよく見てください。
480 ろくなことないですよ!
481 </p>
482
483 <p>
484 それらのフラグをCFLAGSやCXXFLAGSに設定し、システム全体で使う必要はありません。
485 それらはパフォーマンスに悪影響を及ぼすだけでしょう。
486 それらのフラグが、
487 最先端でハイパフォーマンスなシステムを使っているかのように見せるかもしれませんが、
488 しかしそれらは何の効果もないどころか、バイナリのサイズが膨れ上がり、バグ報告は無効(INVALID)や修正の必要無し(WONTFIX)として処理されます。
489 </p>
490
491 <p>
492 あなたはそのような危険なフラグを使う必要はありません。<b>使わないでください。</b>
493 <c>-march</c>、<c>-O</c>、<c>-pipe</c>という基本を守り通してください。
494 </p>
495
496 </body>
497 </section>
498 <section>
499 <title>3より高い-Oレベルはどう?</title>
500 <body>
501
502 <p>
503 何人かのユーザーが、<c>-O4</c>や<c>-O9</c>などを使うことによってもっといいパフォーマンスを得たと誇張していますが、3より高い<c>-O</c>レベルは何の効果もありません。
504 コンパイラは<c>-O4</c>のようなCFLAGSも許容するでしょうが、それらは実質何もしないのです。
505 <c>-O3</c>の最適化を行うだけで、それ以上の最適化はしません。
506 </p>
507
508 <p>
509 もっと証拠が必要ですか?<c>gcc</c>の<uri
510 link="http://gcc.gnu.org/viewcvs/trunk/gcc/opts.c?revision=124622&amp;view=markup">ソースコード
511 </uri>を確認すると:
512 </p>
513
514 <pre caption="-O フラグ部分のソースコード">
515 if (optimize >= 3)
516 {
517 flag_inline_functions = 1;
518 flag_unswitch_loops = 1;
519 flag_gcse_after_reload = 1;
520 /* Allow even more virtual operators. */
521 set_param_value ("max-aliased-vops", 1000);
522 set_param_value ("avg-aliased-vops", 3);
523 }
524 </pre>
525
526 <p>
527 見てのとおり、3より高いレベルであっても、結局<c>-O3</c>として扱われます。
528 </p>
529
530 </body>
531 </section>
532 <section>
533 <title>冗長なフラグ指定はどう?</title>
534 <body>
535
536 <p>
537 しばしば、<path>/etc/make.conf</path>の中で、個々の<c>-O</c>レベルを指定すれば有効になるフラグを
538 重複してCFLAGSやCXXFLAGSに設定していることがあります。
539 これは時々よく知らずにやってしまうのですが、
540 一方で(ebuildが行う)フラグの除去や置換を回避する為に行われることがあります。
541 </p>
542
543 <p>
544 フラグの除去や置換はPortageツリーの中にある多くのebuildで行われています。
545 大抵は、特定の<c>-O</c>レベルでパッケージをコンパイルすると失敗するため、
546 もしくは、フラグを追加すると、そのソースコードでは問題が出るからです。
547 ebuildはどちらの場合も、全部/一部のCFLAGSとCXXFLAGSを除外するか、
548 もしくは異なる<c>-O</c>レベルに置換するでしょう。
549 </p>
550
551 <p>
552 <uri
553 link="http://devmanual.gentoo.org/ebuild-writing/functions/src_compile/build-environment/index.html">Gentoo開発者マニュアル</uri>にフラグの除去と置換がどんな場合にどうやって使われているのか、あらましがあります。
554 </p>
555
556 <p>
557 重複してフラグを設定することによって、ある程度は<c>-O</c>に対するフラグ除去を回避することができます。例えば、<c>-O3</c>であれば、次のようにします:
558 </p>
559
560 <pre caption="重複してCFLAGSを設定">
561 CFLAGS="-O3 -finline-functions -funswitch-loops"
562 </pre>
563
564 <p>
565 しかしながら、<brite>これは賢いやり方ではありません</brite>。
566 CFLAGSは理由があって除去されるのです!
567 フラグが除去されるとき、
568 それらのフラグでパッケージをビルドすると安全でないことを意味します。
569 明らかに分かっているのは、
570 <c>-O3</c>でシステム全体をコンパイルすることは<e>安全ではない</e>という事です。
571 そうすると、<c>-O3</c>の最適化で有効になるいくつかのフラグによって問題となるパッケージが出てくるでしょう。
572 そのため、それらのパッケージをメンテナンスしている開発者の"裏をかく"ことを試みるべきではありません。
573 <e>開発者を信用してください</e>。
574 フラグの除去と置換はあなたの利益になるから行われているのです!
575 もしebuildに代替のフラグが指定されているなら、それを回避しようとしないでください。
576 </p>
577
578 <p>
579 開発者が許可していないフラグでパッケージをビルドすれば、
580 大概は数々の問題に陥り続けることでしょう。
581 Bugzillaに不具合を報告する際には、
582 <path>/etc/make.conf</path>で使っているフラグは容易く見抜かれてしまうので、
583 余計なフラグを除いて再コンパイルする様に開発者に指示されるでしょう。
584 初めから冗長なフラグを指定しないことで、再コンパイルする手間を省いてください!
585 あなたが開発者よりよく知っていると根拠なく無意識に決めつけないでください。
586 </p>
587
588 </body>
589 </section>
590 <section>
591 <title>LDFLAGSはどう?</title>
592 <body>
593
594 <p>
595 Gentoo開発者がすでに基本的で安全なLDFLAGSを基本プロファイルにセットしているので、
596 それらを変更する必要はありません。
597 </p>
598
599 </body>
600 </section>
601 <section>
602 <title>パッケージごとにフラグを変更出来るの?</title>
603 <body>
604
605 <warn>
606 パッケージごとにフラグを変更するとデバッグやサポートが込み入ってきます。
607 もしこの機能を使っている場合には、どんな変更をしたのか、バグレポートで言及してください。
608 </warn>
609
610 <p>
611 パッケージごとに(CFLAGSを含む)環境変数を変更する方法は、<uri
612 link="/doc/ja/handbook/handbook-amd64.xml?part=3&amp;chap=6#doc_chap2">Gentoo
613 ハンドブックの"パッケージごとの環境変数"</uri>で説明しています。
614 </p>
615
616 </body>
617 </section>
618 </chapter>
619
620 <chapter>
621 <title>資料</title>
622 <section>
623 <body>
624
625 <p>
626 以下のいくつかの資料が更に最適化について理解する助けになるでしょう:
627 </p>
628
629 <ul>
630 <li>
631 <uri link="http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/">GNU gccマニュアル</uri>
632 </li>
633 <li>
634 <uri link="/doc/en/handbook/">Gentooインストールハンドブック</uri>の第5章
635 </li>
636 <li><c>man make.conf</c></li>
637 <li><uri link="http://ja.wikipedia.org">Wikipedia</uri></li>
638 <li>
639 <uri link="http://www.coyotegulch.com/products/acovea/">Acovea</uri>(訳注: 現在リンク切れ)は、
640 コンパイラのフラグの相互作用および生成されるコードへの影響が、
641 どのように違うのか測定する場合に有用なベンチマークとテストが行えます。
642 もっとも、それによって提案されるフラグをシステム全体に使うことは適切ではありません。
643 Portageでも次のコマンドで利用可能です:<c>emerge acovea</c>.
644 </li>
645 <li><uri link="http://forums.gentoo.org">Gentooフォーラム</uri></li>
646 </ul>
647
648 </body>
649 </section>
650 </chapter>
651 </guide>