[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/18 20:43 / Filesize : 166 KB / Number-of Response : 785
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C、C++の最適化について語るスレ 2



1 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 09:54:14 ]
コンパイラ性能、コンパイルオプション、コードの最適化などについて語りましょう。
主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。
なお、OS、CPU、コンパイラなどは限定しません

前スレ

C、C++の最適化について語るスレ
pc11.2ch.net/test/read.cgi/tech/1084676298/


413 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:49:02 ]
>>410
そういう仕様のベクトル演算クラスって少ないよ。C++でも

414 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/20(水) 02:11:33 ]
より汎用化したいならテンプレートにしてIntrinsicsベッタリな部分はtraitsで実装するとかいう手もあるわな

fvecやdvecはラッパークラスの実装サンプルだと思ってもいい。ちなみにSSE3〜4には対応してない。

415 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 05:15:43 ]
なるほど、実装サンプルね。じゃあdvecが参照してるヘッダを活用して
独自にラッパー作ってもいいわけだ

>どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので
>性能落ちる
ここの意味がわかりませんぜ親分。うまくベクトル化できてもIntrinsics使ったコードには勝てないのか?

416 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/20(水) 06:12:03 ]
配列=かならずアドレスを持つ=レジスタ変数にできない。
いっぽうで__m128の実体はレジスタに割り当て可能。

レジスタ上に置いて演算を繰り返すような用途には、ロード・ストアは無駄。

417 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:56:09 ]
なんでバールの人はそんなに詳しいの

418 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:25:31 ]
>>416
> 配列=かならずアドレスを持つ=レジスタ変数にできない。

これってどんなコンパイラでもそうなっちゃうの?

419 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:53:19 ]
>>418
最適化によってずっとレジスタに保持するケースもあるとは思うが、
それでも一応メモリ領域に置くだけは置くようだ。

420 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:59:55 ]
>>419
へぇ。そんなこともあるんだ。

で、それは特定のコンパイラでの実験結果であて、規格上レジスタだけで
済ませることができない制約がある、というわけじゃないよね?

421 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:08:55 ]
でもC++はregister変数のアドレスを取れちゃうから不思議。



422 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:23:19 ]
ふと、メンバ変数も仮想関数もない空のクラスでも
アドレス取れないといけないからサイズ0にならないって話を
思い出した。

423 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:03:28 ]
>>421
register はコンパイラへのヒントであって
必ずレジスタに割り付けする必要はないからな


424 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:11:33 ]
>>423
それでもCだと文法エラーなんだよ
この辺が解せない

425 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:23:59 ]
>>424
でも本来の意味的にアドレス取れちゃおかしいよね。

426 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:25:16 ]
インライン関数のアドレスが取れるくらいだからいいんじゃね。

427 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:02:43 ]
ひょっとしてアドレスを取るコードを書いた時点でレジスタに入らなくなったりインライン化されなくなったりする?

428 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:06:35 ]
ローカル変数のスタック・レジスタへの割り当てについては
ダンゴさんが鋭い意見を持っていると思う

再利用とか

