1 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 09:54:14 ] コンパイラ性能、コンパイルオプション、コードの最適化などについて語りましょう。 主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。 なお、OS、CPU、コンパイラなどは限定しません 前スレ C、C++の最適化について語るスレ pc11.2ch.net/test/read.cgi/tech/1084676298/
2 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 12:32:25 ] 2げtt
3 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 15:13:32 ] ポインタ使ったほうが速いの?
4 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 15:18:14 ] コンテナにオブジェクト詰めるときは newしてそのポインタを詰めるとめがっさ軽くなる
5 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 15:36:28 ] >>3-4 オブジェクトのコピーがボトルネックになってる場合に限るけどな。
6 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 17:49:32 ] GPOを行う場合、1000回計算を行うループがあったとして、10回程度ループを回して計測して、最適化することはできないでしょうか? 一旦プログラムのすべてを実行しなければならないとしたら、毎回実行条件の違う 科学計算などではどのように最適化すればよいのでしょうか?
7 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 22:49:32 ] それは分岐予測というカタチでハードウェアが実行している。 コンパイラはそれが機能しやすいようにする。
8 名前:デフォルトの名無しさん [2007/05/02(水) 02:20:57 ] ダンゴさんに声かけたか?
9 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 02:46:05 ] GPO? PGO?
10 名前:・∀・)っ-○◎● mailto:sage [2007/05/03(木) 03:46:08 ]
11 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 14:12:12 ] ダンゴは糞だからイラネ
12 名前:デフォルトの名無しさん [2007/05/03(木) 14:48:47 ] >>11 団子ちゃんが馬鹿にするな!
13 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 16:02:50 ] が?
14 名前:・∀・)っ-○◎● mailto:sage [2007/05/03(木) 16:06:59 ] がががーが・がーがが
15 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 18:16:38 ] そりゃぁ、自分の基準にそって馬鹿だと思えば馬鹿にもするだろうよ。 団子じゃなくたってね。
16 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 18:30:39 ] int型の配列を特定の数値で埋めたいのですが、forループで一つ一つ回していく以外に 何か高速な方法はありませんか?
17 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 18:35:44 ] スレ違いの気がするが ・初期化 ・memset
18 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 18:37:15 ] >>16 SSE2の使えるCPU用でいいなら、真っ当なコンパイラに適当なオプションを指定すれば、 勝手にベクタ化してくれる。 但し、極真っ当にループを書くこと。
19 名前:・∀・)っ-○◎● mailto:sage [2007/05/03(木) 18:40:24 ] memset使えば、コンパイラによっては最適化でより高速な命令に置き換えてくれることもある。 たとえばx86なら要素数4の倍数個で16バイトアラインされてれば for (i = 0; i < ARRAY_SIZE; i++) { a[i] = foo; } ↓ __m128i xfoo = _mm_set1_epi32(foo); for (i = 0; i < ARRAY_SIZE; i+=4) { mm_store_si128(&a[i], xfoo); } みたいな明示的ベクトル化は可能。
20 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 19:28:44 ] ビット演算についての質問です。 やりたいことは、最大値511 (2^9 - 1) で負の可能性がある あるint型の値の値域を 0〜255 に絞りたいのです。 つまり、 x = (x <= 0 ? 0 : (x >= 255 ? 255 : x)); ですが、これを出来るだけ速くしたいのです。 (ちなみに、最終的に行いたいことはアドレス計算です) 一応自分なりに考えたのが、 x |= (0x100 - (x >> 8)); // 最大値を制限 x &= ~(0x100 - (x >> 31)) & 0xff; // 最小値を制限 または x |= ((x >> 8) + 0x7f) ^ 0x7f; // 最大値を制限 x &= ((x >> 31) + 0x7f) ^ 0x80; // 最小値を制限 です。 最小値もある程度決めてしまって構わないのですが、 これ以上高速に値を得る方法はありませんか?
21 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 19:39:08 ] 最小値がある程度小さいなら、最小値の制限は x &= ~((unsigned)x >> 24); でいいかと。
22 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:27:03 ] >>16 std::fill()
23 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:29:06 ] >>17 ,19 memset() は埋める値が 0 とか 0xff とかじゃないと使えないだろ。
24 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:17:18 ] >>21 それいいですね! ~の方が速そうなんですが、 最後は0xffでマスクしないとゴミがのる可能性があるので、 ちょっと変えて、((unsigned)x >> 24) ^ 0xff として使わせてもらいます。 ありがとうございました^^
25 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:19:57 ] あ、すまん。間違えてたわ。 その通り。
26 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:28:45 ] (unsigned)~x>>24 のほうが速そうに見える
27 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:33:07 ] なるほど。
28 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 23:22:19 ] >>26 たしかにそうですね。 と思い、コードを変更して計測してみました。 結果が、クロック単位でまったく同じだったのでおかしいと思い、 コンパイラの生成コードを見てみたのですが、、、 なんと、(((unsigned)x >> 24) ^ 0xff) が>>26 とまったく同じようにコンパイルされてました vc8すごい・・・ >>26 さんもありがとうございました
29 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 23:46:17 ] コンパイラ<やれやれ、やっと俺の優秀さに気づいたか・・・
30 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:36:41 ] ダンゴさんに言わせれば、VCはクズだがな(笑)
31 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:47:45 ] Pentium Pro時代の癖が抜けずに未だに アドレッシングモード使うのを期待する場面で ロード+レジスタ間オペレーションに展開する VC++は駄目な子
32 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:49:21 ] まあ、Intel謹製以外では一番マシだけどなw
33 名前:デフォルトの名無しさん [2007/05/04(金) 01:17:32 ] C、C++の最適化について語るスレ -O2 いまさらだがスレタイはこんな感じのにスレばよかったのに。
34 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:45:30 ] AoSよりSoAの方が高速に動く理由を教えてください
35 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 20:37:59 ] C、C++の最適化についてダンゴ先生が篤く語るスレ がいい
36 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/04(金) 20:40:45 ] 以下、団子に変わりましてイカがお送りします
37 名前:デフォルトの名無しさん [2007/05/05(土) 17:06:49 ] 関数の引数で、スタックのオーバーヘッドをなくす為に const hoge_t& hoge なんて参照渡しが使われるけど これってVC8とか今時のコンパイラでも意味ありますかね?
38 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 17:20:44 ] 参照するとスタック使わなくなるわけでねえでがす
39 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 17:24:20 ] >>37 オブジェクトの作成を勝手に省略することは、 一部の例外を除いて規格上認められていないから、 今でも有効。
40 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 00:22:09 ] ま、ダンゴさんに言わせれば、VCはクズだがな(笑)
41 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/06(日) 00:28:51 ] >>40 はゴキブリかな
42 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 03:45:45 ] >>34 ものによるが、キャッシュが効きやすくなるか、ベクタ化しやすくなるか、ループの最適化をしやすくなる。 AoS の方がこれらに有効なこともあるので、ものによるとしか言えん。
43 名前:デフォルトの名無しさん [2007/05/08(火) 00:40:06 ] グローバル変数Aを算出し、算出した関数内でAを参照したいときは、 @直読み A算出時にローカル変数で一度算出しておき、それを参照(レジスタ参照で高速化を狙う)。Aは適当なところでローカル変数を代入 どちらがより良いソースコードになるでしょうか・・・。 @は見やすくてコード量も減りますが、いちいちRAMにアクセスしそうなので実行速度に懸念があります。 Aはローカル変数を用いることにより実行速度の向上を狙いますが、コード量の増加(ローカル変数増えまくり)や オブジェクトサイズに懸念があります。 いまいちどちらにしたらよいかの判断が出来ませぬ・・・。 みなさまはどうされてます?
44 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 00:43:33 ] よくわからんが、関数・グローバル変数あたり、 待避と復旧用のコードが増えるだけでそ? あと、レジスタに振られたローカル変数は消えるから。
45 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 00:50:12 ] >>44 レスどうもです。 「関数・グローバル変数あたり」が分かりませんでしたが・・。 ローカル変数を用いてレジスタアクセスを狙っても結局スタックに退避したら 変わらないってことでしょうか?
46 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 01:15:00 ] 実測するしかないだろ。常識的に考えて。
47 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 06:09:18 ] >>43 俺様用語で抽象的なコードの質問されてもなぁ。 自分で最低限のコードを書いて、コンパイラに最適化させてアセンブリ出力見比べてみなよ。 まぁ、>46って結論が待っているけど。
48 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 06:47:42 ] 最適化第一法則 最適化するな 最適化第二法則 まだ最適化するな の意味の深さがまだ理解できていないと見えるな。
49 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/12(土) 08:40:11 ] GCCってforループのiをインクリメントからデクリメントに変えるだけで 性能上がったりするよな VC++なんかはループの最適化だけはアグレッシブだから ほとんど気にする必要ないんだが
50 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 12:15:26 ] 終了条件がたまたま 0 だったりするからじゃなくて?
51 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/12(土) 12:29:07 ] 0との比較のほうが命令数が少なくてすむんだよ
52 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:31:43 ] restrictedが使えるコンパイラってアルの?
53 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:33:48 ] あります。
54 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:35:58 ] >>53 bcc32を使っているのですが、うまくいきません
55 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:40:26 ] そんなもんに期待する方が間違っています。
56 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:40:26 ] あとiccもダメでした。
57 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:41:43 ] iccではちゃんと使えます。
58 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 13:42:04 ] そんなもんに期待する方が間違っています。
59 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/12(土) 13:44:27 ] iccは9.1あたりから対応してるはず。VC2005コンパチだし。
60 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:29:43 ] そもそも restricted じゃなくて restrict だな。 GCC も余裕で使える。
61 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:30:50 ] そんなもんに期待する方が間違っています。
62 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 17:19:55 ] VC++は、2005から__restrictが導入されている。
63 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 23:41:50 ] __ かよ。 C++ でも使えるってことなのかな?
64 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 00:06:03 ] VCはc99じゃないからね。
65 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 01:21:12 ] ダンゴ先生に言わせればVCはクズだしなw
66 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/13(日) 01:45:59 ] >>65 は屑
67 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 03:40:23 ] 烏賊自重しろ
68 名前:デフォルトの名無しさん [2007/05/17(木) 16:38:10 ] 長い数式の場合、複数の文に分けて書いた方が最適化しやすいのでしょうか、それとも一気に一つの文に詰め込んでしまった方がよいのでしょうか?
69 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 16:42:45 ] 場合による
70 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 16:43:21 ] っ 実測
71 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:04:13 ] そういう最適化は尚早な最適化や、個人の好みでしかない事の典型的な例
72 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:29:12 ] オーバーロードしてるような時は コピーコンストラクタが実行されないように 分けた方がいいやね。
73 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:39:47 ] >>68 先ずは読み易く書き、適切なコンパイルオプションでコンパイルし、そこが速度上のネックになっていないか測定し、 ネックになっているようならそこで初めて、そこを抜き出して両方のケースを測定してみることだ。 まぁ、コンパイラが適当に最適化してくれるから大差ないと思うよ。
74 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:24:07 ] ダンゴさんの締めのレスが待ち遠しいな
75 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 01:59:50 ] 団子って良く呼ばれるけど、 書き込んだら書き込んだで叩かれるんだよな
76 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 02:04:33 ] 呼ばれてしゃしゃり出て叩かれることを学習させないと。 赤子と同じ。
77 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 08:26:43 ] 赤子みたいなレスだなw
78 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 11:36:25 ] 赤子はこれから学習するが 団子は学習した結果
79 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 13:50:28 ] スキルの無い奴の粘着人格攻撃を受けられれば、コテも一流だな。 団子の圧勝か・・・。
80 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 20:13:30 ] 団子は好きだけど思い込みが激しいから反芻してから発言して欲しい。 オレモナー
81 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 20:43:54 ] 試しに >>80 を反芻してみた。 込みいからが発言して欲モ激しから反芻してい団しい。 オレ子は好きだけど思ナー
82 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:04:05 ] 団子が負けたところを見たことがない はっきり言って最強
83 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:29:20 ] 逃げるが勝ちってか
84 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:30:36 ] 糞壁と一緒だな
85 名前:・∀・)っ-くコ:彡- mailto:sage [2007/05/19(土) 00:38:34 ] お塩先生に負けますた 矢田亜希子たん取られますた
86 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 20:42:26 ] >81 どういうアルゴリズムを適用するとその並びになるのか教えてくれ
87 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 20:58:46 ] 反芻アルゴリズム 攪拌ではない
88 名前:デフォルトの名無しさん [2007/06/07(木) 10:55:11 ] vectorは[]でアクセスできますが、これってメモリ上でも連続しているということでしょうか? 配列と比べても、実行速度は変わらないと考えてよいのでしょうか?
89 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 11:01:05 ] 最新の仕様では連続してる事が保証されてた気がする。 ただ、それは別に [ ] でアクセスできるからという理由ではない。 こいつは演算子オーバーロードされてるから。 例えば deque なんかも [ ] でアクセスできるけど、 こいつはメモリ上の連続性は保証されてない。
90 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:32:29 ] >>88 vectorは連続している事が保証されているので、いざとなったら先頭アドレスを取り出して配列としてアクセスすることも出来るよ。 あと、配列の[]やvectorのoperator[]は境界チェックをしないけど、vectorのat()は境界チェックをするよ。知ってたらごめんね。
91 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:21:44 ] >>88 逆に言えば、添え字演算子[]で読み書きできるからといって、 メモリ上で要素が連続している保障があるとは限らない。 dequeとかmapとか。
92 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 14:57:49 ] >88の人気に嫉妬
93 名前:デフォルトの名無しさん [2007/08/03(金) 20:43:46 ] Intel compilerのx64版を使っているのですが、 レジスタにある筈の値を何度もメモリに読みにいったり、 もう使わないローカル変数をメモリに書き込んだりしています。 ループの奥底なので許容できません。VTune で見てもボトルネックになって いるようです。 深い理由があってのことででしょうか? それとも、x64版の熟成が未完なのでしょうか? 32bit版との賢さの違いについてどんな印象をお持ちですか?
94 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:19:37 ] 64bit版は知らんけど、32bit版もインテルが自分で言うほど 飛びぬけた性能でもないような…。 体験版で試して、俺のプログラムはVCに全敗したから、買う のやめた。Linuxだと他に選択肢が無いのかも知れんけどね。
95 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:42:37 ] ウチの場合はICCのが何割か速かったよ。画像処理で。 GCCとVCと比較してもっとも早かった。 64bit版はさすがに知らないけど。 マルチコアならレジスタにある値だけだとあんまり信用できないからかね?
96 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:02:01 ] ポインタをdereferenceした値なんじゃないの
97 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:58:07 ] >>93 const付けられるところには全て付けてるよな? 関数ローカルのauto変数とか、クラスのメンバ関数(not変数)とかにも。 それでエイリアス問題とかが片付くから、割と変わるぞ。
98 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:10:28 ] エイリアス問題はconstじゃ解決しないぞ restrictキーワードが要る
99 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:29:23 ] ん? メンバ関数がconstなら、その関数内から見たらクラスのメンバ変数は皆const扱いだろ? となると、複数のポインタor参照でメンバ変数を参照したり、キャッシュを持ったりしても実害が無いだろ? 変更がありえないんだから。 つまりエイリアスが発生しても、それが問題にならないケースがあるわけだ。 (グローバル関数経由の変更というものもあるので、確実じゃないけどな) もちろん、クラスのメンバ以外を操作するならrestrictが必要だな。 それはおっしゃる通り。
100 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:12:12 ] constは、「プログラマが」変数を書き換えないという表明であって、 値が変化しないことの保証にはならない。 ポインタor参照経由の値は、 常にaliasの可能性があるとコンパイラはみなさなければならない。 というか、最適化のためのconstnessの判断はコンパイラがやることなので、 最適化フェーズではregisterキーワードよろしく無視されると考えていい。 と似たことを以前constでメシがナンタラというスレで書いた気がする。
101 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:00:20 ] こういうことかな・・・? class A{ public: int x; void foo(int*) const; }; main(){ A *a = new A(); a->foo(&a->x); } void A::foo(int* p) const { int x1 = x; *p += 1; int x2 = x; // x 読み直し }
102 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:53:02 ] うーん、そういうケースも多いだろうけど constがオプティマイザに無視されるということはないと思うぞ。 以前関わったプロジェクトで、constがろくについていなかったので 片端から付けた事があるんだよ。 結果リリースビルドのバイナリが大幅に変わってしまった。 速度的にはそれほどの向上は無かったのが残念だけど(ホットスポットは変わらなかった) 全体的にconstメンバ関数のインライン化が行われていた。 約1%ほどバイナリが肥大化したのはご愛嬌^^;
103 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 16:08:05 ] そりゃまたアホなコンパイラだな・・・ それにその例だと、速度かわらず、バイナリが増えてるんなら無意味じゃないか。
104 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 16:12:56 ] ホットスポットが変わらないから速度の有意差が出なかったのだろ。
105 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:43:09 ] >>102 そこまで言うならメンバ関数への const の有無で出力コードの変わるソースを 出してみて欲しい。
106 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:23:48 ] ちょっとやってみたが、短いサンプルだとconstの有無に関わらずインライン展開されて 結局同じになってしまうな…… まあこの場合「const の有無で出力コードの変わるソース」が存在することを 証明できればいいのだから、最適化オプションの調整を含めて もうちょっと詰めてみる。 こっちもデスマ中なので何日かかるかもしれないが、期待しないで待ってろ。
107 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:29:31 ] 必要なのは「出力コードが変わる」じゃなくて「速度向上に貢献する」だぜ つか、なにもデスマ中にやらんでも(´・∀・`) 元気なときにやろうぜ
108 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 02:29:18 ] いや、>>105 がそう言っているんでな。 とりあえず「constで変わりうる」ということを出しておこうかなと。 C/C++では完全な参照透過性を保証する構文が無いから、 コンパイラにとって論理レベルでの最適化は難しいだろうが、 不可能では無い事を明示したい。 まあ今日は寝る。おやすみ。
109 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 02:56:49 ] >>108 そこまでわかっていて不可能ではないと思う根拠はなんだろう? 楽しみにしてるよ。
110 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:23:24 ] 今年プログラム初めてまだまだわからないことだらけで助けてほしいことがある。 複数のファイルより条件に合う行を抜き出して一つのファイルに出力するプログラムを作ったんですが 処理に結構時間がかかってしまいます。何とか速度向上させたいのですが何か良い方法はないでしょうか? 本当は自分でいろいろ試行錯誤してやりたいのですが分け合って時間が取れなくて書き込みました。
111 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:26:47 ] グレップツール使いな
112 名前:デフォルトの名無しさん [2007/08/06(月) 22:35:17 ] >>110 秀丸つかっとけ
113 名前:デフォルトの名無しさん [2007/08/06(月) 22:36:36 ] >> 93 です。 色々アドバイス頂きながら、返信せず申し訳ありません。 const はきちんと付ける主義です。 わざわざ、{} を追加して、スコープを絞っても、ローカル変数の 無駄な書き込みを止めさせることはできませんでした。 何となく、ICC x64のコンパイル結果って回りくどい気がするのです。 命令のレイテンシとかキャッシュ効率とか考慮された結果かな?
114 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:40:25 ] restrictについては言及ナシですか。
115 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:06:13 ] つーか、具体的なコードも出さずにあーだこーだ言われても 「あーそうですか」としか言いようがないなぁ。
116 名前:デフォルトの名無しさん [2007/08/08(水) 23:24:43 ] >>114 何故か書き込み不能になった返信がさらに遅れました。 restrictを使っても、コンパイル結果が同じでした。 仕事絡みなのでコードを出せません。ご了承下さい。 ごく一部を出しても、実害はないと思いますがバレると 厄介なことになりますもので...
117 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 23:26:13 ] 別にその仕事とは全く関係ないコードを書けばいいのに。
118 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 02:19:54 ] ○○○は糞、だけど証拠は出せません いい流れだ
119 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 03:19:58 ] constによる最適化を主張する俺が戻ってきましたよ とりあえずサンプルを作るのは諦めました。そこで 既存のプロジェクトからメンバ関数のconstを外す ⇒ エラーが出たところだけconstに戻す という手順で相違点を調べました。(バージョン管理ツールは便利だねえ) >>102 の環境はVC7.1でしたがライセンスの関係で問題があるので 今回の環境は別のプロジェクトのCodeWarriorです。 で、リリースビルドの結果は以下の通り。 全関数(メンバ関数でないものやライブラリも含む) 12256個 constメンバ関数 253個 検証時にconstを削除出来なかったメンバ関数 24個 const削除前のコードサイズ 2899400 bytes const削除後のコードサイズ 2899084 bytes constを付けた方がコードサイズが増える傾向がありますが、CodeWarriorの場合は インラインされやすくなるという傾向はありませんでした。 また、極端にパフォーマンスが変化するということはありませんでした。 (づづく)
120 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 03:40:23 ] 逆アセンブリで見られる具体的な差異としては const有りだと分岐命令の後に来ている命令が const無しだと分岐命令の前に来ている という現象が所々に見られました。 いつ評価しても同じなら分岐の後で評価したほうが得、ということなんでしょうか。 (遅延評価に似てる?) サンプルを上げようかと思ったけど、きわめて眠いのでまた今度。 明日か明後日までに適当なアップローダの紹介を希望。 ではおやすみなさい。
121 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 07:15:32 ] 分岐命令をまたいで命令が移動するってのは、動作が変わってるような気がする。 よくわからんからサンプルが欲しいな。ろだ↓ kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
122 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 10:42:03 ] ほい、上げておいた。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=4841 全部上げるわけにもいかんので加工してある。 詳細は添付のreadme.txtを読んでくれ。 じゃ俺は戦場に戻る。
123 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 09:31:04 ] >>122 リストファイル中のソースとの対応がずれてたり、命令数の違いでアドレス部が ずれてたりしてるけど、本当に命令レベルの違いだけを抽出すると、2箇所だけになった。 -- const無し: lw v1,-21056(v0) addiu a0,v1,436 lw v1,436(v1) const付き: lw a0,-20672(v0) lw v1,436(a0) -- const無し: lw v0,-21056(v0) addiu v1,v0,436 lw v0,436(v0) const付き: lw v1,-20672(v0) lw v0,436(v1) --
124 名前:123 mailto:sage [2007/08/10(金) 09:54:07 ] 2箇所いずれも app->CheckMenu() のところね。逆読みすると、 app 内のポインタが指す配列か構造体から1つ値を読み出してるって感じ なんだけど、やっぱり CheckMenu() のソースが欲しいな。ダメ? const無しのほうにある addiu の結果は使われて無いように見える。 あれ? const 付けたほうがコード増えるって言ってたけど、ここでは 1命令減ってるね。
125 名前:123 mailto:sage [2007/08/10(金) 10:03:26 ] const の有無で最適化に影響が出てるんじゃなくて、オーバーロードに影響が 出て処理が変わってるだけじゃないだろうか? たとえば std::bitset::operator [] (size_t) なんかだと、 const 版は単に bool が 返るけど、非 const 版は代入もできるプロキシオブジェクトが返るのでかなり 違った処理になるはず。
126 名前:123 mailto:sage [2007/08/10(金) 10:31:24 ] あ、 addiu の結果はその後の sw で使われるみたい。 app のメンバオブジェクトについて const 版が int を返して、 非 const 版が int& を返すようなオーバーロードが使われてる予感。 んで int& だと続く書き込みに使いまわせるからレジスタに置かれた、と。
127 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:09:19 ] やっぱり、単純にはなんとも言えないという結論か。
128 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 21:42:46 ] いや、大方の予想通りメンバ関数の const は最適化の助けにはならないって結論だろう。
129 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 22:50:05 ] お待たせしました。一時帰宅しました。 辛辣なツッコミを期待していたんだけど、ちょっと物足りないかしら。 まあ、相手してくれてありがとう。 以下質問に対するごお返答。 >>122 CheckMenu()は以下のようなコードになっている。オーバーロードはされていない。 bool CApplication::CheckMenu(int n) { return (m_MenuStatus == n); } ちなみにappはCApplication型のグローバル変数。constではない。 >>128 出力バイナリは違っているのに、そう言いきれるのはなぜ?
130 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 22:51:52 ] 小林洋平
131 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:42:01 ] >>129 関数の中身を晒してくれてありがとう。そういうことなら、素の int 型メンバ変数の 読み取りについてコンパイラ内部で >>126 の言うオーバーロードと似たような扱いが されているんだろう。 今回の例では const が無い場合に int& をキャッシュするために命令数が一つ 増えたとすると、前後の処理内容によってはその int& のキャッシュによって効率が 上がることも考えられる。いつでも const を付けたほうが効率が良いとは言えない。 今回の例で、コンパイラが const 無しの場合に const 付きの場合と同じコードを 吐いても何ら規格に違反しない。最適化の詰めが甘かっただけとも言える。
132 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 10:42:15 ] constは保守のための手助けみたいなもんだろ mutableしてない変数に代入しようとしてたらエラー吐くだけの
133 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:57:53 ] gcc の _attribute((const)) みたいなもんがあればいいのかも。 ・関数の戻り値が引数とインスタンスの内容にのみ依存する。 つまり、 class Test { public: int foo() __attribute__((const)); void bar() const; }; Test T; int a = T.foo(); T.bar(); int b = T.foo(); // int b = a; に最適化できる。
134 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:07:27 ] >>132 変数定義時の const はそうでもないよ。 const 付きで宣言された変数は ポインタや参照を関数に渡した後でも、値が元のままであることを期待して 最適化してもいい。 これに対してポインタ・参照の指す先の型や、メンバ関数に付ける const は ほとんどコード生成に影響しないという話。
135 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:10:47 ] >>133 それはダメでしょ。 T の宣言に const が付いてないので T.bar() の中で const_cast して 値を変更しても合法なはず。
136 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:59:32 ] intメンバ変数一個のstructで試してみたが、 >ポインタや参照を関数に渡した後 では読み直しをやってるなあ。 環境はVC8とgcc3.4.4(cygwin)
137 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 03:34:58 ] >>136 どんなソースで試したの? 以下のソースだと s に対する const によって読み直しが消えて return 10 に最適化される。 const 外すと当然メモリ上の s.x が読み出される。 struct S { int x; }; void f(struct S const* p); int g(void) { struct S const s = { 10 }; f(&s); return s.x; }
138 名前:137 mailto:sage [2007/08/14(火) 03:35:31 ] あ、確認した環境は Cygwin gcc 3.4.4 の -O3 ね。
139 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 09:55:00 ] 似せるとこういう感じ。gccは-O3、vc8は/Oxです。 struct S { S(int x_):x(x_){} int x; }; void f(struct S const * p); int g(void) { struct S const s(10); f(&s); return s.x; } つーか分からないのは仕方ないか。ということで struct S { S(int x_):x(x_){} int x; int getX() const { return x; } }; void f(struct S const * p); int h(int); int g(void) { struct S const s(10); h(s.getX()); f(&s); return s.getX(); } vc8もgcc3.4.4も、分かってるんだか分かってないんだか分からないコードを吐く。 さらに、このコードの int x を const int x にすると、gccは読み直しをしなくなる。 これはsのconst修飾に依存しない。(あれれ?)
140 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:20:39 ] >>139 ほんとだ。これは期待はずれだなぁ。 コンストラクタ内での代入を許すために const として定義されたという情報が 途切れてしまっている、って感じ? メンバのほうに const を付ければ代入を許すタイミングは無いから、 >>137 と 同様に最適化できる、と。
141 名前:デフォルトの名無しさん [2007/08/21(火) 08:34:45 ] const 談義中に割り込み質問ですみません。 VTune で、Clockticks をサンプリングすると"No Samples were collected." になってしまいます。 Sample After Value を変えろ、との記述を見つけて試しましたが、 うまくいきません。(他の event は収集できます) 対策をご存知の方はいらっしゃらないでしょうか?
142 名前:デフォルトの名無しさん [2007/08/21(火) 21:48:51 ] >>141 です。自己解決しました。 使っていたのが一つ前のバージョンのVTune だったので、 quad core に対応していなかったようです。 最新版の体験版をインストールしたらうまくいきました。 それにしても、何のエラーメッセージも出ず、Clockticks だけ収集できないとは、恐ろしい。
143 名前:デフォルトの名無しさん [2007/08/25(土) 12:59:29 ] switchの場合分けにおいて、記述したcase以外は絶対にありえないと コンパイラにヒント出す方法って無いですか? 分岐の先頭でcase以外を範囲外として弾くのが状況として ありえないのでもったいないです。 環境非依存でもVC6,7,8限定の方法でもかまいません。 よろしくお願いします。
144 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 13:51:02 ] >>143 こういう場合だったら、 switch(hoge) { case 1: //1の処理 case 2: //2の処理 default: //ここに来ることは絶対にない } こうすればいいんでないの? switch(hoge) { case 1: //1の処理 default: //2の処理 }
145 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 13:58:11 ] >>143 環境非依存ではそんなものはない。 c++であれば、enum型を使うことで慮ってくれるコンパイラがあるかもしれない。
146 名前:デフォルトの名無しさん mailto:143 [2007/08/25(土) 14:40:46 ] >>144 アセンブラコードを見てみたところ 1・範囲外チェック 2・テーブルジャンプ という流れにコンパイルされていました。 case 1: //1の処理 default: //2の処理 これだとdefaultの処理+テーブルジャンプの処理になってしまって、 結果的に範囲外チェックしているのと負荷は変わらないようです。 >>145 enum試してみます。 ありがとうございました。
147 名前:143 mailto:sage [2007/08/25(土) 14:41:25 ] sage失敗すみません
148 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 14:51:29 ] VC7以降なら __assume を使え
149 名前:144 mailto:sage [2007/08/25(土) 15:11:09 ] >>146 なるほど。こちらが勉強させてもらいました。 確かに範囲外だったら大変だから、コンパイラとしてはチェックせざるをえないんだね。
150 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:28:49 ] >>143 >144の前者のケースなら、 switch (hoge) { case 1: ...; case 2: default: ...; } でいいんでない?
151 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:29:37 ] つーか、二項しかないのにテーブルジャンプにしか最適化できないコンパイラが蛸な希ガス。
152 名前:143 mailto:sage [2007/08/25(土) 15:41:13 ] >>148 __assumeが意図にかなっているようです。ありがとうございました。
153 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 20:23:00 ] >>143 gcc限定ならコメントでなんか記述すればコンパイラが理解してくれた気がする。
154 名前:・∀・)っ-くコ:彡- mailto:sage [2007/08/25(土) 20:54:24 ] 関数テーブル+__forceinlineじゃ駄目だったっけ
155 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 21:02:19 ] gccはassert()が__assumeと同じ動作したはず。
156 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 00:02:22 ] assert(0);だな
157 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 13:53:56 ] ♪ ∧,, ∧ ♪ ♪ ∧,, ∧´・ω・) 美脚♪ ∧,, ∧´・ω・) ) ♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧ ∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ ) (´・ω・) )っ__フ(_/彡 ∧,, ∧ ) ) (っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ ( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_) (_/彡 ( ) ) Οノ 'ヽ_) ( ) Οノ 'ヽ_) (ゝ. Οノ 'ヽ_) ♪ ♪ ミ ヽ_)
158 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:06:35 ] C++特有じゃないとは思いますが質問させてください。 ある処理をループしようと思っているんですが、その時に、 カーソルとして使用するポインタを(ローカル変数として)毎回宣言するのと、 あらかじめ外部で宣言したものを使いまわすのではどちらが高速なのでしょうか?
159 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:39:57 ] >>158 大丈夫、そんなもんは真っ先にコンパイラの最適化の餌食になるから。 それ以前に、ポインタで回すよりも配列参照で回す方が速いかも知れない。 いずれにしても、ケース・バイ・ケースだから実測するべし。
160 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:41:04 ] ♪ ∧,, ∧ ♪ ♪ ∧,, ∧´・ω・) 美脚♪ ∧,, ∧´・ω・) ) ♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧ ∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ ) (´・ω・) )っ__フ(_/彡 ∧,, ∧ ) ) (っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ ( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_) (_/彡 ( ) ) Οノ 'ヽ_) ( ) Οノ 'ヽ_) (ゝ. Οノ 'ヽ_) ♪ ♪ ミ ヽ_)
161 名前:158 mailto:sage [2007/10/06(土) 15:01:50 ] >>159 なるほど。コンパイラに頼れそうですね。 配列については任意の位置に追加、削除等の関係から使えませんでした。 ありがとうございました。
162 名前:poooh ◆manko/yek. mailto:sage [2007/10/06(土) 16:10:39 ] グローバル変数は最適化に良くない。これ豆知識な。
163 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:34:59 ] グローバル変数は最適化に良い。これ豆知識な。
164 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:54:04 ] 確かに、既存ソフトの高速化の仕事をしていると、グローバル変数があったら狙い目だとは思うけどね。
165 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:27:36 ] >>164 高速化の仕事ってどんな感じなの? 今の職場では高速化の効果が工数の割に合わないと言われることが多くて バグ改修時についでに高速化する程度しかやらせて貰えない。 既存機能を維持しつつどうやって安全に高速化してるの? グローバル変数触るなら単体テストだけじゃ足りないよね?
166 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 20:10:46 ] 既存機能を維持しないでどうやって危険に高速化してるの? そんなんだからやらせて貰えないんだぜw?
167 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 20:12:21 ] 単体テストで完全に見えるスコープで、グローバル使いまくる馬鹿は沢山いる
168 名前:164 mailto:sage [2007/10/06(土) 21:00:33 ] 高速化で受ける業務はソースで引き渡しだから、コード解析結果と単体テスト結果しか出さない罠。
169 名前:165 mailto:sage [2007/10/06(土) 21:36:19 ] >>168 高速化で受けた業務なら性能試験はやるんじゃないの? 単体テストしかしないなら関数単位の高速化なのかな? ライブラリ系? 参考までに、使ってる測定ツールとか教えてくれないかな。 それにしても、コード解析結果と単体テスト結果で話がつくとはな。 俺んとこだと結合試験と性能試験やらずに改修完了なんてまず了承されないよ。
170 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 21:53:07 ] そりゃぁ、「何」で金取っているかの違いだろ。 依頼主だって全部の環境晒せるような物ばかりとは限らんわけだし。
171 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 22:17:43 ] 結合と性試験やらずに
172 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 21:26:42 ] 単体テスト=手淫
173 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 07:30:27 ] ♪ ∧,, ∧ ♪ ♪ ∧,, ∧´・ω・) 美脚♪ ∧,, ∧´・ω・) ) ♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧ ∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ ) (´・ω・) )っ__フ(_/彡 ∧,, ∧ ) ) (っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ ( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_) (_/彡 ( ) ) Οノ 'ヽ_) ( ) Οノ 'ヽ_) (ゝ. Οノ 'ヽ_) ♪ ♪ ミ ヽ_)
174 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 08:10:23 ] for (int i=10;i--;) { //ループの中身 } って for (int i=0;i<10;i++) { //ループの中身 } より高速?
175 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 10:40:19 ] >>174 上の方がループの回数が多いから遅い。
176 名前:デフォルトの名無しさん [2007/10/17(水) 12:55:44 ] すみません for (int i=0;i<9;i++) { //ループの中身 } でした
177 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:16:29 ] >>176 >175は間違い。>174でループ回数は同じになっている。 で、どちらも同じ速度のコードになったよ(icc -fastで)。 実測したら、後者の方が気持ち速かった。と言っても、差は10msオーダーだけど。 -- for (int i = 0x7000 * 0x10000; i--;) func(); for (int i = 0; i < 0x7000 * 0x10000; i++) func(); --
178 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:32:58 ] 速度は実測が基本。
179 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:04:30 ] >>177 ありがとう、やっぱりふつうに記述した方が、コンパイラにとってもいいようですね。
180 名前:・∀・)っ-くコ:彡- mailto:sage [2007/10/18(木) 00:31:08 ] forよりdo-whileが速い。 まあ自動で最適化してくれるけど
181 名前:デフォルトの名無しさん [2007/10/18(木) 10:54:47 ] /*1*/ for (i = 0; i < n; i++) これと、誘導変数を使った /*2*/ for (ii = -n; ii < 0; ii++) i = n + ii; それぞれについて、生成コードを予想 また実際の処理系に生成させたコードを評価せよ (n点)
182 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:17:32 ] 変数の型が分からないと予想できねえよ。
183 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:38:28 ] nは正数?
184 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:41:36 ] クラスかもな。
185 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 13:05:00 ] 宿題?
186 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 13:39:29 ] 実行コストについてはダウンカウンタと大差ない感じ。 こりゃ使える。いただき。 a[i]みたいにiをインデックスで使う場面では a[n+ii]に対して&a[n]==a+nがループ内不変になるね。 つかiは符号付き整数だろw で、おれ何点?
187 名前:519 mailto:sage [2007/10/18(木) 13:41:59 ] for文の中身は?変数がintだとすると for (i = 0; i < n; i++); は i=n; という式に展開される可能性がある。 for (ii = -n; ii < 0; ii++) i = n + ii; もnが定数ならば定数代入式に展開される可能性がある。 ていう最適化機能がgccにあったような…?記憶違い?
188 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 16:04:41 ] 空ループの話で盛り上がって 参りました
189 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 16:18:58 ] 全然
190 名前:デフォルトの名無しさん [2007/10/19(金) 09:21:06 ] 乱数が100個必要だとして、単にループで100回乱数を発生させるのではなく、 1つの乱数から、分割するなどして100個効率よく発生させることはできないでしょうか?
191 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:28:51 ] 分割って何? 並列化するってこと? 100個乱数拾うだけならたいした変化は無いと思われ
192 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:43:07 ] 使い道や欲しい乱数の範囲など具体的に
193 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:21:09 ] MTなら実装によっては624個の乱数が一度に得られる でも内部的にはループだしな
194 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 18:51:21 ] >>190 64bitの乱数があったとしてそれをそれを8bit区切りに4つに分けて 8bitの乱数4つとして使えるかってこと? 乱数の質は悪くなると思うけど、どうだろ?
195 名前:190 mailto:sage [2007/10/20(土) 05:36:18 ] 用途はモンテカルロシミュレーションです。 現在はMTを使っています。 計算精度は32bitのfloatでやっているのですが、乱数は64bitのdoubleなので、 それを単純に上位と下位に分けて、一回で2回分使えないかと考えています。 もうひとつ考えているのは、64bitで生成された乱数を、ローテートで1bitずつずらして 一回のMTで64個の乱数が生成できないかということです。 ただ、この場合、乱数の質が元のMTに対してどのようになってくるのかがわかりません。
196 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 05:45:19 ] MTやめてXorShift使うとか
197 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 06:46:44 ] >>195 少なくとも2番目の方法はいくない。 例えば一番左のビットが0の場合、左にローテートしたら元の数の2倍になる。 つまり64個の乱数の中に、大量のaとa*2が入り込む非常に膣の悪い乱数になるよ。
198 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 07:42:54 ] >膣の悪い乱数 乱れすぎw
199 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:45:07 ] >>195 最初の方法もダメ。 MTのdoubleは基本的に仮数部32bitなので分割した下の方は精度が腐る。 仮数部53bitの方は乱数を2個使っているし。
200 名前:190 [2007/10/20(土) 10:15:36 ] 皆さんありがとうございます。 とりあえず、2^128-1周期のXorShiftを使ってみようと思います。 ところでXorShiftのseedのとり方ですが、オリジナルの文献では x=123456789,y=362436069,z=521288629,w=88675123; となっていますが、たとえば、x=1,y=2,z=3,w=4;とすると最初の 数十個は 2061 6175 4 8224 4194381 8396986 8388750 25174430 8652983179 25875070649 8636205711 60369541016 17600805477257 35210146488062 52785194351115 70428979519260 36239912164446735 ように非常に悪い乱数系列になってしまいます。 最初の数百個を捨てればよいのかもしれませんが、seedの選び方には何か決まりがあるのでしょうか?
201 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:19:11 ] >>190 sineくれくれ厨
202 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 14:14:15 ] お前がsine
203 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:24:11 ] >>200 質が悪いって言うけど、どの一部を取り出してもそういった偏りが全く無いほうが質が悪いでしょ。 固定の種にしたいなら好きなだけ選びなよ。
204 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:28:19 ] つーか擬似乱数スレでやれよ
205 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:58:23 ] sine、cosine
206 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:18:59 ] tangent
207 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:44:18 ] cosecant
208 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:53:23 ] 俺には >>200 の乱数列のどこが質が悪いのか分からん 誰か説明してくれ
209 名前:デフォルトの名無しさん [2007/10/21(日) 12:35:59 ] >>208 このスレは馬鹿なお前のためにあるんじゃない
210 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:33:52 ] >>200 乱数の種で複数の値とるとき 互いに素ってのと2の累乗を自分は使わないようにしているけど… 根拠がない。それに小さすぎる値も使わないようにしている。(1とか2とか…)
211 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:51:46 ] >>200 void srand_xor128(void){ w^=(unsigned)time(0)*1812433253; } とかwだけ変更すればたぶんおk。心配なら最初の十万個位捨てたら。
212 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:00:14 ] PSP用ゲームのVCとGCCの両用ソースなんですが 関数内でstaticな配列を使ってはならないという社内ルールが付けられているんですが 理由わかります? void hoge() { static const int array[100] = { 123, 456, 789, 123, 456, 789, }; ,,,, } このようなstaticは駄目で const int array[100] = { 123, 456, 789, 123, 456, 789, }; にしろということなのです。 メモリが厳しいらしいのですが、これで本当に節約になるんでしょうか。
213 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:34:13 ] >>212 実際にコンパイルしてアセンブリ出力を眺めてみれば? 前者は静的領域に確保されることが保障されていて消えることは多分ないが、 後者は最適化で消える可能性がある。 しかし、後者は静的領域からスタックにコピーする最悪なコードになるかもしれない。 それはさておき、100要素指定しておいて6個しかないと激しく無駄だと思う。
214 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:36:44 ] >>212 メモリの節約にはならないだろう。 一般的な実装を予測すると、 static をはずしてもスタックに確保された配列を 初期化するためのコピー元となる配列が作られてしまう。この初期値の配列が static をつけた場合に確保される実体と同等のはずなので、 static をはずすと スタックの領域と初期化用コピーの処理時間が余計に増えるだけになる。 動作上の違いは、再帰呼び出ししたときに配列のアドレスが別物になるかどうか、 という点しかないはず。 はっきり言って逆効果だろう。そのルール決めた人に理由を問い詰めたほうがいい。 非 const な変数に限ってローカル static を禁止するのなら、メンテナンス性の観点から まだ理解できる。
215 名前:デフォルトの名無しさん [2007/11/07(水) 04:56:45 ] 次に静的記憶域期間(static)です。 こちらは宣言されている場所にかかわらずプログラムの開始直前にメモリを確 保し初期化します。初期化を忘れた場合値は0になります。 また、確保された領域はプログラムが終了するまで保持されるので関数の終了 時に値が消えることがありません。2回目以降関数内のstaticオブジェクトを 利用するときは前回の値から始まります。
216 名前:デフォルトの名無しさん [2007/11/07(水) 05:00:13 ] もっとも時間食っているところ、メモリ食っているところを押さえればよい あとはいちいち細かいモジュールに制限加えることはない
217 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 10:01:37 ] >>212 逆(実際はstatic推奨)か、厳しいのはスタックか。
218 名前:デフォルトの名無しさん [2007/11/07(水) 10:40:48 ] 400バイトくらいで厳しいのかよ 2M = 2000000バイトくらいは使用できるんだろ? 400を繰り返し使ってメモリリークするとかなら 考慮するひつようあるだろうけど使用後に解放されるなら他のプログラムに影響しないと思うが 500K = 500000バイトくらい使うところから節約しろよ
219 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 10:54:42 ] for (int i=0;i<100;i++) a[i]=b[i]*xx; だと問題なくベクトル化されるのですが for (int i=0;i<100;i++) a[i]=a[i]*xx; だと remark: loop was not vectorized: dereference too complex. となってベクトル化されません。 自分自身が式の中に入っているとベクトル化できないのでしょうか? コンパイラはicc ver 10で、OSはFedora 7です。
220 名前:デフォルトの名無しさん [2007/11/07(水) 11:05:35 ] ベクトル化がわからない 配列に掛け算できないならコンパイラが壊れている
221 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:08:34 ] >>219 非常にシンプルなサンプルを作って試したら、どちらのケースもベクタ化できるようだよ。 配列aが何か特殊なことになってないかい? 再現できるソースは貼れないかな?
222 名前:212 mailto:sage [2007/11/07(水) 20:11:28 ] ありがとうございました。 私は開発機でコンパイルする権限も無い下っ端なのですが、 腑に落ちなかったモヤモヤが少し晴れました。
223 名前:デフォルトの名無しさん [2007/11/10(土) 05:11:33 ] ループを200回くらい繰り返すとき、全部展開しておいた方が速いですか インライン展開とかも出来て あと、1万回するときに100回と100個展開した方が良いですか?
224 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 05:14:18 ] >>223 余計なことせずにコンパイラに全て任せるのが正解だ。
225 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 05:17:58 ] 基本がなってない奴は気にするだけ無駄
226 名前:デフォルトの名無しさん [2007/11/10(土) 06:01:10 ] 誰かいませんか! 助けてください!!
227 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:04:49 ] どうしたの
228 名前:デフォルトの名無しさん [2007/11/10(土) 06:08:40 ] スレ違いかもしれませんが C言語の宿題がわからなくてこまってます! 明日ってか今日までなんです〜 一緒に考えてくれる人いませんか? お願い助けて〜
229 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:28:53 ] 宿題スレで聞けば? って既にマルチしてるな。
230 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 17:18:26 ] staticだとスレッドセーフじゃなくなるよね?
231 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 17:20:17 ] 場合による
232 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:43:45 ] >>230 読み込みのみなら気にしなくていい 書き込みが絡む場合はスレッドセーフではない 手軽にスレッドセーフにしてくれる拡張構文も最近はあったりする (スレッドローカルストレージ)
233 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 08:05:03 ] >>232 初期化のときに問題にならない?
234 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 08:42:09 ] static変数の初期化より先にどこかでスレッド走らせ始めるつもりか
235 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 10:03:36 ] お前ら Binary Hacks の Hack 37 読むといいですよ
236 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 11:48:44 ] 今日Binary Hacks買ってきたにょー 予定つまってて2週間ほど読めないけど…
237 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 12:42:42 ] Linux系の本だと思ってスルーしてたけど、Windowsプログラミングにはどう?
238 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:04:29 ] かったはいいがぱらぱらめくっただけな自分は やはりLinuxの本という印象。 Windowsしかまともに開発してないから あんまり楽しめなかった。
239 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:45:13 ] mallocダメ絶対な俺としてはスタック領域の調べ方Windows版が載ってただけで大満足
240 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:21:09 ] >>238 ありがとう。やっぱりそうか。
241 名前:デフォルトの名無しさん [2007/12/24(月) 08:55:43 ] age
242 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:22:50 ] newの遅さはどうしてる〜?
243 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:26:18 ] pool allocator使う
244 名前:デフォルトの名無しさん [2008/01/01(火) 19:54:17 ] あげ
245 名前:デフォルトの名無しさん [2008/01/14(月) 22:48:15 ] V(・∀・)V
246 名前:デフォルトの名無しさん [2008/01/22(火) 15:39:00 ] 割る2、掛ける2はシフトを使うと速い。 これ豆知識な。
247 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 15:52:07 ] 俺のCPUは割り算よりシフトの方が時間かかるんだけど
248 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 16:53:00 ] 最近のCPUではよくあることだな。 「1足すならaddよりincの方が速い」とかも同様。 俺の様なジジイの豆知識はほとんど役に立たん。
249 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 16:57:45 ] C/C++の範囲では、どっちがいいかなんてコンパイラの最適化に任せるのが正解。
250 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 18:22:31 ] いや、それを言っちゃうとこのスレ終わっちゃう。 つうか、だから伸びないんだなorz VCの吐くコードとか見てると感動するけど、時々「?」と感じるときがあるのも事実。 そういうのを減らすための豆知識とか、誰か披露してくれまいか。
251 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 18:51:09 ] それじゃ、「?」と感じたものを挙げてみてくれ。可能な限り、説明しようじゃないか。
252 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:23:21 ] inc は使うなというのは正式な資料に書いてあるが >俺のCPUは割り算よりシフトの方が時間かかるんだけど こういうCPUは寡聞にして知らない.教えてくれないか?
253 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:27:30 ] 割り算は普通遅いからね。
254 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:34:13 ] 定数の乗除は最適化してくれるんじゃないの?
255 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:42:07 ] CPU はって言ってるからには アセンブリで比較してると信じたいのだが・・・ C でやってる悪寒
256 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 22:18:22 ] まあ、バレルシフタ持ってない CPU だと、それなりに時間かかるからな。 3ビットのシフトの方が÷2より時間がかかる と言う詭弁は可能かと。
257 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 03:30:02 ] 割り算を逆数近似で計算してればあり得る? まともな割り算は必ずシフタ使うから普通はないが.
258 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:02:42 ] デバッグで実行しての実測なんて意味がない、ただただ使う側のPCスペックと環境だけ
259 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:54:31 ] 何の話だ?
260 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:01:50 ] foreachの最適化は無理無理無理無理いいいいいいいいいいいいいいいいいい
261 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:22:17 ] PenrynだとRadix-16のおかげでdivのクロック数は最小で6 昔とはだいぶ違うよ
262 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:52:45 ] >>261 あれ、14じゃね?
263 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:42:52 ] if((a == 1) && (b == 1)){ asdf; } という処理は論理積 && を使っている以上、分岐が2つある if(a == 1){ if(b == 1){ asdf } } に等しくて、これだと条件分岐が多くその分投機予想も外れる可能性があがるので if((a == 1) & (b == 1)){ asdf; } にすべきだ、っていう話を聞いたんですが、これは本当なんでしょうか? もしくは、そんな事は演算子がオーバーロードされていない限り明確に分かりきった事なので あらかじめコンパイラが論理積を (a == 1) & (a == 1) と同等の処理に最適化してくれたりとかはないんでしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:57:59 ] >>263 実験してみた。最適化できるみたい。 $ cat test.c void g(void); void f(int a, int b) { if ((a == 1) && (b == 1)) { g(); } } $ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -S -o - -Os test.c .file "test.c" .text .globl _f .def _f; .scl 2; .type 32; .endef _f: pushl %ebp movl %esp, %ebp cmpl $1, 8(%ebp) sete %al xorl %edx, %edx cmpl $1, 12(%ebp) sete %dl testl %eax, %edx je L1 popl %ebp jmp _g L1: popl %ebp ret .def _g; .scl 3; .type 32; .endef
265 名前:264 mailto:sage [2008/01/29(火) 13:01:03 ] >>263 使っているコンパイラでは結果が違うかもしれない。そういう環境で、且つ、実際に そのレベルの高速化が必要ならビット AND への置き換えもありうる。ただしその場合は しっかりコメントで実験結果に基づくコードだと添えておく必要があるだろうね。
266 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:11:04 ] なるほど、ありがとうございます。
267 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:35:23 ] 実装が長くても1度しか呼ばれない関数って、普通最適化でインライン展開されますよね?
268 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:41:11 ] 試してみれば?
269 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:46:26 ] インライン展開されます
270 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:46:55 ] コンパイラによってはインライン関数がちゃんと展開できたか教えてくれるコンパイルオプションがあるよ gccの話だけど
271 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:47:27 ] ごめんなさい忘れてください
272 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:23:04 ] 同じ内容の関数を複数用意して使い分ける意味ってあるんでしょうか?
273 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:21:21 ] >>272 唐突に質問されても何を聞きたいのか判りませんが。 同じ内容でも型が違う場合はC++ではテンプレート関数で一つで済ませることもできますが、 Cではできません。その辺りの話でしょうか?
274 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:30:48 ] >>273 そうではなく、 void foo1(int hoge){}; void foo2(int hoge){}; void foo3(int hoge){}; 中の処理も全く同一な関数です オーバーロードだとかそういうのでも全くないです
275 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:35:21 ] >>274 別に意味なんてないと思うが。訳が分からん。 typedef void (*func_t)(int); とやっておいて、どこかでfunc_tの変数を宣言してそれらを代入し、 fptr1 = foo1; fptr2 = foo2; if(fptr1 == fptr 2){ ... }else{ .. } として、処理は同じだけど違うものとして動作させたいと言うくらいしか思いつかないな。 意味があるかないか、どちらにしろそのソースコードを書いた人に直接訊いてみれば良い。
276 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:38:01 ] ただのアホな作りなのか、後の仕変に対応するための措置なのか見極める必要はある。 現状で言えばまとめてしまって構わないとは思うが。
277 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:49:44 ] I キャッシュの関係で、そういうのを最適化のために使えるケースというのはあった。リンカスクリプトも直す必要があるが。 多分違うケースなんだろうけど。
278 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:56:47 ] >>272 目的があれば意味があるんじゃないの?
279 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:57:35 ] string::size と string::length は全く同じメソッドだな。 文字列としては length という言葉を使う方がしっくりくるが、 コンテナとしての要件を満たすには size がないと困る。 なら両方作っちゃえって感じなんだろう。 こういう例ならありうると思う。
280 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:08:27 ] ファイルやフォルダをコピーしたり消したり作ったり、.NETで言うFileInfoクラスやDirectoryInfoクラスを 自分で実装するのは.NETに頼らなくて済む、以外のメリットないのかなぁ・・ このまま行くと.net病になりそうだ・・・ どうすりゃ効率いいかなぁ・・
281 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:18:24 ] 既存のクラス使う方が仕事の効率は良さそうだな。
282 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:18:25 ] 微妙に誤爆・・だけど平気かぎりぎり・・・いやごめんなさい
283 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:20:15 ] うひょー、れすがついちゃってた >>281 Windows専用なら.NET全然良いかな、と思う でも趣味でやってる分には微妙に素直に割り切れないというかなんというか
284 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:24:31 ] というかそのFileInfoクラスだけならともかくさ、他にも色々必要だろ 言い過ぎの誇張表現になるけどそのすべてにおいてMS開発陣の書いたコード以上のものを書けるのかってことになる つまり.NETを1箇所以上で使うなら出来得る限り.NETで実装を
285 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:25:36 ] 効率ってのが速度を表すなら、全ての.NETコードは効率が悪いことになる。
286 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:18 ] 個人でやる分には安心感はあるけどねえ
287 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:47 ] >>279 lengthはsizeを呼ぶだけとかってなら、アリだね。 極力重複コードは避けるべき。
288 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:28:45 ] うあー、こんなんにレスつけてくれてありがとうございます >>284 コードの数割は.NETのを利用したもので、主要な処理の部分だけちょっとがんばって 頼らず書こうかなと思ってたんだけどそのままにしときます
289 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:15:21 ] まあ.NETのあるクラスのすべてのメソッドをフル活用する状況ならいんじゃないかねえ
290 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:50:44 ] >>287 重複コードは inline 関数のおかげで簡単に避けられるね。 Ruby とか同じ動作の別名関数が用意されてる事が多い。 A という言語では a という名前で、 B という言語では b という名前な関数を Ruby に作る時には、 a と b の両方の名前を採用しちゃえ、みたいな。
291 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:04:15 ] そういえばC++には識別子のalias機能がないんだね。
292 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:12:28 ] で、でふ
293 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:13:17 ] 変数は参照で、 関数はインライン関数で、 型は typedef で、 名前空間は namespace a = b; で、 クラステンプレートは継承でそれぞれ可能ではある。 ただ、インライン関数使うのと、 クラステンプレートを継承するのとは、 結構面倒臭い。
294 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:16:11 ] このスレ地味に常駐多くないかい
295 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:27:22 ] C++0xであるかも知れないが、テンプレートのエイリアスは作れないよな。 typedef std::vector my_vector; みたいなの。>>293 にも書いてある継承は可能ってレベルではない。 コンストラクタやらオペレータやら全部知っていて、尚かつ書かないといけない。
296 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:33:01 ] オペレータは必要ないと思う。 コンストラクタは作らないとダメだけど。
297 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:55:01 ] >>296 これで例として成立してるか自身無いけど。 継承しちゃうとoperatorの返す型と継承した型が異なっちゃうからうまくいかない。 struct c { int v; c operator+(int n) { c t; t.v = v + n; return t; } }; struct d:public c {}; main() { d e, f; f + 1; // OK e = f; // OK e = f + 1; // Error }
298 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:01:54 ] >>297 ああ、なるほど。 というか、色んな状況を考えると継承では不完全なのか。
299 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:10:51 ] if(hoge.piyo == hogehoge.piyo) hoge.piyo = hoge.piyo & ~sym.att; こんなのはこれ以上どうにもなりませんよね?
300 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:04:15 ] 分岐は無くせるけどね。 hoge.piyo = ~(sym.att & -(hoge.piyo==hogehoge.piyo) & hoge.piyo; x86でPentiumPro以降に限定するなら hoge.piyo = ~(hoge.piyo == hogehoge.piyo ? sym.att : 0) & hoge.piyo; はCMOVになる可能性がある。 SSEで書けば次のようにも出来る。 // hoge.piyo = ~(sym.att & -(hoge.piyo==hogehoge.piyo) & hoge.piyo; hige.piyo = _mm_andnot_ps(_mm_and_ps(sym.att, _mm_cmpeq_ps(hoge.piyo, hogehoge.piyo)), hoge.piyo); ただSIMD以外は保守性が悪くなるだけであんま効果無いと思う。 実測した方がいい。
301 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:29:28 ] >>300 なるほど・・-ってのを初めてみたんで調べてきます、ありがとうございます
302 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:44:47 ] ANSI Cの仕様ではA==Bが真なら1になるから-1(全ビットON)にしてマスク作ってるだけだよ。 x86なら分岐せずにSETcc + NEGにコンパイルされるはず。
303 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:57:10 ] 偉そうな割には右括弧が足りないぞ。
304 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:00:29 ] どの道やってること同じではないのか
305 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:36:34 ] まぁ、>299程度ならコンパイラに任せて実測してみてからだな。 CMOVになったところで大した差は出ないだろ。
306 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:37:59 ] Windows環境でのファイルなんかのコピーを大きくする手段ってないですよね・・ どのみちOSの機能頼りなわけだから
307 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:39:36 ] コピーしたつもりがおっきくなっちゃうのかー。そりゃねーな。
308 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:41:01 ] すんません、ガチで寝ぼけてる 早くする、ですほんとごめんなさいごめんなさいごえmんあい
309 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:43:14 ] 早くする手段ならいくらでもあるだろ。 速いかどうかは知らんが。
310 名前:デフォルトの名無しさん [2008/02/04(月) 13:48:24 ] ストライピング コードレベルの最適化とは無縁だが。
311 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:54:21 ] 高速化っていうんだから速くか ストライピング、調べてきました それだと送り先が2箇所なのかな・・・ コピー元も先も1箇所なんです というかコードレベルって話じゃないですよね、把握しました
312 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:55:51 ] 単純にバッファをいじるとか HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet /Control/Session Manager/Memory Management ここの数値を というか普通こんなことしねえよな・・
313 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:58:42 ] >>311 実際問題、ファイルアクセスの速度はデバイス側の事情で決まってしまう。 と言うことで、単純に速くする方法はない。 寧ろ、本当にファイルコピーの時間が問題なのか、例えばレスポンスが問題なのか、検討した方がいい。
314 名前:312 mailto:sage [2008/02/04(月) 13:59:50 ] うちの環境だと10Mにしてるけどよく考えたら馬鹿すぎる方法だ 確か再起動必要だった気がするし
315 名前:311 mailto:sage [2008/02/04(月) 14:12:46 ] >>313 最近、.NETFrameworkというものを触ってみまして 色々試してみようとコンソールなんですがファイルをコピー(バックアップ?)する ものを作ってみたんですが、そこでコピー自体速くならないかなあと思った次第です >>312 >>314 再起動必要じゃあれですね・・・ Win32APIとかってのもWindowsの機能を使うやつだって聞いたんで それでファイルのコピーするとこを実装すれば速いんだろうか
316 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:20:28 ] >>315 先ず、.Netって時点でスレ違い。 次に、ファイルコピー自体の速度はデバイス依存だ。 .Netでファイルコピーしていて遅いと思うのなら、コードレベルの最適化ではなく.Netの使い方の問題だ。
317 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:23:52 ] C/C++でファイルコピーなんてファイル開いて読み取って書き込むの繰り返しなんだからさ たぶん.NETでもAPIでも使った方が良い ということでもうそれで完成でいいじゃない
318 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:14:23 ] >>311 Windows 限定なら FastCopy.exe のソースとか見ればいいんじゃないか。
319 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:28:22 ] オープンソースとか見ると趣味人でもない限りC/C++やWinAPIを使うのってことがどういうことかわかっちゃうよな
320 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:24:12 ] 俺は、お前の言ってることがどういうことかわからん。
321 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:30:10 ] 開発効率と現状溢れかえってるPCのスペックの話だろうか まあ例外は確かに往々にあるけど例外は圧倒的にマイノリティ うちも業務じゃC/C++なんて使わないわ
322 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:05:18 ] 何言ってんだこいつ。 Webでもやってろ。
323 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:09:41 ] webは全然分類違うだろ、どこのアマグラマだよ
324 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:10:33 ] 業務でC++主流だと思ってるのか・・
325 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:14:07 ] マジョリティマイノリティでわけちゃうとなぁ まあ業務になると大抵どっちかだけ向いてればいいんだが
326 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:46:26 ] スレチ自重
327 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 20:32:36 ] ここに適当なコード張ってみんなで最適化とか考えたけど適当な長さのコードが見当たらなくて10分で諦めた
328 名前:デフォルトの名無しさん [2008/02/07(木) 16:30:40 ] AMD向けの最適化に関するマニュアルはAMDのホームページにありますが、インテル用のはどこかでダウンロードできなうのでしょうか?
329 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:42:36 ] >>328 www.intel.co.jp/jp/download/index.htm
330 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:32:52 ] >>328 ttp://www.agner.org/optimize/
331 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:01:18 ] おいお前ら、俺のこいつをみてどう思う? class Vector3 { public: union { struct {float x, y, z;} float data[3]; }; Vector3() {} Vector3(float ix, float iy, float iz) { x = ix; y = iy; z = iz; } }; inline Vector3 operator+(const Vector3 & va, const Vector3 & vb) { return Vector3(va.x + vb.x, va.y + vb.y, va.z + vb.z); } ベクトル化されるかな
332 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:16:06 ] 人に読んでもらうんならもうちょっとマシなコードを書いて欲しい所
333 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:17:37 ] 横レスだが、別に普通じゃねえかw
334 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:50:50 ] 全角スペースでいいからインデントをだな
335 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:51:35 ] コードがマシかどうかとは関係ないじゃん
336 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:06 ] >>332 「もうちょっとマシなコード」をkwsk
337 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:14 ] >>334 だけど>>332 じゃないです
338 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:45 ] ここで一つ自演を見付けると
339 名前:331 mailto:sage [2008/02/11(月) 04:00:14 ] 分かった、インデントが無いのは謝る コンパイラ通してないのも謝る ただ俺は…ベクトル化について語って欲しかっただけなんだ…
340 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:03:30 ] コンパイルしてみりゃいいじゃん。
341 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:30:20 ] >>336 ・classじゃなくて別にstructでいいんじゃ? ・無名共同体内無名構造体の後のセミコロンがない ・デフォルトコンストラクタ邪魔 ・メンバ初期化子を使って欲しい そして出来れば引数もconst type&で受け取った方が ・演算子オーバーロードを行う関数の引数名はrhs, lhsにするのが普通
342 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:04:44 ] >>341 ・classじゃなくて別にstructでいいんじゃ? 俺は変数だけならstruct、関数あるならclass使ってるが ・無名共同体内無名構造体の後のセミコロンがない struct {float x, y, z;} ←これか。スマン ・デフォルトコンストラクタ邪魔 コンパイラによっては0で初期化される・・・っていう記憶があるから、 不定値のままでいいから一応書いた メンバ初期化子を使って欲しい そして出来れば引数もconst type&で受け取った方が うぉ?!全くその通りだw Vector3(const float & ix, const float & iy, const float & iz) : x(ix), y(iy), z(iz) {} これでおk? ・演算子オーバーロードを行う関数の引数名はrhs, lhsにするのが普通 知らんかった レスありがとう
343 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:22:15 ] 忘れるところだった。俺はベクt(ryについて聞いてたんだ return Vector3(va.x + vb.x, va.y + vb.y, va.z + vb.z); こいつはベクトル化されるのか? それとも、 Vector3 v; for (int i = 0; i < 3; i++) {v.data[i] = lhs.data[i] + rhs.data[i];} return v; とか書かないとダメかな まぁコンパイラ依存な訳だが、どこまで美味く最適化してくれるか知りたいんだ
344 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:27:03 ] そこだけ見てもベクタ化されるかどうかは不明。 ってことで、クラスの作りだけ見ると、unionにする理由が判らん。 配列のようにも構造体のようにも使いたいのならそういうアクセッサを用意すればいいだけだから、 そもそもデータメンバを公開する理由が判らん。 あーそれから、floatを引き数とするコンストラクタなら参照にしなくて充分。
345 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:29:19 ] >>343 だから、コンパイラが何か、どんな使い方をするかなども書かれていないのにベクタ化されるかは不明だってば。 わざわざforループにしなくても、ベクタ化できるコンパイラならベクタ化すべきときにはしてくれるだろうよ。
346 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:48:14 ] これは3次元ベクトルのクラス。できる限りの高速化が望まれる xyz公開してるのはGetX()とか作ったり使ったりするのが面倒くさいからだ コンパイラはVisual Stdio 2005のやつ
347 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 06:15:07 ] 「できる限りの高速化」を望みつつ、条件も出さずに実測もしないで、 挙句の果てに「面倒くさい」って、阿呆ですか?
348 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:07:04 ] >>347 俺が求めてるのは実測とかじゃなくて、最適化についての経験談なんだが こうした方がベクトル化され易い、とか… あと、 void Vector3::GetX() const {return x;} void Vector3::GetY() const {return y;} void Vector3::GetZ() const {return z;} とか実装しろと? 最適化、いや高速化に関係するのか?
349 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:42:43 ] >>348 だから、いろんなサンプル作って実測してみろって。 クラスを作るのなら効率よく組めて且つ速いものも狙うのは当然だろうし、 そうでないなら速度重視でがりがり書くことになるからクラスなんて作る意味がないって。 要は、やることが半端なの。
350 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:17:11 ] float を参照渡しする意味はあるのか?
351 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:21:53 ] >>349 自己矛盾乙
352 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:28:39 ] むしろだめだろう、リテラルわたせないじゃないか
353 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:36:13 ] 一時オブジェクトが生成されるから問題ない。
354 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:37:31 ] インライン化されるだろうから多分変わりはないだろうが、 積極的に参照にする理由は無いな。
355 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:39:02 ] そうでしたかごめんなさい
356 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:43:56 ] >>351 どこが自己矛盾?
357 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:55:47 ] 他人に訊く暇があったらまずやってみろ! それで自分の力だけではどうにもならない事が起きた時初めて他人を頼る でないといつまでたっても他人に頼る癖が抜けないぞ
358 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:56:22 ] インライン化される事を前提としているならconst参照渡しは問題ないというかコンパイラの助けにある程度なるだろうけど、 確かに中途半端に長い関数で1ワードごときの変数を参照にする必要は無い。
359 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:45:14 ] >>357 ここは相談の場でなくて語り合う場だが?
360 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 04:43:20 ] void float Func(const float &f) { return (f + f - f) * f / f; } イコール void float Func(const float *f) { return (*f + *f - *f) * (*f) / *f } だと思ってた。それとも void float Func(const float *f) { float g = f; return (g + g - g) * g / g; } こうか?参照渡しって内部的にどういう処理が行われてるの
361 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:03:41 ] >>360 最適化されると、後2者の区別はなくなりますが。 # void float とかfloat g = f は兎も角
362 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:12:40 ] >>360 最適化されると、内部的に変数の所在を渡すよりも変数の値をそのまま渡した方が速度が出るので void float Func(const float f) { return (f + f - f) * f / f; } になる。
363 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:26:12 ] 適当にコピペして解説したんだけど >void float まさかこんな風に書いてあったなんて
364 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:27:45 ] >>362 最早意味不明だし。インライン展開されない限り、参照やポインタ渡しが値渡しになることは有り得ません。 # インライン展開されたらされたで、Func()自体が(その呼び出しについては)消えてなくなるだろうけど。
365 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:41:48 ] >>364 不動小数点数の演算って、足して引いて 0 とか、かけて割って 1 とか、畳んでいいんだっけ?
366 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:44:28 ] >>365 実際に最適化されるときに、引き数が明らかなら可能。 そういう意味では、>364は不正解。
367 名前:364 mailto:sage [2008/02/12(火) 12:05:54 ] >実際に最適化されるときに、引き数が明らかなら可能。 あー失礼しました。 gccでの確認ですが、確かにFunc(1.2f)とかは消えてなくなるけど Func(atof(argv[1]))とかだとちゃんと四則演算してますね。 -- call __strtod_internal fstps -4(%ebp) movss -4(%ebp), %xmm3 movss %xmm3, %xmm1 addss %xmm3, %xmm1 subss %xmm3, %xmm1 mulss %xmm3, %xmm1 divss %xmm3, %xmm1 subl $8, %esp cvtss2sd %xmm1, %xmm0 movsd %xmm0, (%esp)
368 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:30:06 ] C/C++でGUIを実装する場合、どういった手段が適当でしょうか?(Windows環境) 色々調べてみたところ ・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う ・WinAPIを直接、みたいなことは趣味でやる人が使う (山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で) で、実際人に聞くと今度はMFCという意見が出てきました 調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない と、こんな感じでして、どっちに進むべきか悩んでいます やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です C#/VB.NETというものも一応考慮のうちに入れておきたいです (GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです) それではよろしくお願いします
369 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:56:45 ] スレタイ読め
370 名前:360 mailto:sage [2008/02/14(木) 09:34:39 ] スマン、遅レスだがvoidは間違いだ floatもマズかったかな double Func(const double &d) { return (d + d - d) * d / d; } こいつはコンパイルされた後ってどうなるんだ? アセンブリ知らないから、とりあえずCの文法的に書いてみるけど double Func(double d) { return (d + d - d) * d / d; } になるのか。それとも double Func(double *d) { return (*d + *d - *d) * (*d) / *d; } になるのか。まさか後者みたいなコード吐かないよね もちFunc関数自体が省略されない場合で
371 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:45:00 ] >>370 アセンブリ知らないという見方なら C の規格上の実行モデルで考えることになり、 その場合にはそれら2つは引数が値渡しである点を除いてほぼ等価。 違いを知りたければアセンブリを見るしかないでしょ。
372 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:46:13 ] コンパイルして逆アセンブルしてみればいいんじゃないの?
373 名前:368 mailto:sage [2008/02/14(木) 10:34:16 ] すんませんごばく
374 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:38:12 ] >>370 参照で書かれた関数は、ポインタで書かれた関数と同じコードを吐くよ。 その例では、後者と同じと言うことになる。 勿論、後者自体がdouble Func(double * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;} と殆んど同じコードを吐くという前堤でね。
375 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:36:36 ] ちょっとコンパイルしてみた。 -- double func(double const d) {return (d + d - d) * d / d;} double func(double const & d) {return (d + d - d) * d / d;} double func(double const * d) {return (* d + * d - * d) * * d / * d;} double func(double const * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;} -- 以下適当に行を圧縮 _Z4funcd: movapd %xmm0, %xmm1 addsd %xmm0, %xmm1 subsd %xmm0, %xmm1 mulsd %xmm0, %xmm1 divsd %xmm0, %xmm1 movapd %xmm1, %xmm0 ret _Z4funcRKd: movsd (%rdi), %xmm1 movapd %xmm1, %xmm0 addsd %xmm1, %xmm0 subsd %xmm1, %xmm0 mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0 ret _Z4funcPKd: movsd (%rdi), %xmm1 movapd %xmm1, %xmm0 addsd %xmm1, %xmm0 subsd %xmm1, %xmm0 mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0 ret _Z4funcPKd: movsd (%rdi), %xmm1 movapd %xmm1, %xmm0 addsd %xmm1, %xmm0 subsd %xmm1, %xmm0 mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0 ret
376 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:55:14 ] >>375 VC++2003で最適化オプションを全て有効にして、その4つの関数を定義して 連続で呼び出してみたら、インライン展開されて計算は1回だけで結果を 4回コピーするだけのコードになった。完全に同一とみなされてるね。 あと、インライン展開されてないコードではSSEを使っているけど、展開された 部分ではSSEは使ってなかったな。
377 名前:360 mailto:sage [2008/02/16(土) 01:27:08 ] 俺の環境(VS2005SE)で速度重視ならこんな感じ 展開はされてない func1: fld qword ptr [esp+4] fld st(0) fadd st,st(1) fsub st,st(1) fmul st,st(1) fdivrp st(1),st ret func2: fld qword ptr [eax] fadd st(0),st fsub qword ptr [eax] fmul qword ptr [eax] fdiv qword ptr [eax] ret func3: fld qword ptr [eax] fadd st(0),st fsub qword ptr [eax] fmul qword ptr [eax] fdiv qword ptr [eax] ret func4: fld qword ptr [eax] fld st(0) fadd st,st(1) fsub st,st(1) fmul st,st(1) fdivrp st(1),st ret あれ、これってSSE使われてないよね。なんで?
378 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:17:22 ] >>370 参照はポインタで渡されるので、関数を呼び出す場合は後者の関数が生成される。 インライン展開されるばあいは、最適化されてポインタが使われない前者と同等になるよ。 >>376 2005proではインライン展開もSSE2になってた。 >>377 SSE2のオプションは確認した?
379 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:22:53 ] >>378 サンクス。オプション忘れてたw インライン展開されているものは全て同じコード吐いてるっぽい されていないものはこんな感じ double func1(double const d) {return (d + d - d) * d / d;} 004018A0 movapd xmm0,xmm1 004018A4 addsd xmm0,xmm1 004018A8 subsd xmm0,xmm1 004018AC mulsd xmm0,xmm1 004018B0 divsd xmm0,xmm1 004018B4 ret double func2(double const & d) {return (d + d - d) * d / d;} double func3(double const * d) {return (* d + * d - * d) * * d / * d;} double func4(double const * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;} 00401880 movsd xmm1,mmword ptr [eax] 00401884 movapd xmm0,xmm1 00401888 addsd xmm0,xmm1 0040188C subsd xmm0,xmm1 00401890 mulsd xmm0,xmm1 00401894 divsd xmm0,xmm1 00401898 ret func1の方が短い事にちょっぴり驚いた。引数でdoubleそのまま使うのも有りって事か?
380 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:18:29 ] このスレに来て学んだことは「とりあえず素直に書いておけ」
381 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:23 ] 結局、最適化器を書いてるのは人間だから、 「彼らが想定する人間であること」 が大事になってくるわな。
382 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:45:37 ] double を参照渡しはまずせんわな。
383 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:55:13 ] たしかに直接にdoubleを参照渡しにすることは無いけど、テンプレートを使うときに引数を参照渡しにすることはよくある。 その結果、doubleを参照渡しにしてしまうことも多々ある。インライン展開なら参照渡しもしっかり最適化されるので助かる。コンパイラ屋さんに感謝だな。
384 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:59:07 ] 値渡し用の型を取得するためのテンプレート使うといいよ。
385 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:59:30 ] 値渡し用の型、じゃねえや。 そういった引数用の型、だ。
386 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:01:08 ] テンプレートだと、問答無用に値渡ししないか? と思ったが、bindとかfunctionとか参照渡しだったな。
387 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:04:48 ] 特定の基本型のみ値渡しにし、 他の型は全部 const 参照にするってやつ。 要するに boost::call_traits<T>::param_type 。
388 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:13:07 ] 凄いことができるんだな。テンプレートって奥が深いな
389 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:15:22 ] つかフツウやるやろ
390 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:16:53 ] まあ実装はかなり泥臭いがな。 基本的に const 参照にして、基本型全部で特殊化。 実際にはもうちょっと階層的に作ってあるけど、 基本的にはそんなとこ。
391 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 03:33:06 ] 分かりやすいのが一番だと思ってる。でも必要な所はあるわけですよ ・・・このスレに何しに来たっけ これをどうするか聞きに来たんだっけかw //---------- class Vector4 { public: float x, y, z, w; Vector4(float ix, float iy, float iz, float iw) : x(ix), y(iy), z(iz), w(iw) {} }; void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB) { pO->x = iA.x + iB.x; pO->y = iA.y + iB.y; pO->z = iA.z + iB.z; pO->w = iA.w + iB.w; } //---------- ベクトル和を計算するAdd関数がある訳だが、とにかく速度が欲しい。 SSEのパックド単精度実数関連の命令(ADDPSとか)使えば早くなるはずだと というか、最適化で勝手にやってくれると思っていたんだが、パックド使ってるようには見えない まさか、この程度なら使わない方が早いのか・・・ おまいらならどうコーディングする? 完全にぶりかえしですまん
392 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 04:02:10 ] コンパイラが場合によって速いほうを選べるように inline にする。 必要な箇所があれば intrinsic でもアセンブラでも使う。
393 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 04:26:20 ] 残念だがそれをaddps1個に翻訳できるほど現時点でのコンパイラは賢くない。だからこそのIntrinsicsなわけで。
394 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:37:36 ] //---------- #include <dvec.h> class Vector4 : public F32vec4 { public: Vector4(float ix, float iy, float iz, float iw) : vec(ix, iy, iz, iw) {} }; void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB) { *pO = iA + iB; } この程度だとラップする意味が無い
395 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:40:31 ] Intel C++ or VC++なら #include <fvec.h> でF32vec4を使う。 テキトーにラップしてよし。 あと、インライン化しないとあんまり効果ないよ。 実関数化するとコールのオーバーヘッドに食われる
396 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:41:40 ] class Vector4 : public F32vec4 { public: Vector4(float ix, float iy, float iz, float iw) : F32vec4(ix, iy, iz, iw) {} }; に訂正
397 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:29:40 ] ダンゴさんの連投でスレが活気付いたな
398 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:38:46 ] 活気づいたっていうのかよこれは
399 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:24:21 ] 1人だけで盛り上がっていては活気付いたとはいえない。 実際に活気付くのは397からだから397の話題振りで活気付いたということにしないと。
400 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:34:36 ] >>391 こうならばどうか? //---------- class Vector4 { private: float x, y, z, w; public: Vector4(float ix, float iy, float iz, float iw) : x(ix), y(iy), z(iz), w(iw) {} void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB) { pO->x = iA.x + iB.x; pO->y = iA.y + iB.y; pO->z = iA.z + iB.z; pO->w = iA.w + iB.w; } //或いは void Add(Vector4& pO, const Vector4 & iA, const Vector4 & iB) { pO.x = iA.x + iB.x; pO.y = iA.y + iB.y; pO.z = iA.z + iB.z; pO.w = iA.w + iB.w; }
401 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:36:08 ] >>400 最後の行に括弧が抜けてた。 };
402 名前:ヽ・´∀`・,,)っ¬ mailto:OH MY LITTLE バール♪ sage [2008/02/18(月) 15:42:20 ] 駄目。それでもスカラにしかならない。 addpsに展開されることが目的なら、配列にして for(int i=0; i<4; i++) vD[i] = vA[i] + vB[i]; 全要素に同じ操作をしてますよってヒントにはループが一番効果的。 手動アンロールしちゃうと効果ない。
403 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:57:21 ] それバールだったのか。釣竿だと思ってたぜ。
404 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:10:23 ] 内部をバラの変数にしても配列にしても外からはわからない。 これぞクラスで隠蔽する良さだな。
405 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:27:11 ] 遅レスすまん f・・・vec.h・・・?こんなの知らなかったよ。 fvec.h は実数、dvec. h は整数の CPU 拡張機能を用いた演算関連のヘッダー、でいいのかな class Vector4 : public F32vec4 { public: Vector4() {} Vector4(float ix, float iy, float iz, float iw) : F32vec4(ix, iy, iz, iw) {} Vector4 & operator =(const F32vec4 & rhs) {*this = rhs; return *this;} }; inline void Add(Vector4 * pO, Vector4 & iA, Vector4 & iB) { *pO = iA + iB; } inline void Normalize(Vector4 * pO, const Vector4 & i) { F32vec4 v2(i * i); F32vec4 norm(sqrt(v2[0] + v2[1] + v2[2] + v2[3])); *pO = i / norm; } 正規化関数も作ってみた。俺の理解力だと今はこれが限界 Vector3 とかも作ってみたいが、float * 4 をパックにしなくちゃいかんから、float 1つ分余計にメモリ必要なんだな fvec.h & dvec.h は xmmintrin.h をインクルードしてるが、直接使っても構わないかな >>400 今まではそうしてた。あと、「};」が抜けてるからメンバ関数が inline か否か判らんぞ 追伸:Intrinsics の発音はイントリンシックスでおk?
406 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:22:14 ] >>405 >\in-?trin-zik, -?trin(t)-sik\ >ttp://cougar.eb.com/soundc11/i/intrin01.wav よって、「イントリンジク」。
407 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:33:11 ] >>405 VC++なら class Vector4 { public: union { float d[4]; struct { float x, y, z, w; }; }; }; これでAddをforループにしたら、SSE使ってくれたよ。
408 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:23:05 ] class myvec { public: union { T array[N]; struct { T a, b, c, d, ... }; }; }; とする場合、特にTがマシンが扱う1Wordの倍数でないと 元々struct { T a, b, c, d, ... }; 部分の各要素の連続性が保証されてないからどう動くかが分からなくなる。 つまり T array[N] では T はきっちり詰め込まれているものの、 struct { ... }; は中で要素の間に空白のブロックが入る可能性がある。 ふじこふじこ
409 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:09:07 ] ごめん、407を訂正する。 SSE使っていることには使っているが movss xmm4, DWORD PTR [eax-8] addss xmm4, xmm0 movss DWORD PTR [eax-8], xmm4 こんなコード吐いてた。(要素数の数だけ繰り返し) VC++2003ではベクトル化してくれるほど頭よくないようだ。 これでも普通にFPU使うよりは速いの?
410 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:57:23 ] >>407 クラスメンバの実体は private: float r[4]; にしといて、メンバ関数で public: float &x(){return r[0];}; const float &x()const{return r[0];}; などとするのがC++的。
411 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:58:16 ] >>409 x86-64はSSE使う方が速いし、FPUの利用は推奨されていない。
412 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/19(火) 23:01:55 ] 自動ベクトル化は何故かVC++ではやってくれないね。何年もなるのに未だに対応しない。 まあIntrinsicsを使うのがいいでしょう。 どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので 性能落ちる。F32vec4かもしくは__m128iから派生するのがヨシ。
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の板を何枚もポトペタしただけなんだろ?
514 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/09(日) 23:51:13 ] 板です。128kgまで耐えられます。
515 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:54:19 ] 面白くないから黙ってろ
516 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 00:03:49 ] >>511 OSは?Windows 2000は512MB以上はほとんど管理してないよ
517 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:30:06 ] >>515 お前も面白くない。自分に適用しないジャッジを人に適用しないようにな。
518 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:32:22 ] 以降、面白さを最適化するスレになりますた。
519 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:36:11 ] 面白さのサイズが最小になるのか
520 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 17:59:24 ] 以降、面白さを最適化するスレを最適化するスレになりました。
521 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:20:10 ] >>1 に goto >>1000 って入れときゃいいんじゃね?
522 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:11:35 ] 僕らが一つと半分のスレッド、時間にしてほぼ4年の月日を消費して分かった事、それは どんなにメモリを必要とするプログラムを書いても副作用がなければそのプログラムは 何もせずにOSに制御を返す1024バイトにも満たないデータ列と同じだという事。
523 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 22:18:01 ] いや、今わかったのはたぶんあんただけよ。
524 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:36:50 ] DANGOさんのベンチマークは副作用で満たされているな
525 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 22:52:46 ] それを言うな
526 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:27:17 ] 副作用でスレが荒れる
527 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 13:14:19 ] メモリ2G積んでるけどそっちがフル稼働するずっと前にCPUがまんまんになる
528 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 18:32:21 ] 以降下ネタ禁止
529 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:18:20 ] ISAバスのEMSメモリカードが遅くて泣いたのはいい思い出
530 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:21:26 ] 私のPCは、CPU温度は低いのにGPUはちんちんに熱くなる。
531 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:21:14 ] それ普通
532 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:47:44 ] >>527 それは今時普通ですから
533 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:00:28 ] ある C++ のメソッドを アセンブラに書き換えたら、かえって実行速度が遅くなった orz
534 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:12:21 ] あるある。 コンパイラってマジ賢いわ。
535 名前:533 mailto:sage [2008/03/12(水) 22:25:43 ] それがさー 多倍長整数の1ビットシフトと論理積処理なんだぜ r = (r << 1) & mask; // r, mask は多倍長整数 こんな単純な処理はキャリービットを使ったシフト命令が使えるアセンブラの方が絶対速いはずなのだが アセンブラにすると、グローバルな最適化がうまくできないみたいで、C++ よりも遅くなったみたい
536 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:28:49 ] そう言うときはどういう処理吐いてるか見た方がいいよ。
537 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:30:44 ] >>535 差し支えなければC++とasm双方晒してくれ。
538 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:31:22 ] 局所的な最適化は必ずしも大局的な最適化とはならない事のいい例だね。 例えば最近のコンパイラなんかは、一回のコンパイル時間が長くなっても エラーメッセージなどを丁寧に出力するから、結果的にコードを修正する時間が短くなって コンパイル回数も減り、開発時間が短くなる事に寄与している。 コンパイラ賢い。
539 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:01:49 ] >>535 パイプラインが詰まるようなコード書いたんじゃねーの。
540 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:05:20 ] キャリーっていう1つしかない資源を使う限り、 詰まらざるを得ないんじゃないかな。
541 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:19:41 ] 多少コードが増えてもCPIが上がれば逆転するから、安易なインラインアセンブラの使用は割に合わない。
542 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:36:23 ] asmのおかげで回りの最適化が効かなくなってんじゃないか?処理時間の短い関数をasmにしても逆効果だよ。 ループを含めるとか、ある程度処理時間がかかる部分をasmに直そうよ。
543 名前:536 mailto:sage [2008/03/13(木) 19:09:16 ] もちろんコンパイラが吐き出してるソースチェックしたよ そしたら グローバルに最適化されてるってことがわかったんだよ
544 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:10:14 ] >>537 うーん、そのままだとちょっと差し支えがあるので、 晒せるように書き直せるかどうか試してみるよ
545 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:20:37 ] >グローバルに最適化 の意味が解らん
546 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:42:37 ] 以下のようなクラスがあって class CShiftAnd { uint m_nReg; uint *m_pR; uint *m_pCV; uint m_exitIndex; uint m_exitMask; public: CShiftAnd(int); ~CShiftAnd(); bool setEntryState(); void transition(uchar); void transition_asm(uchar); };
547 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:42:59 ] bool CShiftAnd::setEntryState() { *m_pR |= 1; return (m_pR[m_exitIndex] & m_exitMask) != 0; } void CShiftAnd::transition(uchar ch) { uint *ptr = m_pR; uint *pCV = m_pCV + (ch * m_nReg); uint carry = 0; for(uint i = 0; i < m_nReg; ++i, ++ptr) { uint nextCarry = *ptr >> 31; *ptr = (*ptr << 1) + carry; *ptr &= *pCV++; carry = nextCarry; } }
548 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:43:53 ] void CShiftAnd::transition_asm(uchar ch) { uint *pR = m_pR; uint *pCV = m_pCV + (ch * m_nReg); uint nReg = m_nReg; __asm { mov edi, pR ;; edi = m_pR mov esi, pCV mov ecx, nReg xor eax, eax ;; clear carry L01: mov eax, [edi] adc eax, [edi] and eax, [esi] mov [edi], eax lea edi, [edi+4] lea esi, [esi+4] loop L01 } }
549 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:45:47 ] 以下のコードでタイムを計測した buf のサイズは1000なので、10億回ループする { StopWatch<> sw; CShiftAnd sa(31); for(int i = 0; i < 10000 * 10; ++i) { int count = 0; for(cchar *ptr = buf; ptr < buf + sizeof(buf); ) { if( sa.setEntryState() ) count += 1; sa.transition(*ptr++); } } }
550 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:47:27 ] おいらの環境でタイムを計測すると 1.125秒 sa.transition(*ptr++); を sa.transition_asm(*ptr++); に変えてタイムを計測すると 1.469秒 だった
551 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:05:19 ] 中身全然理解してないけど なんでedxを使わないでレジスタ変数に使われる(push/popが必要な)esiやediを使ってるの、とか あなたの読んだ最適化に関する文書に、LOOPを使うことについて何か触れられてなかったのか、とか
552 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:20:27 ] >>551 じゃ、アセンブラでどう書いたら高速になるのかコードを晒してくおくれ
553 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:24:49 ] 何が「じゃ」なんだろ。まったく話が繋がってない。
554 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:30:54 ] >>552 最適化技法の専門書でも読め
555 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:38:59 ] C++のソースレベルで見ても ロード/ストアの形にするのも基本だし カウンタ(i)を用意して非定数のlimitと比較するくらいなら、first/last形にするのが常識だし (まあこれは0との比較に変えてるみたいだからいいか) といっても、その程度は最適化コンパイラなら当たり前にやっていることだけど
556 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:42:18 ] で、結局、「グローバルに最適化」とは何なのだろう。
557 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:16:13 ] >>538 の「大局的な最適化」と同じ意味だろう。 別に何かの規格で定められた専門的な用語ではないはずだ。 いや、わかっててネチっこく絡んでるだけなら、野暮な説明だけど。
558 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:29:52 ] おまいらもっと速いアセンブラのコード晒してやれよ
559 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:33:39 ] >>557 いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。 単に「自分の書いた(付け焼刃の)アセンブラより速かったから 大域的な最適化をしているに違いない」と言ってるとしか見えないわけさ。
560 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:51:33 ] >>559 543 名前:536[sage] 投稿日:2008/03/13(木) 19:09:16 もちろんコンパイラが吐き出してるソースチェックしたよ そしたら グローバルに最適化されてるってことがわかったんだよ
561 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 21:55:30 ] VC++は、インラーインアッセンブルルルルァ使った関数はインライン展開とかできません。
562 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:58:27 ] 余計意味わかりませんけど。 例えば、そのグローバルな最適化によって、 >>547 はどのようなアセンブラコードになるのですかね?
563 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:00:06 ] ☆ チン マチクタビレタ〜 マチクタビレタ〜 ☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < 速いアセンブラソースまだ〜? \_/⊂ ⊂_ ) \_____________ / ̄ ̄ ̄ ̄ ̄ ̄ /| | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 愛媛みかん |/
564 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:34:20 ] 団子さんのレスが期待されるところだ
565 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:43:23 ] いやもうレスしただろ
566 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 22:57:30 ] SSEの使えないコードは汗んブラないのが俺のモナー よく読んでないけど使えそうだけどな
567 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:16:51 ] >>559 > いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。 このタイミングで急に新しい話題始めるんですかー。
568 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:17:12 ] loop は遅いから使わないってのは基本だと思うんだがなあ。
569 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 23:27:44 ] コンパイラより自分でアセンブったコードの方が速いと根拠もなく信じてる人もたまにいるので。
570 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:29:10 ] そんなん信じてる馬鹿ここにはまずこないんじゃないの
571 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:31:02 ] x86・RISCやキャッシュてんこ盛りのプロセッサだと今時のコンパイラを超えるのは至難だろうな。 組み込み系の貧弱な石ならアセンブラの方が速い事は多々あるけど。
572 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:31:52 ] コンストラクタ無し/デストラクタ無し/初期化されず説明の無いメンバ変数。 速いコードは書けないが、動かないコード晒されると更にやる気を削がれるな。 >>556 SSE使えるならむしろCって考え方も。 >>568 最近はmicro op fusionとかやってるから高級な命令の方がAMDみたく都合よくなるんじゃない?
573 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:34:07 ] 安価ミスった。556じゃなくて>>566
574 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 23:36:35 ] VCなんかだとthisポインタはecx渡しになるからそこんとこ考えてコード組む必要がある。
575 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 00:20:39 ] >>548 ところで、このコードは正しい結果が出るか確認したか?
576 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/14(金) 00:23:47 ] んでもって>>548 はecx使っちゃってるね
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 は使えないよ。