- 1 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 09:54:14 ]
- コンパイラ性能、コンパイルオプション、コードの最適化などについて語りましょう。
主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。 なお、OS、CPU、コンパイラなどは限定しません 前スレ C、C++の最適化について語るスレ pc11.2ch.net/test/read.cgi/tech/1084676298/
- 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は使えないよ。
|

|