429 名前:ヽ・´∀`・,,)っ¬ mailto:OH MY LITTLE バール♪ sage [2008/02/21(木) 00:21:52 ]
CellのSPE用コンパイラはregisterキーワードつけただけでアドレスをとるコードはコンパイルエラー吐く。
レジスタが十分に多くレジスタ間オペレーション前提のアーキはこんなもんでしょ

430 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:24:55 ]
関数はアドレスとろうとどうしようと、インライン展開の妨げにはなりませんな。
なんせ、通常版を展開しておきさえすれば後は何でもありだから。
gccなんかだと、再帰関数でも一段目だけインライン展開してたりして楽しい。

431 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:29:10 ]
>>427
アドレス取る可能性があると、最適化の掛かりが悪くなるな気がする。がっちりprivateで包んで、メンバ変数のポインタを外から取れなくすると効果ある様な気がする。




432 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:36:29 ]
>>427
メンバ変数はすでに this でアドレス取られてるようなもんだろ。 private とか関係ないと
思うよ。

433 名前:432 mailto:sage [2008/02/21(木) 12:36:56 ]
アンカーミスった >432 は >>431 ね。

434 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/21(木) 23:21:34 ]
アクセス属性は最適化のかかりには関係ないです。
friend属性で完全に読めるしね。


なんにせよ「レジスタ型」のラッパークラスって扱いが難しいだろうな

fvecやdvec使ってても、各要素に配列インターフェイスでにアクセスしようとすると
いったんメモリ上にストアしてから各要素を読み出す動作になる。
なぜならそういう作りだから。
SSE4.1のextractps/dならレジスタ間渡しができるだろうけど。

435 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:32:37 ]
正直、クラスメンバはぶっちゃけグローバル変数なんで最適化かかりにくい。

436 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:23:32 ]
大分関係無いけどだんごさんのクロージャに対する意見を聞きたいです

437 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/22(金) 22:57:28 ]
変態boostはおなかいっぱい


438 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:41:48 ]
ダンゴさんは本当に知識豊富だな

439 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:18:13 ]
別に「変態boostはお腹一杯」では何も有益な事は読みとれんだろww
むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。

440 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:54:46 ]
439は本当に知識豊富だな


441 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:55:54 ]
クロージャ使うと遅くなるってイメージがある



442 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/23(土) 01:58:40 ]
っていうかboostってコードサイズをboostするんだよ。


443 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:06:44 ]
別に「別に\「変態boostはお腹一杯\」では何も有益な事は読みとれんだろww\
むしろ\「もうこりごりだ\」っていう反応にも取れるくらいだ。\
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて\
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。」では何も有益な事は読みとれんだろww
むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。

444 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:07:24 ]
Boostつかうと一気に実行ファイルサイズが10倍に?!

445 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/23(土) 02:08:11 ]
\7

446 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:09:10 ]
>>444
でも使わないと実行時に要するメモリサイズが10倍に!?

447 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:32:18 ]
boost使うとコンパイル時間が4倍位に

448 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:32:46 ]
それはリアルな

449 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:37:29 ]
boost――それは決して便利とは言えない、そして無駄にコンパイルの時間とファイルサイズだけを喰っていってしまう。
しかし必要とあれば使わなければならんのだ――漢にはそういう時が来るものなのだ。

450 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:51:43 ]
必要でもあえて使わないのが漢じゃねーのか?

451 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:59:07 ]
1クロック1バイトまでこだわった俺仕様ライブラリを作るのが漢ってものじゃないのか。




452 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:41:07 ]
昔, RAM 1k とかで 8bit マシンのアセンブラ書いて時は
メモリの 1byte は血の一滴って感じだったけどな…


453 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:50:57 ]
>>450
人、それを馬鹿と言う。

454 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:08:01 ]
>昔, RAM 1k とかで 8bit マシンのアセンブラ書いて時は
1024バイトなんて随分贅沢だなぁ、おい。

455 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 19:12:43 ]
いや、1Kbitじゃないか。


456 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:28:52 ]
6810か

457 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:40:59 ]
>>456
それだったら4114x2の方が安いんじゃないだろうか?


458 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:41:38 ]
2114のまちがい


459 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:08:59 ]
"?"不要 話にならない<当時の価格

460 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:10:10 ]
<←これってどこの文化なの

461 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:52:33 ]
こんにちはー(^^)>おーる



462 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:14:31 ]
>>460
DOSのリダイレクト

463 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 16:30:39 ]
仮にもマなら半角の>を使え

464 名前:デフォルトの名無しさん [2008/02/24(日) 20:45:27 ]
てs

465 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 01:54:03 ]
実行速度重視よりもメモリ使用量重視の方が早くなるときがあることについて

466 名前:デフォルトの名無しさん [2008/03/06(木) 02:13:09 ]
>>465
単一のアプリだけで動いている訳じゃないからな
たとえば残り100Mで全部使用したら、OSや他のアプリがメモリ必要とするから追い出されることになる
しかし自分が動くときにはメモリ上に再び持ってくるから、追い出すのとを繰り返しかなり遅くなる
メモリは最低限にするのが速い

467 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:49:27 ]
あとCPUのキャッシュに乗るとものすごく速くなるんで、そのへんも絡んでくるかと

468 名前:デフォルトの名無しさん [2008/03/06(木) 04:09:33 ]
省メモリで動くならCPUキャッシュを考えて良いけど、
スワップが起こりうるならその時間の方が圧倒的にかかる

469 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 04:16:59 ]
結局実測するしかないんだよな

470 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 04:58:27 ]
それもあらゆる環境で。

471 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:02:59 ]
>>470
馬鹿? あらゆる環境で最適な最適化なんてあるわけないじゃん。
「ターゲットとする」と形容するなら兎も角。

実際、Woodcrestで速くなるように最適化したら、Pen4で遅くなったなんてよくある話だ。
# それ以前に、「あらゆる」だと一体どこまで対象にするんだ? Pen3か? 486か?w



472 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:30:20 ]
>>471
日本語読めない馬鹿?

473 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:34:42 ]
自分が説明できていないことを棚に上げて他人をけなすバカ?w

474 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:22:50 ]
恥ずかしい誤読で鼻息を荒くするのも、
まぁ、人生経験のうちではある。

475 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:25:42 ]
>>471
woodcrest, pen4云々とCレベルの最適化技法とは次元が違うでしょw

476 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:28:57 ]
>>465
実際にどんなケースで省メモリコンパイルのほうが速くなる?

477 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:33:47 ]
>>475
>471じゃないが、Cレベルの最適化限定なのか?
だとしたら、キャッシュやスワップがどうこうなんて関係ないと思うのだが。
逆に、キャッシュやスワップを云々するならそれらのサイズに影響するわけだから、
CPUに依存した話になってしまうだろうし。

478 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:19:55 ]
>>477
Pen4が、Pen3がってのは、吐き出すコードの並べ順とかそういう要因だから、Cコード側でどうにもならんだろ。
キャッシュどうこうは、配列や構造体のサイズを変えたりなどのCコードレベルでの最適化ができるだろ。

479 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:21:15 ]
SSEを使ったベクトル化もベクトル化しやすいCコードにするなどCレベルでの最適化の範疇だな。

480 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:29:41 ]
アセンブリまで意識した時点でCレベルではない。
たいていCプログラマに求められるものではあるが。


481 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:02:33 ]
ダンゴさんの鋭い意見が望まれるな



482 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:25:06 ]
かわいそうな奴はもう放っとけよ

483 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:02:27 ]
通院中だから、ちょっと待っててね。


484 名前:デフォルトの名無しさん [2008/03/07(金) 14:42:19 ]
VC++の浮動小数点ですが、
/fp:precise fast strict
の中でどれが一番精度が高いのでしょうか?
デフォルトのpreciseだと思っていたのですが、
floatをdoubleに変えたときの結果に一番近かったのが
fastだったのですが。

485 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:48:46 ]
>>484
まず、floatをdoubleにした結果に一番近いの意味が不明

486 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:16:52 ]
>>484
x86のFPUはfloatだろうとdoubleだろうと、内部では80bitで計算している。
そのために、floatの計算で本来なら丸め誤差が発生するはずのところで、
誤差が発生しないという問題が生じる。

厳密に規格で決められた通りの精度で計算するためには、1つの計算が
終わるたびに丸め操作が必要になる。

その辺のコントロールをするのが/fpオプションで、fastは速度優先で
最低限の丸め操作しかしないので計算の精度が必要以上に上がってしまう。
また、どのタイミングでメモリにストアされるかによっても、計算結果が
変わってしまうので、全く同じ入力を与えても常に同じ結果になることが
保証できない。

487 名前:♪(*^ ・^)ノ⌒☆ mailto:sage [2008/03/07(金) 18:40:21 ]
>>480
命令の並び順こそモダンなCPUではOoOがあるからあんまり影響しない。

レイテンシの極端に大きい命令に展開されるのがわかってる場合は
アンロールしてソフトパイプライニングするのも有効。もちろんCレベルでできる。

C++なら機種依存の手続きをトレーツ(笑)にしてインターフェイスを汎用化する手もあるね。

>>481
黙れスイーツ(笑)

>>****
ご希望にお答えしてお前は放置

>>483
おう、闘病がんがれよ

488 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:08:28 ]
NGnameが増えたのか?

489 名前:ヾ(*´∀`*)ノ mailto:sage [2008/03/07(金) 20:57:02 ]
どうぞどうぞ

