【初心者歓迎】C/C++室 Ver.63【環境依存OK】 どんな end が来るかはコンパイラには 100 か 10 かも判らん場合が多いから 展開前をコメントアウトし、ばらしたコードで記述する意味はある。
endが4の倍数なら後段のforも要らないしな そこまでカツカツの速度が要る場面も珍しいだろうけど
ループの中に if文が挟まって毎回評価してるのを 大加算ループの中でswitch に置き換えるとか色々。
>>949 展開ってそういうことか
ありがとう。
それは4段階展開ってことだよね
確かに読みにくくなるね・・・
アンロールするかどうかのコンパイルオプションがあることもあるよ
手作業でアンロールを始めるとvtuneが欲しくなるな。
VSにはアンロールなんて無くね?
iccなら>952のendをヒントとしてコンパイラに与えることもできる。
アンロールってはじめてしった
>>949 for (i = 0; i < end + 4 ; i += 4){
ですな・・
それじゃ台無しだ。
>>961 for (i = 0; i < end − 4 ; i += 4){
にはw
whileの展開はどうなるの? でも制御文事態のコストがforより軽いからやる意味ないのかな?
whileでも同じ
展開可能な文を while に詰め込むのは クソプログラム だと思うがね。
アンロールもいいけどチョコロールもね
>>968 do と while どういう使い分けしてるの?
数値を変更もしないし、わかりやすく別名を付ける場合は const int MAXDATA = 123; #define MAXDATA 123 この2つはどっちが正しいんでしょうか? なにか決定的な違いはありますか?どうでもいいですか?
Cでは後者。 C++ではどちらも正しいが、前者が望ましい。 名前空間やスコープを無視するマクロはできるだけ無い方が良い。
どうしても、処理が遅い場合、最後の手段はアセンブラを書きなおすっていうのをやってみたいんですが、 アセンブラの命令一覧はなにを参考にすればいいんですか?どこにあるんでしょうか? CPUによってかわるんですか?
>>973 命令一覧みたからって即できるようなもんじゃないとだけ言っておく
アセンブラはマイコンで慣れてるのでたぶんできると思います。 物によって命令が違うのでWindowsで使える?VSで使える命令を知りたいんです
>>975 ほぼ確実に遅くなるからやめておいたほうがいい。
パイプラインを阻害しないような命令配置とか人間が考えるよりコンパイラにやらせたほうがマシ。
SSEとか使うなら今のところコンパイラまかせよりは人間のほうがいいかも知れんけど。
Windowsと言えば、x86だからIntelのウェブサイトにPDFが転がっている。まあAMDにもあるだろうけど。
http://www.intel.co.jp/jp/download/ この中でも、命令が載っているのは
32ビット(と16ビット)はIA-32 インテル
アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル。
上・中A・中B・下があって中2つが命令一覧。
大体同じだけど、64ビットがインテル エクステンデッド・メモリー 64
テクノロジー・ソフトウェア・デベロッパーズ・ガイドの1巻・2巻。
適当にググって予備知識を付けてから見たほうがいい気もするけど。
命令だけ見てもダメじゃん。 Cの変数とやりとりする規約をコンパイラのマニュアルから探さないと。
>>979 そんなのサンプルみて体で感じ取るぐらいじゃないと駄目
if( a == b && a == c ) これは問題ないですか? if( (a == b) && (a == c) ) こう書かないと結果がおかしくなる場合ってあるんですか? あと、&&と書きさえすればショートサーキットになるんでしょうか? コンパイラによって変わってきちゃいますか?VSなんですが
インテルで調べればよかったんですね。 Windowsはハードの互換性がメリットだと思ったので 仮想アセンブラのようなものでCPUを統一しているのかと思いました。 ありがとうございました。
>>982 > 仮想アセンブラのようなものでCPUを統一
うまいなあ。それは.NET Frameworkというやつだ。
規約や引数その他はコンパイラにアセンブラの出力をさせりゃそれで充分。 問題は、 玄人のアセンブラ>>コンパイラの最適化>>>>素人のアセンブラ なことだ。 確かIntelのpdf群の中に最適化マニュアルもあっただろ。 どんな命令がストールを起こすとかマイクロコードだから遅いとか 互換性を維持しながら最大限速度を取るにはとか、そんなのが載ってるはず。たぶん。 ただね、SIMDのような特殊な命令を利用して特定部分を、というのでない限り 普通は「分岐予測ミス」「メモリアクセス」によって、CPU時間のかなりの部分を食われるのよ。 Pen4とかと比べれば、最近のはそれでもマシになったけど、おそらく半分程度は浪費されるはず。 だから、いかに分岐を減らしてキャッシュミスを無くすか そういうのをC/C++のレベルで考えながらコードを書いたほうが意味があったりするわけよ。
ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、 玄人ががんばれば勝てるものなのか。
>>985 コンパイラに勝つには、コンパイラの使わないSIMD命令を使い倒さないとだめだな。
でも、ほどほどの速さで良ければ、アセンブリ言語を使わなくても
コンパイラ組込関数を使えばいいという状況になりつつある。
マルチスレッドで変数を同時にアクセスするのが危険な気がするので確実に安全をつくりたいんですが ここからここまでの処理はこのスレッドに変数アクセス優先権をあたえて、 他のスレッドがアクセスしに来たらそのスレッドは変数を使い終わるまでそこでストップ というような処理はできるんでしょうか?
988 :
デフォルトの名無しさん :2009/02/09(月) 04:05:58
できるよ。一度に、あるコードに入れる回数を制限できる
989 :
デフォルトの名無しさん :2009/02/09(月) 04:21:10
難し・・・がんばる ありがとう!
マルチスレッドで変数のアクセスって 書き換えがメインスレッドだけでサブスレッドは 読み込みだけだったら問題ないですか?
中途半端な状態ってのがないならそれでいいけど、 volatile はつけとけよ。
994 :
デフォルトの名無しさん :2009/02/09(月) 09:06:55
まるで初心者だが、borlandC++5.5を使ってて、 Windows関数をつかって軽いアプリケーションを作りたいのだが win関数を使うとコンパイルでエラーが出てしまう・・・ "外部シンボル 'WinMain' が未解決" これはどういうことなのでしょうか・・・?おしえてくだしあ><
"外部シンボル 'WinMain' が未解決" でぐぐれ
996 :
デフォルトの名無しさん :2009/02/09(月) 09:11:16
-W をつける。
>>985 > ほう。今ならコンパイラの最適化が人間が扱うのは無理なレベルに達してると思ってたんだが、
> 玄人ががんばれば勝てるものなのか。
勝てるけどコストが合わない事が多い。
>>993 volatile じゃ解決しねーよ。同期オブジェクト使わないと。
んなこたぁない状況による
どこくらいの移植性を考えるかで変わってくるな。 メモリモデルをx86系Windowsに限定するならセーフ。 C/C++の言語的にはアウト。 専門的な話をしたいならマルチスレッドスレに行ったほうがいい。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。