C、C++の最適化について語るスレ 2
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/04/29(日) 09:54:14主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。
なお、OS、CPU、コンパイラなどは限定しません
前スレ
C、C++の最適化について語るスレ
http://pc11.2ch.net/test/read.cgi/tech/1084676298/
0002デフォルトの名無しさん
2007/04/29(日) 12:32:250003デフォルトの名無しさん
2007/04/29(日) 15:13:320004デフォルトの名無しさん
2007/04/29(日) 15:18:14newしてそのポインタを詰めるとめがっさ軽くなる
0005デフォルトの名無しさん
2007/04/29(日) 15:36:28オブジェクトのコピーがボトルネックになってる場合に限るけどな。
0006デフォルトの名無しさん
2007/05/01(火) 17:49:32一旦プログラムのすべてを実行しなければならないとしたら、毎回実行条件の違う
科学計算などではどのように最適化すればよいのでしょうか?
0007デフォルトの名無しさん
2007/05/01(火) 22:49:32コンパイラはそれが機能しやすいようにする。
0008デフォルトの名無しさん
2007/05/02(水) 02:20:570009デフォルトの名無しさん
2007/05/02(水) 02:46:050010・∀・)っ-○◎●
2007/05/03(木) 03:46:080011デフォルトの名無しさん
2007/05/03(木) 14:12:120012デフォルトの名無しさん
2007/05/03(木) 14:48:47団子ちゃんが馬鹿にするな!
0013デフォルトの名無しさん
2007/05/03(木) 16:02:500014・∀・)っ-○◎●
2007/05/03(木) 16:06:590015デフォルトの名無しさん
2007/05/03(木) 18:16:38団子じゃなくたってね。
0016デフォルトの名無しさん
2007/05/03(木) 18:30:39何か高速な方法はありませんか?
0017デフォルトの名無しさん
2007/05/03(木) 18:35:44・初期化
・memset
0018デフォルトの名無しさん
2007/05/03(木) 18:37:15SSE2の使えるCPU用でいいなら、真っ当なコンパイラに適当なオプションを指定すれば、
勝手にベクタ化してくれる。
但し、極真っ当にループを書くこと。
0019・∀・)っ-○◎●
2007/05/03(木) 18:40:24たとえば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);
}
みたいな明示的ベクトル化は可能。
0020デフォルトの名無しさん
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; // 最小値を制限
です。
最小値もある程度決めてしまって構わないのですが、
これ以上高速に値を得る方法はありませんか?
0021デフォルトの名無しさん
2007/05/03(木) 19:39:08x &= ~((unsigned)x >> 24);
でいいかと。
0022デフォルトの名無しさん
2007/05/03(木) 20:27:030023デフォルトの名無しさん
2007/05/03(木) 20:29:06memset() は埋める値が 0 とか 0xff とかじゃないと使えないだろ。
0024デフォルトの名無しさん
2007/05/03(木) 22:17:18それいいですね!
~の方が速そうなんですが、
最後は0xffでマスクしないとゴミがのる可能性があるので、
ちょっと変えて、((unsigned)x >> 24) ^ 0xff として使わせてもらいます。
ありがとうございました^^
0025デフォルトの名無しさん
2007/05/03(木) 22:19:57その通り。
0026デフォルトの名無しさん
2007/05/03(木) 22:28:45のほうが速そうに見える
0027デフォルトの名無しさん
2007/05/03(木) 22:33:070028デフォルトの名無しさん
2007/05/03(木) 23:22:19たしかにそうですね。
と思い、コードを変更して計測してみました。
結果が、クロック単位でまったく同じだったのでおかしいと思い、
コンパイラの生成コードを見てみたのですが、、、
なんと、(((unsigned)x >> 24) ^ 0xff) が>>26とまったく同じようにコンパイルされてました
vc8すごい・・・
>>26さんもありがとうございました
0029デフォルトの名無しさん
2007/05/03(木) 23:46:170030デフォルトの名無しさん
2007/05/04(金) 00:36:410031・∀・)っ-○◎●
2007/05/04(金) 00:47:45アドレッシングモード使うのを期待する場面で
ロード+レジスタ間オペレーションに展開する
VC++は駄目な子
0032・∀・)っ-○◎●
2007/05/04(金) 00:49:210033デフォルトの名無しさん
2007/05/04(金) 01:17:32いまさらだがスレタイはこんな感じのにスレばよかったのに。
0034デフォルトの名無しさん
2007/05/04(金) 12:45:300035デフォルトの名無しさん
2007/05/04(金) 20:37:59がいい
0036・∀・)っ-くコ:彡-
2007/05/04(金) 20:40:450037デフォルトの名無しさん
2007/05/05(土) 17:06:49const hoge_t& hoge なんて参照渡しが使われるけど
これってVC8とか今時のコンパイラでも意味ありますかね?
0038デフォルトの名無しさん
2007/05/05(土) 17:20:440039デフォルトの名無しさん
2007/05/05(土) 17:24:20オブジェクトの作成を勝手に省略することは、
一部の例外を除いて規格上認められていないから、
今でも有効。
0040デフォルトの名無しさん
2007/05/06(日) 00:22:090041・∀・)っ-くコ:彡-
2007/05/06(日) 00:28:510042デフォルトの名無しさん
2007/05/06(日) 03:45:45ものによるが、キャッシュが効きやすくなるか、ベクタ化しやすくなるか、ループの最適化をしやすくなる。
AoS の方がこれらに有効なこともあるので、ものによるとしか言えん。
0043デフォルトの名無しさん
2007/05/08(火) 00:40:06�@直読み
�A算出時にローカル変数で一度算出しておき、それを参照(レジスタ参照で高速化を狙う)。Aは適当なところでローカル変数を代入
どちらがより良いソースコードになるでしょうか・・・。
�@は見やすくてコード量も減りますが、いちいちRAMにアクセスしそうなので実行速度に懸念があります。
�Aはローカル変数を用いることにより実行速度の向上を狙いますが、コード量の増加(ローカル変数増えまくり)や
オブジェクトサイズに懸念があります。
いまいちどちらにしたらよいかの判断が出来ませぬ・・・。
みなさまはどうされてます?
0044デフォルトの名無しさん
2007/05/08(火) 00:43:33待避と復旧用のコードが増えるだけでそ?
あと、レジスタに振られたローカル変数は消えるから。
0045デフォルトの名無しさん
2007/05/08(火) 00:50:12レスどうもです。
「関数・グローバル変数あたり」が分かりませんでしたが・・。
ローカル変数を用いてレジスタアクセスを狙っても結局スタックに退避したら
変わらないってことでしょうか?
0046デフォルトの名無しさん
2007/05/08(火) 01:15:000047デフォルトの名無しさん
2007/05/08(火) 06:09:18俺様用語で抽象的なコードの質問されてもなぁ。
自分で最低限のコードを書いて、コンパイラに最適化させてアセンブリ出力見比べてみなよ。
まぁ、>46って結論が待っているけど。
0048デフォルトの名無しさん
2007/05/11(金) 06:47:42最適化第二法則 まだ最適化するな
の意味の深さがまだ理解できていないと見えるな。
0049・∀・)っ-くコ:彡-
2007/05/12(土) 08:40:11性能上がったりするよな
VC++なんかはループの最適化だけはアグレッシブだから
ほとんど気にする必要ないんだが
0050デフォルトの名無しさん
2007/05/12(土) 12:15:260051・∀・)っ-くコ:彡-
2007/05/12(土) 12:29:070052デフォルトの名無しさん
2007/05/12(土) 13:31:430053デフォルトの名無しさん
2007/05/12(土) 13:33:480054デフォルトの名無しさん
2007/05/12(土) 13:35:58bcc32を使っているのですが、うまくいきません
0055デフォルトの名無しさん
2007/05/12(土) 13:40:260056デフォルトの名無しさん
2007/05/12(土) 13:40:260057デフォルトの名無しさん
2007/05/12(土) 13:41:430058デフォルトの名無しさん
2007/05/12(土) 13:42:040059・∀・)っ-くコ:彡-
2007/05/12(土) 13:44:270060デフォルトの名無しさん
2007/05/12(土) 14:29:43GCC も余裕で使える。
0061デフォルトの名無しさん
2007/05/12(土) 14:30:500062デフォルトの名無しさん
2007/05/12(土) 17:19:550063デフォルトの名無しさん
2007/05/12(土) 23:41:50C++ でも使えるってことなのかな?
0064デフォルトの名無しさん
2007/05/13(日) 00:06:030065デフォルトの名無しさん
2007/05/13(日) 01:21:120066・∀・)っ-くコ:彡-
2007/05/13(日) 01:45:590067デフォルトの名無しさん
2007/05/13(日) 03:40:230068デフォルトの名無しさん
2007/05/17(木) 16:38:100069デフォルトの名無しさん
2007/05/17(木) 16:42:450070デフォルトの名無しさん
2007/05/17(木) 16:43:210071デフォルトの名無しさん
2007/05/17(木) 17:04:130072デフォルトの名無しさん
2007/05/17(木) 17:29:12コピーコンストラクタが実行されないように
分けた方がいいやね。
0073デフォルトの名無しさん
2007/05/17(木) 17:39:47先ずは読み易く書き、適切なコンパイルオプションでコンパイルし、そこが速度上のネックになっていないか測定し、
ネックになっているようならそこで初めて、そこを抜き出して両方のケースを測定してみることだ。
まぁ、コンパイラが適当に最適化してくれるから大差ないと思うよ。
0074デフォルトの名無しさん
2007/05/17(木) 21:24:070075デフォルトの名無しさん
2007/05/18(金) 01:59:50書き込んだら書き込んだで叩かれるんだよな
0076デフォルトの名無しさん
2007/05/18(金) 02:04:33赤子と同じ。
0077デフォルトの名無しさん
2007/05/18(金) 08:26:430078デフォルトの名無しさん
2007/05/18(金) 11:36:25団子は学習した結果
0079デフォルトの名無しさん
2007/05/18(金) 13:50:28団子の圧勝か・・・。
0080デフォルトの名無しさん
2007/05/18(金) 20:13:30オレモナー
0081デフォルトの名無しさん
2007/05/18(金) 20:43:54込みいからが発言して欲モ激しから反芻してい団しい。
オレ子は好きだけど思ナー
0082デフォルトの名無しさん
2007/05/18(金) 21:04:05はっきり言って最強
0083デフォルトの名無しさん
2007/05/19(土) 00:29:200084デフォルトの名無しさん
2007/05/19(土) 00:30:360085・∀・)っ-くコ:彡-
2007/05/19(土) 00:38:34矢田亜希子たん取られますた
0086デフォルトの名無しさん
2007/05/24(木) 20:42:26どういうアルゴリズムを適用するとその並びになるのか教えてくれ
0087デフォルトの名無しさん
2007/05/24(木) 20:58:46攪拌ではない
0088デフォルトの名無しさん
2007/06/07(木) 10:55:11配列と比べても、実行速度は変わらないと考えてよいのでしょうか?
0089デフォルトの名無しさん
2007/06/07(木) 11:01:05ただ、それは別に [ ] でアクセスできるからという理由ではない。
こいつは演算子オーバーロードされてるから。
例えば deque なんかも [ ] でアクセスできるけど、
こいつはメモリ上の連続性は保証されてない。
0090デフォルトの名無しさん
2007/06/28(木) 02:32:29vectorは連続している事が保証されているので、いざとなったら先頭アドレスを取り出して配列としてアクセスすることも出来るよ。
あと、配列の[]やvectorのoperator[]は境界チェックをしないけど、vectorのat()は境界チェックをするよ。知ってたらごめんね。
0091デフォルトの名無しさん
2007/06/28(木) 17:21:44逆に言えば、添え字演算子[]で読み書きできるからといって、
メモリ上で要素が連続している保障があるとは限らない。
dequeとかmapとか。
0092デフォルトの名無しさん
2007/07/15(日) 14:57:490093デフォルトの名無しさん
2007/08/03(金) 20:43:46レジスタにある筈の値を何度もメモリに読みにいったり、
もう使わないローカル変数をメモリに書き込んだりしています。
ループの奥底なので許容できません。VTune で見てもボトルネックになって
いるようです。
深い理由があってのことででしょうか?
それとも、x64版の熟成が未完なのでしょうか?
32bit版との賢さの違いについてどんな印象をお持ちですか?
0094デフォルトの名無しさん
2007/08/03(金) 21:19:37飛びぬけた性能でもないような…。
体験版で試して、俺のプログラムはVCに全敗したから、買う
のやめた。Linuxだと他に選択肢が無いのかも知れんけどね。
0095デフォルトの名無しさん
2007/08/03(金) 21:42:37GCCとVCと比較してもっとも早かった。
64bit版はさすがに知らないけど。
マルチコアならレジスタにある値だけだとあんまり信用できないからかね?
0096デフォルトの名無しさん
2007/08/03(金) 22:02:010097デフォルトの名無しさん
2007/08/04(土) 01:58:07const付けられるところには全て付けてるよな?
関数ローカルのauto変数とか、クラスのメンバ関数(not変数)とかにも。
それでエイリアス問題とかが片付くから、割と変わるぞ。
0098デフォルトの名無しさん
2007/08/04(土) 02:10:28restrictキーワードが要る
0099デフォルトの名無しさん
2007/08/04(土) 03:29:23メンバ関数がconstなら、その関数内から見たらクラスのメンバ変数は皆const扱いだろ?
となると、複数のポインタor参照でメンバ変数を参照したり、キャッシュを持ったりしても実害が無いだろ?
変更がありえないんだから。
つまりエイリアスが発生しても、それが問題にならないケースがあるわけだ。
(グローバル関数経由の変更というものもあるので、確実じゃないけどな)
もちろん、クラスのメンバ以外を操作するならrestrictが必要だな。
それはおっしゃる通り。
0100デフォルトの名無しさん
2007/08/04(土) 12:12:12値が変化しないことの保証にはならない。
ポインタor参照経由の値は、
常にaliasの可能性があるとコンパイラはみなさなければならない。
というか、最適化のためのconstnessの判断はコンパイラがやることなので、
最適化フェーズではregisterキーワードよろしく無視されると考えていい。
と似たことを以前constでメシがナンタラというスレで書いた気がする。
0101デフォルトの名無しさん
2007/08/04(土) 13:00:20class 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 読み直し
}
0102デフォルトの名無しさん
2007/08/04(土) 15:53:02constがオプティマイザに無視されるということはないと思うぞ。
以前関わったプロジェクトで、constがろくについていなかったので
片端から付けた事があるんだよ。
結果リリースビルドのバイナリが大幅に変わってしまった。
速度的にはそれほどの向上は無かったのが残念だけど(ホットスポットは変わらなかった)
全体的にconstメンバ関数のインライン化が行われていた。
約1%ほどバイナリが肥大化したのはご愛嬌^^;
0103デフォルトの名無しさん
2007/08/04(土) 16:08:05それにその例だと、速度かわらず、バイナリが増えてるんなら無意味じゃないか。
0104デフォルトの名無しさん
2007/08/04(土) 16:12:560105デフォルトの名無しさん
2007/08/04(土) 19:43:09そこまで言うならメンバ関数への const の有無で出力コードの変わるソースを
出してみて欲しい。
0106デフォルトの名無しさん
2007/08/05(日) 01:23:48結局同じになってしまうな……
まあこの場合「const の有無で出力コードの変わるソース」が存在することを
証明できればいいのだから、最適化オプションの調整を含めて
もうちょっと詰めてみる。
こっちもデスマ中なので何日かかるかもしれないが、期待しないで待ってろ。
0107デフォルトの名無しさん
2007/08/05(日) 01:29:31つか、なにもデスマ中にやらんでも(´・∀・`)
元気なときにやろうぜ
0108デフォルトの名無しさん
2007/08/05(日) 02:29:18とりあえず「constで変わりうる」ということを出しておこうかなと。
C/C++では完全な参照透過性を保証する構文が無いから、
コンパイラにとって論理レベルでの最適化は難しいだろうが、
不可能では無い事を明示したい。
まあ今日は寝る。おやすみ。
0109デフォルトの名無しさん
2007/08/05(日) 02:56:49そこまでわかっていて不可能ではないと思う根拠はなんだろう?
楽しみにしてるよ。
0110デフォルトの名無しさん
2007/08/06(月) 22:23:24複数のファイルより条件に合う行を抜き出して一つのファイルに出力するプログラムを作ったんですが
処理に結構時間がかかってしまいます。何とか速度向上させたいのですが何か良い方法はないでしょうか?
本当は自分でいろいろ試行錯誤してやりたいのですが分け合って時間が取れなくて書き込みました。
0111デフォルトの名無しさん
2007/08/06(月) 22:26:470112デフォルトの名無しさん
2007/08/06(月) 22:35:17秀丸つかっとけ
0113デフォルトの名無しさん
2007/08/06(月) 22:36:36色々アドバイス頂きながら、返信せず申し訳ありません。
const はきちんと付ける主義です。
わざわざ、{} を追加して、スコープを絞っても、ローカル変数の
無駄な書き込みを止めさせることはできませんでした。
何となく、ICC x64のコンパイル結果って回りくどい気がするのです。
命令のレイテンシとかキャッシュ効率とか考慮された結果かな?
0114デフォルトの名無しさん
2007/08/06(月) 22:40:250115デフォルトの名無しさん
2007/08/06(月) 23:06:13「あーそうですか」としか言いようがないなぁ。
0116デフォルトの名無しさん
2007/08/08(水) 23:24:43何故か書き込み不能になった返信がさらに遅れました。
restrictを使っても、コンパイル結果が同じでした。
仕事絡みなのでコードを出せません。ご了承下さい。
ごく一部を出しても、実害はないと思いますがバレると
厄介なことになりますもので...
0117デフォルトの名無しさん
2007/08/08(水) 23:26:130118デフォルトの名無しさん
2007/08/09(木) 02:19:54いい流れだ
0119デフォルトの名無しさん
2007/08/09(木) 03:19:58とりあえずサンプルを作るのは諦めました。そこで
既存のプロジェクトからメンバ関数のconstを外す ⇒ エラーが出たところだけconstに戻す
という手順で相違点を調べました。(バージョン管理ツールは便利だねえ)
>>102の環境はVC7.1でしたがライセンスの関係で問題があるので
今回の環境は別のプロジェクトのCodeWarriorです。
で、リリースビルドの結果は以下の通り。
全関数(メンバ関数でないものやライブラリも含む) 12256個
constメンバ関数 253個
検証時にconstを削除出来なかったメンバ関数 24個
const削除前のコードサイズ 2899400 bytes
const削除後のコードサイズ 2899084 bytes
constを付けた方がコードサイズが増える傾向がありますが、CodeWarriorの場合は
インラインされやすくなるという傾向はありませんでした。
また、極端にパフォーマンスが変化するということはありませんでした。
(づづく)
0120デフォルトの名無しさん
2007/08/09(木) 03:40:23const有りだと分岐命令の後に来ている命令が
const無しだと分岐命令の前に来ている
という現象が所々に見られました。
いつ評価しても同じなら分岐の後で評価したほうが得、ということなんでしょうか。
(遅延評価に似てる?)
サンプルを上げようかと思ったけど、きわめて眠いのでまた今度。
明日か明後日までに適当なアップローダの紹介を希望。
ではおやすみなさい。
0121デフォルトの名無しさん
2007/08/09(木) 07:15:32よくわからんからサンプルが欲しいな。ろだ↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0122デフォルトの名無しさん
2007/08/09(木) 10:42:03ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=4841
全部上げるわけにもいかんので加工してある。
詳細は添付のreadme.txtを読んでくれ。
じゃ俺は戦場に戻る。
0123デフォルトの名無しさん
2007/08/10(金) 09:31:04リストファイル中のソースとの対応がずれてたり、命令数の違いでアドレス部が
ずれてたりしてるけど、本当に命令レベルの違いだけを抽出すると、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)
--
0124123
2007/08/10(金) 09:54:07app 内のポインタが指す配列か構造体から1つ値を読み出してるって感じ
なんだけど、やっぱり CheckMenu() のソースが欲しいな。ダメ?
const無しのほうにある addiu の結果は使われて無いように見える。
あれ? const 付けたほうがコード増えるって言ってたけど、ここでは
1命令減ってるね。
0125123
2007/08/10(金) 10:03:26出て処理が変わってるだけじゃないだろうか?
たとえば std::bitset::operator [] (size_t) なんかだと、 const 版は単に bool が
返るけど、非 const 版は代入もできるプロキシオブジェクトが返るのでかなり
違った処理になるはず。
0126123
2007/08/10(金) 10:31:24app のメンバオブジェクトについて const 版が int を返して、
非 const 版が int& を返すようなオーバーロードが使われてる予感。
んで int& だと続く書き込みに使いまわせるからレジスタに置かれた、と。
0127デフォルトの名無しさん
2007/08/10(金) 11:09:190128デフォルトの名無しさん
2007/08/10(金) 21:42:460129デフォルトの名無しさん
2007/08/12(日) 22:50:05辛辣なツッコミを期待していたんだけど、ちょっと物足りないかしら。
まあ、相手してくれてありがとう。
以下質問に対するごお返答。
>>122
CheckMenu()は以下のようなコードになっている。オーバーロードはされていない。
bool CApplication::CheckMenu(int n) { return (m_MenuStatus == n); }
ちなみにappはCApplication型のグローバル変数。constではない。
>>128
出力バイナリは違っているのに、そう言いきれるのはなぜ?
0130デフォルトの名無しさん
2007/08/12(日) 22:51:520131デフォルトの名無しさん
2007/08/12(日) 23:42:01関数の中身を晒してくれてありがとう。そういうことなら、素の int 型メンバ変数の
読み取りについてコンパイラ内部で >>126 の言うオーバーロードと似たような扱いが
されているんだろう。
今回の例では const が無い場合に int& をキャッシュするために命令数が一つ
増えたとすると、前後の処理内容によってはその int& のキャッシュによって効率が
上がることも考えられる。いつでも const を付けたほうが効率が良いとは言えない。
今回の例で、コンパイラが const 無しの場合に const 付きの場合と同じコードを
吐いても何ら規格に違反しない。最適化の詰めが甘かっただけとも言える。
0132デフォルトの名無しさん
2007/08/13(月) 10:42:15mutableしてない変数に代入しようとしてたらエラー吐くだけの
0133デフォルトの名無しさん
2007/08/13(月) 14:57:53・関数の戻り値が引数とインスタンスの内容にのみ依存する。
つまり、
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; に最適化できる。
0134デフォルトの名無しさん
2007/08/14(火) 02:07:27変数定義時の const はそうでもないよ。 const 付きで宣言された変数は
ポインタや参照を関数に渡した後でも、値が元のままであることを期待して
最適化してもいい。
これに対してポインタ・参照の指す先の型や、メンバ関数に付ける const は
ほとんどコード生成に影響しないという話。
0135デフォルトの名無しさん
2007/08/14(火) 02:10:47それはダメでしょ。
T の宣言に const が付いてないので T.bar() の中で const_cast して
値を変更しても合法なはず。
0136デフォルトの名無しさん
2007/08/14(火) 02:59:32>ポインタや参照を関数に渡した後
では読み直しをやってるなあ。
環境はVC8とgcc3.4.4(cygwin)
0137デフォルトの名無しさん
2007/08/14(火) 03:34:58どんなソースで試したの?
以下のソースだと 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;
}
0138137
2007/08/14(火) 03:35:310139デフォルトの名無しさん
2007/08/14(火) 09:55:00struct 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修飾に依存しない。(あれれ?)
0140デフォルトの名無しさん
2007/08/14(火) 10:20:39ほんとだ。これは期待はずれだなぁ。
コンストラクタ内での代入を許すために const として定義されたという情報が
途切れてしまっている、って感じ?
メンバのほうに const を付ければ代入を許すタイミングは無いから、 >>137 と
同様に最適化できる、と。
0141デフォルトの名無しさん
2007/08/21(火) 08:34:45VTune で、Clockticks をサンプリングすると"No Samples were collected."
になってしまいます。
Sample After Value を変えろ、との記述を見つけて試しましたが、
うまくいきません。(他の event は収集できます)
対策をご存知の方はいらっしゃらないでしょうか?
0142デフォルトの名無しさん
2007/08/21(火) 21:48:51使っていたのが一つ前のバージョンのVTune だったので、
quad core に対応していなかったようです。
最新版の体験版をインストールしたらうまくいきました。
それにしても、何のエラーメッセージも出ず、Clockticks
だけ収集できないとは、恐ろしい。
0143デフォルトの名無しさん
2007/08/25(土) 12:59:29コンパイラにヒント出す方法って無いですか?
分岐の先頭でcase以外を範囲外として弾くのが状況として
ありえないのでもったいないです。
環境非依存でもVC6,7,8限定の方法でもかまいません。
よろしくお願いします。
0144デフォルトの名無しさん
2007/08/25(土) 13:51:02こういう場合だったら、
switch(hoge)
{
case 1:
//1の処理
case 2:
//2の処理
default:
//ここに来ることは絶対にない
}
こうすればいいんでないの?
switch(hoge)
{
case 1:
//1の処理
default:
//2の処理
}
0145デフォルトの名無しさん
2007/08/25(土) 13:58:11環境非依存ではそんなものはない。
c++であれば、enum型を使うことで慮ってくれるコンパイラがあるかもしれない。
0146デフォルトの名無しさん
2007/08/25(土) 14:40:46アセンブラコードを見てみたところ
1・範囲外チェック
2・テーブルジャンプ
という流れにコンパイルされていました。
case 1:
//1の処理
default:
//2の処理
これだとdefaultの処理+テーブルジャンプの処理になってしまって、
結果的に範囲外チェックしているのと負荷は変わらないようです。
>>145
enum試してみます。
ありがとうございました。
0147143
2007/08/25(土) 14:41:250148デフォルトの名無しさん
2007/08/25(土) 14:51:290150デフォルトの名無しさん
2007/08/25(土) 15:28:49>144の前者のケースなら、
switch (hoge)
{
case 1:
...;
case 2:
default:
...;
}
でいいんでない?
0151デフォルトの名無しさん
2007/08/25(土) 15:29:370153デフォルトの名無しさん
2007/08/25(土) 20:23:00gcc限定ならコメントでなんか記述すればコンパイラが理解してくれた気がする。
0154・∀・)っ-くコ:彡-
2007/08/25(土) 20:54:240155デフォルトの名無しさん
2007/08/25(土) 21:02:190156デフォルトの名無しさん
2007/09/24(月) 00:02:220157デフォルトの名無しさん
2007/09/24(月) 13:53:56♪ ∧,, ∧´・ω・) 美脚♪
∧,, ∧´・ω・) )
♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧
∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ )
(´・ω・) )っ__フ(_/彡 ∧,, ∧ ) )
(っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ
( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_)
(_/彡 ( ) ) Οノ 'ヽ_)
( ) Οノ 'ヽ_)
(ゝ. Οノ 'ヽ_) ♪
♪ ミ ヽ_)
0158デフォルトの名無しさん
2007/10/06(土) 14:06:35ある処理をループしようと思っているんですが、その時に、
カーソルとして使用するポインタを(ローカル変数として)毎回宣言するのと、
あらかじめ外部で宣言したものを使いまわすのではどちらが高速なのでしょうか?
0159デフォルトの名無しさん
2007/10/06(土) 14:39:57大丈夫、そんなもんは真っ先にコンパイラの最適化の餌食になるから。
それ以前に、ポインタで回すよりも配列参照で回す方が速いかも知れない。
いずれにしても、ケース・バイ・ケースだから実測するべし。
0160デフォルトの名無しさん
2007/10/06(土) 14:41:04♪ ∧,, ∧´・ω・) 美脚♪
∧,, ∧´・ω・) )
♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧
∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ )
(´・ω・) )っ__フ(_/彡 ∧,, ∧ ) )
(っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ
( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_)
(_/彡 ( ) ) Οノ 'ヽ_)
( ) Οノ 'ヽ_)
(ゝ. Οノ 'ヽ_) ♪
♪ ミ ヽ_)
0161158
2007/10/06(土) 15:01:50なるほど。コンパイラに頼れそうですね。
配列については任意の位置に追加、削除等の関係から使えませんでした。
ありがとうございました。
0162poooh ◆manko/yek.
2007/10/06(土) 16:10:390163デフォルトの名無しさん
2007/10/06(土) 17:34:590164デフォルトの名無しさん
2007/10/06(土) 17:54:040165デフォルトの名無しさん
2007/10/06(土) 18:27:36高速化の仕事ってどんな感じなの?
今の職場では高速化の効果が工数の割に合わないと言われることが多くて
バグ改修時についでに高速化する程度しかやらせて貰えない。
既存機能を維持しつつどうやって安全に高速化してるの?
グローバル変数触るなら単体テストだけじゃ足りないよね?
0166デフォルトの名無しさん
2007/10/06(土) 20:10:46そんなんだからやらせて貰えないんだぜw?
0167デフォルトの名無しさん
2007/10/06(土) 20:12:210168164
2007/10/06(土) 21:00:330169165
2007/10/06(土) 21:36:19高速化で受けた業務なら性能試験はやるんじゃないの?
単体テストしかしないなら関数単位の高速化なのかな? ライブラリ系?
参考までに、使ってる測定ツールとか教えてくれないかな。
それにしても、コード解析結果と単体テスト結果で話がつくとはな。
俺んとこだと結合試験と性能試験やらずに改修完了なんてまず了承されないよ。
0170デフォルトの名無しさん
2007/10/06(土) 21:53:07依頼主だって全部の環境晒せるような物ばかりとは限らんわけだし。
0171デフォルトの名無しさん
2007/10/06(土) 22:17:430172デフォルトの名無しさん
2007/10/07(日) 21:26:420173デフォルトの名無しさん
2007/10/11(木) 07:30:27♪ ∧,, ∧´・ω・) 美脚♪
∧,, ∧´・ω・) )
♪∧,, ∧´・ω・) )っ__フ ♪ ∧,, ∧
∧,, ∧´・ω・) )っ__フ(_/ 彡 .∧,, ∧ )
(´・ω・) )っ__フ(_/彡 ∧,, ∧ ) )
(っ )っ__フ(_/彡 .∧,, ∧ ) ) Οノ
( __フ(_/彡 ∧,, ∧ ) ) Οノ ヽ_)
(_/彡 ( ) ) Οノ 'ヽ_)
( ) Οノ 'ヽ_)
(ゝ. Οノ 'ヽ_) ♪
♪ ミ ヽ_)
0174デフォルトの名無しさん
2007/10/17(水) 08:10:23{
//ループの中身
}
って
for (int i=0;i<10;i++)
{
//ループの中身
}
より高速?
0175デフォルトの名無しさん
2007/10/17(水) 10:40:19上の方がループの回数が多いから遅い。
0176デフォルトの名無しさん
2007/10/17(水) 12:55:44for (int i=0;i<9;i++)
{
//ループの中身
}
でした
0177デフォルトの名無しさん
2007/10/17(水) 13:16:29>175は間違い。>174でループ回数は同じになっている。
で、どちらも同じ速度のコードになったよ(icc -fastで)。
実測したら、後者の方が気持ち速かった。と言っても、差は10msオーダーだけど。
--
for (int i = 0x7000 * 0x10000; i--;) func();
for (int i = 0; i < 0x7000 * 0x10000; i++) func();
--
0178デフォルトの名無しさん
2007/10/17(水) 13:32:580179デフォルトの名無しさん
2007/10/17(水) 15:04:30ありがとう、やっぱりふつうに記述した方が、コンパイラにとってもいいようですね。
0180・∀・)っ-くコ:彡-
2007/10/18(木) 00:31:08まあ自動で最適化してくれるけど
0181デフォルトの名無しさん
2007/10/18(木) 10:54:47for (i = 0; i < n; i++)
これと、誘導変数を使った
/*2*/
for (ii = -n; ii < 0; ii++)
i = n + ii;
それぞれについて、生成コードを予想
また実際の処理系に生成させたコードを評価せよ (n点)
0182デフォルトの名無しさん
2007/10/18(木) 12:17:320183デフォルトの名無しさん
2007/10/18(木) 12:38:280184デフォルトの名無しさん
2007/10/18(木) 12:41:360185デフォルトの名無しさん
2007/10/18(木) 13:05:000186デフォルトの名無しさん
2007/10/18(木) 13:39:29こりゃ使える。いただき。
a[i]みたいにiをインデックスで使う場面では
a[n+ii]に対して&a[n]==a+nがループ内不変になるね。
つかiは符号付き整数だろw
で、おれ何点?
0187519
2007/10/18(木) 13:41:59for (i = 0; i < n; i++);
は i=n; という式に展開される可能性がある。
for (ii = -n; ii < 0; ii++) i = n + ii;
もnが定数ならば定数代入式に展開される可能性がある。
ていう最適化機能がgccにあったような…?記憶違い?
0188デフォルトの名無しさん
2007/10/18(木) 16:04:410189デフォルトの名無しさん
2007/10/18(木) 16:18:580190デフォルトの名無しさん
2007/10/19(金) 09:21:061つの乱数から、分割するなどして100個効率よく発生させることはできないでしょうか?
0191デフォルトの名無しさん
2007/10/19(金) 09:28:51並列化するってこと?
100個乱数拾うだけならたいした変化は無いと思われ
0192デフォルトの名無しさん
2007/10/19(金) 09:43:070193デフォルトの名無しさん
2007/10/19(金) 12:21:09でも内部的にはループだしな
0194デフォルトの名無しさん
2007/10/19(金) 18:51:2164bitの乱数があったとしてそれをそれを8bit区切りに4つに分けて
8bitの乱数4つとして使えるかってこと?
乱数の質は悪くなると思うけど、どうだろ?
0195190
2007/10/20(土) 05:36:18現在はMTを使っています。
計算精度は32bitのfloatでやっているのですが、乱数は64bitのdoubleなので、
それを単純に上位と下位に分けて、一回で2回分使えないかと考えています。
もうひとつ考えているのは、64bitで生成された乱数を、ローテートで1bitずつずらして
一回のMTで64個の乱数が生成できないかということです。
ただ、この場合、乱数の質が元のMTに対してどのようになってくるのかがわかりません。
0196デフォルトの名無しさん
2007/10/20(土) 05:45:190197デフォルトの名無しさん
2007/10/20(土) 06:46:44少なくとも2番目の方法はいくない。
例えば一番左のビットが0の場合、左にローテートしたら元の数の2倍になる。
つまり64個の乱数の中に、大量のaとa*2が入り込む非常に膣の悪い乱数になるよ。
0198デフォルトの名無しさん
2007/10/20(土) 07:42:54乱れすぎw
0199デフォルトの名無しさん
2007/10/20(土) 08:45:07最初の方法もダメ。
MTのdoubleは基本的に仮数部32bitなので分割した下の方は精度が腐る。
仮数部53bitの方は乱数を2個使っているし。
0200190
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の選び方には何か決まりがあるのでしょうか?
0201デフォルトの名無しさん
2007/10/20(土) 13:19:11sineくれくれ厨
0202デフォルトの名無しさん
2007/10/20(土) 14:14:150203デフォルトの名無しさん
2007/10/20(土) 15:24:11質が悪いって言うけど、どの一部を取り出してもそういった偏りが全く無いほうが質が悪いでしょ。
固定の種にしたいなら好きなだけ選びなよ。
0204デフォルトの名無しさん
2007/10/20(土) 15:28:190205デフォルトの名無しさん
2007/10/20(土) 15:58:230206デフォルトの名無しさん
2007/10/20(土) 17:18:590207デフォルトの名無しさん
2007/10/20(土) 19:44:180208デフォルトの名無しさん
2007/10/21(日) 00:53:23誰か説明してくれ
0209デフォルトの名無しさん
2007/10/21(日) 12:35:59このスレは馬鹿なお前のためにあるんじゃない
0210デフォルトの名無しさん
2007/10/21(日) 19:33:52乱数の種で複数の値とるとき
互いに素ってのと2の累乗を自分は使わないようにしているけど…
根拠がない。それに小さすぎる値も使わないようにしている。(1とか2とか…)
0211デフォルトの名無しさん
2007/10/23(火) 01:51:46void srand_xor128(void){ w^=(unsigned)time(0)*1812433253; }
とかwだけ変更すればたぶんおk。心配なら最初の十万個位捨てたら。
0212デフォルトの名無しさん
2007/11/07(水) 04:00:14関数内で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, };
にしろということなのです。
メモリが厳しいらしいのですが、これで本当に節約になるんでしょうか。
0213デフォルトの名無しさん
2007/11/07(水) 04:34:13実際にコンパイルしてアセンブリ出力を眺めてみれば?
前者は静的領域に確保されることが保障されていて消えることは多分ないが、
後者は最適化で消える可能性がある。
しかし、後者は静的領域からスタックにコピーする最悪なコードになるかもしれない。
それはさておき、100要素指定しておいて6個しかないと激しく無駄だと思う。
0214デフォルトの名無しさん
2007/11/07(水) 04:36:44メモリの節約にはならないだろう。
一般的な実装を予測すると、 static をはずしてもスタックに確保された配列を
初期化するためのコピー元となる配列が作られてしまう。この初期値の配列が
static をつけた場合に確保される実体と同等のはずなので、 static をはずすと
スタックの領域と初期化用コピーの処理時間が余計に増えるだけになる。
動作上の違いは、再帰呼び出ししたときに配列のアドレスが別物になるかどうか、
という点しかないはず。
はっきり言って逆効果だろう。そのルール決めた人に理由を問い詰めたほうがいい。
非 const な変数に限ってローカル static を禁止するのなら、メンテナンス性の観点から
まだ理解できる。
0215デフォルトの名無しさん
2007/11/07(水) 04:56:45こちらは宣言されている場所にかかわらずプログラムの開始直前にメモリを確
保し初期化します。初期化を忘れた場合値は0になります。
また、確保された領域はプログラムが終了するまで保持されるので関数の終了
時に値が消えることがありません。2回目以降関数内のstaticオブジェクトを
利用するときは前回の値から始まります。
0216デフォルトの名無しさん
2007/11/07(水) 05:00:13あとはいちいち細かいモジュールに制限加えることはない
0217デフォルトの名無しさん
2007/11/07(水) 10:01:37逆(実際はstatic推奨)か、厳しいのはスタックか。
0218デフォルトの名無しさん
2007/11/07(水) 10:40:482M = 2000000バイトくらいは使用できるんだろ? 400を繰り返し使ってメモリリークするとかなら
考慮するひつようあるだろうけど使用後に解放されるなら他のプログラムに影響しないと思うが
500K = 500000バイトくらい使うところから節約しろよ
0219デフォルトの名無しさん
2007/11/07(水) 10:54:42for (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です。
0220デフォルトの名無しさん
2007/11/07(水) 11:05:35配列に掛け算できないならコンパイラが壊れている
0221デフォルトの名無しさん
2007/11/07(水) 11:08:34非常にシンプルなサンプルを作って試したら、どちらのケースもベクタ化できるようだよ。
配列aが何か特殊なことになってないかい?
再現できるソースは貼れないかな?
0222212
2007/11/07(水) 20:11:28私は開発機でコンパイルする権限も無い下っ端なのですが、
腑に落ちなかったモヤモヤが少し晴れました。
0223デフォルトの名無しさん
2007/11/10(土) 05:11:33インライン展開とかも出来て
あと、1万回するときに100回と100個展開した方が良いですか?
0224デフォルトの名無しさん
2007/11/10(土) 05:14:18余計なことせずにコンパイラに全て任せるのが正解だ。
0225デフォルトの名無しさん
2007/11/10(土) 05:17:580226デフォルトの名無しさん
2007/11/10(土) 06:01:10助けてください!!
0227デフォルトの名無しさん
2007/11/10(土) 06:04:490228デフォルトの名無しさん
2007/11/10(土) 06:08:40C言語の宿題がわからなくてこまってます!
明日ってか今日までなんです〜
一緒に考えてくれる人いませんか?
お願い助けて〜
0229デフォルトの名無しさん
2007/11/10(土) 06:28:53って既にマルチしてるな。
0230デフォルトの名無しさん
2007/11/13(火) 17:18:260231デフォルトの名無しさん
2007/11/13(火) 17:20:170232デフォルトの名無しさん
2007/11/14(水) 00:43:45読み込みのみなら気にしなくていい
書き込みが絡む場合はスレッドセーフではない
手軽にスレッドセーフにしてくれる拡張構文も最近はあったりする
(スレッドローカルストレージ)
0233デフォルトの名無しさん
2007/11/14(水) 08:05:03初期化のときに問題にならない?
0234デフォルトの名無しさん
2007/11/14(水) 08:42:090235デフォルトの名無しさん
2007/11/14(水) 10:03:360236デフォルトの名無しさん
2007/11/14(水) 11:48:44予定つまってて2週間ほど読めないけど…
0237デフォルトの名無しさん
2007/11/14(水) 12:42:420238デフォルトの名無しさん
2007/11/14(水) 16:04:29やはりLinuxの本という印象。
Windowsしかまともに開発してないから
あんまり楽しめなかった。
0239デフォルトの名無しさん
2007/11/14(水) 22:45:130240デフォルトの名無しさん
2007/11/14(水) 23:21:09ありがとう。やっぱりそうか。
0241デフォルトの名無しさん
2007/12/24(月) 08:55:430242デフォルトの名無しさん
2007/12/24(月) 12:22:500243デフォルトの名無しさん
2007/12/24(月) 12:26:180244デフォルトの名無しさん
2008/01/01(火) 19:54:170245デフォルトの名無しさん
2008/01/14(月) 22:48:150246デフォルトの名無しさん
2008/01/22(火) 15:39:00これ豆知識な。
0247デフォルトの名無しさん
2008/01/22(火) 15:52:070248デフォルトの名無しさん
2008/01/22(火) 16:53:00「1足すならaddよりincの方が速い」とかも同様。
俺の様なジジイの豆知識はほとんど役に立たん。
0249デフォルトの名無しさん
2008/01/22(火) 16:57:450250デフォルトの名無しさん
2008/01/22(火) 18:22:31つうか、だから伸びないんだなorz
VCの吐くコードとか見てると感動するけど、時々「?」と感じるときがあるのも事実。
そういうのを減らすための豆知識とか、誰か披露してくれまいか。
0251デフォルトの名無しさん
2008/01/22(火) 18:51:090252デフォルトの名無しさん
2008/01/22(火) 21:23:21>俺のCPUは割り算よりシフトの方が時間かかるんだけど
こういうCPUは寡聞にして知らない.教えてくれないか?
0253デフォルトの名無しさん
2008/01/22(火) 21:27:300254デフォルトの名無しさん
2008/01/22(火) 21:34:130255デフォルトの名無しさん
2008/01/22(火) 21:42:07アセンブリで比較してると信じたいのだが・・・
C でやってる悪寒
0256デフォルトの名無しさん
2008/01/22(火) 22:18:223ビットのシフトの方が÷2より時間がかかる
と言う詭弁は可能かと。
0257デフォルトの名無しさん
2008/01/23(水) 03:30:02まともな割り算は必ずシフタ使うから普通はないが.
0258デフォルトの名無しさん
2008/01/24(木) 14:02:420259デフォルトの名無しさん
2008/01/24(木) 15:54:310260デフォルトの名無しさん
2008/01/25(金) 00:01:500261デフォルトの名無しさん
2008/01/25(金) 11:22:17昔とはだいぶ違うよ
0262デフォルトの名無しさん
2008/01/25(金) 13:52:45あれ、14じゃね?
0263デフォルトの名無しさん
2008/01/29(火) 12:42:52if(a == 1){ if(b == 1){ asdf } } に等しくて、これだと条件分岐が多くその分投機予想も外れる可能性があがるので
if((a == 1) & (b == 1)){ asdf; } にすべきだ、っていう話を聞いたんですが、これは本当なんでしょうか?
もしくは、そんな事は演算子がオーバーロードされていない限り明確に分かりきった事なので
あらかじめコンパイラが論理積を (a == 1) & (a == 1) と同等の処理に最適化してくれたりとかはないんでしょうか?
0264デフォルトの名無しさん
2008/01/29(火) 12:57:59実験してみた。最適化できるみたい。
$ 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
0265264
2008/01/29(火) 13:01:03使っているコンパイラでは結果が違うかもしれない。そういう環境で、且つ、実際に
そのレベルの高速化が必要ならビット AND への置き換えもありうる。ただしその場合は
しっかりコメントで実験結果に基づくコードだと添えておく必要があるだろうね。
0266デフォルトの名無しさん
2008/01/29(火) 13:11:040267デフォルトの名無しさん
2008/01/30(水) 20:35:230268デフォルトの名無しさん
2008/01/30(水) 20:41:110269デフォルトの名無しさん
2008/01/30(水) 20:46:260270デフォルトの名無しさん
2008/01/30(水) 20:46:55gccの話だけど
0271デフォルトの名無しさん
2008/01/30(水) 20:47:270272デフォルトの名無しさん
2008/01/31(木) 13:23:040273デフォルトの名無しさん
2008/01/31(木) 14:21:21唐突に質問されても何を聞きたいのか判りませんが。
同じ内容でも型が違う場合はC++ではテンプレート関数で一つで済ませることもできますが、
Cではできません。その辺りの話でしょうか?
0274デフォルトの名無しさん
2008/01/31(木) 14:30:48そうではなく、
void foo1(int hoge){};
void foo2(int hoge){};
void foo3(int hoge){};
中の処理も全く同一な関数です
オーバーロードだとかそういうのでも全くないです
0275デフォルトの名無しさん
2008/01/31(木) 14:35:21別に意味なんてないと思うが。訳が分からん。
typedef void (*func_t)(int);
とやっておいて、どこかでfunc_tの変数を宣言してそれらを代入し、
fptr1 = foo1;
fptr2 = foo2;
if(fptr1 == fptr 2){ ... }else{ .. }
として、処理は同じだけど違うものとして動作させたいと言うくらいしか思いつかないな。
意味があるかないか、どちらにしろそのソースコードを書いた人に直接訊いてみれば良い。
0276デフォルトの名無しさん
2008/01/31(木) 14:38:01現状で言えばまとめてしまって構わないとは思うが。
0277デフォルトの名無しさん
2008/01/31(木) 14:49:44多分違うケースなんだろうけど。
0278デフォルトの名無しさん
2008/01/31(木) 19:56:47目的があれば意味があるんじゃないの?
0279デフォルトの名無しさん
2008/01/31(木) 19:57:35文字列としては length という言葉を使う方がしっくりくるが、
コンテナとしての要件を満たすには size がないと困る。
なら両方作っちゃえって感じなんだろう。
こういう例ならありうると思う。
0280デフォルトの名無しさん
2008/02/02(土) 20:08:27自分で実装するのは.NETに頼らなくて済む、以外のメリットないのかなぁ・・
このまま行くと.net病になりそうだ・・・
どうすりゃ効率いいかなぁ・・
0281デフォルトの名無しさん
2008/02/02(土) 20:18:240282デフォルトの名無しさん
2008/02/02(土) 20:18:250283デフォルトの名無しさん
2008/02/02(土) 20:20:15>>281
Windows専用なら.NET全然良いかな、と思う
でも趣味でやってる分には微妙に素直に割り切れないというかなんというか
0284デフォルトの名無しさん
2008/02/02(土) 20:24:31言い過ぎの誇張表現になるけどそのすべてにおいてMS開発陣の書いたコード以上のものを書けるのかってことになる
つまり.NETを1箇所以上で使うなら出来得る限り.NETで実装を
0285デフォルトの名無しさん
2008/02/02(土) 20:25:360286デフォルトの名無しさん
2008/02/02(土) 20:26:180287デフォルトの名無しさん
2008/02/02(土) 20:26:47lengthはsizeを呼ぶだけとかってなら、アリだね。
極力重複コードは避けるべき。
0288デフォルトの名無しさん
2008/02/02(土) 20:28:45>>284
コードの数割は.NETのを利用したもので、主要な処理の部分だけちょっとがんばって
頼らず書こうかなと思ってたんだけどそのままにしときます
0289デフォルトの名無しさん
2008/02/02(土) 21:15:210290デフォルトの名無しさん
2008/02/03(日) 02:50:44重複コードは inline 関数のおかげで簡単に避けられるね。
Ruby とか同じ動作の別名関数が用意されてる事が多い。
A という言語では a という名前で、
B という言語では b という名前な関数を Ruby に作る時には、
a と b の両方の名前を採用しちゃえ、みたいな。
0291デフォルトの名無しさん
2008/02/03(日) 03:04:150292デフォルトの名無しさん
2008/02/03(日) 03:12:280293デフォルトの名無しさん
2008/02/03(日) 03:13:17関数はインライン関数で、
型は typedef で、
名前空間は namespace a = b; で、
クラステンプレートは継承でそれぞれ可能ではある。
ただ、インライン関数使うのと、
クラステンプレートを継承するのとは、
結構面倒臭い。
0294デフォルトの名無しさん
2008/02/03(日) 03:16:110295デフォルトの名無しさん
2008/02/03(日) 12:27:22typedef std::vector my_vector;
みたいなの。>>293にも書いてある継承は可能ってレベルではない。
コンストラクタやらオペレータやら全部知っていて、尚かつ書かないといけない。
0296デフォルトの名無しさん
2008/02/03(日) 12:33:01コンストラクタは作らないとダメだけど。
0297デフォルトの名無しさん
2008/02/03(日) 13:55:01継承しちゃうと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
}
0298デフォルトの名無しさん
2008/02/03(日) 14:01:54ああ、なるほど。
というか、色んな状況を考えると継承では不完全なのか。
0299デフォルトの名無しさん
2008/02/03(日) 16:10:51hoge.piyo = hoge.piyo & ~sym.att;
こんなのはこれ以上どうにもなりませんよね?
0300デフォルトの名無しさん
2008/02/03(日) 18:04:15hoge.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以外は保守性が悪くなるだけであんま効果無いと思う。
実測した方がいい。
0301デフォルトの名無しさん
2008/02/03(日) 20:29:28なるほど・・-ってのを初めてみたんで調べてきます、ありがとうございます
0302デフォルトの名無しさん
2008/02/03(日) 23:44:47x86なら分岐せずにSETcc + NEGにコンパイルされるはず。
0303デフォルトの名無しさん
2008/02/04(月) 00:57:100304デフォルトの名無しさん
2008/02/04(月) 01:00:290305デフォルトの名無しさん
2008/02/04(月) 13:36:34CMOVになったところで大した差は出ないだろ。
0306デフォルトの名無しさん
2008/02/04(月) 13:37:59どのみちOSの機能頼りなわけだから
0307デフォルトの名無しさん
2008/02/04(月) 13:39:360308デフォルトの名無しさん
2008/02/04(月) 13:41:01早くする、ですほんとごめんなさいごめんなさいごえmんあい
0309デフォルトの名無しさん
2008/02/04(月) 13:43:14速いかどうかは知らんが。
0310デフォルトの名無しさん
2008/02/04(月) 13:48:24コードレベルの最適化とは無縁だが。
0311デフォルトの名無しさん
2008/02/04(月) 13:54:21ストライピング、調べてきました
それだと送り先が2箇所なのかな・・・
コピー元も先も1箇所なんです
というかコードレベルって話じゃないですよね、把握しました
0312デフォルトの名無しさん
2008/02/04(月) 13:55:51HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet
/Control/Session Manager/Memory Management
ここの数値を
というか普通こんなことしねえよな・・
0313デフォルトの名無しさん
2008/02/04(月) 13:58:42実際問題、ファイルアクセスの速度はデバイス側の事情で決まってしまう。
と言うことで、単純に速くする方法はない。
寧ろ、本当にファイルコピーの時間が問題なのか、例えばレスポンスが問題なのか、検討した方がいい。
0314312
2008/02/04(月) 13:59:50確か再起動必要だった気がするし
0315311
2008/02/04(月) 14:12:46最近、.NETFrameworkというものを触ってみまして
色々試してみようとコンソールなんですがファイルをコピー(バックアップ?)する
ものを作ってみたんですが、そこでコピー自体速くならないかなあと思った次第です
>>312>>314
再起動必要じゃあれですね・・・
Win32APIとかってのもWindowsの機能を使うやつだって聞いたんで
それでファイルのコピーするとこを実装すれば速いんだろうか
0316デフォルトの名無しさん
2008/02/04(月) 14:20:28先ず、.Netって時点でスレ違い。
次に、ファイルコピー自体の速度はデバイス依存だ。
.Netでファイルコピーしていて遅いと思うのなら、コードレベルの最適化ではなく.Netの使い方の問題だ。
0317デフォルトの名無しさん
2008/02/04(月) 14:23:52たぶん.NETでもAPIでも使った方が良い
ということでもうそれで完成でいいじゃない
0318デフォルトの名無しさん
2008/02/04(月) 22:14:23Windows 限定なら FastCopy.exe のソースとか見ればいいんじゃないか。
0319デフォルトの名無しさん
2008/02/04(月) 22:28:220320デフォルトの名無しさん
2008/02/04(月) 23:24:120321デフォルトの名無しさん
2008/02/04(月) 23:30:10まあ例外は確かに往々にあるけど例外は圧倒的にマイノリティ
うちも業務じゃC/C++なんて使わないわ
0322デフォルトの名無しさん
2008/02/05(火) 00:05:18Webでもやってろ。
0323デフォルトの名無しさん
2008/02/05(火) 00:09:410324デフォルトの名無しさん
2008/02/05(火) 00:10:330325デフォルトの名無しさん
2008/02/05(火) 00:14:07まあ業務になると大抵どっちかだけ向いてればいいんだが
0326デフォルトの名無しさん
2008/02/05(火) 00:46:260327デフォルトの名無しさん
2008/02/06(水) 20:32:360328デフォルトの名無しさん
2008/02/07(木) 16:30:400329デフォルトの名無しさん
2008/02/07(木) 16:42:36http://www.intel.co.jp/jp/download/index.htm
0330デフォルトの名無しさん
2008/02/09(土) 12:32:52ttp://www.agner.org/optimize/
0331デフォルトの名無しさん
2008/02/11(月) 03:01:18class 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);
}
ベクトル化されるかな
0332デフォルトの名無しさん
2008/02/11(月) 03:16:060333デフォルトの名無しさん
2008/02/11(月) 03:17:370334デフォルトの名無しさん
2008/02/11(月) 03:50:500335デフォルトの名無しさん
2008/02/11(月) 03:51:350336デフォルトの名無しさん
2008/02/11(月) 03:52:06「もうちょっとマシなコード」をkwsk
0337デフォルトの名無しさん
2008/02/11(月) 03:52:140338デフォルトの名無しさん
2008/02/11(月) 03:52:450339331
2008/02/11(月) 04:00:14コンパイラ通してないのも謝る
ただ俺は…ベクトル化について語って欲しかっただけなんだ…
0340デフォルトの名無しさん
2008/02/11(月) 04:03:300341デフォルトの名無しさん
2008/02/11(月) 04:30:20・classじゃなくて別にstructでいいんじゃ?
・無名共同体内無名構造体の後のセミコロンがない
・デフォルトコンストラクタ邪魔
・メンバ初期化子を使って欲しい そして出来れば引数もconst type&で受け取った方が
・演算子オーバーロードを行う関数の引数名はrhs, lhsにするのが普通
0342デフォルトの名無しさん
2008/02/11(月) 05:04:44・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にするのが普通
知らんかった
レスありがとう
0343デフォルトの名無しさん
2008/02/11(月) 05:22:15return 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;
とか書かないとダメかな
まぁコンパイラ依存な訳だが、どこまで美味く最適化してくれるか知りたいんだ
0344デフォルトの名無しさん
2008/02/11(月) 05:27:03ってことで、クラスの作りだけ見ると、unionにする理由が判らん。
配列のようにも構造体のようにも使いたいのならそういうアクセッサを用意すればいいだけだから、
そもそもデータメンバを公開する理由が判らん。
あーそれから、floatを引き数とするコンストラクタなら参照にしなくて充分。
0345デフォルトの名無しさん
2008/02/11(月) 05:29:19だから、コンパイラが何か、どんな使い方をするかなども書かれていないのにベクタ化されるかは不明だってば。
わざわざforループにしなくても、ベクタ化できるコンパイラならベクタ化すべきときにはしてくれるだろうよ。
0346デフォルトの名無しさん
2008/02/11(月) 05:48:14xyz公開してるのはGetX()とか作ったり使ったりするのが面倒くさいからだ
コンパイラはVisual Stdio 2005のやつ
0347デフォルトの名無しさん
2008/02/11(月) 06:15:07挙句の果てに「面倒くさい」って、阿呆ですか?
0348デフォルトの名無しさん
2008/02/11(月) 07:07:04俺が求めてるのは実測とかじゃなくて、最適化についての経験談なんだが
こうした方がベクトル化され易い、とか…
あと、
void Vector3::GetX() const {return x;}
void Vector3::GetY() const {return y;}
void Vector3::GetZ() const {return z;}
とか実装しろと?
最適化、いや高速化に関係するのか?
0349デフォルトの名無しさん
2008/02/11(月) 07:42:43だから、いろんなサンプル作って実測してみろって。
クラスを作るのなら効率よく組めて且つ速いものも狙うのは当然だろうし、
そうでないなら速度重視でがりがり書くことになるからクラスなんて作る意味がないって。
要は、やることが半端なの。
0350デフォルトの名無しさん
2008/02/11(月) 10:17:110351デフォルトの名無しさん
2008/02/11(月) 10:21:53自己矛盾乙
0352デフォルトの名無しさん
2008/02/11(月) 10:28:390353デフォルトの名無しさん
2008/02/11(月) 10:36:130354デフォルトの名無しさん
2008/02/11(月) 10:37:31積極的に参照にする理由は無いな。
0355デフォルトの名無しさん
2008/02/11(月) 10:39:020356デフォルトの名無しさん
2008/02/11(月) 10:43:56どこが自己矛盾?
0357デフォルトの名無しさん
2008/02/11(月) 11:55:47それで自分の力だけではどうにもならない事が起きた時初めて他人を頼る
でないといつまでたっても他人に頼る癖が抜けないぞ
0358デフォルトの名無しさん
2008/02/11(月) 11:56:22確かに中途半端に長い関数で1ワードごときの変数を参照にする必要は無い。
0359デフォルトの名無しさん
2008/02/12(火) 02:45:14ここは相談の場でなくて語り合う場だが?
0360デフォルトの名無しさん
2008/02/12(火) 04:43:20{
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;
}
こうか?参照渡しって内部的にどういう処理が行われてるの
0361デフォルトの名無しさん
2008/02/12(火) 08:03:41最適化されると、後2者の区別はなくなりますが。
# void float とかfloat g = f は兎も角
0362デフォルトの名無しさん
2008/02/12(火) 11:12:40最適化されると、内部的に変数の所在を渡すよりも変数の値をそのまま渡した方が速度が出るので
void float Func(const float f)
{
return (f + f - f) * f / f;
}
になる。
0363デフォルトの名無しさん
2008/02/12(火) 11:26:12>void float
まさかこんな風に書いてあったなんて
0364デフォルトの名無しさん
2008/02/12(火) 11:27:45最早意味不明だし。インライン展開されない限り、参照やポインタ渡しが値渡しになることは有り得ません。
# インライン展開されたらされたで、Func()自体が(その呼び出しについては)消えてなくなるだろうけど。
0365デフォルトの名無しさん
2008/02/12(火) 11:41:48不動小数点数の演算って、足して引いて 0 とか、かけて割って 1 とか、畳んでいいんだっけ?
0366デフォルトの名無しさん
2008/02/12(火) 11:44:28実際に最適化されるときに、引き数が明らかなら可能。
そういう意味では、>364は不正解。
0367364
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)
0368デフォルトの名無しさん
2008/02/14(木) 07:30:06色々調べてみたところ
・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う
・WinAPIを直接、みたいなことは趣味でやる人が使う
(山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で)
で、実際人に聞くと今度はMFCという意見が出てきました
調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない
と、こんな感じでして、どっちに進むべきか悩んでいます
やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です
C#/VB.NETというものも一応考慮のうちに入れておきたいです
(GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです)
それではよろしくお願いします
0369デフォルトの名無しさん
2008/02/14(木) 07:56:450370360
2008/02/14(木) 09:34:39floatもマズかったかな
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関数自体が省略されない場合で
0371デフォルトの名無しさん
2008/02/14(木) 09:45:00アセンブリ知らないという見方なら C の規格上の実行モデルで考えることになり、
その場合にはそれら2つは引数が値渡しである点を除いてほぼ等価。
違いを知りたければアセンブリを見るしかないでしょ。
0372デフォルトの名無しさん
2008/02/14(木) 09:46:130373368
2008/02/14(木) 10:34:160374デフォルトの名無しさん
2008/02/14(木) 11:38:12参照で書かれた関数は、ポインタで書かれた関数と同じコードを吐くよ。
その例では、後者と同じと言うことになる。
勿論、後者自体がdouble Func(double * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;}
と殆んど同じコードを吐くという前堤でね。
0375デフォルトの名無しさん
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
0376デフォルトの名無しさん
2008/02/14(木) 14:55:14VC++2003で最適化オプションを全て有効にして、その4つの関数を定義して
連続で呼び出してみたら、インライン展開されて計算は1回だけで結果を
4回コピーするだけのコードになった。完全に同一とみなされてるね。
あと、インライン展開されてないコードではSSEを使っているけど、展開された
部分ではSSEは使ってなかったな。
0377360
2008/02/16(土) 01:27:08展開はされてない
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使われてないよね。なんで?
0378デフォルトの名無しさん
2008/02/16(土) 23:17:22参照はポインタで渡されるので、関数を呼び出す場合は後者の関数が生成される。
インライン展開されるばあいは、最適化されてポインタが使われない前者と同等になるよ。
>>376
2005proではインライン展開もSSE2になってた。
>>377
SSE2のオプションは確認した?
0379デフォルトの名無しさん
2008/02/17(日) 09:22:53インライン展開されているものは全て同じコード吐いてるっぽい
されていないものはこんな感じ
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そのまま使うのも有りって事か?
0380デフォルトの名無しさん
2008/02/17(日) 11:18:290381デフォルトの名無しさん
2008/02/17(日) 12:34:23「彼らが想定する人間であること」
が大事になってくるわな。
0382デフォルトの名無しさん
2008/02/17(日) 18:45:370383デフォルトの名無しさん
2008/02/17(日) 20:55:13その結果、doubleを参照渡しにしてしまうことも多々ある。インライン展開なら参照渡しもしっかり最適化されるので助かる。コンパイラ屋さんに感謝だな。
0384デフォルトの名無しさん
2008/02/17(日) 21:59:070385デフォルトの名無しさん
2008/02/17(日) 21:59:30そういった引数用の型、だ。
0386デフォルトの名無しさん
2008/02/17(日) 22:01:08と思ったが、bindとかfunctionとか参照渡しだったな。
0387デフォルトの名無しさん
2008/02/17(日) 22:04:48他の型は全部 const 参照にするってやつ。
要するに boost::call_traits<T>::param_type 。
0388デフォルトの名無しさん
2008/02/17(日) 23:13:070389デフォルトの名無しさん
2008/02/17(日) 23:15:220390デフォルトの名無しさん
2008/02/17(日) 23:16:53基本的に const 参照にして、基本型全部で特殊化。
実際にはもうちょっと階層的に作ってあるけど、
基本的にはそんなとこ。
0391デフォルトの名無しさん
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とか)使えば早くなるはずだと
というか、最適化で勝手にやってくれると思っていたんだが、パックド使ってるようには見えない
まさか、この程度なら使わない方が早いのか・・・
おまいらならどうコーディングする?
完全にぶりかえしですまん
0392デフォルトの名無しさん
2008/02/18(月) 04:02:10必要な箇所があれば intrinsic でもアセンブラでも使う。
0393ヽ・´∀`・,,)っ━━━━━━┓
2008/02/18(月) 04:26:200394ヽ・´∀`・,,)っ━━━━━━┓
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;
}
この程度だとラップする意味が無い
0395ヽ・´∀`・,,)っ━━━━━━┓
2008/02/18(月) 06:40:31#include <fvec.h>
でF32vec4を使う。
テキトーにラップしてよし。
あと、インライン化しないとあんまり効果ないよ。
実関数化するとコールのオーバーヘッドに食われる
0396ヽ・´∀`・,,)っ━━━━━━┓
2008/02/18(月) 06:41:40{
public:
Vector4(float ix, float iy, float iz, float iw)
: F32vec4(ix, iy, iz, iw)
{}
};
に訂正
0397デフォルトの名無しさん
2008/02/18(月) 08:29:400398デフォルトの名無しさん
2008/02/18(月) 08:38:460399デフォルトの名無しさん
2008/02/18(月) 10:24:21実際に活気付くのは397からだから397の話題振りで活気付いたということにしないと。
0400デフォルトの名無しさん
2008/02/18(月) 12:34:36こうならばどうか?
//----------
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;
}
0401デフォルトの名無しさん
2008/02/18(月) 12:36:08最後の行に括弧が抜けてた。
};
0402ヽ・´∀`・,,)っ¬
2008/02/18(月) 15:42:20addpsに展開されることが目的なら、配列にして
for(int i=0; i<4; i++) vD[i] = vA[i] + vB[i];
全要素に同じ操作をしてますよってヒントにはループが一番効果的。
手動アンロールしちゃうと効果ない。
0403デフォルトの名無しさん
2008/02/18(月) 15:57:210404デフォルトの名無しさん
2008/02/18(月) 16:10:23これぞクラスで隠蔽する良さだな。
0405デフォルトの名無しさん
2008/02/19(火) 03:27:11f・・・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?
0406デフォルトの名無しさん
2008/02/19(火) 04:22:14>\in-?trin-zik, -?trin(t)-sik\
>ttp://cougar.eb.com/soundc11/i/intrin01.wav
よって、「イントリンジク」。
0407デフォルトの名無しさん
2008/02/19(火) 11:33:11VC++なら
class Vector4
{
public:
union {
float d[4];
struct { float x, y, z, w; };
};
};
これでAddをforループにしたら、SSE使ってくれたよ。
0408デフォルトの名無しさん
2008/02/19(火) 12:23:05{
public:
union {
T array[N];
struct { T a, b, c, d, ... };
};
};
とする場合、特にTがマシンが扱う1Wordの倍数でないと
元々struct { T a, b, c, d, ... }; 部分の各要素の連続性が保証されてないからどう動くかが分からなくなる。
つまり T array[N] では T はきっちり詰め込まれているものの、 struct { ... }; は中で要素の間に空白のブロックが入る可能性がある。
ふじこふじこ
0409デフォルトの名無しさん
2008/02/19(火) 13:09:07SSE使っていることには使っているが
movss xmm4, DWORD PTR [eax-8]
addss xmm4, xmm0
movss DWORD PTR [eax-8], xmm4
こんなコード吐いてた。(要素数の数だけ繰り返し)
VC++2003ではベクトル化してくれるほど頭よくないようだ。
これでも普通にFPU使うよりは速いの?
0410デフォルトの名無しさん
2008/02/19(火) 21:57:23クラスメンバの実体は
private:
float r[4];
にしといて、メンバ関数で
public:
float &x(){return r[0];};
const float &x()const{return r[0];};
などとするのがC++的。
0411デフォルトの名無しさん
2008/02/19(火) 21:58:16x86-64はSSE使う方が速いし、FPUの利用は推奨されていない。
0412ヽ・´∀`・,,)っ━━━━━━┓
2008/02/19(火) 23:01:55まあIntrinsicsを使うのがいいでしょう。
どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので
性能落ちる。F32vec4かもしくは__m128iから派生するのがヨシ。
0413デフォルトの名無しさん
2008/02/20(水) 01:49:02そういう仕様のベクトル演算クラスって少ないよ。C++でも
0414ヽ・´∀`・,,)っ━━━━━━┓
2008/02/20(水) 02:11:33fvecやdvecはラッパークラスの実装サンプルだと思ってもいい。ちなみにSSE3〜4には対応してない。
0415デフォルトの名無しさん
2008/02/20(水) 05:15:43独自にラッパー作ってもいいわけだ
>どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので
>性能落ちる
ここの意味がわかりませんぜ親分。うまくベクトル化できてもIntrinsics使ったコードには勝てないのか?
0416ヽ・´∀`・,,)っ━━━━━━┓
2008/02/20(水) 06:12:03いっぽうで__m128の実体はレジスタに割り当て可能。
レジスタ上に置いて演算を繰り返すような用途には、ロード・ストアは無駄。
0417デフォルトの名無しさん
2008/02/20(水) 11:56:090418デフォルトの名無しさん
2008/02/20(水) 12:25:31> 配列=かならずアドレスを持つ=レジスタ変数にできない。
これってどんなコンパイラでもそうなっちゃうの?
0419デフォルトの名無しさん
2008/02/20(水) 12:53:19最適化によってずっとレジスタに保持するケースもあるとは思うが、
それでも一応メモリ領域に置くだけは置くようだ。
0420デフォルトの名無しさん
2008/02/20(水) 12:59:55へぇ。そんなこともあるんだ。
で、それは特定のコンパイラでの実験結果であて、規格上レジスタだけで
済ませることができない制約がある、というわけじゃないよね?
0421デフォルトの名無しさん
2008/02/20(水) 14:08:550422デフォルトの名無しさん
2008/02/20(水) 14:23:19アドレス取れないといけないからサイズ0にならないって話を
思い出した。
0423デフォルトの名無しさん
2008/02/20(水) 20:03:28register はコンパイラへのヒントであって
必ずレジスタに割り付けする必要はないからな
0424デフォルトの名無しさん
2008/02/20(水) 20:11:33それでもCだと文法エラーなんだよ
この辺が解せない
0425デフォルトの名無しさん
2008/02/20(水) 22:23:59でも本来の意味的にアドレス取れちゃおかしいよね。
0426デフォルトの名無しさん
2008/02/20(水) 22:25:160427デフォルトの名無しさん
2008/02/21(木) 00:02:430428デフォルトの名無しさん
2008/02/21(木) 00:06:35ダンゴさんが鋭い意見を持っていると思う
再利用とか
0429ヽ・´∀`・,,)っ¬
2008/02/21(木) 00:21:52レジスタが十分に多くレジスタ間オペレーション前提のアーキはこんなもんでしょ
0430デフォルトの名無しさん
2008/02/21(木) 00:24:55なんせ、通常版を展開しておきさえすれば後は何でもありだから。
gccなんかだと、再帰関数でも一段目だけインライン展開してたりして楽しい。
0431デフォルトの名無しさん
2008/02/21(木) 12:29:10アドレス取る可能性があると、最適化の掛かりが悪くなるな気がする。がっちりprivateで包んで、メンバ変数のポインタを外から取れなくすると効果ある様な気がする。
0432デフォルトの名無しさん
2008/02/21(木) 12:36:29メンバ変数はすでに this でアドレス取られてるようなもんだろ。 private とか関係ないと
思うよ。
0434ヽ・´∀`・,,)っ━━━━━━┓
2008/02/21(木) 23:21:34friend属性で完全に読めるしね。
なんにせよ「レジスタ型」のラッパークラスって扱いが難しいだろうな
fvecやdvec使ってても、各要素に配列インターフェイスでにアクセスしようとすると
いったんメモリ上にストアしてから各要素を読み出す動作になる。
なぜならそういう作りだから。
SSE4.1のextractps/dならレジスタ間渡しができるだろうけど。
0435デフォルトの名無しさん
2008/02/22(金) 15:32:370436デフォルトの名無しさん
2008/02/22(金) 21:23:320437ヽ・´∀`・,,)っ━━━━━━┓
2008/02/22(金) 22:57:280438デフォルトの名無しさん
2008/02/22(金) 23:41:480439デフォルトの名無しさん
2008/02/23(土) 01:18:13むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。
0440デフォルトの名無しさん
2008/02/23(土) 01:54:460441デフォルトの名無しさん
2008/02/23(土) 01:55:540442ヽ・´∀`・,,)っ━━━━━━┓
2008/02/23(土) 01:58:400443デフォルトの名無しさん
2008/02/23(土) 02:06:44むしろ\「もうこりごりだ\」っていう反応にも取れるくらいだ。\
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて\
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。」では何も有益な事は読みとれんだろww
むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。
0444デフォルトの名無しさん
2008/02/23(土) 02:07:240445ヽ・´∀`・,,)っ━━━━━━┓
2008/02/23(土) 02:08:110446デフォルトの名無しさん
2008/02/23(土) 02:09:10でも使わないと実行時に要するメモリサイズが10倍に!?
0447デフォルトの名無しさん
2008/02/23(土) 02:32:180448デフォルトの名無しさん
2008/02/23(土) 02:32:460449デフォルトの名無しさん
2008/02/23(土) 02:37:29しかし必要とあれば使わなければならんのだ――漢にはそういう時が来るものなのだ。
0450デフォルトの名無しさん
2008/02/23(土) 09:51:430451デフォルトの名無しさん
2008/02/23(土) 09:59:070452デフォルトの名無しさん
2008/02/23(土) 11:41:07メモリの 1byte は血の一滴って感じだったけどな…
0453デフォルトの名無しさん
2008/02/23(土) 11:50:57人、それを馬鹿と言う。
0454デフォルトの名無しさん
2008/02/23(土) 13:08:011024バイトなんて随分贅沢だなぁ、おい。
0455デフォルトの名無しさん
2008/02/23(土) 19:12:430456デフォルトの名無しさん
2008/02/23(土) 21:28:520457デフォルトの名無しさん
2008/02/24(日) 06:40:59それだったら4114x2の方が安いんじゃないだろうか?
0458デフォルトの名無しさん
2008/02/24(日) 06:41:380459デフォルトの名無しさん
2008/02/24(日) 10:08:590460デフォルトの名無しさん
2008/02/24(日) 10:10:100461デフォルトの名無しさん
2008/02/24(日) 10:52:330462デフォルトの名無しさん
2008/02/24(日) 15:14:31DOSのリダイレクト
0463デフォルトの名無しさん
2008/02/24(日) 16:30:390464デフォルトの名無しさん
2008/02/24(日) 20:45:270465デフォルトの名無しさん
2008/03/06(木) 01:54:030466デフォルトの名無しさん
2008/03/06(木) 02:13:09単一のアプリだけで動いている訳じゃないからな
たとえば残り100Mで全部使用したら、OSや他のアプリがメモリ必要とするから追い出されることになる
しかし自分が動くときにはメモリ上に再び持ってくるから、追い出すのとを繰り返しかなり遅くなる
メモリは最低限にするのが速い
0467デフォルトの名無しさん
2008/03/06(木) 03:49:270468デフォルトの名無しさん
2008/03/06(木) 04:09:33スワップが起こりうるならその時間の方が圧倒的にかかる
0469デフォルトの名無しさん
2008/03/06(木) 04:16:590470デフォルトの名無しさん
2008/03/06(木) 04:58:270471デフォルトの名無しさん
2008/03/06(木) 08:02:59馬鹿? あらゆる環境で最適な最適化なんてあるわけないじゃん。
「ターゲットとする」と形容するなら兎も角。
実際、Woodcrestで速くなるように最適化したら、Pen4で遅くなったなんてよくある話だ。
# それ以前に、「あらゆる」だと一体どこまで対象にするんだ? Pen3か? 486か?w
0472デフォルトの名無しさん
2008/03/06(木) 08:30:20日本語読めない馬鹿?
0473デフォルトの名無しさん
2008/03/06(木) 08:34:420474デフォルトの名無しさん
2008/03/06(木) 09:22:50まぁ、人生経験のうちではある。
0475デフォルトの名無しさん
2008/03/06(木) 11:25:42woodcrest, pen4云々とCレベルの最適化技法とは次元が違うでしょw
0476デフォルトの名無しさん
2008/03/06(木) 11:28:57実際にどんなケースで省メモリコンパイルのほうが速くなる?
0477デフォルトの名無しさん
2008/03/06(木) 11:33:47>471じゃないが、Cレベルの最適化限定なのか?
だとしたら、キャッシュやスワップがどうこうなんて関係ないと思うのだが。
逆に、キャッシュやスワップを云々するならそれらのサイズに影響するわけだから、
CPUに依存した話になってしまうだろうし。
0478デフォルトの名無しさん
2008/03/06(木) 12:19:55Pen4が、Pen3がってのは、吐き出すコードの並べ順とかそういう要因だから、Cコード側でどうにもならんだろ。
キャッシュどうこうは、配列や構造体のサイズを変えたりなどのCコードレベルでの最適化ができるだろ。
0479デフォルトの名無しさん
2008/03/06(木) 12:21:150480デフォルトの名無しさん
2008/03/06(木) 22:29:41たいていCプログラマに求められるものではあるが。
0481デフォルトの名無しさん
2008/03/07(金) 01:02:330482デフォルトの名無しさん
2008/03/07(金) 01:25:060483デフォルトの名無しさん
2008/03/07(金) 11:02:270484デフォルトの名無しさん
2008/03/07(金) 14:42:19/fp:precise fast strict
の中でどれが一番精度が高いのでしょうか?
デフォルトのpreciseだと思っていたのですが、
floatをdoubleに変えたときの結果に一番近かったのが
fastだったのですが。
0485デフォルトの名無しさん
2008/03/07(金) 15:48:46まず、floatをdoubleにした結果に一番近いの意味が不明
0486デフォルトの名無しさん
2008/03/07(金) 17:16:52x86のFPUはfloatだろうとdoubleだろうと、内部では80bitで計算している。
そのために、floatの計算で本来なら丸め誤差が発生するはずのところで、
誤差が発生しないという問題が生じる。
厳密に規格で決められた通りの精度で計算するためには、1つの計算が
終わるたびに丸め操作が必要になる。
その辺のコントロールをするのが/fpオプションで、fastは速度優先で
最低限の丸め操作しかしないので計算の精度が必要以上に上がってしまう。
また、どのタイミングでメモリにストアされるかによっても、計算結果が
変わってしまうので、全く同じ入力を与えても常に同じ結果になることが
保証できない。
0487♪(*^ ・^)ノ⌒☆
2008/03/07(金) 18:40:21命令の並び順こそモダンなCPUではOoOがあるからあんまり影響しない。
レイテンシの極端に大きい命令に展開されるのがわかってる場合は
アンロールしてソフトパイプライニングするのも有効。もちろんCレベルでできる。
C++なら機種依存の手続きをトレーツ(笑)にしてインターフェイスを汎用化する手もあるね。
>>481
黙れスイーツ(笑)
>>****
ご希望にお答えしてお前は放置
>>483
おう、闘病がんがれよ
0488デフォルトの名無しさん
2008/03/07(金) 20:08:280489ヾ(*´∀`*)ノ
2008/03/07(金) 20:57:020490デフォルトの名無しさん
2008/03/08(土) 00:15:33コードが同じならメモリにストアされるタイミングも同じで、
同じ入力を与えたら同じ結果になるんじゃないの?
それとも、入力ってのはソースファイル(コンパイラに対する入力)のことかな?
0491デフォルトの名無しさん
2008/03/08(土) 00:45:47レジスタからあふれてメモリに追い出されるときに丸めが生じる。
同じ式が違う場所にあるときに丸めるタイミングが違ってくる可能性がある。
0492デフォルトの名無しさん
2008/03/08(土) 00:51:190493デフォルトの名無しさん
2008/03/08(土) 01:24:27なることが保証できない。
0494デフォルトの名無しさん
2008/03/08(土) 01:32:410495486
2008/03/08(土) 02:03:49言いたいことは491の言ってることだな。
クライアントとサーバで同じ式を書いても同じ結果にならなかったり、
デバッグ用のコードを入れたら結果が変わったり、インライン展開
されるかどうかで結果が変わってしまう。
0496デフォルトの名無しさん
2008/03/08(土) 02:16:10それの全く同じタイミングに実行される全く同じ位置のコード(マシン語レベルで)に
全く同じ入力を与える場合を想定してたんだぜ。
0497デフォルトの名無しさん
2008/03/08(土) 02:43:100498デフォルトの名無しさん
2008/03/08(土) 02:46:360499デフォルトの名無しさん
2008/03/08(土) 02:49:010500デフォルトの名無しさん
2008/03/08(土) 09:00:590501デフォルトの名無しさん
2008/03/08(土) 09:29:12レジスタのみの演算をぶん回して
比較しないとな。
0502ヽ・´∀`・,,)っ━━━━━━┓
2008/03/08(土) 13:26:10Athlon 64の前のモデルではメモリ増やすと逆に遅くなる現象があるらしーな。
0503デフォルトの名無しさん
2008/03/08(土) 14:39:400504デフォルトの名無しさん
2008/03/08(土) 16:24:450505ヽ・´∀`・,,)っ━━━━━━┓
2008/03/08(土) 17:28:200506デフォルトの名無しさん
2008/03/09(日) 00:40:050507デフォルトの名無しさん
2008/03/09(日) 04:12:570508デフォルトの名無しさん
2008/03/09(日) 05:24:380509デフォルトの名無しさん
2008/03/09(日) 17:06:410510デフォルトの名無しさん
2008/03/09(日) 22:48:390511498
2008/03/09(日) 23:25:110512デフォルトの名無しさん
2008/03/09(日) 23:25:180513デフォルトの名無しさん
2008/03/09(日) 23:26:320514ヽ・´∀`・,,)っ━━━━━━┓
2008/03/09(日) 23:51:130515デフォルトの名無しさん
2008/03/09(日) 23:54:190516ヽ・´∀`・,,)っ━━━━━━┓
2008/03/10(月) 00:03:49OSは?Windows 2000は512MB以上はほとんど管理してないよ
0517デフォルトの名無しさん
2008/03/10(月) 00:30:06お前も面白くない。自分に適用しないジャッジを人に適用しないようにな。
0518デフォルトの名無しさん
2008/03/10(月) 14:32:220519デフォルトの名無しさん
2008/03/10(月) 14:36:110520デフォルトの名無しさん
2008/03/10(月) 17:59:240521デフォルトの名無しさん
2008/03/10(月) 20:20:100522デフォルトの名無しさん
2008/03/10(月) 22:11:35どんなにメモリを必要とするプログラムを書いても副作用がなければそのプログラムは
何もせずにOSに制御を返す1024バイトにも満たないデータ列と同じだという事。
0523ヽ・´∀`・,,)っ━━━━━━┓
2008/03/10(月) 22:18:010524デフォルトの名無しさん
2008/03/10(月) 22:36:500525ヽ・´∀`・,,)っ━━━━━━┓
2008/03/10(月) 22:52:460526デフォルトの名無しさん
2008/03/11(火) 11:27:170527デフォルトの名無しさん
2008/03/11(火) 13:14:190528デフォルトの名無しさん
2008/03/11(火) 18:32:210529デフォルトの名無しさん
2008/03/11(火) 21:18:200530デフォルトの名無しさん
2008/03/11(火) 21:21:260531デフォルトの名無しさん
2008/03/12(水) 13:21:140532デフォルトの名無しさん
2008/03/12(水) 13:47:44それは今時普通ですから
0533デフォルトの名無しさん
2008/03/12(水) 22:00:280534デフォルトの名無しさん
2008/03/12(水) 22:12:21コンパイラってマジ賢いわ。
0535533
2008/03/12(水) 22:25:43r = (r << 1) & mask; // r, mask は多倍長整数
こんな単純な処理はキャリービットを使ったシフト命令が使えるアセンブラの方が絶対速いはずなのだが
アセンブラにすると、グローバルな最適化がうまくできないみたいで、C++ よりも遅くなったみたい
0536デフォルトの名無しさん
2008/03/12(水) 22:28:490537デフォルトの名無しさん
2008/03/12(水) 22:30:44差し支えなければC++とasm双方晒してくれ。
0538デフォルトの名無しさん
2008/03/12(水) 22:31:22例えば最近のコンパイラなんかは、一回のコンパイル時間が長くなっても
エラーメッセージなどを丁寧に出力するから、結果的にコードを修正する時間が短くなって
コンパイル回数も減り、開発時間が短くなる事に寄与している。
コンパイラ賢い。
0539デフォルトの名無しさん
2008/03/12(水) 23:01:49パイプラインが詰まるようなコード書いたんじゃねーの。
0540デフォルトの名無しさん
2008/03/12(水) 23:05:20詰まらざるを得ないんじゃないかな。
0541デフォルトの名無しさん
2008/03/12(水) 23:19:410542デフォルトの名無しさん
2008/03/13(木) 12:36:23ループを含めるとか、ある程度処理時間がかかる部分をasmに直そうよ。
0543536
2008/03/13(木) 19:09:16そしたら グローバルに最適化されてるってことがわかったんだよ
0544デフォルトの名無しさん
2008/03/13(木) 19:10:14うーん、そのままだとちょっと差し支えがあるので、
晒せるように書き直せるかどうか試してみるよ
0545デフォルトの名無しさん
2008/03/13(木) 19:20:37の意味が解らん
0546デフォルトの名無しさん
2008/03/13(木) 19:42:37class 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);
};
0547デフォルトの名無しさん
2008/03/13(木) 19:42:59{
*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;
}
}
0548デフォルトの名無しさん
2008/03/13(木) 19:43:53{
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
}
}
0549デフォルトの名無しさん
2008/03/13(木) 19:45:47buf のサイズは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++);
}
}
}
0550デフォルトの名無しさん
2008/03/13(木) 19:47:271.125秒
sa.transition(*ptr++); を sa.transition_asm(*ptr++); に変えてタイムを計測すると
1.469秒
だった
0551デフォルトの名無しさん
2008/03/13(木) 20:05:19なんでedxを使わないでレジスタ変数に使われる(push/popが必要な)esiやediを使ってるの、とか
あなたの読んだ最適化に関する文書に、LOOPを使うことについて何か触れられてなかったのか、とか
0552デフォルトの名無しさん
2008/03/13(木) 20:20:27じゃ、アセンブラでどう書いたら高速になるのかコードを晒してくおくれ
0553デフォルトの名無しさん
2008/03/13(木) 20:24:490554デフォルトの名無しさん
2008/03/13(木) 20:30:54最適化技法の専門書でも読め
0555デフォルトの名無しさん
2008/03/13(木) 20:38:59ロード/ストアの形にするのも基本だし
カウンタ(i)を用意して非定数のlimitと比較するくらいなら、first/last形にするのが常識だし
(まあこれは0との比較に変えてるみたいだからいいか)
といっても、その程度は最適化コンパイラなら当たり前にやっていることだけど
0556デフォルトの名無しさん
2008/03/13(木) 20:42:180557デフォルトの名無しさん
2008/03/13(木) 21:16:13別に何かの規格で定められた専門的な用語ではないはずだ。
いや、わかっててネチっこく絡んでるだけなら、野暮な説明だけど。
0558デフォルトの名無しさん
2008/03/13(木) 21:29:520559デフォルトの名無しさん
2008/03/13(木) 21:33:39いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。
単に「自分の書いた(付け焼刃の)アセンブラより速かったから
大域的な最適化をしているに違いない」と言ってるとしか見えないわけさ。
0560デフォルトの名無しさん
2008/03/13(木) 21:51:33543 名前:536[sage] 投稿日:2008/03/13(木) 19:09:16
もちろんコンパイラが吐き出してるソースチェックしたよ
そしたら グローバルに最適化されてるってことがわかったんだよ
0561ヽ・´∀`・,,)っ━━━━━━┓
2008/03/13(木) 21:55:300562デフォルトの名無しさん
2008/03/13(木) 21:58:27例えば、そのグローバルな最適化によって、
>>547はどのようなアセンブラコードになるのですかね?
0563デフォルトの名無しさん
2008/03/13(木) 22:00:06マチクタビレタ〜
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < 速いアセンブラソースまだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
0564デフォルトの名無しさん
2008/03/13(木) 22:34:200565デフォルトの名無しさん
2008/03/13(木) 22:43:230566ヽ・´∀`・,,)っ━━━━━━┓
2008/03/13(木) 22:57:30よく読んでないけど使えそうだけどな
0567デフォルトの名無しさん
2008/03/13(木) 23:16:51> いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。
このタイミングで急に新しい話題始めるんですかー。
0568デフォルトの名無しさん
2008/03/13(木) 23:17:120569ヽ・´∀`・,,)っ━━━━━━┓
2008/03/13(木) 23:27:440570デフォルトの名無しさん
2008/03/13(木) 23:29:100571デフォルトの名無しさん
2008/03/13(木) 23:31:02組み込み系の貧弱な石ならアセンブラの方が速い事は多々あるけど。
0572デフォルトの名無しさん
2008/03/13(木) 23:31:52速いコードは書けないが、動かないコード晒されると更にやる気を削がれるな。
>>556 SSE使えるならむしろCって考え方も。
>>568 最近はmicro op fusionとかやってるから高級な命令の方がAMDみたく都合よくなるんじゃない?
0573デフォルトの名無しさん
2008/03/13(木) 23:34:070574ヽ・´∀`・,,)っ━━━━━━┓
2008/03/13(木) 23:36:350575デフォルトの名無しさん
2008/03/14(金) 00:20:39ところで、このコードは正しい結果が出るか確認したか?
0576ヽ・´∀`・,,)っ━━━━━━┓
2008/03/14(金) 00:23:470577デフォルトの名無しさん
2008/03/14(金) 12:16:5486のアセンブラなんて10年以上やってないんで自信ないんだが、途中でキャリーフラグ消えてないか?
キャリー使わずにCで書いても同じくらいの速さのコードは出そうだが。
0578デフォルトの名無しさん
2008/03/14(金) 13:01:13mov, lea, loop はキャリーに影響しない
add edi, 4 でなく lea edi, [edi + 4] とするのはそのためでもある
0579デフォルトの名無しさん
2008/03/14(金) 21:39:30andも?
0580デフォルトの名無しさん
2008/03/14(金) 22:07:37少しは自分で調べろ
0581ヽ・´∀`・,,)っ━━━━━━┓
2008/03/15(土) 00:05:39MMX/SSEもフラグレジスタを書き換えない。
0582デフォルトの名無しさん
2008/03/17(月) 10:24:25逆汗しないと
0583デフォルトの名無しさん
2008/03/17(月) 10:36:220584デフォルトの名無しさん
2008/03/17(月) 10:57:390585デフォルトの名無しさん
2008/03/17(月) 12:13:540586デフォルトの名無しさん
2008/03/18(火) 20:20:53gethoge()->fuga();
gethoge()->piyo();
例B)
hoge *p = gethoge();
p->fuga();
p->piyo();
gethogeはprivate変数へのアクセサと仮定して、
この場合例AとBでどっちの方が早いのだろう?
fugaやpiyoがもっとたくさんあるのなら後者だろうけど
2回だけだとポインタこさえるコストも考えるとごっちゃになってきた。
0587デフォルトの名無しさん
2008/03/18(火) 21:40:210588デフォルトの名無しさん
2008/03/19(水) 10:47:54処理時間で A >= B って感じ。
「ポインタこさえるコスト」とか言うが、 A でもコンパイラが
ポインタを作る。しかも繰り返し。
0589デフォルトの名無しさん
2008/03/19(水) 12:29:580590デフォルトの名無しさん
2008/03/21(金) 13:27:230591デフォルトの名無しさん
2008/03/21(金) 21:02:410592デフォルトの名無しさん
2008/03/26(水) 09:42:590593デフォルトの名無しさん
2008/03/26(水) 12:24:390594デフォルトの名無しさん
2008/03/26(水) 14:16:56各関数のメモリアクセスは調べられそうですね
ありがとうございます。
0595デフォルトの名無しさん
2008/03/26(水) 14:44:33writeとreadはいらないの?
0596デフォルトの名無しさん
2008/03/26(水) 15:25:04メモリアクセスはin/outだけじゃ・・・
0597デフォルトの名無しさん
2008/03/26(水) 16:07:31どうやったらプログラム実行終了時の
各関数のそれぞれにおいてのメモリアクセス数が出るんだ
0598デフォルトの名無しさん
2008/03/26(水) 18:58:16命令ごとのメモリや演算器、キャッシュ、バスのタイミングが見える。プロファイラなんかとは次元が違う。
0599デフォルトの名無しさん
2008/03/26(水) 21:43:23それぞれのメモリアクセスはどこみればいいのか分からん
全体の1秒あたりのメモリアクセスは出てるけど
0600デフォルトの名無しさん
2008/03/29(土) 09:07:380601ヽ・´∀`・,,)っ━━━━━━┓
2008/03/29(土) 09:13:420602デフォルトの名無しさん
2008/03/29(土) 09:40:390603デフォルトの名無しさん
2008/03/29(土) 09:56:570604デフォルトの名無しさん
2008/03/29(土) 12:12:580605ヽ・´∀`・,,)っ━━━━━━┓
2008/03/29(土) 12:29:130606デフォルトの名無しさん
2008/03/29(土) 23:47:370607デフォルトの名無しさん
2008/03/30(日) 00:55:130608デフォルトの名無しさん
2008/03/30(日) 00:59:220609デフォルトの名無しさん
2008/03/30(日) 02:23:090610デフォルトの名無しさん
2008/03/30(日) 10:57:300611デフォルトの名無しさん
2008/03/30(日) 11:22:370612デフォルトの名無しさん
2008/03/30(日) 17:47:20w
0613デフォルトの名無しさん
2008/03/31(月) 02:51:590614デフォルトの名無しさん
2008/03/31(月) 03:08:410615デフォルトの名無しさん
2008/04/01(火) 00:18:250616デフォルトの名無しさん
2008/04/01(火) 01:05:430617デフォルトの名無しさん
2008/04/01(火) 10:00:38コンパイラによるがされにくい。
PGIでは、vectorのまま[]でアクセスしたループはベクトル化してくれないが、
一旦ポインタに変換してループを書くとベクトル化する。
0618デフォルトの名無しさん
2008/04/01(火) 10:52:060619デフォルトの名無しさん
2008/04/01(火) 15:40:330620デフォルトの名無しさん
2008/04/01(火) 16:37:250621デフォルトの名無しさん
2008/04/02(水) 15:05:29vectorに限って言えばiteratorはまず間違いなくポインタだろ。
ということは最適化される。
0622619
2008/04/02(水) 16:20:53vector<double>::iterator p = v.begin();
を使って、
p[i]
でアクセスしたらポインタと同等の最適化されました。
ただ、for文の終了条件を p != v.end() なんてことしたら
ループの回数が不明ということで最適化除外されました。
0623ヽ・´∀`・,,)っ━━━━━━┓
2008/04/02(水) 17:00:57から派生の方向で
アクセッサ?ほぼ再実装だね
0624ヽ・´∀`・,,)っ━━━━━━┓
2008/04/02(水) 17:02:21コンパイラは?
0625デフォルトの名無しさん
2008/04/02(水) 23:37:030626デフォルトの名無しさん
2008/04/02(水) 23:48:28PGI
0627デフォルトの名無しさん
2008/04/03(木) 00:23:080628デフォルトの名無しさん
2008/04/03(木) 13:17:37毎回インスタンス変数見るのか。
for(int i=0,sz=v.size(); i<sz; i++){...}
for(iterator i=0,end=v.end(); i!=end; i++){...}
のどちらかだろ常考。
0629デフォルトの名無しさん
2008/04/03(木) 14:51:29高級アセンブラだから細かいところに気を使うんだよな。
0630デフォルトの名無しさん
2008/04/03(木) 15:13:25正当にやれるのは、v自体がローカル変数で、
ポインタを取られてないことを解析出来る場合だけど、
その前提を維持するより一時ローカル変数に移した方が簡単だと思う。
0631デフォルトの名無しさん
2008/04/03(木) 16:33:26もうローカルでポインタを取得してないメンバ変数やグローバル変数が
外から変更される可能性がある場合は全部volatile付けるって事でいいよw
なんてやってるとvolatileだらけでどっちが面倒くさいんだか分からなくなってくるな。
0632デフォルトの名無しさん
2008/04/03(木) 18:15:58volatileが付いていてもいなくても
付いているのと同じように扱われている気がする(ローカルな自動変数以外)。
0633デフォルトの名無しさん
2008/04/03(木) 19:18:06同じってことは無いだろうけどね。
0634デフォルトの名無しさん
2008/04/03(木) 19:31:48釣りかネタだよね?
0635デフォルトの名無しさん
2008/04/03(木) 20:56:390636デフォルトの名無しさん
2008/04/03(木) 21:06:50ここは「volatile 宣言最強!!!」って言わなくちゃいけないところですか?
はずしてたらごめんなさい
0637デフォルトの名無しさん
2008/04/03(木) 21:08:45マジレスしたらいけない流れなんだろうな。
0638デフォルトの名無しさん
2008/04/03(木) 21:32:100639ヽ・´∀`・,,)っ━━━━━━┓
2008/04/03(木) 21:33:360640636
2008/04/03(木) 21:36:48> volatile は毎回メモリにアクセスするようにするもの
なのは, いいんだけど >>634 な, ものがあったから
ちょっと言ってみたかった
0642デフォルトの名無しさん
2008/04/03(木) 21:49:31involving the object because the value of the object might be changed
by means undetectable by an implementation.
0643デフォルトの名無しさん
2008/04/04(金) 01:29:390644デフォルトの名無しさん
2008/04/04(金) 02:20:000645デフォルトの名無しさん
2008/04/04(金) 04:20:100646デフォルトの名無しさん
2008/04/04(金) 11:12:120647デフォルトの名無しさん
2008/04/04(金) 11:15:58これもあぼ〜んしとくわ
0648デフォルトの名無しさん
2008/04/04(金) 21:51:09厳密には違うけどまぁ別にいいや
0649デフォルトの名無しさん
2008/04/04(金) 21:56:37オブジェクトへの積極的な最適化を抑制するための処理系へのヒントである。
0650デフォルトの名無しさん
2008/04/04(金) 22:19:362: i = 1;
3: i = 2;
4: i = 3;
こうしたとき2行目3行目の代入された数値は使われないので、最適化されて消される。
しかしデバイス制御などでiがデバイスのアドレスの場合、消されては困る場合がある。
こういう時、宣言の前にvolatileを付けたら最適化されないので意図した動きを得られる。
0651デフォルトの名無しさん
2008/04/04(金) 22:22:270652デフォルトの名無しさん
2008/04/04(金) 22:56:39マルチスレッドでのvolatileについてはダンゴさんが一言ありそうだ
0653デフォルトの名無しさん
2008/04/04(金) 23:02:500654デフォルトの名無しさん
2008/04/04(金) 23:04:190655デフォルトの名無しさん
2008/04/05(土) 00:15:040656デフォルトの名無しさん
2008/04/05(土) 00:16:340657デフォルトの名無しさん
2008/04/05(土) 06:42:330658デフォルトの名無しさん
2008/04/05(土) 09:05:070659デフォルトの名無しさん
2008/04/05(土) 09:41:280660デフォルトの名無しさん
2008/04/05(土) 09:52:28> 処理系へのヒントである。
とか書いてあるとちょっと不安なんだが。
0661デフォルトの名無しさん
2008/04/05(土) 10:01:27ターゲットにメモリが存在するとも限らないし
0662デフォルトの名無しさん
2008/04/05(土) 10:29:51C/C++ でそういう処理系は聞いた事ないな。
inline や register みたいにヒント扱いだから
規格上はそのあたりの挙動は処理系依存なのかもしんないけど、
先ず心配しないでいいとは思う。
0663デフォルトの名無しさん
2008/04/05(土) 17:18:06| volatileオブジェクトについては、処理系独立な意味付けは行われていない。
とあるから安心していいのでは。
0664デフォルトの名無しさん
2008/04/05(土) 20:40:18volatile を無視するコンパイラ程度はあってもいい気はする。
0665デフォルトの名無しさん
2008/04/05(土) 21:02:06volatileを無視するコンパイラは最適化禁止だな。
0666デフォルトの名無しさん
2008/04/05(土) 21:10:12全て volatile なコンパイラはあっても
volatile 無視するコンパイラは少なそうか?
0667ヽ・´∀`・,,)っ━━━━━━┓
2008/04/05(土) 21:18:00規格準拠をうたうコンパイラで、そういうのは聞いたことはない。
まあ、そういう処理系を作ろうと思えば作れるんじゃないの?
0668デフォルトの名無しさん
2008/04/05(土) 21:30:53#define volatile
0669ヽ・´∀`・,,)っ━━━━━━┓
2008/04/05(土) 21:35:440670デフォルトの名無しさん
2008/04/05(土) 21:37:090671ヽ・´∀`・,,)っ━━━━━━┓
2008/04/05(土) 21:44:140672デフォルトの名無しさん
2008/04/05(土) 21:45:400673デフォルトの名無しさん
2008/04/05(土) 22:05:570674ヽ・´∀`・,,)っ━━━━━━┓
2008/04/05(土) 22:11:240675デフォルトの名無しさん
2008/04/05(土) 22:14:57ほとんどosにそれを通知するような機構があると思うんだけど。
javaのvolatileはそれを保証するものになるらしいが。
0676デフォルトの名無しさん
2008/04/05(土) 23:14:20実質的に高級アセンブラじゃん, 言語仕様が…
0677デフォルトの名無しさん
2008/04/05(土) 23:58:130678デフォルトの名無しさん
2008/04/06(日) 22:59:17聞きたかないが。
0679デフォルトの名無しさん
2008/04/07(月) 07:19:160680デフォルトの名無しさん
2008/04/08(火) 00:27:34gccに-fvolatileと-fvolatile-globalってオプションがあったらしい。
前者はポインタからの間接参照、後者はグローバル変数の参照を
全てvolatile扱いするというもの。
見付けたドキュメントは古そうなのだったから、
最近のgccにもあるかどうかは知らないけど。
0681デフォルトの名無しさん
2008/04/20(日) 16:08:470682デフォルトの名無しさん
2008/04/20(日) 20:27:330683デフォルトの名無しさん
2008/04/20(日) 20:39:41私と一緒に働きましょう!
就職フェアでお待ちしてます。
0684デフォルトの名無しさん
2008/04/21(月) 01:48:520685デフォルトの名無しさん
2008/04/21(月) 01:51:040686デフォルトの名無しさん
2008/04/21(月) 01:59:31特にパラメータ化された型のインスタンスに対して使ってるやつ
0687デフォルトの名無しさん
2008/04/21(月) 11:15:410688後置インクリメント
2008/04/21(月) 12:57:170689デフォルトの名無しさん
2008/04/21(月) 17:35:020690デフォルトの名無しさん
2008/04/21(月) 19:52:260691デフォルトの名無しさん
2008/04/21(月) 20:20:52もう働いてるんだって、前は自動車のOSとかやってた
0692デフォルトの名無しさん
2008/04/21(月) 21:06:12最近だとトヨタさんががんばってるみたいだけどあれどうよ?
0693683
2008/04/22(火) 00:09:19# 私は非組み込み。
0694デフォルトの名無しさん
2008/04/22(火) 20:25:12というか正直1年もいないで他のチームいったからな
あの数ヶ月は楽しかった
Javaを経てそっちいって今は標準化()わらいチームだ
0695デフォルトの名無しさん
2008/04/22(火) 21:36:240696デフォルトの名無しさん
2008/04/27(日) 12:07:430697デフォルトの名無しさん
2008/04/27(日) 12:18:530698デフォルトの名無しさん
2008/04/27(日) 14:07:48その辺のスレで添削のお願いとかした方がいいんじゃね?
運が良ければバグとか直してくれる暇人とか来るだろうし。
0699デフォルトの名無しさん
2008/04/27(日) 14:11:20数学板とかいくとアルゴリズムレベルで最適化してくれるが
# 早い話、俺はどこまでアフォなのかを教えてくれる
0700デフォルトの名無しさん
2008/04/27(日) 14:52:190701デフォルトの名無しさん
2008/04/29(火) 04:53:20貴方がこれから知ったことをすべて教えてくれるのなら...
0702デフォルトの名無しさん
2008/04/30(水) 18:04:29ちょっと調べて見たけど、隣り合うところとしか計算しないから
並列化することで計算速度はあがりそうに思える。
しかし単純にスレッド化しても、パフォーマンスがあがるわけではない。
なぜならCPUのキャッシュにヒットするかどうかが鍵になるので
キャッシュ漏れが発生するような並列化をしてしまうと
ペナルティが発生してしまうためである。
またL2キャッシュ漏れが発生して当然というぐらい大量の要素数について
計算するのであれば、並列化することで高速化は図れると思うが
やってみないとわからないし、環境に依存する。
よって最強を求めるならば
要素数や初期条件で最適化は変わるのは当然なので
何がやりたいかちゃんとかかないとだめ。
0703デフォルトの名無しさん
2008/04/30(水) 18:30:26汎用 != 最強
0704デフォルトの名無しさん
2008/04/30(水) 18:52:260705デフォルトの名無しさん
2008/04/30(水) 18:59:100706ヽ・´∀`・,,)っ━━━━━━┓
2008/04/30(水) 19:54:070707デフォルトの名無しさん
2008/04/30(水) 22:42:56「ラムダ持ち上げとかやって本当にグローバルに取らなきゃいけない変数は
まとめて局所的に集約した形でヒープに、そうでない変数はスタックに取る」
とか
「計算方法と使用可能なリソースを分析して配列自体の要素のならびを
スパースに取る(CPU n 個いれば, キャッシュラインサイズ * n で集めら
れるように配列を配置しておいて, N スレッドに自動配分する」
ってのが、賢いコンパイラ
高級アセンブラの C とか C++ とかは上記のような最適化を許されない言語
仕様が結構あると思うんだが…
# 結構がんばってるんだけどな, 大規模並列用の C コンパイラ
# だけど fortran とか, チューニングされた lisp 系言語には負けてるよな
0708デフォルトの名無しさん
2008/04/30(水) 22:53:26言語仕様として低レベルと高レベルを同じ次元で扱ってるのが問題。
0709デフォルトの名無しさん
2008/05/01(木) 00:28:060710デフォルトの名無しさん
2008/05/01(木) 00:29:480711デフォルトの名無しさん
2008/05/01(木) 01:22:32アセンブラ無しのCと計算目的に最適化されてる言語と比較したら
Cには軍配あがらないよなー
てか、それでCのほうが早かったらその言語の意味ないし。
Cにこだわらないで目的に応じたツールを使うってのは
研究者としては全然ありだと思う。
最近のコンパイラは割りと賢くなってきて、
固定値になる場合は計算した結果を使ってくれるようになったけど
基本C言語ってそういうのは実装する人が考えて実装するのであって
最適化はしてくれたらラッキーぐらいのものが多い。
あくまでもC/C++のフレームワークの範囲での最適化といったら
コンパイル結果がどれぐらい小さくなるか考えたりとか、
わざとキャッシュにヒットしないようにデータを配置するとか
その程度だろうし。
あとはそういう計算に向いている汎用ライブラリを使う。OpenMPとか。
で、本当の本当に最適化したかったらアセンブラになってしまい
すれ違いになってしまうという。
0712デフォルトの名無しさん
2008/05/01(木) 01:36:27アセンブラってマイクロレベルじゃよいと思うけど大域的には無理じゃない?
0713デフォルトの名無しさん
2008/05/01(木) 01:38:220714デフォルトの名無しさん
2008/05/01(木) 08:04:49> 固定値になる場合は計算した結果を使ってくれるようになったけど
> 基本C言語ってそういうのは実装する人が考えて実装するのであって
> 最適化はしてくれたらラッキーぐらいのものが多い。
いったいいつの時代の人なんだ?
0715デフォルトの名無しさん
2008/05/01(木) 10:28:08最適化とは逆の方向にいってるよね。
#define SECURE_SCL 0
つければ大丈夫みたいだけど、
知らないと最新の最適化するコンパイラを使っているはずなのに
パフォーマンスが落ちる。
コンパイラの努力をライブラリが無駄にしてるわけですよ。
あとCの最適化って基本的に書いて見てコンパイルさせて
アセンブラ見て最適化されてるか確認して初めてわかるものじゃない?
バージョンがかわったりオプションかわったりすれば
コードが変わるから、それが正しいかどうか判断できないし。
ちょっと上にも誰かが書いてあるけど、最適化するには条件があって
その条件をちょっとでも外れると最適化されないし。
どこまで要求するかで話変わるし
最適化と一言でいっても人によって受け止め方は違うんですよ
自分は最適化してくれたらラッキーぐらいのコードを書くことが大半ですから
最適化がそのプログラムの根幹に関わるようなことはあんまりないです。
ある場合はSSEの出番だし。
自分にとっての最適化はアセンブラだし
人によってはいかにコピーを発生させないかというレベルのものだろうし
研究用との人なんかは結果が速く出れば計算機資源は関係ない人もいるだろうし
ただ、下手なコード書いても速くならないこともしっている。
コンパイラも賢いからね。
0716デフォルトの名無しさん
2008/05/01(木) 10:32:150717デフォルトの名無しさん
2008/05/01(木) 11:05:25一番困るのは、「forよりwhileが速い」とか「[]で書くより*で書くほうが速い」と言った古い流儀を引き摺ることだったり。
特にiccのようなコンパイラは、典型的なforの使い方をした場合により最適化するようだしね。
0718デフォルトの名無しさん
2008/05/01(木) 11:43:37ネットかなんかで見たこと書いてるだけなんだろうけど、微妙に理解力が
足りない感が痛々しいな。
0719デフォルトの名無しさん
2008/05/01(木) 11:46:550720デフォルトの名無しさん
2008/05/01(木) 11:47:460721デフォルトの名無しさん
2008/05/01(木) 11:59:21どこが足りないのか指摘してください。
勉強になるんで。
0722デフォルトの名無しさん
2008/05/01(木) 13:46:37自分のふとした思いつきとか、「何となくそんな気がする」というフィーリングが、
この世の何かを「ピタリ当てている」と信じたい、そういう年頃ってあるでしょ。
0723デフォルトの名無しさん
2008/05/01(木) 13:50:000724デフォルトの名無しさん
2008/05/01(木) 13:53:260725デフォルトの名無しさん
2008/05/01(木) 15:26:25715の最適化についてのレスを書いたのは俺だが
715はメインがSSEとかアセンブラって言ってるから的を外してないと思うぞ。
>>719, 720
俺の経験上、ベクトル化はマジ信用出来ない。
有効に働くのは全要素に単純に四則演算と超越関数を与えるときだけだから
融通のきかなさはGPU以上。
ぶっちゃけそんな単純なコードならCでfor回したって読みにくくならないし、gccもVC++もベクトル化してくれるんだよ。
ただその他のレジスタの使い方とかインライン化みたいな
帯域的な最適化は賢いから高級アセンブラとしては依然有効。
あとcomplexをベクトル化するのも面倒くさいから有効。
0726デフォルトの名無しさん
2008/05/01(木) 15:33:25俺は715じゃなくて、715が参照してる最適化についてのレスを書いた人。
んで、超越関数はgccやVC++ではベクトル化出来ないから
単純な計算式に超越関数が入ってる時はIntelのコンパイラが有効。
まあそれにしたって対象が全要素じゃない事も多いし
結局自分でSSEで書いてる。
0727デフォルトの名無しさん
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だとあんまり目立たないのねん。
0728デフォルトの名無しさん
2008/05/01(木) 19:11:21gcc/icc の違いによるのではないだらうか。
0729ヽ・´∀`・,,)っ━━━━━━┓
2008/05/01(木) 19:47:090730727
2008/05/01(木) 21:56:39結論から言えば、CPUをWoodcrestXeonにしてiccをv10にして-Xtにすればもう少し速くなるのだけれど。
0731デフォルトの名無しさん
2008/05/02(金) 08:00:070732デフォルトの名無しさん
2008/05/02(金) 09:14:140733デフォルトの名無しさん
2008/05/02(金) 09:35:060734デフォルトの名無しさん
2008/05/02(金) 12:20:260735デフォルトの名無しさん
2008/05/02(金) 12:34:02最適化の一つだけどね。
ベンチが自分のやりたいことにあってるかどうかが重要。
0736デフォルトの名無しさん
2008/05/02(金) 14:00:19そういうチューンは無駄かも
0737ヽ・´∀`・,,)っ━━━━━━┓
2008/05/02(金) 14:52:380738デフォルトの名無しさん
2008/05/02(金) 17:56:580739デフォルトの名無しさん
2008/05/02(金) 20:23:180740デフォルトの名無しさん
2008/05/02(金) 21:01:040741デフォルトの名無しさん
2008/05/02(金) 21:11:240742デフォルトの名無しさん
2008/05/02(金) 21:48:560743デフォルトの名無しさん
2008/05/02(金) 21:58:270744デフォルトの名無しさん
2008/05/02(金) 22:10:120745デフォルトの名無しさん
2008/05/02(金) 22:13:08全部展開しろカス
0746デフォルトの名無しさん
2008/05/02(金) 22:14:310747デフォルトの名無しさん
2008/05/02(金) 22:24:15セットのサイズ(キャッシュサイズをセット数で割った数)の倍数のアクセスが増えると効率が悪くなるので、計算順序を変えるとかでそれを外せばOK。
セットのサイズに満たない配列は気にする必要はないかな。
0748デフォルトの名無しさん
2008/05/03(土) 01:43:03セットってのは, コンパレータの個数で ok?
でもって、ラインサイズと素な数で戦えば ok と言ってる?
0749デフォルトの名無しさん
2008/05/03(土) 01:45:49ラインサイズxコンパレータ数と素な数
0750デフォルトの名無しさん
2008/05/03(土) 09:40:56下の絵でアドレスでコーダがセットのライン数になる
http://upload.wikimedia.org/wikipedia/ja/d/d2/Read_4waycache.png
素因数にラインサイズxライン数が含まれると効率が下がる。
でもラインサイズに合わせるのは正解なので、ラインサイズx素数または、ラインサイズx(ライン数を因数として含まない数)がいいんじゃないかな。
0751デフォルトの名無しさん
2008/05/22(木) 23:37:21効率化の手法まとめたページどこにいったっけ?
0752デフォルトの名無しさん
2008/05/22(木) 23:48:51if(n % 2 == 1) n * 3 + 1
0753ヽ・´∀`・,,)っ━━━━━━┓
2008/05/23(金) 21:03:060754デフォルトの名無しさん
2008/05/23(金) 21:58:300755デフォルトの名無しさん
2008/05/24(土) 00:13:090756デフォルトの名無しさん
2008/05/24(土) 00:20:120757デフォルトの名無しさん
2008/05/24(土) 01:23:330758デフォルトの名無しさん
2008/05/24(土) 01:26:110759デフォルトの名無しさん
2008/05/24(土) 01:26:30専ブラ組からすれば、新着レスのあるスレを一覧上部に集めて順に見ていく作業の一過程。
つまりdat削除しない限り、忘れてても縁は切れない。新着レスがあるたび、こうして思い出すことになるw
0760126
2008/05/24(土) 01:27:29実際、専ブラによって色々とスタイル変わってくるよね。
・・・良いんだか悪いんだかわからないけどw
0761759=760
2008/05/24(土) 01:29:48これも専ブラならではか?(マウスホイールしちゃって、前回別の場所で使った名前が出た)。
0762デフォルトの名無しさん
2008/05/24(土) 01:34:000763デフォルトの名無しさん
2008/05/24(土) 08:35:410764デフォルトの名無しさん
2008/05/24(土) 14:05:25カレーライスうまいよね
0765デフォルトの名無しさん
2008/06/12(木) 00:36:2416bitずつ小分けに取得したいのですが
何型にキャストするのが正しいのですか?
0766デフォルトの名無しさん
2008/06/12(木) 01:16:39そもそも、質問の意図が、そう言う話とはちゃってる?
0767デフォルトの名無しさん
2008/06/12(木) 01:24:120768デフォルトの名無しさん
2008/06/12(木) 02:25:12キャストは最後の手段にしようぜ。
ふつうに u64 & 0xffff, (u64 >> 16) & 0xffff, .... でいいでしょ。
0769デフォルトの名無しさん
2008/06/12(木) 02:49:17方法を聞いているに違いない。
配列としてアクセスするのが一番期待できるかな?
0770デフォルトの名無しさん
2008/06/12(木) 02:55:12動作保証が無けりゃ問題外でしょ。ビットシフトで取り出すように書いとけば、
コンパイラが勝手に 16 ビットずつメモリから読み出すように最適化することも
できるだろうし。むしろメモリへのアクセスを陽に書かないほうが早い可能性もある。
0771デフォルトの名無しさん
2008/06/12(木) 03:03:500772デフォルトの名無しさん
2008/06/14(土) 00:12:11エンディアンに依存したらダメじゃね?
0773デフォルトの名無しさん
2008/06/14(土) 00:14:540774デフォルトの名無しさん
2008/06/14(土) 00:18:29依存する問題まで考えて移植性を重視する必要ねーだろ
0775デフォルトの名無しさん
2008/06/14(土) 00:19:090776,,・´∀`・,,)っ-○◎●
2008/06/14(土) 00:43:500777デフォルトの名無しさん
2008/06/14(土) 00:49:040778デフォルトの名無しさん
2008/06/14(土) 12:34:010779デフォルトの名無しさん
2008/06/14(土) 22:31:12そもそも今時のプロセサならバレルシフタぐらいは積んでるだろうから、
>>768 で十分だと思うが。
0780デフォルトの名無しさん
2008/06/17(火) 08:53:090781デフォルトの名無しさん
2008/06/17(火) 08:58:26646 名前:デフォルトの名無しさん[] 投稿日: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同士です
0782デフォルトの名無しさん
2008/06/17(火) 08:59:560783デフォルトの名無しさん
2008/06/17(火) 10:37:140784デフォルトの名無しさん
2008/06/17(火) 10:51:07あらかじめ除数がわかってないと>>781は使えないよ。
0785デフォルトの名無しさん
2008/06/25(水) 18:08:52配列が2のn乗の時だけキャッシュミスヒットが増えて、ループに条件分岐がある時だけベクトル化できなくなります。
0786デフォルトの名無しさん
2008/06/25(水) 22:50:190787デフォルトの名無しさん
2008/06/27(金) 00:35:040788,,・´∀`・,,)っ-○◎●
2008/06/28(土) 13:17:18最近のCPUじゃマイクロコードレベルで同等かそれよりエレガントなことやってるだろうから
よっぽどガチガチのRISCでも使わない限り覚えても意味ないよ
0789デフォルトの名無しさん
2008/06/28(土) 13:21:13具体的に
0790デフォルトの名無しさん
2008/06/28(土) 13:27:380791デフォルトの名無しさん
2008/06/28(土) 14:46:02一例をどぞ
0792,,・´∀`・,,)っ-○◎●
2008/06/28(土) 14:52:12ここにも書いてあるけど、SRT法といってROM上のテーブルから2ビットないし4ビットずつ辞書引きして
求める方法が大分前から主流
実装方法は
http://www.iit.edu/~upadsau/ece529/html_report/ece529_report.html
Radix-16レベルになるとNewton法ですら歯が立たんケースが多い。
0793,,・´∀`・,,)っ-○◎●
2008/06/28(土) 14:54:20PDFのほうがいいみたいだな
http://www.iit.edu/~upadsau/ece529/ece529_report.pdf
0794デフォルトの名無しさん
2008/06/28(土) 19:39:210795デフォルトの名無しさん
2008/06/29(日) 06:48:48それとも、ダンゴがアホなのか?
0796デフォルトの名無しさん
2008/06/29(日) 09:42:33あってもそんな奴隷ドカタ仕事したくありません
0797デフォルトの名無しさん
2008/06/29(日) 09:50:540798デフォルトの名無しさん
2008/06/29(日) 10:13:240799デフォルトの名無しさん
2008/06/29(日) 10:18:358051なんて数人しかいないだろ
0800デフォルトの名無しさん
2008/06/29(日) 10:58:230801デフォルトの名無しさん
2008/06/29(日) 11:30:260802デフォルトの名無しさん
2008/06/29(日) 11:36:33分からないなら別だけどなw
0803デフォルトの名無しさん
2008/06/29(日) 12:09:340804デフォルトの名無しさん
2008/06/29(日) 13:48:45組み込みって、仕事の数としてはどうなんだろう?
0805デフォルトの名無しさん
2008/06/29(日) 15:42:49ただ、不動小数点数除算がそこそこ速いから、場面にもよる。
まあ、役に立つ場面があるわけだから、知識として知っておく分にはデメリットは無いだろう。
ところで、ゲーム以外の組み込みって、ホントに応答時間を重視してる?
家電の何触っても遅い気がするし、このペースなら最適化とか関係ないだろ。
0806デフォルトの名無しさん
2008/06/29(日) 15:59:25組み込みは、ユーザーから見えない所のハードウェア制御の応答時間の制限ががマジ厳しい。
0807デフォルトの名無しさん
2008/06/29(日) 17:28:150808デフォルトの名無しさん
2008/06/29(日) 21:04:13これだから組み込みを知らない奴らは・・・
0809デフォルトの名無しさん
2008/06/29(日) 22:00:42機器によっては UI と機器制御が別になってるのに糞な UI の機器も
あるから、>>808 の言うことは当てはまらない。
0810デフォルトの名無しさん
2008/06/29(日) 22:19:440811デフォルトの名無しさん
2008/06/29(日) 22:22:460812デフォルトの名無しさん
2008/06/29(日) 22:29:45もうちょっとどうにか、って思うことはある。
うちのテレビの設定が右矢印キーで変更モードに入るんだけど、
左矢印キーでなく決定キーでないと変更モードから抜けられない。
で、決定キーでは変更モードに入れない。なんでやねん、と。
0813デフォルトの名無しさん
2008/06/29(日) 22:34:08糞とか言う前にさ。
0814デフォルトの名無しさん
2008/06/29(日) 22:45:33分かりやすさとか、一貫性とかの話じゃないの?
それなら組み込みの大変さとか関係無いし。
0815デフォルトの名無しさん
2008/06/29(日) 22:53:110816デフォルトの名無しさん
2008/06/30(月) 01:04:23固定小数点数との区別も付かないの?
0817デフォルトの名無しさん
2008/06/30(月) 01:17:06本当に不動小数点数と思ってる奴は別だろうけど
0818デフォルトの名無しさん
2008/06/30(月) 03:00:33この場合、typoもありうるね。
以前、太極拳を大極拳って書いてる奴が居て、これは(少なくともATOK17では)
「たいきょくけん」で変換すれば必ず「太極拳」になるのに、わざわざ区切って変換して
わざわざ間違えてるケースだから、いやちょっと待て、って思ったけど。
0819デフォルトの名無しさん
2008/06/30(月) 04:12:17あと50円高いチップ使ってくれたらと思う事は結構ある
0820デフォルトの名無しさん
2008/06/30(月) 07:21:09家電 UI がクズになる理由がよくわかる書き込みだなぁ
つうか釣りだよな?
本気で言ってないよね?
0821デフォルトの名無しさん
2008/06/30(月) 10:14:52iPodなんかは、早くないしすごく使いやすい訳じゃないけど統一感もあるし、うまくできてるよね。
日本(まあ、アップル以外ということだが)の家電の組み込みは、十分練られたUIのガイドラインなしに
思いつきで作ってるようにみえる。UI次第で動作速度を10倍速く感じさせることもできるんだけどね。
0822デフォルトの名無しさん
2008/06/30(月) 10:24:23機器制御が第一、使いやすさ等はそっちのけ。
0823デフォルトの名無しさん
2008/06/30(月) 10:47:160824ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 14:17:490825デフォルトの名無しさん
2008/06/30(月) 14:27:030826デフォルトの名無しさん
2008/06/30(月) 16:02:51ボクちゃんスゴいんだぞカキコか
0827ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 16:52:000828デフォルトの名無しさん
2008/06/30(月) 17:24:480829デフォルトの名無しさん
2008/06/30(月) 17:42:57後半話が逸れてるが、あの馬鹿はそこを指摘してるわけじゃなくてちゃんと本題の整数除算の話をしてる。そこまではいい。
あの馬鹿の馬鹿たる所以は、肝心の整数除算についてはスレタイ通りである事。
そして自分の開発環境しか知らず、必要としている分野があるかもしれないことを想像出来ない事。
仮に必要なかった所で、スレチでもないし他に話題があるわけじゃないんだからぶった切る必要はない。
事実と自分の宗教を分けて考えろと言っているのに。
0830デフォルトの名無しさん
2008/06/30(月) 18:35:49だから他所でも散々言われているとおり
人間性が根本的におかしいって話だろう
そういう相手に対し論理的にモノを考える時点で負けだぞ
0831ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 18:47:09そもそも/演算子が常にDIVに対応するわけではないし、それこそコンパイラの最適化に委ねるべきでしょ。
「ビット演算=トリッキーで速い」と思ってる厨が多杉
PCには左7ビットシフトよりadd eax,eax×7のほうが速い(低レイテンシ)ような
プロセッサだってあったんだぜ?そういうの含めてコンパイラに任せればいいんだよ
マイコンなんかじゃ除算そのものの利用頻度少ないだろ
高級言語レベルで除算をビット演算で置き換えることに価値があると思うなら
まともにボトルネック分析できてないから、まあマ辞めろ
0832デフォルトの名無しさん
2008/06/30(月) 19:04:390833ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 19:07:24技術力がない奴は二言目にはこれを言うね。
そして実際口に出す奴は両方欠落してるのが定説。
0834デフォルトの名無しさん
2008/06/30(月) 19:11:590835ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 19:22:15つかx86も最近は単精度のほうが速いんでないの?
ちなみに*printfは内部でmalloc呼んでるから除算よりよっぽどボトルネックだよ。
そっちの再実装の方がよっぽど価値あるぞ
(書式が必要ない文字列はputsとかfwriteで代用できる)
0836デフォルトの名無しさん
2008/06/30(月) 21:01:400837デフォルトの名無しさん
2008/06/30(月) 21:12:06>>人間性
>技術力がない奴は二言目にはこれを言うね。
>そして実際口に出す奴は両方欠落してるのが定説。
おまいさんが言うべきじゃなかろうw
0838デフォルトの名無しさん
2008/06/30(月) 21:15:20gccはやるな。
でもgccが使えないような人たちはそもそもprintfなんて使わない事に気づいてない。
0839デフォルトの名無しさん
2008/06/30(月) 21:18:34printfのオーバーヘッドの問題は最適化に触れてる本では必ずといっていいほど出てくる。
定数除算の乗算+シフトなどへの置き換えによる最適化はHacker's Delightくらいでしか見たことがない。
popcountやビットスキャンすらハードワイヤードロジックでの実装が増えてるくらいだ。
たしかCellにもその手の命令があった。
0840デフォルトの名無しさん
2008/06/30(月) 21:24:23> ちなみに*printfは内部でmalloc呼んでるから除算よりよっぽどボトルネックだよ。
BSD 由来の printf 系関数のように, 内部で malloc 呼ばない実装もあるんだが………
0841ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 21:25:17GCC以外のコンパイラでは*printfが不要らしいぜwww
馬鹿でぇwww
0842デフォルトの名無しさん
2008/06/30(月) 21:29:010843ヽ・´∀`・,,)っ━━━━━━┓
2008/06/30(月) 21:47:09malloc使うか使わないかだけの問題じゃないな。
そもそもヒープは再利用するからOSの呼び出しが常に発生する訳じゃないし。
書式文字列含む含まないにかかわらず % が含まれるかスキャンするのだけでも
ものすごいクロック数の無駄だと思わないか?
いやコンパイラはGCCだけしか必要ないと思ってる人には無駄だけど
0844デフォルトの名無しさん
2008/06/30(月) 22:01:320845デフォルトの名無しさん
2008/06/30(月) 22:17:120846デフォルトの名無しさん
2008/06/30(月) 22:17:18いきなりオレサマ話をはじめるから
会話にならないよ
相手するのは無駄
でも、かわいいから許す
0847デフォルトの名無しさん
2008/06/30(月) 22:29:530848デフォルトの名無しさん
2008/06/30(月) 23:19:05確かに。
ユーザーが遅くて使いづらいといえば、
それが正しい。作り手の言い訳が挟まる余地はないよ。
0849デフォルトの名無しさん
2008/07/01(火) 00:58:28おまえはx86限定のスレから出てくるなよ、あそこなら神扱いされても文句言われないだけの知識あるから。
0850デフォルトの名無しさん
2008/07/01(火) 01:22:040851デフォルトの名無しさん
2008/07/01(火) 01:27:28書き込む前に前提書いてくれると, 反論なり同意なりしやすいんだが
何に反応してカキコしてるんだかわからん時が………
0852デフォルトの名無しさん
2008/07/01(火) 01:58:38でも提示された資料はまだ読みきってないから内容については・・・、とりあえず信頼するぜ!
0853デフォルトの名無しさん
2008/07/01(火) 02:05:460854ヽ・´∀`・,,)っ━━━━━━┓
2008/07/01(火) 04:54:09・除算がプログラム全体のパフォーマンスを左右しかねないくらいに遅い
・コンパイラがヘタレで除算の最適化を行わない
・なぜか高級言語レベルでのビット演算・乗算への置き換えで劇的に性能改善できる
これ全部満たすのってどんなCPUとコンパイラだよwww
0855ヽ・´∀`・,,)っ━━━━━━┓
2008/07/01(火) 04:58:240856ヽ・´∀`・,,)っ━━━━━━┓
2008/07/01(火) 05:16:010857デフォルトの名無しさん
2008/07/01(火) 05:16:22特にコーディング規約で最適化オプション切らないと駄目なときとか
古いコンパイラ(gccの2.95系ベースだったり)のときもあるし。
劇的な性能改善じゃなく、ループ内とかの小さな積み重ねの問題だし。
変なバス付いてると、その読むだけでウェイトかかったり、
時間制約だけ仕様書に厳しく書いてたり、だし。
結局、小さいことからコツコツやって、アセンブリの出力確認して・・・。
せめてプロファイラくらい欲しくなる時もあるけど・・・。
ICE
こういうのって俺だけ?(´・ω・`)
0858ヽ・´∀`・,,)っ━━━━━━┓
2008/07/01(火) 05:38:13おかしな規約だな
でも最適化するなと指示したのに性能が必要なの?
変数にvolatile付けて副作用のある最適化を抑制したりpragma使って部分指定したりとか
そういう回避手段はいくらでもあると思うが
0859デフォルトの名無しさん
2008/07/01(火) 05:48:06とか言われて前の基板のソースとコンパイラとを引き継ぐなんざ
ざらだよ。コンパイラスイッチまで指定されてるし。
前の基板と同じCPUにして保守部品の在庫コスト下げる必要も
あるし、しゃーねーけど。
そうなると古い環境と古いCPUだから、必然的に枯れた技術で
対応しないと駄目になる。
0860デフォルトの名無しさん
2008/07/01(火) 06:27:13コードレビューに単体テストやらされた覚えがある。
除算なんか得体の知れない演算に置き換えたりしたら、
まあ全パターンテストどころじゃ済まないな
何のために最適化を抑止する規約になってるのか意図を考えれば本末転倒な話だ
0861デフォルトの名無しさん
2008/07/01(火) 07:31:01別スレでも最後散々証拠見せろとか喚いていたがテメェが日本語読めてないだけだ。
0862デフォルトの名無しさん
2008/07/01(火) 07:37:340863デフォルトの名無しさん
2008/07/01(火) 10:05:420864デフォルトの名無しさん
2008/07/01(火) 10:22:02【団子ちゃん】C、C++の最適化について語るスレ 3【専用】
が良いのではないか。
そうだ団子ちゃんが書き込んでるスレは全部これにしよう!
0865デフォルトの名無しさん
2008/07/02(水) 13:07:51実際盛り上がってるんだしw
0866デフォルトの名無しさん
2008/07/02(水) 13:23:06新規は無さそうだが
0867デフォルトの名無しさん
2008/07/02(水) 13:49:01IA32だとアライメントが合ってなくても遅くなるだけだが、
ミスアライメント例外が発生するCPUも結構あるから
ターゲットによってはテストが必要だろう。
0868デフォルトの名無しさん
2008/07/02(水) 15:59:37最近のIA-32のロードユニットは64ないし128ビットのロード+シフトで構成されてるので、
8ないし16バイト境界さえ跨いでなかったら実は殆ど同じ。
長さが決まってるstrncpyやmemcpyをDWORD単位のL/Sに展開する最適化はVCでもやってるな。
0869デフォルトの名無しさん
2008/07/02(水) 21:49:340870デフォルトの名無しさん
2008/07/02(水) 22:16:160871デフォルトの名無しさん
2008/07/02(水) 23:27:10各情報は間違ってないが、全部持論に持って行こうとしているだけの構ってちゃん。
最終的には根本的に間違ってる。
(情報は合ってるが、導いている方向が間違ってる)
0872デフォルトの名無しさん
2008/07/03(木) 01:04:130873デフォルトの名無しさん
2008/07/03(木) 01:09:280874ヽ・´∀`・,,)っ━━━━━━┓
2008/07/03(木) 08:07:510875デフォルトの名無しさん
2008/07/03(木) 08:11:47もちろんターゲットはx86だけど。
いや、アラインメント不整合で遅くなるとか、だいぶ知識古いなと思って
0876デフォルトの名無しさん
2008/07/03(木) 08:47:020877デフォルトの名無しさん
2008/07/03(木) 09:58:120878デフォルトの名無しさん
2008/07/03(木) 10:45:25上のレスが全部そうじゃねえかwww
0879デフォルトの名無しさん
2008/07/03(木) 11:21:48見苦しい団子が何言ってんだかw
しかしム板の連中は優しいよな
UNIX板みたいに有無を言わさず
追い出したりしないし
0880ヽ・´∀`・,,)っ━━━━━━┓
2008/07/03(木) 15:58:36COBOLer未満のマイナー人種じゃねーか
x86,ARM,SuperH,PowerPCあたりより市場規模大きいなら謝るが
マイノリティはマイノリティらしくしろボケ
0881デフォルトの名無しさん
2008/07/03(木) 16:09:220882ヽ・´∀`・,,)っ━━━━━━┓
2008/07/03(木) 16:14:54高級言語レベルでの最適化を論じなきゃいけないようなケースなんて
まずないですから。
どことも知らない過疎の山村の「おらが村のシキタリ」
なんて、世の大半は一生知らなくても生きていけるように
本当に無駄な知識なんです。
本当に視野が狭いのは、マイノリティを自覚できないマイノリティですよ。
0883デフォルトの名無しさん
2008/07/03(木) 16:16:22Q.普段は買い物程度ですが、たまに家族4人で出かけられる車を探しています。予算は250万円です。
A.スポーツカー以外知ったこっちゃないよ。オートマとかどんだけw
こうですか?わかりません(><)
0884ヽ・´∀`・,,)っ━━━━━━┓
2008/07/03(木) 16:17:560885デフォルトの名無しさん
2008/07/03(木) 16:21:560886デフォルトの名無しさん
2008/07/03(木) 16:22:340887ヽ・´∀`・,,)っ━━━━━━┓
2008/07/03(木) 16:23:26四人乗りならダイハツMOVE(笑)でも十分だな。
カローラでももったいないな。
大体にその例はおかしい。
大衆車の話の最中に農機の話をするくらいナンセンス
0888デフォルトの名無しさん
2008/07/03(木) 16:24:05弱小は質問しちゃいけないの?
0889デフォルトの名無しさん
2008/07/03(木) 16:25:14この団子ちゃん本物?
アレなのは判ってたけど
ここまでとは
0890デフォルトの名無しさん
2008/07/03(木) 17:10:370891デフォルトの名無しさん
2008/07/03(木) 17:26:400892デフォルトの名無しさん
2008/07/03(木) 17:35:310893デフォルトの名無しさん
2008/07/03(木) 18:53:09あぼーんで済まなくて厄介なのさ
0894デフォルトの名無しさん
2008/07/03(木) 19:29:020895デフォルトの名無しさん
2008/07/03(木) 20:09:17水道もガスも使わない人なんだな。
組み込みのカバーエリアがわかってて寝言ほざいてんのか?
おまえがしたクソ流す水道局の制御も枯れたマイコンでやってんだよ。
パソコンとゲームしかしらない引篭もりは黙ってろ(w
0896デフォルトの名無しさん
2008/07/03(木) 21:09:210897デフォルトの名無しさん
2008/07/03(木) 21:15:22この発言があろうが無かろうが関係ないし、
ましてや議論が正しかろうが間違っていようが関係ない。
いい歳して論調がおかしすぎる。
丁度本人が言ってくれたから>>833をそっくりそのまま返してあげたい。
0898デフォルトの名無しさん
2008/07/03(木) 21:42:210899デフォルトの名無しさん
2008/07/03(木) 21:54:16中学くらいにしか見えん
少なくとも社会人はできんだろう
0900デフォルトの名無しさん
2008/07/03(木) 23:25:430901デフォルトの名無しさん
2008/07/03(木) 23:29:360902デフォルトの名無しさん
2008/07/03(木) 23:39:060903デフォルトの名無しさん
2008/07/03(木) 23:48:440904デフォルトの名無しさん
2008/07/03(木) 23:49:580905デフォルトの名無しさん
2008/07/04(金) 00:07:09憶測だけど多分25前後。
>>903-904
いや、シャシャリ出てこないだけで話を理解出来る奴もいるよ。
奴は持論、空論、論理のすり替えは多いがCPUのアーキテクチャは人一倍理解している。たまに勘違いしてるが、突っ込みどころは少ない。
それよりファミリーカーの話題にスポーツカーとか農機とか平気で語り出して、それで結論づけて話を終わらせるのが問題なんだよ。
0906デフォルトの名無しさん
2008/07/04(金) 01:10:100907デフォルトの名無しさん
2008/07/04(金) 03:55:43理解力はあると思うが、後付けが多いのは話題が出てから調べてるせいじゃねのか?
0908デフォルトの名無しさん
2008/07/04(金) 05:13:49せいぜいヘネパタ読んだレベルだと思うんだが。
0909デフォルトの名無しさん
2008/07/04(金) 07:32:21現実問題を解決できる人格と器量が
無いのが最大の問題点
0910デフォルトの名無しさん
2008/07/04(金) 08:37:42実務の人は現場の実情に縛られすぎで、団子は空論すぎ。
でも、逆の視点から見るのも新鮮だから、お前は空論とか、無駄な制約に縛られすぎとか一度忘れようぜ
0911デフォルトの名無しさん
2008/07/04(金) 08:43:050912デフォルトの名無しさん
2008/07/04(金) 10:56:31自分を神のように思い込んでしまう痛さ
もう少し修行すれば東京kittyみたいになれるぞ!
0913デフォルトの名無しさん
2008/07/04(金) 11:24:38批判してるヤシはここには無用の存在なんだが
0914デフォルトの名無しさん
2008/07/04(金) 11:38:150915デフォルトの名無しさん
2008/07/04(金) 16:02:310916ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 16:56:02でも【ソフト市場の】規模は・・・
たしかに組み込み分野において非x86にかかわるソフト技術者の需要も
拡大してるのは認めるべき事実だね。
でも個々のCPU単位でみるとまだ遠く及ばないんだよね。
Web・オープンとかパッケージとかでいうジャンルに分類されるソフトの動く
システムの大半はx86ベースだ。
ソフト資産の面で圧倒的な最大勢力だから需要が需要を呼ぶ状態。
#大体にエンベデッドシステムの受験者の少なさ加減を見れば何が解らんかや
0917ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 17:05:24それまさに大衆車に対する耕運機とかトラックのポジションじゃんww
もちろん組み込みソフト屋に多重派遣比率が高いのも知ってる。
ピラミッドには底辺が必要なのも事実だよ。
0918ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 17:17:13x86に限らず、ここ最近のRISC系統のプロセッサなら大概、
除算そのものの命令はなくとも逆数や逆数平方根を求めるのにRadix4-SRTかそれ同等の手法を使ってる。
Radix-16はまだ少ない。x86ではIntelが45nmで実装を始めたばかりだ。
0919デフォルトの名無しさん
2008/07/04(金) 18:02:300920デフォルトの名無しさん
2008/07/04(金) 18:15:080921デフォルトの名無しさん
2008/07/04(金) 18:17:030922デフォルトの名無しさん
2008/07/04(金) 18:23:42どこでいいか聞けばわからないし、早く意見が聞きたいから・・・
多くの閲覧者がいるスレッドを選ぼうと。
0923デフォルトの名無しさん
2008/07/04(金) 18:25:200924ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 18:30:49前者はC++98の規格書も同然だから持っておいたら?
あと「C++プライマー」もいい本。
たしかに
定数除算の最適化(笑)にテンプレートも使えないロートルが威張り散らすようなスレで
聞くべきじゃないな
0925デフォルトの名無しさん
2008/07/04(金) 18:39:23論理のすり替え。
件の例は、回答が質問とはあさっての方向って意味だろ。
0926デフォルトの名無しさん
2008/07/04(金) 18:43:35どうもありがとう。「プログラミング言語C++第三版 ソリューション」 には、
「 98年刊「プログラミング言語C++ 第3版」の練習問題の解答を提示し、
C++のより深い概念・構文・機能を詳細に解説。
ソフトウェア設計の際に新たな指針となるアイデアを提供するための補助問題
も掲載。」らしいけど、「プログラミング言語C++ 第3版」の練習問題はないの
かな?
0927訂正
2008/07/04(金) 18:44:36どうもありがとう。「プログラミング言語C++第三版 ソリューション」は、
「 98年刊「プログラミング言語C++ 第3版」の練習問題の解答を提示し、
C++のより深い概念・構文・機能を詳細に解説。
ソフトウェア設計の際に新たな指針となるアイデアを提供するための補助問題
も掲載。」らしいけど、「プログラミング言語C++ 第3版」の練習問題は載って
ないのかな?
0928ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 18:54:48それともソフトの市場規模がハードの個数だけで決まるとでも思ってたの?
つか組込ソフト市場でのシェアすら携帯やゲーム機で使われてる
MIPSとかARMなんかの方がずっと大きいと思ってるんだが
68kのノウハウなんて何の役に立つの?
0929ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 19:14:35C++第三版自体に練習問題が載ってる。
規格の説明がメインなので問題数自体はそんなに多くないが、
解答だけで一冊分厚い本が作れた程度には問題の中身は濃い。
飲み込みのいい人にはこれだけで十分。
まあプライマーが一番いいんだけど、でかすぎるので気力のない人にはおすすめできない。
あとiostream周りはミス設計なので無理知らなくてよい。
STLも全部使ってみる必要はない。
0930デフォルトの名無しさん
2008/07/04(金) 19:16:25OoOが云々言われてもそれこそ役に立たないだろ。
専用スレを立てるべきという意見とかは過疎るだけな気もするが別に異論はない。
他にあさってな例は、某スレでの「クタざまぁ」と言いたげな発言。
スレの住民には何の意味もないし。
嫌いなら、そしてスレタイどおりの議論をしたくないなら出ていけばいいだけ。
俺もx86は団子並みに得意だけど、他の環境は詳しくないからもっと情報欲しいんだ。
ぶったぎらないで建設的な会話をしてくれ。
0931デフォルトの名無しさん
2008/07/04(金) 19:36:58>あとiostream周りはミス設計なので無理知らなくてよい。
kwsk
basic_stringをハーブ・サッターがボロクソに叩いてるのは
知ってるけど、それは初めて聞いたな
0932ヽ・´∀`・,,)っ━━━━━━┓
2008/07/04(金) 20:14:50iostreamまわりだけで入出力やろうとするとcstdioよりかえって手間がかかるんだよね。
printfはJavaにも移植されたくらいメジャーな機能。
C++においても誇りを持って使うべき。
boost::formatを使うという手もあるんだけど、
実行ファイルサイズがでかくなるわ、sprintf併用より遅いわで実用は考えない方がいい。
0933デフォルトの名無しさん
2008/07/04(金) 20:19:150934デフォルトの名無しさん
2008/07/04(金) 20:39:470935デフォルトの名無しさん
2008/07/04(金) 20:42:300936デフォルトの名無しさん
2008/07/04(金) 21:55:20シェアが低い、原子炉の制御やら火力発電所の制御はどうでもいいと。
衛星の管理もどうでも良いと。
だれも威張ってないし、マジョリティぶってんじゃないのよ。
マジョリティな話題しか出来ないなら、マイノリティの話題が出たときには口を噤む位の
脳みそを示してほしいだけ。
こっちは、別に最新の最適化を否定しているわけじゃねーんだからよ。
0937デフォルトの名無しさん
2008/07/04(金) 22:01:35組んだことがないな。
それよりも、国際化を意識しているとprintfの書式はちょっと不満。
言語によって単語の順番を変えた方が自然になることが多いからね。
まぁ、こういう話はスレ違いになってくるが。
0938デフォルトの名無しさん
2008/07/04(金) 22:22:49パーソナルコンピュータ市場で1位がCompaq、Appleは2位のシェアを獲得しました。
ってやつ。
3位がIBMですっていう・・・
0939デフォルトの名無しさん
2008/07/04(金) 22:54:292chにくるな
0940デフォルトの名無しさん
2008/07/04(金) 23:36:21Posix拡張使えばいいじゃない。
今時、VC++も_printf_pなどといった関数で同じ順序指定の書式が使える。
0941デフォルトの名無しさん
2008/07/04(金) 23:36:55というか2chにくるなとか、2chはお前の家かってw
0942デフォルトの名無しさん
2008/07/05(土) 00:23:490943デフォルトの名無しさん
2008/07/05(土) 00:30:510944デフォルトの名無しさん
2008/07/05(土) 01:46:410945ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 10:31:00俺が言ってるのは首尾一貫して、その68kだかでしか通用しない【除算の厨テク】の需要がある人がマイノリティってことなんだけどな。
組み込みソフト市場そのもが小さいことに言及したのは、あくまで主論の一環だよ。
もちろん組み込みソフト市場は拡大してるしこれからも増える。
でも、前世紀の厨テクなんて無くてもソフトが組めるしそもそも一生知る必要がない人のほうが多い
そもそも性能の要求があるからもっと近代的なプロセッサを採用すべきじゃね?
もちろんprintfのパフォーマンスなんざ本質的にはどうでもいいものの代表例だし、
除算はもっとどうでもいい。速かれ遅かれそもそも組み込みCPUは遅いものだから大局には影響がない。
#原子炉(笑)下水道(笑)
#68kがなければARMを使えばいいじゃない。
#Atomでもいいよ
0946デフォルトの名無しさん
2008/07/05(土) 10:49:320947デフォルトの名無しさん
2008/07/05(土) 10:53:000948ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 10:55:47ARMのthumb命令セットなんてコードサイズ>実行効率の代表格だし
SuperHなんかももともとの命令セットが小さいよね。
80:20だとか90:10だとかいうけど本当にプログラム全体の性能のボトルネックになってる部分は
コード全体の2割にも満たないという経験則がある。
それこそ頻度の高い処理の最適化だけで十分だね。
0949ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 11:00:00逆に必要のあるものなんてあるの?
原子力がなければ自家発電でいいじゃない。
火打ち石で火でもおこせばいいじゃない。
ソフト産業なんて須く本質的に必要のないものを作ってるんだよ。
0950デフォルトの名無しさん
2008/07/05(土) 11:04:36医療機器が無ければ死ねばいいじゃない。
0951ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 11:06:52なあに、かえって免疫力がつく
0952デフォルトの名無しさん
2008/07/05(土) 11:34:440953デフォルトの名無しさん
2008/07/05(土) 11:40:20と言っているんだよ、きっと。
0954ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 11:42:170955ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 11:44:12日本語おかしいです
0956デフォルトの名無しさん
2008/07/05(土) 11:45:010957ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 11:52:01ソフト産業なんてサービス業ですよ
でも本質的に必要の無いところにこそビジネスチャンスがある
0958デフォルトの名無しさん
2008/07/05(土) 12:10:360959ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 12:15:280960デフォルトの名無しさん
2008/07/05(土) 12:17:50おさらば
0961デフォルトの名無しさん
2008/07/05(土) 12:32:52>#68kがなければARMを使えばいいじゃない。
>#Atomでもいいよ
勝手に使ってろよ(w
今現在の現実問題を無視して、突然自分の理想世界でオナニーかよ。
お前はそうゆう世界に引っ越せよ。今は68はまだ現役なんだからよ。
時間がたてば世代交代して、今のプロセッサを組み込みで使うようになるなんざ、
アホでもわかるんだよ。えらそーに垂れんな(w
ただし、その時はARM(笑)やAtom(爆笑)は「最新のプロセッサ」じゃなくなってんだよ(w
68kが最新だった時代があるって脳みそが理解できんのか?
マイノリティに対して「マイノリティだ!厨テクだ!」って一々嬉々として攻撃して
「最新を知ってる自分は、より上位」とかいう態度がアホだって言ってんだよ。
見てて痛いから、話題に関係無い時はすっこんでろ。こっちが恥ずかしいんだよ。
0962ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 13:14:02それなりに柔軟性があるから今後も進化していけるんでね?
x86が出てから何十年もたつけど、時代遅れになった時代なんてないな。
AtomでもVIA C7でもいいけど、真面目な話、組み込みも含めてx86オンリーの時代は来つつあるね。
新たに命令セットを起こして市場を征するような時代は前世紀で終わったよ。
まあインフラ向け組み込みも本質的に他のCPUでこと足りる分野であって
そのCPUそのものが必須ではないことがわかってるならそれでいいよ。
68kは進化から取り残され、最新鋭(笑)だった時代の技術者が引退しちゃったらそれまでだろうし
技術者は今やCOBOLerなみに貴重なのは認めるよ
0963デフォルトの名無しさん
2008/07/05(土) 13:21:56今、現役(稼働中という意味でなく、新たにプログラムが組まれているという意味で)じゃないなら、
今後書くコードでそのテクを使う必要は無い、
って言ってるんじゃないの?団子は。
0964963
2008/07/05(土) 13:23:370965デフォルトの名無しさん
2008/07/05(土) 13:27:22おまえが、「不要だ」っていってる話題は、今現在、現実の世界で「必要」って人もいるのよ。
しかも、その分野は、現実世界でそれなりに意味のあることやってんのよ。
それがわからずに「そんなもん不要だ!」とか「マジョリティぶるな!」とか言って、
おもむろに全否定はじめるから、みんなはソレが痛いって言ってんのがわかんねーのか?
68が今後廃れるのはわかってるしPPCやARMがシェア伸ばしてるのが現状なのは
お前よりは現場の人間の方が味わってわかってるのよ。
けど、インフラの世代交代なんていつもの事だし、どーでもいいのよ。
お前の頭の中の未来(笑)がx86で埋め尽くされてようが、こっちしったこっちゃねーの。
他人の話題を否定する前に、自分の知ってる世界とは違う世界があって、そこでは、
お前のも含めて、水流せばクソがちゃんと明後日の方向にすっ飛んでくよう頑張ってる
人たちもいるって考えるようにしとけよ。ただでさえ痛いコテなんだからよ。
0966ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 13:28:10保守の見積もり工数昇華のために都度車輪を再発明しないといけない人なんでしょ。
0967デフォルトの名無しさん
2008/07/05(土) 13:30:170968デフォルトの名無しさん
2008/07/05(土) 13:32:430969ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 13:33:39問題は、保守の度に都度除算を書かされ、その最適化をコンパイラにやらせることができない人がどれだけいるかだ。
そもそも最適化なんて本当に必要なの?無駄な作業じゃね?
いい加減意図を読もうよ
0970デフォルトの名無しさん
2008/07/05(土) 13:34:05団塊退職の穴埋め云々の怖い話は正直聞きたくない
0971デフォルトの名無しさん
2008/07/05(土) 13:49:240972デフォルトの名無しさん
2008/07/05(土) 13:57:45Cなんてつかってるの、デカイ範囲じゃもはや組み込みくらいじゃねーの?
そういう意味じゃここでやってもかまわん話題だと思うが。
いまさらな話題だし、度々されても困るけど。スレチとは思えん。
何時までもヒステリックに否定するほどの事でもないだろ。
ダンゴは負けたくないんだろうけど。人格全否定されてるもんな〜。
0973デフォルトの名無しさん
2008/07/05(土) 14:05:19ま、68kと言っていいかどうかは意見の別れるところだが。
0974ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 14:15:37井の中の蛙大海を知らず。
Web・オープンの世界では確かにLAMPとかRailsが最近人気だがC/C++もまだまだ使われてる。
Windowsではネイティブのほうがまだ多い。
むしろ保守のしようのなくなったレガシーの置き換えにJavaとかC#が使われ始めてるのが現実。
文字通りパフォーマンスが必要な部分についてはC/C++(場合によってはASMも併用)は必要なんだよね。
高級言語でSIMD拡張を直に叩けるのは少ないし。
0975デフォルトの名無しさん
2008/07/05(土) 14:24:33ダンゴさんが言うと説得力あるな、具体例として。
0976デフォルトの名無しさん
2008/07/05(土) 14:31:230977デフォルトの名無しさん
2008/07/05(土) 14:33:29命令セット同じってだけでx86を語ってるアホもいるんだし、CFも68系でいいんじゃね?
誰かさんに言わせると、「進化からとりこのされた」らしいけど(w
いまさら常識だけど、C/++の最適化はターゲットプロセッサと使ってるコンパイラの
組み合わせを意識しないと駄目って事を忘れて、突然「最新のx86と最新のコンパイ
ラじゃないと駄目」とか言い出してる痛いボケが、このスレじゃはりついてるってわけか。
仕事で使うのに「僕、最新のプロセッサとコンパイラじゃないと嫌です!車輪の最発明は
愚かも者のする事なんです」とか言えねーだろ。普通。みんな与えられた環境で
ベストつくしてるだけだっての。
「組み込みも含めてx86オンリーの時代」とかって、超イタ過ぎ。
>>974
だから、>>>972はCっつってんだろ。
Cなんて最近じゃねーよ。ほとんど++だっての。アホか。
みんな知ってるわかりきったこと偉そーに語んなっていってんだろ(w
0978デフォルトの名無しさん
2008/07/05(土) 14:36:570979デフォルトの名無しさん
2008/07/05(土) 14:42:59僻地における老人介護の需要的な意味で。
別にC/C++使いの需要が組み込みが高いわけではない。
だから孫請け曾孫請け偽装派遣が横行する。
つーかC++は組み込みではまだ少ないだろ。シンビアン使ってるとこぐらいだな。
当然68Kなどお呼びでないな。
0980デフォルトの名無しさん
2008/07/05(土) 14:48:35ま、少ないことにかわりはないが。
0981デフォルトの名無しさん
2008/07/05(土) 14:50:14C++の組み込み利用が多いとも言ってないんだが・・・。
どうしたんだ?
0982デフォルトの名無しさん
2008/07/05(土) 14:57:05日本語がもう少しまともに使えるようになるまで ROM ってろよ、低脳。
0983ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 15:03:59仕事でコンパイラの機能で不満感じたことはないし、
そもそも性能要求が大きい分野なら、それなりに予算おちる。
むしろ上に規約の改善提案できんようじゃ終わっとるな。
どんだけ人月商売の消耗品だよ。
0984デフォルトの名無しさん
2008/07/05(土) 15:11:59そういう世界では手間の割に効果の高い方法は採用したいのだ。
あ、ダンゴさんへのレスじゃないよ。
0985デフォルトの名無しさん
2008/07/05(土) 15:13:140986デフォルトの名無しさん
2008/07/05(土) 15:17:10つうか、シチュエーションもわからずに「規約の改善」とかいってるけど、
なんか理由があって規約が出来た可能性もあるしな。
その手の「客の指定でコンパイラ代えれません」とか政治的理由のある
変な規約があるなんてザラだし。
ダンゴって学生?
0987ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 15:18:32LUTに展開したりとかの手動最適化はスクリプトで迅速かつ確実に。
基本的にこういう分野は人要らないんだよ。
一度作ってしまえば再利用可能。
それを、何度も新たに除算を書き直さないといけないなんて、
人月単価何十万の商売でマージンで稼ぐのが目的の派遣業の常套手段ですね。
わかります。
0988デフォルトの名無しさん
2008/07/05(土) 15:22:21【ダンゴは】C、C++の最適化について語るスレ 3【クソを流さない】
って感じか?
0989デフォルトの名無しさん
2008/07/05(土) 15:23:400990デフォルトの名無しさん
2008/07/05(土) 15:23:43何度も同じコード書くって言い張ってるのもダンゴだけだし。
0991ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 15:24:18なんだ客に提案もできない会社なのか。聞いちゃ悪いけど何次請け?
間接的だが俺の提案で客にPentium Mサーバ入れさせたことがある。
Intelプロセッサだからできたんだけどな。ちょうど産業用マシン出してるメーカーもあったし。
これがAMDだと極端に嫌われる。
0992デフォルトの名無しさん
2008/07/05(土) 15:25:30ほんま、ダンゴさんは、名言のオンパレードやで。
0993デフォルトの名無しさん
2008/07/05(土) 15:25:37ダンゴもアレだが、除算の最適化が厨テクってのは同意だな
余程ボトルネックになってる箇所限定なら有りだけどさ
0994デフォルトの名無しさん
2008/07/05(土) 15:26:51面白れー。
0995デフォルトの名無しさん
2008/07/05(土) 15:26:56つまりこういうことですね。
0996ヽ・´∀`・,,)っ━━━━━━┓
2008/07/05(土) 15:29:37そもそも組み込みCPU評価ボードがお手軽とかさ
ATOM載ったマザーがいくらで買えるか考えたら、お手頃でもなんでもねーって。
ましてバルクで1000個単位の価格なんざ興味ないし
0997デフォルトの名無しさん
2008/07/05(土) 15:29:58余裕の無い環境で必要ならやればいいでしょ。
リソースに余裕ある場合は厨テクになるけど。
0998デフォルトの名無しさん
2008/07/05(土) 15:32:30極論だねぇ
0999デフォルトの名無しさん
2008/07/05(土) 15:33:46おもしれー奴だよな。
1000デフォルトの名無しさん
2008/07/05(土) 15:34:2410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。