1 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 09:54:14 ] コンパイラ性能、コンパイルオプション、コードの最適化などについて語りましょう。 主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。 なお、OS、CPU、コンパイラなどは限定しません 前スレ C、C++の最適化について語るスレ pc11.2ch.net/test/read.cgi/tech/1084676298/
577 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:16:54 ] >>548 86のアセンブラなんて10年以上やってないんで自信ないんだが、途中でキャリーフラグ消えてないか? キャリー使わずにCで書いても同じくらいの速さのコードは出そうだが。
578 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:01:13 ] >>577 mov, lea, loop はキャリーに影響しない add edi, 4 でなく lea edi, [edi + 4] とするのはそのためでもある
579 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:39:30 ] >>578 andも?
580 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:07:37 ] >>579 少しは自分で調べろ
581 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/15(土) 00:05:39 ] andは書き換えるだろ。 MMX/SSEもフラグレジスタを書き換えない。
582 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:24:25 ] Cとインラインアセンブラのソースを睨めっこしても意味ないだろ 逆汗しないと
583 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:36:22 ] はぁ?
584 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:57:39 ] はぁ。
585 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 12:13:54 ] ハァ〜ン
586 名前:デフォルトの名無しさん [2008/03/18(火) 20:20:53 ] 例A) gethoge()->fuga(); gethoge()->piyo(); 例B) hoge *p = gethoge(); p->fuga(); p->piyo(); gethogeはprivate変数へのアクセサと仮定して、 この場合例AとBでどっちの方が早いのだろう? fugaやpiyoがもっとたくさんあるのなら後者だろうけど 2回だけだとポインタこさえるコストも考えるとごっちゃになってきた。
587 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:40:21 ] ちゃんとインライン化されれば同じようなもんだろ。
588 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 10:47:54 ] >>586 処理時間で A >= B って感じ。 「ポインタこさえるコスト」とか言うが、 A でもコンパイラが ポインタを作る。しかも繰り返し。
589 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 12:29:58 ] fugaの中でhogeが書き換わる可能性を考慮すると、AとBでは結果が異なる可能性がありそうな気も
590 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:27:23 ] それをいうならgethogeじゃない? fuga一回しか呼んでないじゃん
591 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 21:02:41 ] fugaとpiyoを呼んでprivate変数の状態を変えるとか考えないのか?
592 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 09:42:59 ] vtuneって各関数でのメモリアクセス数って調べられますか?
593 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 12:24:39 ] 遅延量や、キャッシュミスもわかる。
594 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 14:16:56 ] memoryのpageinput/outputを監視すれば 各関数のメモリアクセスは調べられそうですね ありがとうございます。
595 名前:デフォルトの名無しさん [2008/03/26(水) 14:44:33 ] >>594 writeとreadはいらないの?
596 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 15:25:04 ] >>595 メモリアクセスはin/outだけじゃ・・・
597 名前:デフォルトの名無しさん [2008/03/26(水) 16:07:31 ] vtunesの使いかた分かんね。 どうやったらプログラム実行終了時の 各関数のそれぞれにおいてのメモリアクセス数が出るんだ
598 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 18:58:16 ] >>597 命令ごとのメモリや演算器、キャッシュ、バスのタイミングが見える。プロファイラなんかとは次元が違う。
599 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 21:43:23 ] >>598 それぞれのメモリアクセスはどこみればいいのか分からん 全体の1秒あたりのメモリアクセスは出てるけど
600 名前:デフォルトの名無しさん [2008/03/29(土) 09:07:38 ] vectorって配列に比べて最適化されにくい?
601 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/29(土) 09:13:42 ] そうでもないよ
602 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 09:40:39 ] ダンゴさんは博識にもほどがあるな
603 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 09:56:57 ] スタックに置く場合以外は同じだろうね。
604 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:12:58 ] 602 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
605 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/29(土) 12:29:13 ] 上に同じ
606 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:47:37 ] 「TASさん」みたいなノリですね、わかります。
607 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:55:13 ] ダンゴさんの書き込みでスレが再加熱したな
608 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:59:22 ] 607 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
609 名前:デフォルトの名無しさん [2008/03/30(日) 02:23:09 ] 608 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
610 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 10:57:30 ] あぼ〜ん推奨ワード:ダンゴ、だんご、団子
611 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 11:22:37 ] 610 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
612 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:47:20 ] >>610-611 w
613 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:51:59 ] w ってどういう意味?
614 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 03:08:41 ] 藁w
615 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 00:18:25 ] >>614 には失望した
616 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 01:05:43 ] なら俺は干草
617 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 10:00:38 ] >>600 コンパイラによるがされにくい。 PGIでは、vectorのまま[]でアクセスしたループはベクトル化してくれないが、 一旦ポインタに変換してループを書くとベクトル化する。
618 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 10:52:06 ] vector使うなら、operator[]を使わずにiteratorを使うだろ。常考
619 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 15:40:33 ] iteratorなんかつかったら余計に最適化されねーっての。
620 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 16:37:25 ] されますが何か。
621 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 15:05:29 ] その手があったか。 vectorに限って言えばiteratorはまず間違いなくポインタだろ。 ということは最適化される。
622 名前:619 mailto:sage [2008/04/02(水) 16:20:53 ] すんません。 vector<double>::iterator p = v.begin(); を使って、 p[i] でアクセスしたらポインタと同等の最適化されました。 ただ、for文の終了条件を p != v.end() なんてことしたら ループの回数が不明ということで最適化除外されました。
623 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/02(水) 17:00:57 ] std::vector<F32vec4> から派生の方向で アクセッサ?ほぼ再実装だね
624 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/02(水) 17:02:21 ] >>622 コンパイラは?
625 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:37:03 ] ダンゴさんはVCの最適化については一言言いたいところがあるようだな
626 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:48:28 ] >>624 PGI
627 名前:デフォルトの名無しさん [2008/04/03(木) 00:23:08 ] 623 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
628 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 13:17:37 ] >p != v.end() 毎回インスタンス変数見るのか。 for(int i=0,sz=v.size(); i<sz; i++){...} for(iterator i=0,end=v.end(); i!=end; i++){...} のどちらかだろ常考。
629 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 14:51:29 ] 本来その程度の事は自動でやってくれるべきだけどね。 高級アセンブラだから細かいところに気を使うんだよな。
630 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 15:13:25 ] それを自動でやったらvolatileを勝手に外すくらいの暴挙じゃね? 正当にやれるのは、v自体がローカル変数で、 ポインタを取られてないことを解析出来る場合だけど、 その前提を維持するより一時ローカル変数に移した方が簡単だと思う。
631 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 16:33:26 ] ああそうか。あー!面倒くさい! もうローカルでポインタを取得してないメンバ変数やグローバル変数が 外から変更される可能性がある場合は全部volatile付けるって事でいいよw なんてやってるとvolatileだらけでどっちが面倒くさいんだか分からなくなってくるな。
632 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 18:15:58 ] パソコンだとマルチスレッドなんてあるから、 volatileが付いていてもいなくても 付いているのと同じように扱われている気がする(ローカルな自動変数以外)。
633 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 19:18:06 ] volatileは厳密にメモリのアクセス回数を決めるための物だから 同じってことは無いだろうけどね。
634 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 19:31:48 ] >>633 釣りかネタだよね?
635 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:56:39 ] バカの可能性もあるな。(w
636 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:06:50 ] 流れ見てないんだが… ここは「volatile 宣言最強!!!」って言わなくちゃいけないところですか? はずしてたらごめんなさい
637 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:08:45 ] volatile は毎回メモリにアクセスするようにするものだとか マジレスしたらいけない流れなんだろうな。
638 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:32:10 ] お前らボラれてるぞ
639 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/03(木) 21:33:36 ] volatileは最適化抑制です。
640 名前:636 mailto:sage [2008/04/03(木) 21:36:48 ] >>637 > volatile は毎回メモリにアクセスするようにするもの なのは, いいんだけど >>634 な, ものがあったから ちょっと言ってみたかった
641 名前:636 mailto:sage [2008/04/03(木) 21:43:32 ] >>639 そんなもん分かってて遊んでるんだからほっとけや
642 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:49:31 ] volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation.
643 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 01:29:39 ] ダンゴさんのレスがピシッと決まったな。
644 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 02:20:00 ] 643 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
645 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 04:20:10 ] さすがダンゴさん
646 名前:デフォルトの名無しさん [2008/04/04(金) 11:12:12 ] 644 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
647 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 11:15:58 ] >名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん これもあぼ〜んしとくわ
648 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 21:51:09 ] >volatileは最適化抑制 厳密には違うけどまぁ別にいいや
649 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 21:56:37 ] volatile は処理系には検知できない手段によってオブジェクトの値が変更をうける可能性がある場合に オブジェクトへの積極的な最適化を抑制するための処理系へのヒントである。
650 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:19:36 ] 1: int i; 2: i = 1; 3: i = 2; 4: i = 3; こうしたとき2行目3行目の代入された数値は使われないので、最適化されて消される。 しかしデバイス制御などでiがデバイスのアドレスの場合、消されては困る場合がある。 こういう時、宣言の前にvolatileを付けたら最適化されないので意図した動きを得られる。
651 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:22:27 ] マルチスレッドかメモリマップド I/O で使うのが定番だな。
652 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:56:39 ] > マルチスレッド マルチスレッドでのvolatileについてはダンゴさんが一言ありそうだ
653 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:02:50 ] クリティカルセクション自身も volatile にするだろ?
654 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:04:19 ] フラグ程度なら害はない。
655 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:15:04 ] volatileで万全!
656 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:16:34 ] double-checked locking とか泥くせえよなあ
657 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 06:42:33 ] メモリオーダリングはしょうがない。volatileは悪くない。
658 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:05:07 ] もう -O0 でいいじゃん。
659 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:41:28 ] -O0 で毎回メモリ読みに行くことは保証されてるのか?
660 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:52:28 ] それ以前に volatile では保証されてんのか? > 処理系へのヒントである。 とか書いてあるとちょっと不安なんだが。
661 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:01:27 ] 規格上はメモリアクセスは保証されない ターゲットにメモリが存在するとも限らないし
662 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:29:51 ] Java だと昔 volatile がちゃんと実装されてないとか聞いた事あったけど、 C/C++ でそういう処理系は聞いた事ないな。 inline や register みたいにヒント扱いだから 規格上はそのあたりの挙動は処理系依存なのかもしんないけど、 先ず心配しないでいいとは思う。
663 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:18:06 ] A8.2 型指定子によると | volatileオブジェクトについては、処理系独立な意味付けは行われていない。 とあるから安心していいのでは。
664 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:40:18 ] register を無視するコンパイラがあるように volatile を無視するコンパイラ程度はあってもいい気はする。
665 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:02:06 ] >>664 volatileを無視するコンパイラは最適化禁止だな。
666 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:10:12 ] 特に最適化しなければ volatile だから 全て volatile なコンパイラはあっても volatile 無視するコンパイラは少なそうか?
667 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:18:00 ] 元の意味が「揮発性」だっけ。 規格準拠をうたうコンパイラで、そういうのは聞いたことはない。 まあ、そういう処理系を作ろうと思えば作れるんじゃないの?
668 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:30:53 ] こうですか? #define volatile
669 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:35:44 ] __declspec(align(32)) みたいなのを規格化してほしーな
670 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:37:09 ] アラインメント関連は C++0x にもう入ってるだろ?
671 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:44:14 ] どっちかというとCに入れて欲しいんだが
672 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:45:40 ] それは確かにw
673 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 22:05:57 ] ダンゴさんの書き込みへのレスのすばやさは宇宙一とおもわれるほどだな
674 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 22:11:24 ] 673 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
675 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 22:14:57 ] メモリバリアはcpuか評価環境で変わってくるんじゃないの? ほとんどosにそれを通知するような機構があると思うんだけど。 javaのvolatileはそれを保証するものになるらしいが。
676 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 23:14:20 ] 本当に意味のある最適化が仕様的に禁止されてる言語に対して何期待してるんだ? 実質的に高級アセンブラじゃん, 言語仕様が…
677 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 23:58:13 ] なんか、また変なのが涌いてきたぞ...
678 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:59:17 ] まぁマテ、じっくり話を聞いたらなんてこたぁない普通の話かもしれん。 聞きたかないが。
679 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 07:19:16 ] ポインタがあるせいで禁止される最適化の話じゃないのかな?
680 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:27:34 ] >>666 gccに-fvolatileと-fvolatile-globalってオプションがあったらしい。 前者はポインタからの間接参照、後者はグローバル変数の参照を 全てvolatile扱いするというもの。 見付けたドキュメントは古そうなのだったから、 最近のgccにもあるかどうかは知らないけど。
681 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 16:08:47 ] スレが静まり返ったな
682 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:27:33 ] 組み込み行きたい、.net開発とかいやだよもう
683 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:39:41 ] >>682 私と一緒に働きましょう! 就職フェアでお待ちしてます。
684 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:48:52 ] 後置インクリメント/デクリメントなんて消えればいいのに
685 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:51:04 ] 消えてるし
686 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:59:31 ] 後置インクリメントを使ってるソースは消えればいい 特にパラメータ化された型のインスタンスに対して使ってるやつ
687 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 11:15:41 ] 一時オブジェクトが必要になるしな。
688 名前:後置インクリメント mailto:sage [2008/04/21(月) 12:57:17 ] わたしのこと、そんなに嫌い・・・?
689 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:35:02 ] むしろ後置の動作が前置になって前置がなくなればいいと思う
690 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 19:52:26 ] それもそうだな。
691 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 20:20:52 ] >>683 もう働いてるんだって、前は自動車のOSとかやってた
692 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:06:12 ] >>691 最近だとトヨタさんががんばってるみたいだけどあれどうよ?
693 名前:683 mailto:sage [2008/04/22(火) 00:09:19 ] あー、うちの課の私の隣のチームがトヨタさんのシステムやってますね。 # 私は非組み込み。
694 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:25:12 ] 実際他社のそれってあんま知らない というか正直1年もいないで他のチームいったからな あの数ヶ月は楽しかった Javaを経てそっちいって今は標準化()わらいチームだ
695 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:36:24 ] むしろ標準化の方がよっぽどいきたくないな、いい会社ならやりがいありそうではあるが・・
696 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 12:07:43 ] 自分のソースを貼ったら最適化してくれるスレってある?
697 名前:デフォルトの名無しさん [2008/04/27(日) 12:18:53 ] 張ってみ
698 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:07:48 ] 貼るなら普通にSourceForgeとかに置いて、 その辺のスレで添削のお願いとかした方がいいんじゃね? 運が良ければバグとか直してくれる暇人とか来るだろうし。
699 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:11:20 ] >>696 数学板とかいくとアルゴリズムレベルで最適化してくれるが # 早い話、俺はどこまでアフォなのかを教えてくれる
700 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:52:19 ] 2次元拡散方程式の最強のコードを教えてください
701 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 04:53:20 ] >>700 貴方がこれから知ったことをすべて教えてくれるのなら...
702 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:04:29 ] >>700 ちょっと調べて見たけど、隣り合うところとしか計算しないから 並列化することで計算速度はあがりそうに思える。 しかし単純にスレッド化しても、パフォーマンスがあがるわけではない。 なぜならCPUのキャッシュにヒットするかどうかが鍵になるので キャッシュ漏れが発生するような並列化をしてしまうと ペナルティが発生してしまうためである。 またL2キャッシュ漏れが発生して当然というぐらい大量の要素数について 計算するのであれば、並列化することで高速化は図れると思うが やってみないとわからないし、環境に依存する。 よって最強を求めるならば 要素数や初期条件で最適化は変わるのは当然なので 何がやりたいかちゃんとかかないとだめ。
703 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:30:26 ] 最強 == 汎用 汎用 != 最強
704 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:52:26 ] キャッシュ漏れってなんだ?
705 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:59:10 ] キャッシュミスのことかな?
706 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/30(水) 19:54:07 ]
707 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:42:56 ] >>702 「ラムダ持ち上げとかやって本当にグローバルに取らなきゃいけない変数は まとめて局所的に集約した形でヒープに、そうでない変数はスタックに取る」 とか 「計算方法と使用可能なリソースを分析して配列自体の要素のならびを スパースに取る(CPU n 個いれば, キャッシュラインサイズ * n で集めら れるように配列を配置しておいて, N スレッドに自動配分する」 ってのが、賢いコンパイラ 高級アセンブラの C とか C++ とかは上記のような最適化を許されない言語 仕様が結構あると思うんだが… # 結構がんばってるんだけどな, 大規模並列用の C コンパイラ # だけど fortran とか, チューニングされた lisp 系言語には負けてるよな
708 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:53:26 ] 下手に最適化しすぎるとgccに対するLinusみたいにボロクソ言われるしな。 言語仕様として低レベルと高レベルを同じ次元で扱ってるのが問題。
709 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:28:06 ] スピルアウト?
710 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:29:48 ] 誤爆
711 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:22:32 ] キャッシュミスのことです。L2キャッシュに乗らない場合のことね。 アセンブラ無しのCと計算目的に最適化されてる言語と比較したら Cには軍配あがらないよなー てか、それでCのほうが早かったらその言語の意味ないし。 Cにこだわらないで目的に応じたツールを使うってのは 研究者としては全然ありだと思う。 最近のコンパイラは割りと賢くなってきて、 固定値になる場合は計算した結果を使ってくれるようになったけど 基本C言語ってそういうのは実装する人が考えて実装するのであって 最適化はしてくれたらラッキーぐらいのものが多い。 あくまでもC/C++のフレームワークの範囲での最適化といったら コンパイル結果がどれぐらい小さくなるか考えたりとか、 わざとキャッシュにヒットしないようにデータを配置するとか その程度だろうし。 あとはそういう計算に向いている汎用ライブラリを使う。OpenMPとか。 で、本当の本当に最適化したかったらアセンブラになってしまい すれ違いになってしまうという。
712 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:36:27 ] そういうのに向いている高級言語って何? アセンブラってマイクロレベルじゃよいと思うけど大域的には無理じゃない?
713 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:38:22 ] FORTRANなんか最適化に有利なんじゃないか
714 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 08:04:49 ] > 最近のコンパイラは割りと賢くなってきて、 > 固定値になる場合は計算した結果を使ってくれるようになったけど > 基本C言語ってそういうのは実装する人が考えて実装するのであって > 最適化はしてくれたらラッキーぐらいのものが多い。 いったいいつの時代の人なんだ?
715 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:28:08 ] VCなんかは最近はセキュリティオプション強化してるから 最適化とは逆の方向にいってるよね。 #define SECURE_SCL 0 つければ大丈夫みたいだけど、 知らないと最新の最適化するコンパイラを使っているはずなのに パフォーマンスが落ちる。 コンパイラの努力をライブラリが無駄にしてるわけですよ。 あとCの最適化って基本的に書いて見てコンパイルさせて アセンブラ見て最適化されてるか確認して初めてわかるものじゃない? バージョンがかわったりオプションかわったりすれば コードが変わるから、それが正しいかどうか判断できないし。 ちょっと上にも誰かが書いてあるけど、最適化するには条件があって その条件をちょっとでも外れると最適化されないし。 どこまで要求するかで話変わるし 最適化と一言でいっても人によって受け止め方は違うんですよ 自分は最適化してくれたらラッキーぐらいのコードを書くことが大半ですから 最適化がそのプログラムの根幹に関わるようなことはあんまりないです。 ある場合はSSEの出番だし。 自分にとっての最適化はアセンブラだし 人によってはいかにコピーを発生させないかというレベルのものだろうし 研究用との人なんかは結果が速く出れば計算機資源は関係ない人もいるだろうし ただ、下手なコード書いても速くならないこともしっている。 コンパイラも賢いからね。
716 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:32:15 ] コンパイラは何を使ってる?
717 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:05:25 ] まぁ、SSE使うのも今のコンパイラだったら当然視野に入っているしね。 一番困るのは、「forよりwhileが速い」とか「[]で書くより*で書くほうが速い」と言った古い流儀を引き摺ることだったり。 特にiccのようなコンパイラは、典型的なforの使い方をした場合により最適化するようだしね。
718 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:43:37 ] >>707 , >>711 , >>715 , >>717 ネットかなんかで見たこと書いてるだけなんだろうけど、微妙に理解力が 足りない感が痛々しいな。
719 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:46:55 ] inline fortranはまだか
720 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:47:46 ] extern "FORTRAN" のほうが欲しい
721 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:59:21 ] >>718 どこが足りないのか指摘してください。 勉強になるんで。
722 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:46:37 ] 「微妙」とか「感」という表現からして、あんまり期待はできないかと。 自分のふとした思いつきとか、「何となくそんな気がする」というフィーリングが、 この世の何かを「ピタリ当てている」と信じたい、そういう年頃ってあるでしょ。
723 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:50:00 ] 48歳位か
724 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:53:26 ] 実際、人によっては一生モノではあるね。
725 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:26:25 ] >>718 715の最適化についてのレスを書いたのは俺だが 715はメインがSSEとかアセンブラって言ってるから的を外してないと思うぞ。 >>719 , 720 俺の経験上、ベクトル化はマジ信用出来ない。 有効に働くのは全要素に単純に四則演算と超越関数を与えるときだけだから 融通のきかなさはGPU以上。 ぶっちゃけそんな単純なコードならCでfor回したって読みにくくならないし、gccもVC++もベクトル化してくれるんだよ。 ただその他のレジスタの使い方とかインライン化みたいな 帯域的な最適化は賢いから高級アセンブラとしては依然有効。 あとcomplexをベクトル化するのも面倒くさいから有効。
726 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:33:25 ] 分かりにくかったな。 俺は715じゃなくて、715が参照してる最適化についてのレスを書いた人。 んで、超越関数はgccやVC++ではベクトル化出来ないから 単純な計算式に超越関数が入ってる時はIntelのコンパイラが有効。 まあそれにしたって対象が全要素じゃない事も多いし 結局自分でSSEで書いてる。
727 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 18:02:55 ] 丁度今日はとあるメモリアクセスを伴うロジックで最適化オプションをいろいろ試してた。 -- gccのオプション→ なし -O -O2 -O3 Xeon w/icc 旧アルゴリズム(SoA) 1.06 0.71 0.82 0.98 0.05 新アルゴリズム(SoA) 0.16 0.12 0.06 0.06 0.03 新アルゴリズム(AoS) 0.42 0.10 0.03 0.02 0.02 -- 旧アルゴリズムは何故かO2以降で遅くなるし、 新アルゴリズムは最適化しない場合を除きAoSの方が速いし。 最後のXeonを除くと、他はPen4なのでその所為なのかも知れず。 つーか、折角の新アルゴリズムの効果がXeonだとあんまり目立たないのねん。
728 名前:デフォルトの名無しさん [2008/05/01(木) 19:11:21 ] Xeonだからって10倍も速くなるものだらうか。 gcc/icc の違いによるのではないだらうか。
729 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/01(木) 19:47:09 ] ベクトル化でうまくはまれば10倍も十分ありうる。
730 名前:727 mailto:sage [2008/05/01(木) 21:56:39 ] 新アルゴリズムはgccとiccの(時間的な)差は出ませんでしたね。 結論から言えば、CPUをWoodcrestXeonにしてiccをv10にして-Xtにすればもう少し速くなるのだけれど。
731 名前:デフォルトの名無しさん [2008/05/02(金) 08:00:07 ] 超越関数ってexpとか?
732 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:14:14 ] 超越数でぐぐれ
733 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:35:06 ] キャッシュのヒット率大きいんじゃあないか
734 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:20:26 ] キャッシュベンチしてもねえ
735 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:34:02 ] キャッシュにヒットするようにコンパクトにするっていうのも 最適化の一つだけどね。 ベンチが自分のやりたいことにあってるかどうかが重要。
736 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:00:19 ] キャッシュサイズがどんどん大きくなってるから そういうチューンは無駄かも
737 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/02(金) 14:52:38 ] L1は増えない
738 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 17:56:58 ] 何でAMDは、Intel C++ Compilerみたいなの出さないのかなぁ・・・。
739 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 20:23:18 ] ライフがすでにマイナスだから(笑)
740 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:01:04 ] 2のベキ乗間隔でメモリアクセスするとキャッシュミスヒットしやすいと、RS6000だかの説明にあった。
741 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:11:24 ] うん、キャッシュラインが上書きされる可能性が高くなって、キャッシュに存在する可能性が下がって効率が悪くなるからだね。
742 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:48:56 ] 結論: メモリアクセスは素数間隔で行うべし
743 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:58:27 ] 系)配列のサイズ(一番下)を2の冪にしてはいけない
744 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:10:12 ] そうは言ってもループバッファとか扱ってると余りは求めたくないしねえ。
745 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:13:08 ] ループ? 全部展開しろカス
746 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:14:31 ] リングバッファって言えばいいか。
747 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:24:15 ] 2のべき乗の配列を取りたいなら、 セットのサイズ(キャッシュサイズをセット数で割った数)の倍数のアクセスが増えると効率が悪くなるので、計算順序を変えるとかでそれを外せばOK。 セットのサイズに満たない配列は気にする必要はないかな。
748 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:43:03 ] >>747 セットってのは, コンパレータの個数で ok? でもって、ラインサイズと素な数で戦えば ok と言ってる?
749 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:45:49 ] 間違ってた ラインサイズxコンパレータ数と素な数
750 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 09:40:56 ] >>748 下の絵でアドレスでコーダがセットのライン数になる upload.wikimedia.org/wikipedia/ja/d/d2/Read_4waycache.png 素因数にラインサイズxライン数が含まれると効率が下がる。 でもラインサイズに合わせるのは正解なので、ラインサイズx素数または、ラインサイズx(ライン数を因数として含まない数)がいいんじゃないかな。
751 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:37:21 ] int[][]こんな感じのデータ構造に対する 効率化の手法まとめたページどこにいったっけ?
752 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:48:51 ] if(n % 2 == 0) n / 2 if(n % 2 == 1) n * 3 + 1
753 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/23(金) 21:03:06 ] int *[]にして列を都度割り当てすれば・・・
754 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:58:30 ] ダンゴさんの書き込みでスレがdat落ちの危機に瀕したな。
755 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 00:13:09 ] ダンゴさん兄弟
756 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 00:20:12 ] やはり皆、半月以上レスが無くてもスレ見てるんだなw
757 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:23:33 ] 専ブラ使っているんで、レスがあれば一目で分かります。
758 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:26:11 ] 風呂から出てチンチンブラブラしてますたー
759 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:26:30 ] それは非専ブラ組の発想ではないかな。 専ブラ組からすれば、新着レスのあるスレを一覧上部に集めて順に見ていく作業の一過程。 つまりdat削除しない限り、忘れてても縁は切れない。新着レスがあるたび、こうして思い出すことになるw
760 名前:126 mailto:sage [2008/05/24(土) 01:27:29 ] う、かぶった。 実際、専ブラによって色々とスタイル変わってくるよね。 ・・・良いんだか悪いんだかわからないけどw
761 名前:759=760 mailto:sage [2008/05/24(土) 01:29:48 ] ごめん、名前間違えた。 これも専ブラならではか?(マウスホイールしちゃって、前回別の場所で使った名前が出た)。
762 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:34:00 ] ずっともぐってたスレが一度あがって半端におちてると見失うw
763 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 08:35:41 ] そういう時は履歴!
764 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 14:05:25 ] 代々木の カレーライスうまいよね
765 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:36:24 ] uint64_tの値を 16bitずつ小分けに取得したいのですが 何型にキャストするのが正しいのですか?
766 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:16:39 ] uint16_t でええんちゃう? そもそも、質問の意図が、そう言う話とはちゃってる?
767 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:24:12 ] union知らんのって話でしょ
768 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:25:12 ] >>765 キャストは最後の手段にしようぜ。 ふつうに u64 & 0xffff, (u64 >> 16) & 0xffff, .... でいいでしょ。
769 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:49:17 ] ここは最適化のスレだから、一番最適化がかかりそうな 方法を聞いているに違いない。 配列としてアクセスするのが一番期待できるかな?
770 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:55:12 ] >>769 動作保証が無けりゃ問題外でしょ。ビットシフトで取り出すように書いとけば、 コンパイラが勝手に 16 ビットずつメモリから読み出すように最適化することも できるだろうし。むしろメモリへのアクセスを陽に書かないほうが早い可能性もある。
771 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 03:03:50 ] union
772 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:12:11 ] >>767 ,771 エンディアンに依存したらダメじゃね?
773 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:14:54 ] そんなあなたに #if
774 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:18:29 ] 最適化するんだからマシン固有の癖(エンディアン)に 依存する問題まで考えて移植性を重視する必要ねーだろ
775 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:19:09 ] それぞれの環境ごとに最適化すればいい
776 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/06/14(土) 00:43:50 ] pextrwで(ry
777 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:49:04 ] bswapも(ry
778 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:01 ] 小分けしたいだけなんだからエンディアン考えなくてもいいんじゃないかと思う
779 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:31:12 ] union 使うなら考えんといかんだろ? そもそも今時のプロセサならバレルシフタぐらいは積んでるだろうから、 >>768 で十分だと思うが。
780 名前:デフォルトの名無しさん [2008/06/17(火) 08:53:09 ] ビット演算だけで、剰余を求める方法を教えてください
781 名前:デフォルトの名無しさん [2008/06/17(火) 08:58:26 ] 646 名前:デフォルトの名無しさん[] 投稿日:2008/01/23(水) 21:06:35 割り算を掛け算とビットシフトに置き換える計算式求めるプログラムできた #include <iostream> using namespace std; main(){ unsigned int N,n,k; for(N=2; N<65000 ; N++){ for(n=0; (1<<n)<N ; n++); n+=15; double X=(pow(2,n)/N); unsigned int Y=(unsigned int)X; unsigned int d=0; if(X-Y<=Y+1-X)d=(unsigned int)(pow(2,n)- (N-1)*Y)-1; else Y++; printf("x /%5d = ( x * %5d + %5d ) >> %2d",N,Y,d,n); for(k=1; k<(1<<16) ; k++) if(k/N != ((k*Y+d)>>n))break; if(k==(1<<16))printf(" OK\n"); else printf(" ERR\n"); }} 647 名前:646[] 投稿日:2008/01/24(木) 15:42:18 64bit機か、内部で64bitまで計算結果を保持しているなら 32bitの割り算も出来るけど646は16bit同士です
782 名前:デフォルトの名無しさん [2008/06/17(火) 08:59:56 ] 2^n の剰余 とそれに近い数の剰余は簡単にも止まる。
783 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:37:14 ] 止めんなw
784 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:51:07 ] >>780 あらかじめ除数がわかってないと>>781 は使えないよ。