490 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 00:15:33 ]
>>486
コードが同じならメモリにストアされるタイミングも同じで、
同じ入力を与えたら同じ結果になるんじゃないの?
それとも、入力ってのはソースファイル(コンパイラに対する入力)のことかな?

491 名前:デフォルトの名無しさん [2008/03/08(土) 00:45:47 ]
>>490
レジスタからあふれてメモリに追い出されるときに丸めが生じる。
同じ式が違う場所にあるときに丸めるタイミングが違ってくる可能性がある。



492 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 00:51:19 ]
同じ位置にあるコードでの話じゃなかったのか。

493 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:24:27 ]
同じ位置にあっても、コンパイルされるたびに毎回同じ結果に
なることが保証できない。

494 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:32:41 ]
つまり、入力ってのはソースファイル(コンパイラに対する入力)のことになるわけだね?

495 名前:486 mailto:sage [2008/03/08(土) 02:03:49 ]
いや、関数に対する入力のつもりで書いたんだが。
言いたいことは491の言ってることだな。
クライアントとサーバで同じ式を書いても同じ結果にならなかったり、
デバッグ用のコードを入れたら結果が変わったり、インライン展開
されるかどうかで結果が変わってしまう。

496 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:16:10 ]
コンパイルしてしまった後のプログラムがあって、
それの全く同じタイミングに実行される全く同じ位置のコード(マシン語レベルで)に
全く同じ入力を与える場合を想定してたんだぜ。

497 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:43:10 ]
ダンゴさんのレスでスレが一気に加熱したな。

498 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:46:36 ]
メモリ4倍にしたらCPUの処理速度が40%以上遅くなった。

499 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:49:01 ]
CPU の問題じゃなくて、サイズの違うメモリを使ってるからじゃないのか?

500 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:00:59 ]
単純に、交換したメモリが遅いだけじゃないの?

501 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:29:12 ]
CPU が遅くなったと言うなら、
レジスタのみの演算をぶん回して
比較しないとな。



502 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/08(土) 13:26:10 ]
Intel入ってないだけじゃないの?
Athlon 64の前のモデルではメモリ増やすと逆に遅くなる現象があるらしーな。

503 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:39:40 ]
PenDの速さの実感できなさ具合は異常

504 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:24:45 ]
あぼーん推奨ワード:ダンゴさんの

505 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/08(土) 17:28:20 ]
同意

506 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:40:05 ]
ダンゴさんが復活したおかげでレス数がうなぎのぼりだな

507 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 04:12:57 ]
あぼーん推奨ワード:ダンゴさんが

508 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 05:24:38 ]
あぼーん推奨ワード:ダンゴ、団子

509 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:06:41 ]
だんご大家族♪

510 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:48:39 ]
DANGOさんのおかげでEDが直りました

511 名前:498 mailto:sage [2008/03/09(日) 23:25:11 ]
superπでチェックしたが明らかにCPUトロくなった。256を1Gに変えたのだが。



512 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:25:18 ]
弾固さんのおかげで層化学会に入ることができました

513 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:26:32 ]
どうせ128MBの板を何枚もポトペタしただけなんだろ?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<166KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef