C、C++の最適化について語るスレ 3
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/07/05(土) 16:27:29主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。
なお、OS、CPU、コンパイラなどは限定しません。
前スレ
C、C++の最適化について語るスレ
http://pc11.2ch.net/test/read.cgi/tech/1084676298/ (過去ログ化前)
C、C++の最適化について語るスレ 2
http://pc11.2ch.net/test/read.cgi/tech/1177808054/
0002デフォルトの名無しさん
2008/07/05(土) 16:28:270003デフォルトの名無しさん
2008/07/05(土) 16:37:27読めてないよ
0004デフォルトの名無しさん
2008/07/05(土) 16:38:37まったくだよな。
前スレの後半読み飛ばしまくったけど、それでもむかついた。
0005デフォルトの名無しさん
2008/07/05(土) 16:41:080006デフォルトの名無しさん
2008/07/05(土) 16:42:030007デフォルトの名無しさん
2008/07/05(土) 16:43:360008デフォルトの名無しさん
2008/07/05(土) 16:48:410009ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 16:55:440010デフォルトの名無しさん
2008/07/05(土) 17:17:45かってにシキるなよ。クソを流さないダンゴ。
0011デフォルトの名無しさん
2008/07/05(土) 17:36:55これだから組み込みを知らない奴らは・・・
0012ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 17:46:00大変なのはいいからC++でリソース潤沢な環境の最適化の需要を想定できない人は電子板に行ってください。
ここのカテゴリは「PC等」なんで。
俺はPPCマカーでもあるから非x86には寛容な方だけど
0013デフォルトの名無しさん
2008/07/05(土) 17:46:560014デフォルトの名無しさん
2008/07/05(土) 17:49:39前スレの807-813の再レスというかネタだろ
0015デフォルトの名無しさん
2008/07/05(土) 17:51:390016ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 17:55:54うるしぁiPodぶつけんぞ
0017デフォルトの名無しさん
2008/07/05(土) 18:09:24前スレの948に答えてあげよう、ROMは割と余る、RAMは意外と足りない。
あと16ビット系は多品種少量でめちゃ現役。
ARMやMIPSみたいな豪華なCPUが使えない場所はけっこうあるよ。
0018ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 18:19:020019デフォルトの名無しさん
2008/07/05(土) 18:25:00テンション高すぎw
0020デフォルトの名無しさん
2008/07/05(土) 18:26:400021デフォルトの名無しさん
2008/07/05(土) 18:36:410022デフォルトの名無しさん
2008/07/05(土) 18:39:030023デフォルトの名無しさん
2008/07/05(土) 18:43:300024デフォルトの名無しさん
2008/07/05(土) 18:51:570025デフォルトの名無しさん
2008/07/05(土) 18:56:070026デフォルトの名無しさん
2008/07/05(土) 19:09:520027デフォルトの名無しさん
2008/07/05(土) 19:11:41905 :デフォルトの名無しさん:2008/07/04(金) 00:07:09
>>899
憶測だけど多分25前後。
>>903-904
いや、シャシャリ出てこないだけで話を理解出来る奴もいるよ。
奴は持論、空論、論理のすり替えは多いがCPUのアーキテクチャは人一倍理解している。たまに勘違いしてるが、突っ込みどころは少ない。
それよりファミリーカーの話題にスポーツカーとか農機とか平気で語り出して、それで結論づけて話を終わらせるのが問題なんだよ。
0028デフォルトの名無しさん
2008/07/05(土) 19:38:430029ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 20:43:13どうせならHDみたいな本に載せてもいいような、
機種によらずほとんどのCPUで有効な最適化手段用意しようよ。
ちなみに前スレのは俺の使う石だとかえって遅くなるぞ。
そういう特定のCPUに依存したコードをことわりもなく書くのが傲慢なんだよ
俺がどれだけSSEとかVMXの話題遠慮してると思ってるんだ
もっとも、この板に専門スレがあるがな
0030デフォルトの名無しさん
2008/07/05(土) 21:35:350031デフォルトの名無しさん
2008/07/05(土) 21:41:150032デフォルトの名無しさん
2008/07/05(土) 21:49:13ヒープ確保よりスタック確保の方が早いけど、
スタックだとコンパイル時にサイズ決まってしまうのが残念だ。
allocaが安心して使えたら良いのに。
0033デフォルトの名無しさん
2008/07/05(土) 22:59:480034ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/05(土) 23:54:50void foo(int n)
{
double a[n];
…
}
こんな風に整数の変数でスタック上配列を確保できる。
もちろん関数の途中でも{}で囲んでやりさえすればいつでも使える。
なんにせよC99準拠の処理系ならほぼ例外なく
何らかの形でallocaみたいな関数も実装されてると思ってるが。
しかし機械語レベルで見るとなんのことはない、x86でいうespを変数値ぶんだけ操作してるだけ。
0035デフォルトの名無しさん
2008/07/05(土) 23:57:59配列のアドレスを別に保存しておかないといけないし、
サイズも sizeof 用に保存しておかないといけないんだぜ。
0036デフォルトの名無しさん
2008/07/06(日) 00:09:54void foo(const char *p)
{
char a[strlen(p) + 1];
...
}
で上手くコンパイルできないバグがあった。
esp を操作するだけなんて言う奴は考え浅すぎ。
0037デフォルトの名無しさん
2008/07/06(日) 00:23:56>C++はもちろん当たり前だがC99準拠の処理系では
C++でも出来るように読めてしまう
0038デフォルトの名無しさん
2008/07/06(日) 00:30:230039デフォルトの名無しさん
2008/07/06(日) 00:36:01allocaと同じく、関数頭辺りでスタックのページ拡張コードも入るよ。
espをいじるだけだと例外が発生する。
0040デフォルトの名無しさん
2008/07/06(日) 00:50:160041デフォルトの名無しさん
2008/07/06(日) 00:53:50だから、>>34 はそんなレベルじゃないって言ってるだけだが。
>>39
それは、環境による。
全ての環境にページングシステムがついてるわけじゃないし、
スタック例外処理ハンドラで拡張するシステムもあるし。
0042デフォルトの名無しさん
2008/07/06(日) 01:11:25std::vect(ry
0043デフォルトの名無しさん
2008/07/06(日) 01:15:440044デフォルトの名無しさん
2008/07/06(日) 01:49:030045デフォルトの名無しさん
2008/07/06(日) 01:54:430046デフォルトの名無しさん
2008/07/06(日) 02:16:58それ反転
0047デフォルトの名無しさん
2008/07/06(日) 02:18:140048デフォルトの名無しさん
2008/07/06(日) 02:22:130049デフォルトの名無しさん
2008/07/06(日) 02:24:40>そういう特定のCPUに依存したコードをことわりもなく書くのが傲慢なんだよ
すげぇ
お薬効きまくってますネ!
0050デフォルトの名無しさん
2008/07/06(日) 02:36:150051デフォルトの名無しさん
2008/07/06(日) 02:41:09前スレ見てない人には、団子の人格批判だけのレスは
アホっぽく見えるから、止めた方が良いと思うぞ。
0052デフォルトの名無しさん
2008/07/06(日) 02:50:32このスレも
同じレベルだろ
0053デフォルトの名無しさん
2008/07/06(日) 02:55:510054ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 06:45:28ヒープに確保で駄目な理由ってなに?
逆にスタックを使うデメリットは認識してる?
多くのCランタイムはアプリケーションヒープはプールしてmallocの度に未使用領域を再利用する実装が多いよ
Cellのspu-gccだとは単にLS上の空いたとこ割り当てるだけだし
0055デフォルトの名無しさん
2008/07/06(日) 07:20:18>そういう特定のCPUに依存したコードをことわりもなく書くのが傲慢なんだよ
勝手に決めんな。このスレはOS、CPU、コンパイラは限定しないんだから、
古くても新しくても、機種依存でも、あきらかにそれとわかれば問題ねーんだよ。
>>34
高速なメモリプールを動的に確保したいってだけでしょ?
最適化は直接関係ないじゃん。
>>48
他システムとのエンディアン変換で使わんか?フーリエ変換でもあると便利でしょ。
SIMDにそんな命令があるCPUもあるから、どうしても速度が気になるなら直書でやったら?
ダンゴが固定しているCPUに依存しない最適化じゃ無理。
0056デフォルトの名無しさん
2008/07/06(日) 07:55:400057デフォルトの名無しさん
2008/07/06(日) 08:08:15ダンゴの使っていない処理系の話題は板違いです
0058ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 08:22:25じゃ古典的な実装のひとつでも覚えようか。
ちなみに4〜5行目はBSWAPがあれば一発だね。
i = ((i&0x55555555)<<1) | ((i>>1)&0x55555555);
i = ((i&0x33333333)<<2) | ((i>>2)&0x33333333);
i = ((i&0x0F0F0F0F)<<4) | ((i>>4)&0x0F0F0F0F);
i = ((i&0x00FF00FF)<<8) | ((i>>8)&0x00FF00FF);
i = i>>16 | i<<16;
ま、これが最善とは限らないがね。
ちなみに他に、ビットスワップにXORを使う実装があるが
スーパースカラと相性よくない気がするので俺はこっちが好き
#組み込み爺さんは放置推奨。かまうあなたも組み込みです。
0059デフォルトの名無しさん
2008/07/06(日) 09:39:12Radix-SRT dividerは組み込みには関係ないからと噛みついたのが組み込み爺さん
ダブスタもいいところだな
0060ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 09:43:520061デフォルトの名無しさん
2008/07/06(日) 09:46:34用意してたの?
0062デフォルトの名無しさん
2008/07/06(日) 10:08:22で?最適化は?
0063デフォルトの名無しさん
2008/07/06(日) 10:12:37俺、組み込みやってるんだけど、このスレじゃダンゴ氏に
肯定的でないと発言出来ないって事?
あと、結局このスレはCPU依存な話題はNGって事でOK?
0064デフォルトの名無しさん
2008/07/06(日) 10:14:01いや、駄目ってことではなくて、違うじゃんってこと。
そりゃヒープ気分ででかいの確保したらすぐ死ぬけどさ。
>>56
可変長配列のこと?
だとするとC言語用の単なる構文糖衣みたいなものか・・・。
>>55
バイト列じゃなく、ビット列まで逆になるエンディアンがあるってこと?
0065デフォルトの名無しさん
2008/07/06(日) 10:14:47最近はビット順もエンディアンって言うのか?
0066デフォルトの名無しさん
2008/07/06(日) 10:21:040067デフォルトの名無しさん
2008/07/06(日) 10:27:33まぁ手でやったけど。
0068デフォルトの名無しさん
2008/07/06(日) 10:30:11ビット演算だけで、剰余を求める方法を教えてください
788 名前:,,・´∀`・,,)っ-○◎●[sage] 投稿日:2008/06/28(土) 13:17:18
というか、除算・剰余にビット演算を使うような厨テクなんて
最近のCPUじゃマイクロコードレベルで同等かそれよりエレガントなことやってるだろうから
よっぽどガチガチのRISCでも使わない限り覚えても意味ないよ
795 名前:デフォルトの名無しさん[sage] 投稿日:2008/06/29(日) 06:48:48
古いCPUと枯れたコンパイラの仕事はもう無いっておもってるのか?
それとも、ダンゴがアホなのか?
--
これで荒れはじめたんでしょ。
よっぽどツボついたのか、ダンゴが組込み=悪って事にして散々罵倒しだした。
それで、なんだか、ココは最新のベクトル系の最適化の話以外は禁止なふんいき。
0069ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 10:31:19こういうのは基本的に何パターンか丸暗記してる。HDにも載ってるし。
ちなみにこれは比較的命令の並列度が高めのCPU向け。
>>62
逆に、これより速いのあるならやってみてよ。
ちなみにAltiVecやSSE4を使っていいなら攪拌命令を使って各バイト4ビットずつ
同時にビットオーダーを反転する手もある。
007055
2008/07/06(日) 10:32:460071ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 10:38:39汲み取り系君はビット順とバイト順が区別できないほど頭がアレなんで。
0072デフォルトの名無しさん
2008/07/06(日) 10:42:03お前みたいなスレが荒れる原因を
わざわさ持ち出してくる奴も同じくらい迷惑なんだが
0073ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 10:51:24普通はCではコンパイラの仕事だろ。
0074デフォルトの名無しさん
2008/07/06(日) 10:57:260075ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 11:05:17くやしいのうwwwくやしいのうwww
こうですかわかりません><
0076デフォルトの名無しさん
2008/07/06(日) 11:08:17vipでやれカス共
0077デフォルトの名無しさん
2008/07/06(日) 11:19:10ところで、モトローラのマイコンの件はどうなりましたか?
0078デフォルトの名無しさん
2008/07/06(日) 11:19:230079ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 11:34:08あの会社の収益は組み込みPPCが大半だと思ってたよ
で、R8Cとどっちが売れてるの?
0080デフォルトの名無しさん
2008/07/06(日) 11:47:510081デフォルトの名無しさん
2008/07/06(日) 11:53:07だからマジョリティしか発言権無いのかと。
0082デフォルトの名無しさん
2008/07/06(日) 11:55:460083デフォルトの名無しさん
2008/07/06(日) 11:58:44売ったんじゃなくてスピンアウトだろ
どっちかというと分社化
MacのIntel移行は痛かったようだな
0084デフォルトの名無しさん
2008/07/06(日) 11:59:460085デフォルトの名無しさん
2008/07/06(日) 12:19:570086デフォルトの名無しさん
2008/07/06(日) 12:29:39モトローラは通信事業の収益の方が大きかったから辞めたがってた。
アポは五月蝿いくせに数捌かない客だったし。
アポが消えたら、厄払いが済んだかのように、各ゲーム機が一斉にPPC系になって
フリスケとIBM大勝利って感じ。
>>63
別にダンゴスレじゃないから、ココで組込みの話題でもオッケー。
最適化関係ならね。
0087ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 12:38:30は?
Freescaleはゲーム3機種に絡んでないよ。Wiiのは750CLカスタムだし。
Appleこそ脱PPC以降米国市場で1000ドル以上のPCの売上でダントツトップになったり
大躍進じゃないか
でもclassic見捨てるなボゲ
0088デフォルトの名無しさん
2008/07/06(日) 12:52:10どーでも良い事にいちいち噛み付くなよ。ウゼェ。
0089デフォルトの名無しさん
2008/07/06(日) 12:53:22最適化された結果消えたんだから文句言うな
0090デフォルトの名無しさん
2008/07/06(日) 12:55:58PPCマックのプログラムなんて、爺の野良仕事みたいなもんだと思うけど。
0091デフォルトの名無しさん
2008/07/06(日) 12:59:02ダンゴもいい加減からかわれてるって気づけ!
良い天気なんだから、外に出て体動かせ。ビタミンDでも補給しろ!
0092デフォルトの名無しさん
2008/07/06(日) 13:42:12で、モトローラのマイコンはどうなんだ?
市場規模とかw
0093ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 15:10:53まあウンコじゃね?
ハードの売上とそれに群がるソフト市場、ともにIntelが圧倒的に首位なのは言うまでもないし。
0094デフォルトの名無しさん
2008/07/06(日) 15:16:08たまのフレーミングが終われば過疎スレに戻るんだから、いまはこのイベントを楽しめ
>87
> Freescaleはゲーム3機種に絡んでないよ。Wiiのは750CLカスタムだし。
言いたいことは否定しないが、CodeWarrior を供給してる関係で、"ゲーム開発に絡んでいる" という言い方は出来る。
つうか、前スレ831 にアンカー付けてくれないかな。
824には同意なんだが。
0095デフォルトの名無しさん
2008/07/06(日) 15:25:520096ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 15:26:40しかしCodeWarriorねぇ・・・
Wii向けならまだ使ってるとこあんのかね?
PS3はSCE謹製のSDKがあるし360はもちろんVisualStudioだし。
0097ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 15:29:510098デフォルトの名無しさん
2008/07/06(日) 15:30:03ツボをつく書き込みがあった?
団子はしばしば発狂してるけどトリガが知りたいな
0099デフォルトの名無しさん
2008/07/06(日) 15:39:57なかなかの蹴散らされっぷりだなw
0100デフォルトの名無しさん
2008/07/06(日) 15:45:140101デフォルトの名無しさん
2008/07/06(日) 15:47:07店主を完全に拘束しといてくれ、頼んだよ
0102ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 15:57:03要するに独自IDEを維持できないほどにヤバいんだよ。
地味にMac用C/C++として独占的な需要あったのにXcodeに完全に食われたしね。
0103デフォルトの名無しさん
2008/07/06(日) 15:58:530104ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 16:07:23低リソースでやりくりの文化が生理的に嫌いなだけよ
さらに組み込みのローカルルールを持ち込んで吠える奴が嫌い。
ま、Sunのみたいにいちいちアラインメント例外吐くCPUも嫌いだが
(下位ビットを無視してでもメモリアクセスの方が好き)
まあどうでもいいこと
0105デフォルトの名無しさん
2008/07/06(日) 16:08:400106デフォルトの名無しさん
2008/07/06(日) 16:09:570107デフォルトの名無しさん
2008/07/06(日) 16:13:11ソフトウエア市場規模TOP以外はローカルなのか。
0108デフォルトの名無しさん
2008/07/06(日) 16:26:20要するにボクちゃん以外は
ローカルなんだよ
さすが自称社長の息子www
0109デフォルトの名無しさん
2008/07/06(日) 16:27:18[2] 問題文(含コード&リンク):
キーボードから4桁の10進数の入力を2回受付ける.
但し,4桁の各位の数は必ず互いに異なるものが入力されるとする.
A:二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す.
B:二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す.
AとBの数値を最後に表示させる。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:borland c++ 5.5
[3.3] 言語:C
[4] 期限: 今日中でお願いします。
0110デフォルトの名無しさん
2008/07/06(日) 16:30:06[2] 問題文(含コード&リンク):
キーボードから4桁の10進数の入力を2回受付ける.
但し,4桁の各位の数は必ず互いに異なるものが入力されるとする.
A:二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す.
B:二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す.
AとBの数値を最後に表示させる。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:borland c++ 5.5
[3.3] 言語:C
[4] 期限: 今日中でお願いします。
0111デフォルトの名無しさん
2008/07/06(日) 17:47:22え?ダンゴってそんな面白設定あったんだ。
なんでPGなんてやってんの?マゾ?
0112デフォルトの名無しさん
2008/07/06(日) 17:49:330113デフォルトの名無しさん
2008/07/06(日) 18:01:33さすがに、それは誹謗中傷すぎるだろ。
ダンゴ、早く否定してくれ。笑い死ぬ。
0114デフォルトの名無しさん
2008/07/06(日) 18:02:40その辺の八百屋のおっちゃんだって社長だぞ。定食屋のおっさんも社長だよ。
俺の小学校なんて、同じクラスの1/3くらいは社長の息子だったぞ。
0115デフォルトの名無しさん
2008/07/06(日) 18:12:49帝王学ばかり学んでたので、おまえらリーマンのことなんて
知るかボケみたいな発狂をしてた
細かい言い回しは違うだろうけど
こういうのを見てると、団子の技術は刃物としか思えん
他にもゲームの開発してた自慢なんて面白発言もあったかな
0116デフォルトの名無しさん
2008/07/06(日) 18:14:110117デフォルトの名無しさん
2008/07/06(日) 18:14:29まあ、こっちは別に下賎よばわりされても結構だが(w
みんなドラえもんとか思い出しちゃうよ。「スネ夫か!」って(w
0118デフォルトの名無しさん
2008/07/06(日) 18:21:17今の自分の仕事に社会的な意味をみいだせてないんじゃないの?
組込みの人は、社会的に説得力のある仕事が多いから、
組込み=爺とかマイノリティってレッテル貼って自我を保ってるように思える。
そんなの気にしなくて良いのに。誰もダンゴを下賎だとか思ってないって。
面白キャラだとは思うけど。
0119デフォルトの名無しさん
2008/07/06(日) 18:22:31就労経験はあるんだろうけど(バイトとか)、職場の人を見ながら小学生の妄想
「皆ボクチンの考えどおり動けばギガイオナズンなのに」って感じで
0120デフォルトの名無しさん
2008/07/06(日) 18:24:200121デフォルトの名無しさん
2008/07/06(日) 18:36:50だけど、組込みでアプリ屋の戯言ホザク奴もアホだろ。
自分の領分と異なる世界なら、黙って学んでけば良いだけで。
PICで開発やってるのに除算連発して「コンパイラを信じろ」なんて言ってたら基地外だよ。
同様に、アプリ開発でいまさら除算をいちいちシフトに直してたら、そんなカスはクビだろ。
いい加減いがみ合うなって。
0122デフォルトの名無しさん
2008/07/06(日) 18:38:04技術があれば何をしてもいいんだって所なんだよ
わざわざ自作PCみたいなところで
素人相手に技術自慢というか
技術をふりかざしたイジメをしてみたり
せっかく愛嬌もあるし面白キャラなんだから
もう少しなんとかならんものか
本当に学生だったり
もっと飛び抜けてればそれもありだと思うけど
0123デフォルトの名無しさん
2008/07/06(日) 18:43:51あればね
0124デフォルトの名無しさん
2008/07/06(日) 18:47:30ム板でそれが通用すると思ってるあたりが痛いんだよな。
まあ、ココはイイ隔離スレになってるよ。
出来れば、社長の息子はずっとここに閉じ込めといてくれ。
0125デフォルトの名無しさん
2008/07/06(日) 18:49:43組込みでアプリ屋の戯言ホザク奴とかこの場に存在しない人を持ち出されても困る
0126デフォルトの名無しさん
2008/07/06(日) 18:53:440127デフォルトの名無しさん
2008/07/06(日) 18:53:580128デフォルトの名無しさん
2008/07/06(日) 18:58:380129デフォルトの名無しさん
2008/07/06(日) 19:01:01つ鏡
0130デフォルトの名無しさん
2008/07/06(日) 19:04:49小規模開発でいろいろ気を使うのは事実だし、
それをマイノリティとか爺の仕事とかいってるアホがいるじゃん。
0131デフォルトの名無しさん
2008/07/06(日) 19:05:520132デフォルトの名無しさん
2008/07/06(日) 19:17:250133デフォルトの名無しさん
2008/07/06(日) 19:28:340134デフォルトの名無しさん
2008/07/06(日) 19:33:240135ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 19:33:45プンプン
つか、ちなみに俺いまアマグラミンガーで本職営業だけど
職業マが負け犬って自覚はあるのか。良いことだ
どこの大手SIerでもコンサル>SE・PGだもんな。
客に仕様を提案したり、自分たちで作ったソフトを売り込む人間は偉いんだよ。
与えられたハードと仕様の通りにソフトを作る人間はただの駒でしかない。
本質的な話、組み込みには負け組しかいないってことな。
0136デフォルトの名無しさん
2008/07/06(日) 19:35:50世の中トレードオフと言うものがあって、全ての項目を良く
するなんてできない事も多い。
例えばコンパイラオプションで速度優先とかサイズ優先の
最適化とかあるだろ。
最適化によって速度もサイズも良くなる場合はいいけど、
背反する場合もあるからな。
0137デフォルトの名無しさん
2008/07/06(日) 19:36:41組み込み屋って回路図引くところから、つか、デバイスの選定からやるもんだぜ。
しかし、今回は思った通り過ぎてつまらないな・・・
0138デフォルトの名無しさん
2008/07/06(日) 19:38:06勝ち組とか駒とか負け組みとか偉いとか、アホくさい発言すんなよ恥ずかしい。
兼業農家と専業農家はどっちは偉いかとか、近海漁業は遠洋漁業に比べて偉いとか
イチイチ職業や役職にランク付けして、自分の地位を確認してんのか?
寂しい奴だな。
0139デフォルトの名無しさん
2008/07/06(日) 19:43:20ペンション屋の息子か・・・。別に悪かないが、他人様の職業バカに出来るほどかぁ?
0140デフォルトの名無しさん
2008/07/06(日) 19:49:08思ってるけど、自分が負け組みなんて考えたこと無かった。
偉いってなに?定量的に言ってほしい。
幸福感の多様性が認められない価値観の人が、管理職を技術職より偉いってよく言うけど。そんな感じ?
それとも、生涯年俸の話?
もしかして、社長>社員って価値観?
0141デフォルトの名無しさん
2008/07/06(日) 19:49:480142デフォルトの名無しさん
2008/07/06(日) 19:58:35ん
ごは転職を二度ほどしてなかったか?なぜペンション屋の息子などと主張するの?
0143デフォルトの名無しさん
2008/07/06(日) 20:06:14kwsk
0144デフォルトの名無しさん
2008/07/06(日) 20:08:29最近は論理層と物理層で分ける所も多いよな。ソフトとハードって呼んでだけで。
FPGAやらCPLDのソースも普通に使うし。ターゲット用のデバドラをCで組む事もあるし。
0145ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:09:39社員(株主)>社長(従業員筆頭)だな。
ちなみに俺は某生命保険相互会社の【社員】でもあるが
0146デフォルトの名無しさん
2008/07/06(日) 20:19:28団子専用スレで団子に理解できない話を振って脱線させるのはどうかと
0147デフォルトの名無しさん
2008/07/06(日) 20:20:03ようするに、職業では組んでないって事?アマグラマーみたいな造語?
別に、このスレとしてプロかどうかなんてどうでも良い事だと思うんだけど。
別に学生でも社会人でも職業でやってても趣味でやってても良いと思うよ。
ただ、俺は職業プログラマーが負け犬とか思わないけどな。
自分が職業プログラマやってて自虐ギャグでやってるんなら構わないけど、
そうじゃないなら、他人の職業を貶めるのは貧しい発想だし、傲慢なアホウのする事だよ。
0148デフォルトの名無しさん
2008/07/06(日) 20:24:360149デフォルトの名無しさん
2008/07/06(日) 20:29:420150デフォルトの名無しさん
2008/07/06(日) 20:32:02これでもまだ団子と会話が成り立つと思ってる?
残念だけどまともな対処はできないと思うよ
0151ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:34:30【問】
uint32型の整数nが2のべき乗もしくは0ならtrue,それ以外ならfalseを返す関数を作れ。
#しかし簡単すぎるなこれ。
0152デフォルトの名無しさん
2008/07/06(日) 20:38:330153デフォルトの名無しさん
2008/07/06(日) 20:39:570154デフォルトの名無しさん
2008/07/06(日) 20:41:540155デフォルトの名無しさん
2008/07/06(日) 20:42:470156デフォルトの名無しさん
2008/07/06(日) 20:44:040157デフォルトの名無しさん
2008/07/06(日) 20:44:47目糞と鼻糞が罵り合ってる
0158デフォルトの名無しさん
2008/07/06(日) 20:45:32保険屋の宿題か?自分で考えろよ、それ位。
0159ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:45:43釣れた結果がム板最速スレじゃん
0160デフォルトの名無しさん
2008/07/06(日) 20:47:31なんざありふれてるのでライブラリを検索する。
わざわざ車輪の再発明する必要はない。
0161ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:47:49相互会社における【社員】の意味も知らないのか
0162デフォルトの名無しさん
2008/07/06(日) 20:49:030163ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:51:21え?
こんなものまでライブラリ化するの?
多倍長でもない整数の足し算や引き算を関数にするようなもんだな
0164デフォルトの名無しさん
2008/07/06(日) 20:53:480165デフォルトの名無しさん
2008/07/06(日) 20:55:110166デフォルトの名無しさん
2008/07/06(日) 20:55:370167デフォルトの名無しさん
2008/07/06(日) 20:56:06case 0:
case 0x00000001: case 0x00000002: case 0x00000004: case 0x00000008: case 0x00000010: case 0x00000020: case 0x00000040: case 0x00000080:
case 0x00000100: case 0x00000200: case 0x00000400: case 0x00000800: case 0x00001000: case 0x00002000: case 0x00004000: case 0x00008000:
case 0x00010000: case 0x00020000: case 0x00040000: case 0x00080000: case 0x00100000: case 0x00200000: case 0x00400000: case 0x00800000:
case 0x01000000: case 0x02000000: case 0x04000000: case 0x08000000: case 0x10000000: case 0x20000000: case 0x40000000: case 0x80000000:
return true;
default:
return false;
}
0168166
2008/07/06(日) 20:57:160169ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 20:57:49ギャグで言ってるのか?
0170デフォルトの名無しさん
2008/07/06(日) 20:58:13ギャグでいってるのか?
あと、関数とかいってるクズはどうしようもないな
そのまま氏んでくれ
0171デフォルトの名無しさん
2008/07/06(日) 20:58:210172デフォルトの名無しさん
2008/07/06(日) 20:59:06まあ、組込み屋的発想で申し訳ないが。
0173170
2008/07/06(日) 20:59:130174デフォルトの名無しさん
2008/07/06(日) 21:00:000175デフォルトの名無しさん
2008/07/06(日) 21:01:04関数っていってるのってダンゴさまだけだぞ!あやまれ!
0176デフォルトの名無しさん
2008/07/06(日) 21:02:070177デフォルトの名無しさん
2008/07/06(日) 21:03:17言い方が聖書の一説っぽいな。
0178デフォルトの名無しさん
2008/07/06(日) 21:05:350179デフォルトの名無しさん
2008/07/06(日) 21:06:200180デフォルトの名無しさん
2008/07/06(日) 21:10:270181デフォルトの名無しさん
2008/07/06(日) 21:18:40プログラマ組は次スレに移動しましょう
0182デフォルトの名無しさん
2008/07/06(日) 21:23:11どんな配列だよw
一瞬想像しちゃっただろ。
>>181
ペンション屋の息子スレに移動でいいんじゃね?
0183デフォルトの名無しさん
2008/07/06(日) 21:28:29このスレの面白さは、プログラマにしかわからんだろうな。
0184デフォルトの名無しさん
2008/07/06(日) 21:34:21「発明」できなくても恥じることはないような式を使うことになる。
答えつーか元ネタを知ってる連中は今頃アイタタタ・・・と思ってるだろう。
つか俺俺
ついでに言うとスレチ。
0185ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 21:34:23ビット配列にすればたった512MBですむな。
0186デフォルトの名無しさん
2008/07/06(日) 21:42:130187デフォルトの名無しさん
2008/07/06(日) 21:47:070188ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 21:54:32ある法則に気付くだろう。
0189デフォルトの名無しさん
2008/07/06(日) 21:58:27よっぽどダンゴ先生が気になっているんだなw
0190デフォルトの名無しさん
2008/07/06(日) 22:05:120191デフォルトの名無しさん
2008/07/06(日) 22:08:26何言ってんだこいつ?ダンゴ先生がそんなつまんない回答するわけないだろ。
すっげー最適化スレにふさわしい目から鱗の超回答に決まってんだろ!偽者!
0192デフォルトの名無しさん
2008/07/06(日) 22:12:53この辺の単語に回答が隠れてると思うな。俺は。
google先生も知らない単語だし、こいつは怪しいぜ。
0193デフォルトの名無しさん
2008/07/06(日) 22:14:230194デフォルトの名無しさん
2008/07/06(日) 22:19:410195デフォルトの名無しさん
2008/07/06(日) 22:20:550196ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 22:30:25へぇ
0197デフォルトの名無しさん
2008/07/06(日) 22:32:040198デフォルトの名無しさん
2008/07/06(日) 22:37:000199デフォルトの名無しさん
2008/07/06(日) 22:46:29ここでは、どんなボケでダンゴをからかうかでみんな足並みそろえてる。
0200ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 22:47:100201デフォルトの名無しさん
2008/07/06(日) 22:51:57ダンゴ先生に失礼だな、君は!!
何言ってんだよ。ダンゴ先生がこんな常識的なコードで満足しているわけないだろ!!
あのダンゴ先生だぜ!!俺達が想像もできないような方法をあと一時間もしないうちに書いてくれるはずだ!!
そうじゃなかったらダンゴ先生のことだから恥ずかしくて二度とム板に来れるわけないだろうが!!
ささ、先生どうぞ↓
0202デフォルトの名無しさん
2008/07/06(日) 22:53:260203デフォルトの名無しさん
2008/07/06(日) 22:58:480204デフォルトの名無しさん
2008/07/06(日) 23:01:59あぼ〜んを主張するのを見ると顔がにやけてしまわないか?
>>203
0205ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 23:09:360206デフォルトの名無しさん
2008/07/06(日) 23:11:57想像だけど団子が悪いだろ!
0207デフォルトの名無しさん
2008/07/06(日) 23:23:28身から出た錆。
懲りない奴。
0208デフォルトの名無しさん
2008/07/06(日) 23:29:59さて、残り三十分ってところか!!
ダンゴ先生、>>206とか>>207とか見返すような鮮烈な最適化コードをよろしくお願いしますよ!!
0209デフォルトの名無しさん
2008/07/06(日) 23:56:530210ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/06(日) 23:59:08あるわけねーだろ文盲、カス、インキンタムシ
0211デフォルトの名無しさん
2008/07/07(月) 00:01:57あなたは偽物ですね、わかります。
ダンゴ先生ならちゃんと書けますから。書けないわけがありませんから。
ダンゴ先生を侮辱する偽物は失せろよ!!
ささ、ダンゴ先生、どうぞどうぞ↓
0212デフォルトの名無しさん
2008/07/07(月) 00:06:10テラおっさん臭いクソスレでワロタ
0213ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 00:12:110214デフォルトの名無しさん
2008/07/07(月) 00:13:51だから、偽物はとっととしっぽ巻いてママのおっぱいでも吸いに行きなって。
ダンゴ先生の実力に嫉妬すんなよ、凡人が。
0215デフォルトの名無しさん
2008/07/07(月) 00:45:490216ヽ・´∀`・,,)っ━━━━━━┓
2008/07/07(月) 00:57:34キーボード・・・たしかにPFUなんてソフト屋としちゃあれだな
HHKBは愛用してるけど。
0217デフォルトの名無しさん
2008/07/07(月) 01:02:07馬鹿とはそういうもんだ。
0218デフォルトの名無しさん
2008/07/07(月) 01:03:330219デフォルトの名無しさん
2008/07/07(月) 01:10:230220ヽ・´∀`・,,)っ━━━━━━┓
2008/07/07(月) 01:18:23でも金払ってサービス受けてるんだからそれ以上の感情などないな
0221デフォルトの名無しさん
2008/07/07(月) 01:34:440222ヽ・´∀`・,,)っ━━━━━━┓
2008/07/07(月) 01:39:26外食行ってトイレが汚かったらその店もう二度と行きたくないだろ?
ようするに店の本質が問われるわけ。
だから誇りに思って便器磨くがごとく働けよ。
0223デフォルトの名無しさん
2008/07/07(月) 01:47:07で、お前は一体何ができんの?
0224デフォルトの名無しさん
2008/07/07(月) 02:04:350225デフォルトの名無しさん
2008/07/07(月) 02:06:571、トイレ掃除のおばちゃん程度の人
2、俺様
0226デフォルトの名無しさん
2008/07/07(月) 02:08:14まともな営業もできないだろうよ
0227デフォルトの名無しさん
2008/07/07(月) 02:11:13「ボク様のこと誉めて誉めてー」って
わざわざ書き込みしに来ることなんだよ
しかも一部から来るなって言われてるのにwww
0228デフォルトの名無しさん
2008/07/07(月) 07:07:52しかし、ダンゴ先生の能力不足でトイレ掃除のおばちゃんも誉めようもないwww
チャンスくれてやったのに、結局無能を曝け出して終わりか……
ご愁傷様。
0229ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 07:37:45ひろゆきの言うところの「掲示板を使うのは難しい」人の多いインターネットですね
君らに謝らないといけないことがある。
我が家も投資ファンドにわずかながらも協力して原油高の高騰に貢献してます。
0230デフォルトの名無しさん
2008/07/07(月) 07:40:17で?
0231ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 08:13:10「僕は海賊にはならないよ」って言ったけど最近では
「俺は海賊王になる」って言ってるだろ
簡単に人を信用してはいけない。
0232デフォルトの名無しさん
2008/07/07(月) 08:14:140233デフォルトの名無しさん
2008/07/07(月) 09:15:02だまれ和スィーツ(笑)
0234デフォルトの名無しさん
2008/07/07(月) 10:27:15自分のページにソニー的なアドレスから
アクセスがあっただけで
ボクのプログラムがソニーから注目されてる!
PS3のSDKにのっちゃうかも!
みたいなことを喜気として2chに書き込んじゃう
ピュアな心はどこにいっちゃったの?
0235デフォルトの名無しさん
2008/07/07(月) 10:33:48その言い方を気に入らないかつ粘着な人がいるので見ていてもったいなく思う
0236デフォルトの名無しさん
2008/07/07(月) 10:39:170237デフォルトの名無しさん
2008/07/07(月) 10:57:03しかし、ブラウザ閉じればだんごの事なんてどうでもよくなるわけだ。
0238デフォルトの名無しさん
2008/07/07(月) 11:25:16「家ではおとなしくて家の仕事もよく手伝ってくれるイイコなんですよ」
こうですね、よくある話です。
0239ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 11:47:31悪いが一切無いよ。
でもゲトキパさん方が来るときのGoogleのキーワード見たら笑えるんだよマジで。
最近はFlashに飛ばすトラップ仕掛けてるけどね。
関係ないコードだけど別のサイトで学生んときに暇つぶしに作った某DLL公開してて、
ソースよこせって言ってきた業者に丸ごと売りつけたのならある。
ちなみに実名でやってるサイトだから詳細は言わん。
0240ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 12:08:48ホントならゲハ板にfusianasan付きでカキコさせるトラップでも用意したいんだけど
cookieが必要だからブラウザで2chにカキコしたことある奴にしか通用しないし。
つーか、用心深いのかJavaScript無効にしてるケースが多い。
0241デフォルトの名無しさん
2008/07/07(月) 12:34:160242ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 12:44:03つい思いつきで、○るみさんのソフトのコミットにこっちの名前つかった。
名前が載ればそれでいいと思った。
今は反省していない。
0243デフォルトの名無しさん
2008/07/07(月) 13:18:18そのネタいつまで使うつもりだよw
へる○さんも迷惑じゃね?
2chとかへる○さんとか使わないで
自分のblogでやれw
0244ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 13:27:48引用してたりするしそういう文化の会社だってあるんでね?
0245デフォルトの名無しさん
2008/07/07(月) 13:54:320246デフォルトの名無しさん
2008/07/07(月) 14:02:290247デフォルトの名無しさん
2008/07/07(月) 17:05:30任意に子ウィンドウを破壊するには
どうすればいいでしょうか
0248デフォルトの名無しさん
2008/07/07(月) 17:08:490249デフォルトの名無しさん
2008/07/07(月) 17:16:000250デフォルトの名無しさん
2008/07/07(月) 17:22:58do(window, "子ウィンドウを破壊");
0251デフォルトの名無しさん
2008/07/07(月) 17:27:25その子ウィンドウがCPU使用率が高くて
0252デフォルトの名無しさん
2008/07/07(月) 17:30:33それならPC本体に対戦車ミサイルを撃ち込めばOK
0253デフォルトの名無しさん
2008/07/07(月) 17:32:110254デフォルトの名無しさん
2008/07/07(月) 17:33:020255デフォルトの名無しさん
2008/07/07(月) 17:36:41どういうプロセッサ使ってるんだろ
0256ヽ・´∀`・,,)っ━━━━━━━┓
2008/07/07(月) 17:39:02ウインドウタイトルかクラス名がユニークで一意に決まるならFindWindowでウインドウハンドル拾って、
さらにPostMessageで、
あとはわかるな?
そもそも消せないのか?
それ以前にそのウインドウ消しても問題ないのか?
つかソフト名教えろカス
0257デフォルトの名無しさん
2008/07/07(月) 18:07:300258ヽ・´∀`・,,)っ━━━━━━┓
2008/07/07(月) 18:15:26え?スレ違いじゃないレスどれだけあったっけ?
このスレ
0259デフォルトの名無しさん
2008/07/07(月) 19:14:4750MHzの8085とかじゃね?
0261デフォルトの名無しさん
2008/07/07(月) 20:24:04> 対戦車ミサイルって誘導のためコンピュータを内蔵してるんだな
ミサイル系は知らないけど、戦闘機のアビオニクスは
ミニコン(IBMの奴だったと思う) -> z8000 -> mips -> 今どこだかしらん
ってな, 発展をしたってなことを聞いた覚えがある
0262デフォルトの名無しさん
2008/07/07(月) 20:41:20ダンゴさんスゴス
0263ヽ・´∀`・,,)っ━━━━━━┓
2008/07/07(月) 20:47:40p://labs.cybozu.co.jp/blog/takesako/
ちなみに引用レス中のコードはミスってたんでトラックバックしておいたんだが。
0264デフォルトの名無しさん
2008/07/07(月) 21:07:52出てくるんだ。
対戦車ミサイルの多くは有線式の誘導方式で、射手がラジコンみたいに
操縦するんだよ。
0265デフォルトの名無しさん
2008/07/07(月) 21:45:400266デフォルトの名無しさん
2008/07/07(月) 23:22:270267デフォルトの名無しさん
2008/07/07(月) 23:51:260268デフォルトの名無しさん
2008/07/07(月) 23:55:12ttp://jp.youtube.com/watch?v=Z22x4JzYVsQ
0269デフォルトの名無しさん
2008/07/08(火) 00:14:120270デフォルトの名無しさん
2008/07/08(火) 00:34:300271デフォルトの名無しさん
2008/07/08(火) 00:35:510272デフォルトの名無しさん
2008/07/09(水) 14:27:040273デフォルトの名無しさん
2008/07/09(水) 14:59:070274デフォルトの名無しさん
2008/07/09(水) 15:12:05C++で組み込みは絶望的に頻度低いな
0275デフォルトの名無しさん
2008/07/09(水) 15:26:23ミッションクリティカルなところで使われてるのが枯れたCPUだけなんてこともない。
俺は水力発電向けでia64 HP-UXターゲット、Cで組まれたコードの保守なんて仕事もこなした。
むしろ多数決型冗長系組めるのはエンプラ用に設計されたアーキでこそのもの。
0276ヽ・´∀`・,,)っ━━━━━━┓
2008/07/09(水) 16:42:390277デフォルトの名無しさん
2008/07/10(木) 11:56:48・従来のコードがCで、C++にする積極的な理由がないから
・客先が(理由は兎も角)C++は使うなと指示してきたから
・作業者にスキルがないから
・管理者にスキルがないから
で、最近真面目にvtune使い始めたんだけど、流石に便利だな。
これでEclipseじゃなければもっといいんだが。
むぅ、これでもまだスレ違いか。
0278デフォルトの名無しさん
2008/07/13(日) 12:38:03・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
写真に撮ってアップロードしようとした。
http://d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
http://d.hatena.ne.jp/pmoky/20060510
http://d.hatena.ne.jp/pmoky/20060511
http://d.hatena.ne.jp/pmoky/20060512
有限会社やねう企画(所在地・大阪府八尾市末広町2−1−2)が計画倒産
http://www.sia.go.jp/~osaka/zenso/19.09.pdf
やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』
やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
0279デフォルトの名無しさん
2008/07/13(日) 12:47:530280デフォルトの名無しさん
2008/07/14(月) 21:13:47ダンゴさんはまだキチガってないぞ
0281デフォルトの名無しさん
2008/07/15(火) 20:09:160282デフォルトの名無しさん
2008/07/15(火) 20:21:570283デフォルトの名無しさん
2008/07/22(火) 01:27:17今世紀最大の正真正銘のキチガイ弓月城太郎にやねうらおは絡まれている。
弓月城太郎は正真正銘のキチガイ
【自作自演】弓月城太郎氏に関するまとめ【神秘体験】
http://d.hatena.ne.jp/yaneurao/20080619
0284デフォルトの名無しさん
2008/07/26(土) 10:57:46a[b[x]c[y]]って感じでアクセスしてる奴
もっと効率よくアクセスできんのかね
プンプン
0285デフォルトの名無しさん
2008/07/26(土) 11:02:14読みやすいコードを書いてコンパイラの最適化に任せたほうがいいって、
じっちゃんが言ってた。
0286デフォルトの名無しさん
2008/07/26(土) 11:06:05じじいのいうことなんてきかねーよぼけ
0287デフォルトの名無しさん
2008/07/26(土) 11:28:31じじいたちの世代はコンパイラがバカだから
スピードのためなら読み難くてもトリッキーな
コード書いてたわな
0288デフォルトの名無しさん
2008/07/26(土) 11:31:120289デフォルトの名無しさん
2008/07/26(土) 11:35:510290デフォルトの名無しさん
2008/07/26(土) 21:16:47これコンパイル通るのか
0291デフォルトの名無しさん
2008/07/27(日) 02:53:550292デフォルトの名無しさん
2008/07/27(日) 04:16:030293デフォルトの名無しさん
2008/07/27(日) 08:34:30通らなねーよボケ
0294デフォルトの名無しさん
2008/07/27(日) 10:38:57#define c +d
int a[10];
int b[10];
int d[10];
int x;
int y;
int z = a[b[x] c[y]];
0295デフォルトの名無しさん
2008/07/27(日) 10:50:010296デフォルトの名無しさん
2008/07/27(日) 11:30:47for(y) { for(x){
a[x+y*size1] = ...;
}}
みたいなことやってもコンパイラはちゃんとyの項を外に出して最適化してくれるのは分かってるんだけれど、精神衛生上気持ち悪い。
それにa(x, y)みたいにアクセスできるクラスがあっても添え字の計算がクラスの奥深くになると外に出せなくなるし。
0297デフォルトの名無しさん
2008/07/27(日) 12:04:53ならない
せっかく多次元配列でさえも自分でカスタマイズできるのがC++の便利なところなのにね。言語仕様に含めて自由を放棄するなんてことはできない。
0298デフォルトの名無しさん
2008/07/27(日) 13:23:18yの項を外に出すだけじゃなくて自動ベクトル化とかもやりづらくなるし。
それに二次元配列を言語が持ってても邪魔しないと思う。
必要ならオーバーライドすればいいだけ。
0299デフォルトの名無しさん
2008/07/27(日) 15:30:22C99だと要素数に変数使えてますます便利。C99使えないけど。
0300ヽ・´∀`・,,)っ━━━━━┓
2008/07/28(月) 16:57:10あたりでキャッシュライン縛りアヒャヒャヒャ
0301デフォルトの名無しさん
2008/08/29(金) 10:18:510302デフォルトの名無しさん
2008/08/29(金) 10:30:050303デフォルトの名無しさん
2008/08/29(金) 10:50:170304デフォルトの名無しさん
2008/08/29(金) 16:42:030305デフォルトの名無しさん
2008/09/01(月) 06:00:380306デフォルトの名無しさん
2008/09/10(水) 21:39:44-O3以上のオプションはなし?
0307デフォルトの名無しさん
2008/09/10(水) 21:42:42もっと具体的に。インライン展開したからと言って、必ずしもサイズが増えるわけじゃないよ。
つーか、O2でもstaticな関数は勝手にインライン展開したと思うのだけど。
0308デフォルトの名無しさん
2008/09/10(水) 21:45:30関数ポインタを使ったスイッチを多用したソースなんですが
予定してるよりも速度でないのでインライン展開で高速化できれば
と思ったんですが・・・
0309デフォルトの名無しさん
2008/09/10(水) 21:52:56またそんな御無体なw
0310デフォルトの名無しさん
2008/09/10(水) 21:57:500311デフォルトの名無しさん
2008/09/10(水) 22:34:32あ、そういのは無理ですかww
代わりのチューニングって何かありますかね・・・
0313デフォルトの名無しさん
2008/09/10(水) 22:55:200314デフォルトの名無しさん
2008/09/10(水) 23:22:19エスパー希望なら鼬害だ。
0315デフォルトの名無しさん
2008/09/11(木) 00:39:160316デフォルトの名無しさん
2008/09/11(木) 21:49:300317デフォルトの名無しさん
2008/09/11(木) 22:31:170318デフォルトの名無しさん
2008/09/11(木) 22:45:160319デフォルトの名無しさん
2009/06/19(金) 00:37:43インテルアーキで、Core2とかはキャッシュラインが64バイトだと思います。
例えば、16バイトにアライメントされた配列
float A[10][1024] __attribute__(((aligned(16)));
float B[10][1024] __attribute__(((aligned(16)));
float C[10][1024] __attribute__(((aligned(16)));
があった場合、
for(i = 0; i < 10; i++){
for(j = 0; j < 1024; j++){
C[i][j] = A[i][j] * B[i][j];
}
}
といった計算では、[i][0],[i][16],が呼ばれるたびに、
64バイト毎にキャッシュされるのでしょうか?
最近のCPUは数Mのキャッシュがあるので、
最初にA,B,Cのデータを全部キャッシュに送ってしまえばパフォーマンスが
かなりあがるような気がするのですが。
0320デフォルトの名無しさん
2009/06/19(金) 01:22:510321デフォルトの名無しさん
2009/06/19(金) 01:55:43スレ違い。
0322デフォルトの名無しさん
2009/06/19(金) 15:59:08場合による。
プリフェッチというのを調べてみるといい。
0323デフォルトの名無しさん
2009/06/19(金) 18:32:51じゃあ、キャッシュのロックも。
0324デフォルトの名無しさん
2009/06/19(金) 23:18:20配列のサイズが小さければ、特に気にすることはないと思うのですが、
配列のサイズがキャッシュラインよりも大きい場合、キャッシュライン毎に転送されるというのであれば、DDR系のメモリはデータが送られてくるまでに数百サイクルのレイテンシが
あるので、例えば64バイト単位でしか送られないのであれば、メモリ転送が非常にボトルネックになるのかと思っています。
>>322
プリフェッチも調べてみて、SSEを使ってやってみましたが、結局変わりませんでした。プリフェッチでもサイズが指定できないようで、
どこまでキャッシュされているのかが分かりません。最近のCPUはハードウェアが勝手やるみたいなので、プログラマが考慮しても余り効果がないのかもしれません。
他にスタックの変数はほとんどキャッシュされると思われるので、
関数毎にmemcpyでコピーしてみたところ、PowerPC(Cell PPU)では効果がありましたが、Core2では逆に遅くなってしまいました。
スレ違いみたいですのでこの辺で終わりにします。
void func(){
float a[256];
float b[256];
float c[256];
for(i = 0; i < 10; i++){
for(j = 0; j < 1024; i+=256){
memcpy(a,&A[i][j],256*sizeof(float));
memcpy(b,&B[i][j],256*sizeof(float));
memcpy(c,&C[i][j],256*sizeof(float));
for(k = 0; k < 256 ; k++){
c[k] = a[k] * b[k];
}
memcpy(&C[i][j],c,256*sizeof(float));
}
}
}
0325デフォルトの名無しさん
2009/06/20(土) 02:52:18アセンブリリストを出力させて、(手でやったりツール使ったりして)どの命令でどれだけ
ストールするか調べ、ソースコードをどう変えたらどう代わるのかを比べないと意味がない。
http://perfsuite.ncsa.uiuc.edu/publications/LJ135/t1.html
とか参考になるんじゃないか。
パイプラインの動作を理解すること、実際に計測すること、が重要。
パイプライン解析するツールとかあると理解しやすいんだけど。
フリーのは知らないけど探してみたら?
0326デフォルトの名無しさん
2009/06/22(月) 16:05:39if(0 == (hoge % 60))
{
// なになに
}
これを高速化する方法はないですか?
0327デフォルトの名無しさん
2009/06/22(月) 16:36:33↓
const unsigned hoge;
0328デフォルトの名無しさん
2009/06/22(月) 18:30:01無理。
0329デフォルトの名無しさん
2009/06/22(月) 18:34:05bool isHogeZero = (hoge % 60) == 0;
をループの外に追加して
if(isHogeZero)
{
// なになに
}
にしたら1%速くなりました。
0330デフォルトの名無しさん
2009/06/22(月) 19:06:040331デフォルトの名無しさん
2009/06/22(月) 19:08:54その64はどこから出てきた数字なの
0332デフォルトの名無しさん
2009/06/22(月) 19:12:100333デフォルトの名無しさん
2009/06/22(月) 19:27:23http://soudan1.biglobe.ne.jp/qa992559.html
0334デフォルトの名無しさん
2009/06/22(月) 19:53:27X / D の値は (R * X + (1 << 32)) >> 64となる。
0335デフォルトの名無しさん
2009/06/26(金) 09:11:17名言集 その3
『いつもサボってばかりのキャップがウゼえ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
0337デフォルトの名無しさん
2009/11/25(水) 03:47:590338デフォルトの名無しさん
2009/11/25(水) 05:17:08というか知る事ができないからキャッシュは高速なんだろ
知る事ができる回路にすると遅くなる
0339デフォルトの名無しさん
2009/11/25(水) 09:09:04何のために?
0340デフォルトの名無しさん
2009/11/25(水) 13:46:39そんなふざけた事してないで普通に良く使うデータだけ良く使ってればいいんだよ!
0341デフォルトの名無しさん
2009/11/25(水) 13:49:38x86ならVTune
0342デフォルトの名無しさん
2009/11/26(木) 12:45:460343デフォルトの名無しさん
2009/11/26(木) 18:32:53効果があるな
0344デフォルトの名無しさん
2009/11/26(木) 20:29:43さっさとアクセスしてキャッシュに入れた方が速そうだけど。
実際どうなん?
0345デフォルトの名無しさん
2009/11/26(木) 23:48:030346デフォルトの名無しさん
2009/11/27(金) 02:20:16Itanium2の分岐プレディケーションはかなり効果があったみたいだが
悲しいかな全く新しい命令体系なのでx86に取り入れられない
しかも爆熱で設計がまずい
今の所大容量L2キャッシュに分岐予測って組み合わせがベストだろうな
0347デフォルトの名無しさん
2009/12/15(火) 15:30:56そんなことはどうでもいい。そのデータを使いたいか使いたくないかだ。
使いたいなら事前にprefetch命令を発行しとけばいい
0348デフォルトの名無しさん
2010/01/30(土) 08:39:220349デフォルトの名無しさん
2010/01/30(土) 09:38:350350デフォルトの名無しさん
2010/01/30(土) 09:39:55これもか
あんまし効果ねーな
やっぱりasmでバリバリ書いた方がいいだろ
0351デフォルトの名無しさん
2010/03/11(木) 16:53:57inline int hoge(const int* array, const int type){
if(type == 1) {
return *cPtr(array[0], array[2] , array[3], array[5]); //本当の計算は内挿を呼び出す
} else if(type == 2) {
return *cPtr(array[2], array[3] , array[3], array[4]);
} else {
return *cPtr(array[0], array[2] , array[3], array[5]);
}
}
という関数があって、1ピクセル毎に呼び出される。
typeは奇数ラインや呼び出しフレームで変わる。
だから、分解して関数ポインタにしてみたけど、速度変わらなかった。
もしかして、関数ポインタを呼び出すのもオーバーヘッド大きい?
0352デフォルトの名無しさん
2010/03/11(木) 17:09:45関数呼び出し自体にオーバーヘッドあるし分岐予測しにくいし。
どうすればいいかという話になるとそれだけの情報だとなんとも言えんが、
ラインやフレーム単位では処理が固定できるなら、なるべくそこでまとめるべきだろう
0353デフォルトの名無しさん
2010/03/11(木) 17:43:35typeの分布に連続性があるなら関数テーブルが有利かもしれない
その例のようにtypeとの対応が固定なら分岐しないという手もある
return *cPtr(array[idxtbl[type][0]], array[idxtbl[type][1]] , array[idxtbl[type][2]], array[idxtbl[type][3]]);
0355デフォルトの名無しさん
2010/03/11(木) 20:45:57コードキャッシュ的にも困るだろうな。
0356351
2010/03/11(木) 23:31:15関数ポインタ使用していた所を決め打ちで関数呼び出し & inlineしてみたんですけど
これまた微妙に…。
720x480の画像を 0.03fpsしか変化しませんでした。
ICCじゃなくて、MSVCでも実験してみます。
0357デフォルトの名無しさん
2010/03/12(金) 01:07:24まあ、cPtr関数がどんなサイズでどんな処理をしているかわからんけど、
関数引っ張ってくる位だから、関数ポインタを使って分岐なくしてもそんな変わらん様な気がするな。
見る限り分岐のケースって3個しかないからな。
0358デフォルトの名無しさん
2010/03/12(金) 10:58:57ライン単位の分岐にしよう。
そして、ループのアンロールをしよう(またはコンパイラがアンロール
できるようなコードを書こう)。
0359デフォルトの名無しさん
2010/03/12(金) 12:42:26ろうと思いがちだが、どっこい実測してみると随分と違う
8回のループをアンロールするだけでも格段に違うぞ
0360デフォルトの名無しさん
2010/03/12(金) 14:30:09ソースうpしてみます。
http://uproda.2ch-library.com/lib222858.zip.shtml
DLキー : 1
GetFrameが、外部から1フレームずつ呼び出される部分です。
EDI.cpp内のnEDI_8x8が足引っ張ってるんですよ。
多分、for文よりif文のコストがかかってる気がしますが、どうでしょうか。
これ、元のソースが配列をプロパティで保持して、何度も使い回してたり
GetFrameメソッドにベタ打ちしてあって、300行超えてたり…。
俺なりにリファクタリングして、今のコンパイラでビルドしただけで
速度が2倍近く出るようになったという…。
0361デフォルトの名無しさん
2010/03/12(金) 15:11:55その関数内の配列CtCi、自動変数だから毎回コピーされてないか?
constつけるかstaticつけるかしたらコピーが抑制される希ガス。
0362デフォルトの名無しさん
2010/03/12(金) 15:15:370363デフォルトの名無しさん
2010/03/12(金) 15:43:27if (final > 255) { return 0xFF;
} else if (final < 0) { return 0;
}
return (BYTE) final;
--
このキモチワルイコードを何とかしてくれw
--
inline int FastEDIUpsizer::getFinal(const BYTE p[64], const BYTE n[64][4], const double CtCi[4][4]){
double a[4] = { 0,0,0,0 };
double r[4] = { 0,0,0,0 };
for(int i = 0; i < 4; i++){ for(int k = 0; k < 64; k++){ r[i] += n[k][i] * p[k]; }}
for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ a[i] += CtCi[i][j] * r[j]; }}
return (int)(p[15] * a[0] + p[26] * a[1] + p[37] * a[2] + p[48] * a[3] + 0.5f);
}
--
後者のループは手でアンロールしてもいいかも。
あー、配列rはdoubleにしたら勿体無いな、整数でいいよ。
つーか、rの制御変数はjに固定しろよ。ややこしい。
それから、0.5fじゃなくて0.5だな。doubleと足す定数はfloatじゃ拙い。
0.5ならどうでもいいけど、0.1と0.1fでは精度が違ってしまう。
0364デフォルトの名無しさん
2010/03/12(金) 15:53:20>このキモチワルイコードを何とかしてくれw
if (final > 255) return 0xff;
if (final < 0) return 0;
return BYTE(final);
>あー、配列rはdoubleにしたら勿体無いな、整数でいいよ。
>つーか、rの制御変数はjに固定しろよ。ややこしい。
#if 0 // どっちが早いだろ
int r[4];
for (int j = 0; j < 4; ++j) {
int r = 0;
for (int k = 0; k < 64; ++k) r += n[k][j] * p[k];
r[j] = r;
}
#else
int r[] = {0, 0, 0, 0};
for (int k = 0; k < 64; ++k) {
for (int j = 0; j < 4; ++j) r[j] += n[k][j] * p[k];
}
#endif
double a[4];
for (int i = 0; i < 4; ++i) {
double a = 0;
for (int j = 0; j < 4; ++j) a += CtCi[i][j] * r[j];
a[i] = a;
}
0365364
2010/03/12(金) 16:00:21double a0 = CtCi[0][0] * r[0] + CtCi[0][1] * r[1] + CtCi[0][2] * r[2] + CtCi[0][3] * r[3];
double a1 = CtCi[1][0] * r[0] + CtCi[1][1] * r[1] + CtCi[1][2] * r[2] + CtCi[1][3] * r[3];
double a2 = CtCi[2][0] * r[0] + CtCi[2][1] * r[1] + CtCi[2][2] * r[2] + CtCi[2][3] * r[3];
double a3 = CtCi[3][0] * r[0] + CtCi[3][1] * r[1] + CtCi[3][2] * r[2] + CtCi[3][3] * r[3];
return int(p[15] * a0 + p[26] * a1 + p[37] * a2 + p[48] * a3 + 0.5);
警告出るならr[0]などはdouble(r[0])などに。
0366361
2010/03/12(金) 16:10:58そういうことなら自動変数でもしょうがないけど、配列の初期化の警告は無視しているのかな?
double CtCi[4][4] = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};
のように二重にしないとダメだし、0.fと1.0fのようにバランス悪い書き方するくらいなら初期化値くらい整数でいいよ。
0367デフォルトの名無しさん
2010/03/12(金) 16:16:560368デフォルトの名無しさん
2010/03/12(金) 21:00:36ICC・MSVC共にW3では、何故か警告出ませんでした。
何か意図があるのかと思って放置してました。
>>364さん、ありがとうございます。
前者、後者を試してみました。
iccのRelease Buildでは、デフォルトでループアンロールされるみたいで
iccでは10.93fps 〜 10.92fpsの間で、あまり変化ありませんでした。
msvcでは、手動アンロールで8.43から8.48へ変化しました。
>>363さん、ありがとうございます。修正しました。
>>367さん、ええ。この際、doubleをlongにしてしまおうかと。
何か気になる点があったら教えて欲しいです。
0369358
2010/03/13(土) 07:08:08分岐をループの外に出してみた。コンパイルは通る。
http://www1.axfc.net/uploader/File/so/40327.zip
変更点は TEMPLATE_FALLBACK で検索。
他にも外に出せる条件がある。
でも正直、割合的には小さいと思う。
358 での、ライン単位のループにというのは、ループ中の不変条件を
抽出しやすくという意図もあったのだけれども、面倒になって説明する
のをやめた。
関係ないけど memset() の単位が違う。
0370デフォルトの名無しさん
2010/03/18(木) 10:58:51int count = 0;
if(*c++ == 0xFF) count++;
if(*c++ == 0xFF) count++;
if(*c++ == 0xFF) count++;
のif文を
count += if_ff(*c++);
inline int if_FF(const int c){
return (c + 1) >> 2;
}
に変形してみたけど遅くなった。
キャストで足引っ張ってるのかな。
0371デフォルトの名無しさん
2010/03/18(木) 11:15:080372デフォルトの名無しさん
2010/03/18(木) 11:16:39一般的に比較のコストは減算、それに対して加算とシフトになっているので
だが、分岐が無いだけ若干有利か
アセンブリ吐かせて比較した方が早いよ
0373370
2010/03/18(木) 18:41:54すみません、間違えました。
>>372
ヘッダファイルに、inline付け忘れていただけというオチでした。
if文を無くすだけで、それなりになりますね。
0374デフォルトの名無しさん
2010/03/22(月) 17:27:14肝となるアルゴリズムを教えてください
0375デフォルトの名無しさん
2010/03/22(月) 17:37:10基本は N-gram と サフィックス・アレイ で検索。
0376デフォルトの名無しさん
2010/03/27(土) 08:52:500377デフォルトの名無しさん
2010/04/13(火) 22:11:12ざっくっと考えてみたが・・・益々キモチワルイな orz
※final が32bitの場合
int x = ~(final >> 31);
int y = ((final - 0xFF) >> 31);
return (x & y & final) | (~y & 0xFF);
0378デフォルトの名無しさん
2010/04/16(金) 12:54:43こんな感じでいいんじゃね? キモチワルさでは負けるけどw
return(BYTE)((unsigned)final>255?final>255?255:0:final);
0379デフォルトの名無しさん
2010/04/16(金) 19:51:540380378
2010/04/19(月) 13:01:51とりあえずテストコード。
ttp://codepad.org/qgKt5Lqu
0381デフォルトの名無しさん
2010/04/19(月) 13:42:090382デフォルトの名無しさん
2010/04/21(水) 09:59:42普通に間違ってねえか
0383デフォルトの名無しさん
2010/04/21(水) 10:01:040384デフォルトの名無しさん
2010/04/23(金) 04:49:26FLOW dependenceというエラーが出て、ベクトル化されません。
ループ前には
#pragma ivdep
#pragma vector always
をつけています
コンパイルオプションは
-ansi_alias -O3
です。
よろしくお願いします
0385デフォルトの名無しさん
2010/04/23(金) 13:42:19並列化できないコードなのでしょう。
0386デフォルトの名無しさん
2010/04/23(金) 15:26:15依存関係がないことを指示する方法はないのでしょうか?
0387デフォルトの名無しさん
2010/04/23(金) 23:15:15なぜ間違えたし。それをするなら
int x = ((255 - final) >> 31) | final;
int y = ~(final >> 31);
return x & y & 255;
でしょう
>>380
シフト演算は意外と遅いので改良案2のように連続させたら負けだと思う
0388デフォルトの名無しさん
2010/04/24(土) 00:12:50レイテンシ4だっけ?
0389デフォルトの名無しさん
2010/04/24(土) 01:48:25並列化?ベクトル化じゃないの?
どっちにしろ出来るとわかっているなら、
はじめからSSEで書いてみたら?
要素数を2か4で割るだけだから。
GCCだとSIMDをあまり意識しないで書けるけど、
ICCだと組込関数を使わないとだめだな。
0390デフォルトの名無しさん
2010/04/24(土) 07:17:00インテルC++コンパイラ9.0発表!
http://pc12.2ch.net/test/read.cgi/tech/1118850896/l50
現象が再現する最小限のコード無しで質問しても、望む答えは得られないと思うけどね。
0391378
2010/04/24(土) 08:15:49>>387
さすがです。速いです。 (ただし、VC2008だと改造の余地有りでした。gccやiccならOKなのかも)
というわけでまとめコードです。
ttp://codepad.org/soXj03pM
0392378
2010/04/24(土) 08:18:070393デフォルトの名無しさん
2010/04/26(月) 11:30:280394デフォルトの名無しさん
2010/04/26(月) 12:04:45時間を計測する__rdtsc()を実装すればいいだけじゃないか
負数が2の補数表現のCPUであればほぼそのまま動く
0395デフォルトの名無しさん
2010/04/26(月) 12:49:33THX! 試してみる。
処で、rdtscってナノ秒くらい?
0396デフォルトの名無しさん
2010/04/26(月) 18:54:11OSでトラップしてエミュしてたり。
まあ、やってみれ。
環境によっては実行の間にコンテキスト切り替えによりコアが変わってしまい
変なカウンタ値が得られてしまうこともあるので、どうしてもそれを避けたかったら
Affinity 指定とかで逃げるのがよい。
0397デフォルトの名無しさん
2010/04/26(月) 21:25:42全部範囲内 - オリジナル : 860,274
全部範囲内 - cmov参考値 : 1,352,259
全部範囲内 - レス387(分岐無) : 1,426,005
全部範囲内 - レス387(を改造) : 1,364,436
全部範囲外(+方向) - オリジナル : 761,985
全部範囲外(+方向) - cmov参考値 : 1,327,752
全部範囲外(+方向) - レス387(分岐無) : 1,425,996
全部範囲外(+方向) - レス387(を改造) : 1,363,995
全部範囲外(-方向) - オリジナル : 786,555
全部範囲外(-方向) - cmov参考値 : 1,327,743
全部範囲外(-方向) - レス387(分岐無) : 1,425,996
全部範囲外(-方向) - レス387(を改造) : 1,364,418
全部範囲外(+-交互) - オリジナル : 774,261
全部範囲外(+-交互) - cmov参考値 : 1,327,743
全部範囲外(+-交互) - レス387(分岐無) : 1,426,005
全部範囲外(+-交互) - レス387(を改造) : 1,364,436
時々外れる(分岐卵ェ) - オリジナル : 1,295,001
時々外れる(分岐卵ェ) - cmov参考値 : 1,605,672
時々外れる(分岐卵ェ) - レス387(分岐無) : 1,426,005
時々外れる(分岐卵ェ) - レス387(を改造) : 1,364,400
かなり外れる(分岐卵ェ) - オリジナル : 1,236,168
かなり外れる(分岐卵ェ) - cmov参考値 : 1,613,412
かなり外れる(分岐卵ェ) - レス387(分岐無) : 1,426,059
かなり外れる(分岐卵ェ) - レス387(を改造) : 1,364,409
0398デフォルトの名無しさん
2010/04/27(火) 01:59:06--------------------------------------------------
全部範囲内 - オリジナル : 18711
全部範囲内 - cmov参考値 : 11985
全部範囲内 - レス387(分岐無) : 20967
全部範囲内 - レス387(を改造) : 19800
全部範囲外(+方向) - オリジナル : 11988
全部範囲外(+方向) - cmov参考値 : 14310
全部範囲外(+方向) - レス387(分岐無) : 18762
全部範囲外(+方向) - レス387(を改造) : 20217
全部範囲外(-方向) - オリジナル : 26226
全部範囲外(-方向) - cmov参考値 : 19713
全部範囲外(-方向) - レス387(分岐無) : 27261
全部範囲外(-方向) - レス387(を改造) : 26136
全部範囲外(+-交互) - オリジナル : 25260
全部範囲外(+-交互) - cmov参考値 : 19704
全部範囲外(+-交互) - レス387(分岐無) : 27198
全部範囲外(+-交互) - レス387(を改造) : 26199
時々外れる(分岐予測) - オリジナル : 30450
時々外れる(分岐予測) - cmov参考値 : 23619
時々外れる(分岐予測) - レス387(分岐無) : 27279
時々外れる(分岐予測) - レス387(を改造) : 26217
かなり外れる(分岐予測) - オリジナル : 30639
かなり外れる(分岐予測) - cmov参考値 : 35454
かなり外れる(分岐予測) - レス387(分岐無) : 27270
かなり外れる(分岐予測) - レス387(を改造) : 26172
0399デフォルトの名無しさん
2010/04/27(火) 11:36:030400デフォルトの名無しさん
2010/04/27(火) 12:03:23最適化掛けてreleaseビルドしてみたけど、殆ど変わらなかった。
プロファイルで最適化したら遅くなったり…。
0401デフォルトの名無しさん
2010/04/28(水) 05:41:36--------------------------------------------------
全部範囲内 - オリジナル : 32816
全部範囲内 - cmov参考値 : 32872
全部範囲内 - レス387(分岐無) : 41032
全部範囲内 - レス387(を改造) : 32848
全部範囲外(+方向) - オリジナル : 24664
全部範囲外(+方向) - cmov参考値 : 15774
全部範囲外(+方向) - レス387(分岐無) : 19692
全部範囲外(+方向) - レス387(を改造) : 15762
全部範囲外(-方向) - オリジナル : 15150
全部範囲外(-方向) - cmov参考値 : 15177
全部範囲外(-方向) - レス387(分岐無) : 18933
全部範囲外(-方向) - レス387(を改造) : 15156
全部範囲外(+-交互) - オリジナル : 11448
全部範囲外(+-交互) - cmov参考値 : 15171
全部範囲外(+-交互) - レス387(分岐無) : 18933
全部範囲外(+-交互) - レス387(を改造) : 15153
時々外れる(分岐予測) - オリジナル : 15138
時々外れる(分岐予測) - cmov参考値 : 15171
時々外れる(分岐予測) - レス387(分岐無) : 18933
時々外れる(分岐予測) - レス387(を改造) : 15153
かなり外れる(分岐予測) - オリジナル : 15249
かなり外れる(分岐予測) - cmov参考値 : 15177
かなり外れる(分岐予測) - レス387(分岐無) : 18933
かなり外れる(分岐予測) - レス387(を改造) : 15762
0402デフォルトの名無しさん
2010/04/28(水) 21:44:04final = min(final, 255);
return final;
読みやすさ重視。どうだろ。
0403hoge
2010/04/29(木) 12:31:30全部範囲内 - オリジナル : 983,151 : 404,208
全部範囲内 - cmov参考値 : 690,516 : 426,708
全部範囲内 - レス387(分岐無) : 747,666 : 431,892
全部範囲内 - レス387(を改造) : 691,830 : 396,126
全部範囲内 - レス402 : 884,844 : 404,226
全部範囲外(+方向) - オリジナル : 688,230 : 404,226
全部範囲外(+方向) - cmov参考値 : 884,835 : 426,771
全部範囲外(+方向) - レス387(分岐無) : 747,819 : 431,334
全部範囲外(+方向) - レス387(を改造) : 691,866 : 396,045
全部範囲外(+方向) - レス402 : 787,851 : 404,226
全部範囲外(-方向) - オリジナル : 983,142 : 404,199
全部範囲外(-方向) - cmov参考値 : 884,844 : 426,735
全部範囲外(-方向) - レス387(分岐無) : 747,765 : 432,594
全部範囲外(-方向) - レス387(を改造) : 691,767 : 396,324
全部範囲外(-方向) - レス402 : 884,844 : 404,271
全部範囲外(+-交互) - オリジナル : 835,686 : 404,226
全部範囲外(+-交互) - cmov参考値 : 884,835 : 426,717
全部範囲外(+-交互) - レス387(分岐無) : 747,819 : 431,604
全部範囲外(+-交互) - レス387(を改造) : 691,974 : 396,45
全部範囲外(+-交互) - レス402 : 787,779 : 404,235
時々外れる(分岐予測) - オリジナル : 1,394,181 : 404,298
時々外れる(分岐予測) - cmov参考値 : 1,311,543 : 426,096
時々外れる(分岐予測) - レス387(分岐無) : 747,855 : 431,739
時々外れる(分岐予測) - レス387(を改造) : 691,947 : 396,054
時々外れる(分岐予測) - レス402 : 1,436,544 : 404,253
かなり外れる(分岐予測) - オリジナル : 1,334,898 : 404,208
かなり外れる(分岐予測) - cmov参考値 : 2,007,639 : 426,105
かなり外れる(分岐予測) - レス387(分岐無) : 498,465 : 431,883
かなり外れる(分岐予測) - レス387(を改造) : 461,142 : 396,459
かなり外れる(分岐予測) - レス402 : 864,846 : 404,226
0404デフォルトの名無しさん
2010/04/29(木) 12:33:470405デフォルトの名無しさん
2010/04/29(木) 12:39:410406378
2010/05/02(日) 22:22:39LinuxのGCCにも対応しました。ICCは分かりません。
ttp://codepad.org/4YzZa9oq
>>405
書き方次第でcmovになるか分岐になるかだと思いますよ。
0407デフォルトの名無しさん
2010/05/12(水) 03:50:570408デフォルトの名無しさん
2010/05/12(水) 07:28:05そんなもん知らなくても大丈夫。コンパイラがまともなら、勝手にループを3つに分けることさえしてくれるから。
0409デフォルトの名無しさん
2010/05/12(水) 10:20:390410デフォルトの名無しさん
2010/05/12(水) 20:35:190411デフォルトの名無しさん
2010/05/14(金) 21:43:45・エリザベス抱き枕
・むったん抱き枕
……とか作ったら売れるんだろうか。
0412デフォルトの名無しさん
2010/05/14(金) 21:44:410413デフォルトの名無しさん
2010/05/22(土) 21:59:25売れるか分からんけど,
使い込めば最適化されると思うよ
0414デフォルトの名無しさん
2010/09/25(土) 13:11:11{
・・・
return X(v);
}
これって
値を捨ててしまう場合に最後のコンストラクタ、コピーコンストラクタなどカットしてくれますかね?
0415デフォルトの名無しさん
2010/09/25(土) 13:16:010416デフォルトの名無しさん
2010/09/25(土) 13:21:380417デフォルトの名無しさん
2010/09/25(土) 16:48:240418デフォルトの名無しさん
2010/09/25(土) 18:59:59要は、情報が少なすぎ。
0419デフォルトの名無しさん
2010/10/04(月) 21:53:430420デフォルトの名無しさん
2011/05/06(金) 15:32:35.870421デフォルトの名無しさん
2011/05/06(金) 15:34:58.900422デフォルトの名無しさん
2011/05/06(金) 15:52:12.430423デフォルトの名無しさん
2011/05/06(金) 15:57:18.37それ C++ でもできるんじゃないの?
0424デフォルトの名無しさん
2011/05/06(金) 16:01:52.27inlineに対する最適化ならNo
0425デフォルトの名無しさん
2011/05/06(金) 16:05:33.650426デフォルトの名無しさん
2011/05/06(金) 18:29:14.11その箇所と extern 付きの inline 関数定義を同じ翻訳単位に置いて
他の場所は別の翻訳単位に置くことで、
何回も呼ばれるところだけインライン展開し
他の場所は普通に外部定義された関数を呼ぶことができる
こうすることで、コードサイズの増加を押さえながら
必要な箇所だけインライン展開できる
C++ では同じことはできない
0427デフォルトの名無しさん
2011/05/06(金) 20:09:39.21もう、コンピュータの性能が上がったからでごまかしたら?
もちろん、数値計算の分野ではコンピュータの性能が上がったら
より大きな問題を解くという循環で、きりがないのはわかっているが。
でも、そういう問題はパソコンで解いちゃだめなの。
スーパーコンピュータで解け!
0428デフォルトの名無しさん
2011/05/06(金) 22:45:03.82(元のスレからはじまって)最後に出てきたこれが、言語機能としての
違いを利用した唯一まともな答えだね。
ありがとう。
ただ、分けた翻訳単位でインライン展開されないとも限らないし
別の翻訳単位でインライン展開されないとも限らないし、翻訳単位を
分けることのデメリットと秤にかけないといけないなど、実用性を考えると
甚だ疑問なんだけれども。
0429デフォルトの名無しさん
2011/05/07(土) 00:00:22.74必要なところだけinline展開される(かもしれない)メリットと、翻訳単位が分かれることのデメリットのトレードオフになるかと。
0430デフォルトの名無しさん
2011/05/07(土) 00:06:15.75翻訳単位ごとにコンパイルしてオブジェクトファイル作って
リンクする手法を取ってる間はそんなことは起こらないんじゃないかなぁ
0431デフォルトの名無しさん
2011/05/07(土) 00:32:28.49それはそうだが、すでにリンク時にインライン展開する実装だってあるんだぜ。
0432デフォルトの名無しさん
2011/05/07(土) 00:34:36.600433デフォルトの名無しさん
2011/05/07(土) 01:24:01.200434デフォルトの名無しさん
2011/05/07(土) 06:00:28.06言語が最適化のヒントを詳しく出せるようになってても時代とともに無効になる場合もある。
逆に言えば無効になるまで他言語より優れてれば良い。Fortranのように。
0435デフォルトの名無しさん
2011/05/07(土) 13:45:07.96C++でもヘッダでinline関数を定義すれば少なくともOBJファイル単位では
inlineになったりならなかったりするでしょ
コンパイラの裁量に任せるならヘッダでstatic関数を定義して
PGOでもかけときゃ善きにはからってくれるし
そもそもC++ではtemplateを頻繁に使うのでヘッダに載ってる
コードの量がC99より多いのでリンク前の最適化の機会も多いはず
C99の方がいいバイナリ吐くとか眉唾だよね
0436デフォルトの名無しさん
2011/05/07(土) 13:56:42.79OBJファイルとはなんぞや?
0437デフォルトの名無しさん
2011/05/07(土) 13:58:22.13リンカが扱う単位。
0438デフォルトの名無しさん
2011/05/07(土) 13:59:18.110439デフォルトの名無しさん
2011/05/07(土) 14:18:02.730440デフォルトの名無しさん
2011/05/07(土) 21:15:10.72標準に制限付きで取り込まれたんだと解釈してたわ。
だから >>426 みたいな使い方は当たり前だと思ってたけど
そうでもないんだね。
0441デフォルトの名無しさん
2011/05/08(日) 10:36:03.40バイナリサイズを押さえながら最適化なんてコンセプトが
理解されるはずも無い
0442デフォルトの名無しさん
2011/05/08(日) 10:49:49.49> C++は出力されるバイナリサイズに対しては富豪的立場だから
そんなことないよ。
C++ のターゲットには ROM のサイズがごく小さい組み込み機器も入ってる。
0443デフォルトの名無しさん
2011/05/08(日) 12:07:54.900444デフォルトの名無しさん
2011/05/08(日) 12:12:37.610445天使 ◆uL5esZLBSE
2011/07/01(金) 17:58:33.03ハッアァァアァァァァァァアァァアァアァアアァァァァ????????????
ゴミが散らかってる
死ね
0446デフォルトの名無しさん
2011/08/09(火) 06:24:47.25> 750 名前:774ワット発電中さん[sage] 投稿日:2011/08/08(月) 23:45:00.43 ID:X717yz94 [4/4]
> >>739
> 所詮はその程度の知識よのぅ。まんまと釣り針にかかるとは。
>
> もう何年もアセンブラは書いてないが、当時他のコンパイラに比べて最適化された
> コードを吐くと言われたx86のMSCあたりでさえ、MSCの出したアセンブラソースを
> 雛形に手で直していくと、自己書き換えとかトリッキーな手段を使わなくとも、
> 生成されるバイナリ比較で1/2〜1/3以下になった。
>
> アセンブラならCフラグの状態でエラーの有無を返せるが、Cでは実装により決ま
> ったレジスタで返さなければならない。 汎用レジスタは関数内で破壊される可能
> 性があるので、上位関数では関数の前後で変数の保持に使えない。
>
> 例えば、x86系の多くのコンパイラは、16bit値ならAXレジスタ、32bit値ならDX:AX
> レジスタで値を返すが、戻り値がvoid型の関数として定義しても、コンパイラは
> これらのレジスタは破壊される前提でコードを吐く。
>
> したがって、register宣言を付けてレジスタ渡にしても、実際は関数の呼び出し
> 前に、スタック上のローカル変数ないしグローバル変数から汎用レジスタへの
> コピーが行われるため速くはならない。おまけに、レジスタ渡しにしたところで、
> その関数内から別の関数を呼ぶと、変数渡しに割り当てられたレジスタが破壊
> される想定が必要なので、結局、コンパイラは関数内でスタック領域へ変数の
> コピーを置く領域を割り当て、ストアしなければならない。
>
> さらに、レジスタ渡しの関数をあちこちで呼び出すと、上記の関数呼び出し
> の際のレジスタ代入コードがばら撒かれ、コード量も増える。
>
> アセンブラでは関数ごとに、呼び出し前後のレジスタ保持ルールや、同じint型
> の値でも返すレジスタを任意に選択するなど、一歩間違うとバグるリスクと引き
> 換えに、最大限の最適化ができるが、Cコンパイラはそこまで賢くはなれない。
0447デフォルトの名無しさん
2011/08/09(火) 06:39:55.090448デフォルトの名無しさん
2011/08/09(火) 07:08:09.05過去の事実を語ってくれているだけなら害はなさそうだけど、
それを根拠に一般的な話としてアセンブリで書くことが効率的だと言っているのなら、 >>447
0449446
2011/08/09(火) 07:09:37.45そうれはそう思うけど、上から順番に行くと
> アセンブラならCフラグの状態でエラーの有無を返せるが、Cでは実装により決ま
> ったレジスタで返さなければならない。
現在なら、戻り値をフラグで返すコンパイラって無いの?
> 汎用レジスタは関数内で破壊される可能
> 性があるので、上位関数では関数の前後で変数の保持に使えない。
現在、関数内で破壊されないレジスタは保存しないグローバル最適化してくれないの?
あるいは、現在のx86系はレジスタリネーミングされている筈。
だけどコンパイラは昔ながらの保存をしているの?
現在のコンパイラの最適化が、そんなにアホとは思えないんだけど…
0450デフォルトの名無しさん
2011/08/09(火) 08:21:03.21人力で書いたらコンパイラのコードの数分の1になるのなんて、すげートリビアルな
コードとかそんなのだよ。あらゆる状態変化を人間の頭が完全に追える範囲、
せいぜい数KB。逆に言えば中間コードインタプリタとかでは、それをやる価値が
あることもある。
前後の文脈わからんけど、register宣言はもはや付ける意味は基本的にほとんどない、
というのはコンパイラの常識ではあるが。
プロセッサ自体もスーパスカラとかで色々ややこしい動作をするようになってるから、
その老害オヤジが実際に現代のプロセッサで大口叩いてるような最適のコードを
書けるとはとても思えない。
> 現在なら、戻り値をフラグで返すコンパイラって無いの?
呼び出し規約という奴があるから基本的には無理。
> 現在、関数内で破壊されないレジスタは保存しないグローバル最適化してくれないの?
保存しない、というのは呼び出される側のすることであって、呼び出し側では、
呼び出し規約で破壊されることがありうることになってるレジスタを、呼び出しに
またがって生存を仮定することは通常できない。これは規約が有効な限り無理。
が、返り値がフラグ一丁で済むような関数であるとかそういうのはインライン展開
しちまうのが多分一番効率的という気がする。
0451デフォルトの名無しさん
2011/08/09(火) 09:01:36.70今のコンパイラは当時とはまるで次元が違うことを認識できていないようでは、不勉強の謗りは免れないな。
0453デフォルトの名無しさん
2011/08/09(火) 10:47:56.75総合的な出来は一番よかったとは思うけど。
0454デフォルトの名無しさん
2011/08/09(火) 12:57:12.28今来たけどもその時代からのプログラマだが
>一歩間違うとバグるリスクと引き換えに
アセンブラでガリガリ書き換えてバグるんじゃコスト的には大幅ダウンなわけで
趣味で最速プログラム作りたいならいいけど仕事ならNGだわな。
確かにフラグで返すとか不使用レジスタを自己ルールで決めてレジスタ渡しするとかすれば速くはなるが
クロック8MHzとかの時代の話だからねえ。
今なら手間の方が大きすぎてお勧めできん。
0455446
2011/08/09(火) 13:33:19.52なるほど、勉強になる。ありがと。
特に
> プロセッサ自体もスーパスカラとかで色々ややこしい動作をするようになってるから、
> その老害オヤジが実際に現代のプロセッサで大口叩いてるような最適のコードを
> 書けるとはとても思えない。
聞かせてやりたいと思った。
> 前後の文脈わからんけど、
おっと失礼した。ドヤ顔の書き込みがあったのはここ。
http://kamome.2ch.net/test/read.cgi/denki/1309466648/750
0456デフォルトの名無しさん
2011/08/09(火) 14:24:30.22組み込み(制御系)とかリアルタイムゲーム(リフレッシュ間隔時間内での処理が要求される)とか、
確かにそういう職人芸が成否を決めることもあるんだけどね。
あとどうでもいい知識だが8086のコンパイラではLSI-C 86は非標準的なレジスタ渡しで、うまくやると
末尾再帰最適化も効いてほんとにアセンブラ手書きみたいなコードができることもあった。階乗とか
かなり単純なコードの場合だけど。
どうでもいくない知識としては、x86 64の呼び出し規約はUnix系もWindows(Microsoft)もレジスタ渡し、
ってのは今時アセンブラ信者をやるなら必須の知識かな。
0457デフォルトの名無しさん
2011/08/09(火) 14:37:41.77RISC ならまだいいけど 86 のアセンブラを昔風に最適化なんてできる気がしねえ。
SIMD まわりは、また別だけど。
0458デフォルトの名無しさん
2011/08/09(火) 17:32:08.17あれって当然レジスタの順番ってのがあるんだよね?
第一引数から順番に
0459デフォルトの名無しさん
2011/08/09(火) 19:25:16.08> 関数パラメタの受け渡しには、レジスタAX, BX, CX, DXとスタックが使われま
> す。パラメタがどのレジスタにはいるかは、左から順に各パラメタに次の規則を
> 適用することによって決定されます。
(以下箇条書きでルールが4個)
そんな面倒なもんでもないね。
説明が糞だから、仕方がない。
例えば、引数が一つでint型の場合、どのレジスタに割り当てるか不明。
0461デフォルトの名無しさん
2011/08/09(火) 19:30:09.92> + パラメタの型がint, unsigned int, short, unsigned short, near pointer
> または2バイトの構造体か共用体ならば、AX, BX, CX, DXのうち未使用のも
> のに割り当て、どれも空いていなければ、スタック上に1ワード取ります。
と書いてあるが、どう不明なんだ?
・『未使用』の意味が不明
・どの順に使うか不明
0463デフォルトの名無しさん
2011/08/09(火) 19:49:36.07順番は確かに書いてないなw
0464デフォルトの名無しさん
2011/08/09(火) 20:17:08.53思い出した
まさにその辺が曖昧で分からなかったんだよ
0465デフォルトの名無しさん
2011/08/09(火) 20:26:03.840466デフォルトの名無しさん
2011/08/09(火) 20:40:46.590467デフォルトの名無しさん
2011/08/09(火) 21:38:29.370468デフォルトの名無しさん
2011/08/09(火) 22:08:35.310469 忍法帖【Lv=22,xxxPT】
2011/08/28(日) 05:24:28.170470デフォルトの名無しさん
2011/08/28(日) 09:08:22.45まずは64ビット級からはじめろ
0471デフォルトの名無しさん
2011/08/28(日) 10:34:30.17スレ違いだからくだ質へ。
で、何がわからないのかさっぱりだから、整理して。
ハンドアセンブルでもCコンパイラでも、32bitと変わらない手順で作れるはずなんだけど。
0472デフォルトの名無しさん
2011/09/08(木) 13:01:15.04for (int j = yT; j <= yB; ++j) {
// 0.666s
for (int k = xL; k <= xR; ++k) { // 2.347s
const double gwTt = gwT[k];
// 1.048s
const int di = s1[k] - s2[k];
// 2.282s
const int di2 = di * di;
// 2.530s
const double di3 = di2 * gwTt;
// 10.685s
gweights += gwTt;
// 1.146s
diff += di3;
// 7.087s
}
}
ICCでも速度出ない…。
int * doubleって遅い?
0473デフォルトの名無しさん
2011/09/08(木) 13:02:31.79orz
>int * doubleって遅い?
遅い。つーか、キャストが遅い。
それはさて、ベクタ化しないでしょ。gweightsとdiffを別のループで計算するようにしたらベクタ化しないかな。
それと、定数だから大丈夫だと思うが0.0fはfloat値だから0.0にすべきかと。
0475デフォルトの名無しさん
2011/09/08(木) 16:28:03.49// 1.146s
diff += di3;
// 7.087s
むしろこの辺に疑問を。diffの型ってintじゃないのか
0476デフォルトの名無しさん
2011/09/17(土) 03:55:01.560477デフォルトの名無しさん
2011/09/17(土) 03:56:22.89プログラムでこの部分がかなりの時間をとっているので改善したいと考えています。
#define M 300000
#define N 50000
int XY[M], b[N];
double x[N], y[N], z[N];
for(int i = 0; i < 40000; i++)
{
for( int j = i+1; j < 40000; j++)
{
r = sqrt((x[i]-x[j])*(x[i]-x[j]) +
(y[i]-y[j])*(y[i]-y[j]) +
(z[i]-z[j])*(z[i]-z[j]))+0.5;
XY[r] += b[i]*b[j];
}
}
・x,y,zの有効数字は整数桁まで
・rの最大値は200000程度
・インラインアセンブラやMMXを使用せずに速度を上げたい
インデックスへのアクセスとsqrtの計算の部分がボトルネックのようです。
よろしくお願いします
0478デフォルトの名無しさん
2011/09/17(土) 04:35:58.891秒かからないんだが、データが違うのかな?
http://ideone.com/bGwRs
0479デフォルトの名無しさん
2011/09/17(土) 04:42:51.13ちょっと修正。結果変わらず。
http://ideone.com/EpARv
0480デフォルトの名無しさん
2011/09/17(土) 05:18:58.040481デフォルトの名無しさん
2011/09/17(土) 05:26:58.28セグメンテーションフォルトになる可能性がある
(少なくとも僕の環境では起こった)
データ作っているところでM/3とかでいいかな
0482デフォルトの名無しさん
2011/09/17(土) 05:30:59.240483デフォルトの名無しさん
2011/09/17(土) 05:32:49.23配列の動的確保つかうといい。
0484デフォルトの名無しさん
2011/09/17(土) 05:35:48.750485デフォルトの名無しさん
2011/09/17(土) 05:43:00.01XY[r]のランダムアクセスをなくせれば良いが、元のをこれ以上改善できるところがない。
0486デフォルトの名無しさん
2011/09/17(土) 05:43:42.51固定小数点演算にすればいいんじゃないの?
u_long sqrt2(u_long f)
{
u_long s = f,t;
if(x == 0) return 0;
do {
t = s;
s = (t + f / t) >> 1;
}while(s < t);
return t;
}
int XY[M], b[N];
int x[N], y[N], z[N];
int xi, yi, zi;
for(int i = 0; i < 40000; i++) {
xi = x[i]; yi = y[i]; zi = z[i]:
for( int j = i+1; j < 40000; j++) {
r = sqrt2( (xi-x[j])<<1 +
(yi-y[j])<<1 +
(zi-z[j])<<1 ) + 0.5;
XY[r] += b[i]*b[j];
}
}
sqrt2()関数はここから持ってきた。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5438/sqrt.htm
0487デフォルトの名無しさん
2011/09/17(土) 05:46:22.64自分のPCとコンパイラだと25秒くらいかかります
1秒以下というのはコンパイラやPCの性能の違いかもしれないです
もしそこまで早くできるなら十分なのですが・・・
>>482
そこが大きいと思ってたけどそんなにですか・・・
ありがとうございます
0488デフォルトの名無しさん
2011/09/17(土) 05:47:18.23そうなんだ。じゃぁ、>>486は意味無いのねorz
0489デフォルトの名無しさん
2011/09/17(土) 05:52:15.81ランダムアクセスがXY[r] += b[i]*b[j];におけるボトルネックということですか・・・
でも、データはかなりランダムに配置されていてrの最小値が10000、最大値が200000くらいなので
ノルムでソートしたらそれのほうが時間がかかりそうです・・・
0490477
2011/09/17(土) 05:55:13.56自分のプログラムではsqrtを省略する時rの値がMより大きくなるため、
XY[1000] += b[i]*b[j]みたいな感じプログラムを回していました
そのせいでランダムアクセスが起きず、
速度が上昇→sqrtがボトルネック
のように勘違いしていたみたいです。
お手数をおかけして申し訳ないです
0491デフォルトの名無しさん
2011/09/17(土) 06:02:33.45GPUは使ったことないけど、こういった単純な計算には向いていそう。とおもうだけど実測はしていない。
CPUのマルチスレッドでも速くなると思うけど実測はしていない。
0492デフォルトの名無しさん
2011/09/17(土) 06:09:46.56メモリ共有すると衝突で遅くなると思うので、実メモリが十分にあったら別々に確保。
スレッド1 : for(int i = 0; i < 40000; i+=4) { XY0[r]・・・ }
スレッド2 : for(int i = 1; i < 40000; i+=4) { XY1[r]・・・ }
スレッド3 : for(int i = 2; i < 40000; i+=4) { XY2[r]・・・ }
スレッド4 : for(int i = 3; i < 40000; i+=4) { XY3[r]・・・ }
for( r = 0; r < M; r++) { XY[r]=XY0[r]+XY1[r]+XY2[r]+XY3[r]; }
0493477
2011/09/17(土) 06:15:16.82ありがとうございます。
それならインテルコンパイラでコンパイルを行うと勝手にMMX最適化を
行ってくれるのではないか、という認識でいます。
ですので、現時点では並列計算は考えていません、
認識が間違っていたら申し訳ないです
0494デフォルトの名無しさん
2011/09/17(土) 06:32:32.19一台でやるとランダムアクセスが一気に4つ来るだけで速度が速くならないか。
0495デフォルトの名無しさん
2011/09/17(土) 07:54:40.930496デフォルトの名無しさん
2011/09/17(土) 09:40:51.94> #define M 300000
> x[i] = rand() % M;
32bitのコンパイラなら、普通はRAND_MAXって32767程度だと思う。
だから、これだとx,y,zのサンプルデータが小さすぎるんでないかな?
0497477
2011/09/17(土) 09:44:04.74static double x[N], y[N], z[N];
こうしてたの忘れてました、すいません
0498デフォルトの名無しさん
2011/09/17(土) 09:49:05.30iccを使えるなら、OpenMPの指定がらくだから試してみるといい。
# そしてがっくりくる、とw
0500デフォルトの名無しさん
2011/09/17(土) 10:14:16.90VCだとPGOが使えなくなるぽいけど
0501デフォルトの名無しさん
2011/09/17(土) 10:15:44.55かなり大きなキャッシュが必要だな
0502デフォルトの名無しさん
2011/09/17(土) 10:24:43.92x[i] = rand() % M;
y[i] = rand() % M;
z[i] = rand() % M;
b[i] = rand() % 100;
}
memset(XY, 0, sizeof XY); //できるかぎりキャッシュに残るように分離した
/(^o^)\
こういうのは、IntelよりAMDのCPUの方が有利かもね。
loopを微妙に解いてprefetchするとかで。
0504デフォルトの名無しさん
2011/09/17(土) 14:39:47.12同一メモリにアクセスする限りは、並列化しても大して速くならないことは目に見えているな。
0505デフォルトの名無しさん
2011/09/17(土) 14:42:05.73割り当てると速くなるかもしれない。
0506デフォルトの名無しさん
2011/09/17(土) 15:11:18.87なるべく同じXY[r]へのアクセスを増やすこと。
0507デフォルトの名無しさん
2011/09/17(土) 15:12:25.120508デフォルトの名無しさん
2011/09/17(土) 16:57:20.03それはちょっと無理じゃないかな。
>>477
> #define M 300000
> int XY[M], b[N];
> ・rの最大値は200000程度
必要なキャッシュは800kB。結構デカイ。
short intとかWORDとかの16bitに入れたほうが簡単かも。
0509デフォルトの名無しさん
2011/09/17(土) 17:07:10.79組みたくないが
0510デフォルトの名無しさん
2011/09/17(土) 17:20:53.96ループを工夫して対策するしかない
0511デフォルトの名無しさん
2011/09/17(土) 17:57:33.20を部分的にCPUキャッシュに乗せて
XY[M]と併せて全てがキャッシュに乗るようにする。
まずCPUキャッシュにのっている部分だけで計算をすすめて
終わったら次を読み込む。
0512デフォルトの名無しさん
2011/09/17(土) 18:49:42.97#include <math.h>
#include <stdio.h>
#define M 10
#define N 50000
#define R 50000
unsigned int xor128();
void main() {
int i, j, r, *b = new int[N];
float *x, *y, *z;
x= new float[N]; y= new float[N]; z= new float[N];
unsigned int *XY = new unsigned int[M];
for(i = 0; i < M; i++) XY[i]=0;
r = (int)(M/sqrt(3.0));
for(i = 0; i < N; i++) {
b[i]=1 + i%32768; x[i]=xor128()%r; y[i]=xor128()%r; z[i]=xor128()%r; }
unsigned int sum=0;
for(i = 0; i < R; i++) {
for( j = i+1; j < R; j++) {
r = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) + (z[i]-z[j])*(z[i]-z[j])) + 0.5;
sum+=b[i]*b[j];
//XY[r] += b[i]*b[j];
}}
printf("%d\n",sum);
}
unsigned int xor128() {
static unsigned int x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
unsigned int t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
他の配列をcache不可な場所に配置するのはどうだろうか。
0514デフォルトの名無しさん
2011/09/17(土) 19:17:12.010515デフォルトの名無しさん
2011/09/17(土) 19:18:18.11強制的にキャッシュに乗らせない命令もあるの?
0516デフォルトの名無しさん
2011/09/17(土) 19:20:52.43(x,y,z)のdoubleをfloatへ節約してみたがダメだった。CPUキャッシュサイズには依存するが。
0517デフォルトの名無しさん
2011/09/17(土) 19:22:09.08これがXYをキャッシュから弾き出している
0518デフォルトの名無しさん
2011/09/17(土) 19:23:37.360519デフォルトの名無しさん
2011/09/17(土) 19:34:03.930520デフォルトの名無しさん
2011/09/17(土) 19:50:48.03struct CACHE {
int r;
int b;
};
CACHE c[N];
を追加して
for(int i = 0; i<40000; i++) {
for(int j=i+1; j<40000; j++) {
// 読み込み:キャッシュをフルに使う
// 書き込み:追い出されてもOK
int r = static_cast<int>(sqrt(
(x[i]-x[j])*(x[i]-x[j]) +
(y[i]-y[j])*(y[i]-y[j]) +
(z[i]-z[j])*(z[i]-z[j]))+0.5);
c[j].r = r;
c[j].b = b[i]*b[j];
}
for(int j=i+1; j<40000; j++) {
// 読み込み:追い出されてもOK
// 書き込み:キャッシュをフルに使う
XY[c[j].r] += c[j].b;
}
}
少しは速くなるはず
0522デフォルトの名無しさん
2011/09/17(土) 21:02:42.16{
for(int l = 0; l < 40000; l += 256)
{
for(int i = k; i < min(40000,k+256); i++)
{
for( int j = max(k+1,l); j < min(40000,l+256); j++)
{
r = sqrt((x[i]-x[j])*(x[i]-x[j]) +
(y[i]-y[j])*(y[i]-y[j]) +
(z[i]-z[j])*(z[i]-z[j]))+0.5;
XY[r] += b[i]*b[j];
}
}
}
}
256エントリーずつにした
0523デフォルトの名無しさん
2011/09/17(土) 21:03:42.320524520
2011/09/17(土) 21:18:03.51ttp://ideone.com/nkhXc
チョットだけ速くなったかな
0525デフォルトの名無しさん
2011/09/17(土) 21:21:41.550526520
2011/09/17(土) 21:36:55.08ソースの骨組みは前からあるのでそれを改造して作ってます
0527デフォルトの名無しさん
2011/09/18(日) 02:35:46.99使うメモリを二分割とか、三分割にしたらもっと速くならない?
こんな感じで。
for(int j=i+1; j<40000; j++) {
if (c[j].r<(i+200000)/2)
XY[c[j].r] += c[j].b;
}
for(int j=i+1; j<40000; j++) {
if (c[j].r=>(i+200000)/2)
XY[c[j].r] += c[j].b;
}
0528477
2011/09/18(日) 07:14:51.15>>520を利用したら計算時間が25秒->20秒まで早くなりました!
構造体にこんな使い方があるなんて知りませんでした。
あと、今日誤差を許容して計算してみたら、Mのオーダを一つ落とせそうな事に気づきました。
これらを利用したら合計計算時間を半分近くまでできそうです。
他の方の意見も非常に参考になるので色々と試しています
様々な意見を出していただいてありがとうございます!
0529477
2011/09/18(日) 07:15:34.06>>520を利用したら計算時間が25秒->20秒まで早くなりました!
構造体にこんな使い方があるなんて知りませんでした。
あと、今日誤差を許容して計算してみたら、Mのオーダを一つ落とせそうな事に気づきました。
これらを利用したら合計計算時間を半分近くまでできそうです。
他の方の意見も非常に参考になるので色々と試しています
様々な意見を出していただいてありがとうございます!
0530477
2011/09/18(日) 07:19:51.38ありがとうございます!!構造体のこういう使い方は始めて知りました。
あと、今日計算していて気づいたのですが、誤差を許容してMのオーダを1つ下げてもそれほど結果は変わらないみたいです
これらを利用したら全体の計算時間を半分くらいにできるかもしれません。
他の意見も参考にして色々試しています。
様々な意見をありがとうございます、非常に参考になります。
0531デフォルトの名無しさん
2011/09/18(日) 07:22:06.400532デフォルトの名無しさん
2011/09/18(日) 08:44:07.73計算時間半分になるんじゃん?
関係ないがiとjが出てくるコードは読みにくくてたまらん。xとyのほうがいい。
0533デフォルトの名無しさん
2011/09/18(日) 09:34:47.35i<jとj>iは同じだろう…ってのは置いといて
for(int i = 0; i < 40000; i++)
{
for( int j = i+1; j < 40000; j++)
常に j>i だよ。
もともと半分しか計算してない。
0534477
2011/09/18(日) 09:39:48.13Mの大きさを1/10,1/100にそれぞれしたときかかる時間は
22.352->21.563->21.523
程度の短縮だったので、提示していただいた考えではあまりうまくいかなさそうです
やはりランダムアクセスにおいてキャッシュがうまく働いていないのかと・・・
知識不足で>>520の方法でなぜ短縮されるのかがよくわかりませんが・・・
0535508
2011/09/18(日) 10:53:58.92> やはりランダムアクセスにおいてキャッシュがうまく働いていないのかと・・・
だからランダムでもXY[M]がキャッシュに入る様、二分割三分割でやろうって話し。
0536477
2011/09/18(日) 11:19:41.40>>512で示していただいてますが、Mを10にしてもキャッシュをうまく使えないのならメモリを分割しても
うまくいかないと思います
>>534のレスでは>>527への応答になっていませんね、すいません。
0537デフォルトの名無しさん
2011/09/18(日) 11:31:48.790538デフォルトの名無しさん
2011/09/18(日) 11:33:36.100539477
2011/09/18(日) 12:12:24.85XY[r]へのランダムアクセスがボトムネックで、
jが大きすぎるため、キャッシュがXYの方に割り当てられず、
Mのを小さくしてもXY[r]のアクセスにキャッシュを使うことができない
というのが現在の認識です。
0540デフォルトの名無しさん
2011/09/18(日) 12:17:59.42アクセスを局所に集中させるという方向は間違っていないはず。
0541デフォルトの名無しさん
2011/09/18(日) 14:59:32.45>それならインテルコンパイラでコンパイルを行うと勝手にMMX最適化を
>行ってくれるのではないか、という認識でいます
コレ見てSSEでもいいんじゃね?って思ってSSE2版を追加しました(一度に2個のsqrtを計算してるだけですが)
ttp://ideone.com/8ZS47
0542デフォルトの名無しさん
2011/09/18(日) 15:15:36.44速くなったか。
0543デフォルトの名無しさん
2011/09/18(日) 15:20:33.060544522
2011/09/18(日) 15:47:03.27>>522は自分で書いて何だが、会社辞めて何年もプログラム書いていないし、
コンパイラも入れていないから駄目な気がする
すまぬ
>>520,>>541ってすげー
0545デフォルトの名無しさん
2011/09/18(日) 16:38:13.950546デフォルトの名無しさん
2011/09/18(日) 16:54:15.410547520=541
2011/09/18(日) 17:06:50.77別に凄くは無いですよ。google先生が凄いんです
>>542
一番いい最適化の方法だと自分は思います。複雑な演算をしている間にプリフェッチが完了すればメモリアクセスを
隠蔽できるので
0548デフォルトの名無しさん
2011/09/18(日) 18:17:02.88bxyz を構造体にしても変わらなんだ。
0549デフォルトの名無しさん
2011/09/18(日) 18:26:16.410550520
2011/09/18(日) 23:13:29.10関数が大きいから命令キャッシュから溢れているかも
ttp://ideone.com/P8jIP
疲れたのでROMに戻ります
0551デフォルトの名無しさん
2011/09/19(月) 01:43:14.36遅レスだが、
gcc version 4.2.1 (Apple Inc. build 5664)
RAND_MAX = 2147483647
gcc a.c -O2 -Wall
0552デフォルトの名無しさん
2011/09/19(月) 02:08:12.19RAND_MAXでかくていいなぁ。
ちなみにsrandの引数の型ってどうなってる?
64bitになってるのかな?
0553デフォルトの名無しさん
2011/09/19(月) 03:21:22.23unsigned
0554デフォルトの名無しさん
2011/09/19(月) 09:02:29.111秒未満
>>550の実行結果
res:477 -> 32.4342
res:520 -> 31.6174
res:520s -> 34.1533
res:520s2 -> 31.2566
なんだが、議論を続ける理由は何だろう?
例えばデータ量が数桁大きくなった場合でも適用出来る方法を探る、とか?
0555デフォルトの名無しさん
2011/09/19(月) 10:06:34.97stdlib.h @ MSVC
#define RAND_MAX 0x7fff
>>554
イマイチ、状況が解らないんだよね。
intやdoubleの四則演算の300000, 50000 の配列なんて、
ベクタ化でガッツリ早くなるのに。
0556477
2011/09/19(月) 10:20:29.02色々なアイデアを出してくださって非常に参考になりました。
SSEに関しては、もう少しでインテルコンパイラが使えるようになるので、
それを導入してから参考にさせていただきます。本当にありがとうございます。
>>548
大きい配列を扱う場合はfloatの方が少し早いみたいですね、知りませんでした。
ですがこれも何故か遅くなってしまったので保留しておきます。
>>554
実際には時間を変えた複数のデータの比較になるので、一つ一つの計算が早ければ早いほど望ましいです。
あと>>479のままでは私のPCではコンパイルできないので、データを十分に計算していない可能性があるのではないかと・・・
0557デフォルトの名無しさん
2011/09/19(月) 10:52:00.02floatを使うときは、doubleとの変換が発生しないように注意。
具体的には、定数は必ずfをつけるかキャストするとか、標準関数もfloat版を使うとか。
手っ取り早い検証方法としては、アセンブリ出力をしてcvtなんちゃらのニモニックを探せばいい。
あ、勿論、gccの場合は-msse2 -mfpmath=sseを忘れずに。
0558デフォルトの名無しさん
2011/09/19(月) 11:12:51.70> 私のPCではコンパイルできない
どんな環境か知らないけど、配列を動的確保してないからじゃない?
ttp://ideone.com/Sicye
0559477
2011/09/19(月) 11:34:38.50すいません、コンパイルできないじゃなくてコンパイルしても動かないの間違いでした
動的確保の代わりにstatic int, static double を使ってプログラムを動かしているのですが
動的確保したほうがいいのでしょうか?
>>557
どこかで無駄な変換が起きてる可能性がありますね、
アセンブリはあまり理解していないですが、
そちらからも無駄がないか調べてみたいと思います。ありがとうございます。
ちなみにVisual C++2010でやってます。
0560デフォルトの名無しさん
2011/09/19(月) 12:03:50.85> コンパイルしても動かない
32bitバイナリで、スタックエラーでしょ?
スタック・ヒープってのがあって、mallocやnewすると、ヒープ領域が使われて
自動変数は、スタック領域が使われるんだよ。MSVCの既定では、1MBだから
int XY[300000], b[50000]; // int型 (4Bytes) * (300000 + 50000)
double x[50000], y[50000], z[50000]; // double型 (8Bytes) * (50000 + 50000 + 50000)
簡単に溢れるじゃんw Cellみたいにアーキテクチャによっては、
スタックが非常に高速なメモリーだったりするんだけど、スタック領域は大きくないんだよ。
コンパイラによっては、staticキーワード付けるとヒープ領域使うらしいけど
所詮環境依存だからね。
0561477
2011/09/19(月) 12:18:54.86環境依存ならstaticは使わないほうが良さそうですね、
だとすると、
>>554は全部スタック領域で演算できてるから早いのでしょうか
それとも、計算時に何らかのエラーが発生しているため早いのでしょうか
もし前者なら1秒未満というのは非常に魅力的です
0562デフォルトの名無しさん
2011/09/19(月) 13:46:28.56>>479の実行結果
1秒未満
>>550の実行結果
res:477 -> 32.4342
何でこうなるの
0563デフォルトの名無しさん
2011/09/19(月) 14:07:02.74現代のパソコンは複数のソフトが動くから、他のソフトに迷惑掛けないのが高速化のコツ。
スワップアウトを何度もやると遅い。
0564デフォルトの名無しさん
2011/09/19(月) 14:08:55.18newやvectorで動的確保した方が良い。
staticは遅いのと、容量確保に限界がある。
動的確保も限界があるがそっちのほうが大きい。
0565デフォルトの名無しさん
2011/09/19(月) 14:13:02.78コンパイル時に確保が決定している固定領域がスタック。
コンパイル時に確保が決まっていない領域がヒープ。
自プログラム、他のソフトにとっても、使っていないメモリは解放した方が、空きが増えて速度が上がるので動的確保の方が良い。
0566デフォルトの名無しさん
2011/09/19(月) 14:16:36.05>>479は計算結果を表示していないから計算自体が最適化でなくなってるんじゃないの?
バグにしかみえないんだけれど…
0567477
2011/09/19(月) 14:16:55.14>>479をそのままコンパイルしてやってみましたが18秒かかりました
1秒未満というのはちょっと考えづらいです・・・
>>563
後の参考になります。ありがとうございます。
しかし今回時間がかかっている部分の計算は、ほとんどがintの配列に格納されることと、
sqrtの引数・戻り値がdoubleであることからfloatを使う旨みはあまりなさそうでした
0568デフォルトの名無しさん
2011/09/19(月) 14:22:19.40sqrtの計算部分は無視できるよ。
全体の容量削減が追い出されない可能性をあげる。
0569477
2011/09/19(月) 14:32:47.86ありがとうございます。早くなりそうなら動的確保に変えてみます
その場合、calloc関数でも構わないのでしょうか?
C++は全然していないので・・・質問ばかりですいません
>>568
なるほど!
ということはメモリを動的確保して、例えばx,y,zをintで表現できれば
キャッシュ内に配列が収まる可能性があるということですね
これはちょっと光が見えてきた気がします!
0570デフォルトの名無しさん
2011/09/19(月) 14:36:43.270571デフォルトの名無しさん
2011/09/19(月) 14:50:59.72static int XY[M], b[N], r, i, j;
static double x[N], y[N], z[N];
一番簡単に修正するには静的領域に置くのがいいな
元のプログラムは多分スタックオーバーフローで異常終了している
0572デフォルトの名無しさん
2011/09/19(月) 14:54:17.77r,i,jは分けないと
0574デフォルトの名無しさん
2011/09/19(月) 14:59:14.33static int XY[M], b[N];
int r, i, j;
static double x[N], y[N], z[N];
こういう事だね了解
0575デフォルトの名無しさん
2011/09/19(月) 15:04:55.84あれは正直羨ましい
0576デフォルトの名無しさん
2011/09/19(月) 15:14:25.15http://www.dotup.org/uploda/www.dotup.org2040834.zip.html
MSVCのデバッグビルドで、実行すると120秒。
ICCで最適化したら、12秒
そろそろ速いマシン欲しいわー。
0577477
2011/09/19(月) 16:42:58.30全ての変数をスタック領域内に入れて計算を行いましたが
結局は>>520のやり方の方が早かったです・・・
これだと動的確保の処理を入れると余計に時間がかかりそうです
今の考え方のままだとそろそろ頭打ちかもしれないです
0578デフォルトの名無しさん
2011/09/19(月) 19:05:21.65L2Cacheに収めると、劇的に早くなるだろうね。
http://www.dotup.org/uploda/www.dotup.org2041723.zip.html
0579デフォルトの名無しさん
2011/09/19(月) 19:17:24.260580デフォルトの名無しさん
2011/09/19(月) 19:21:02.680581デフォルトの名無しさん
2011/09/19(月) 20:11:45.92大きいL2キャッシュマシンを用意するんですね
0582デフォルトの名無しさん
2011/09/19(月) 21:12:40.020583デフォルトの名無しさん
2011/09/19(月) 22:28:38.07>557は言っている。sqrtf()を使えと。
0584デフォルトの名無しさん
2011/09/20(火) 00:54:19.40rは最大、sqrt(3)*Mに成り得るから、
X:int XY[M]
O:int XY[2 * M]
の方がいいと思う。
0585デフォルトの名無しさん
2011/09/20(火) 01:05:37.13floor(sqrt(3)*(M-1) + 1/2)
ようやくこの話が出たか
>47ではなくて>479に言うべきだけどな
0586デフォルトの名無しさん
2011/09/20(火) 01:26:15.90アンカーは正しく使えよ。
専ブラならいいけど、そうでない人が困るだろ?
0587デフォルトの名無しさん
2011/09/20(火) 01:45:58.61>rは最大、sqrt(3)*Mに成り得るから
絶対になりませんよ。
>>477 には、"#define M 300000" "rの最大値は200000程度"
って書いてあるんだから。
0588デフォルトの名無しさん
2011/09/20(火) 01:48:42.670589477
2011/09/20(火) 06:06:00.22そのやり方でやってみましたが、
>>520 -> 22.105sec
>>578 -> 27.413sec
という結果でした。
しかし、自分でTestCodeのcalc3の部分をコンパイルして計算したところ、
倍近く時間がかかったので、インテルコンパイラには期待が持てそうです。
ありがとうございます。
0590477
2011/09/20(火) 06:23:20.91↓
for(int i = 0; i < max; i++){
const int bi = b[i];
const int xi = x[i];
const int yi = y[i];
const int zi = z[i];
for( int j = i+1; j < max; j++){
c[j].r = sqrt((xi-x[j])*(xi-x[j]) +
(yi-y[j])*(yi-y[j]) +
(zi-z[j])*(zi-z[j]))+0.5;
c[j].b = bi*b[j];
}
for( int j = i+1; j < max; j++)
XY[c[j].r] += c[j].b;
}
>>578を利用してこのように書き換えると
22.188sec, 22.328sec -> 20.645sec, 20.670sec
と、少し速度があがりました!
参照を減らすのはもっと早くやっておくべきでした。
0591デフォルトの名無しさん
2011/09/20(火) 06:57:39.030592デフォルトの名無しさん
2011/09/20(火) 08:26:10.40上のループの方が速いのかのう
コンパイル環境用意していない者の戯言です
0593デフォルトの名無しさん
2011/09/20(火) 14:54:03.20そのくらいの速度向上でいいなら、 float 化が一番楽じゃないかねえ。
sqrtf と +0.5f に気をつけるだけじゃん。
0594デフォルトの名無しさん
2011/09/20(火) 18:07:24.700595デフォルトの名無しさん
2011/09/20(火) 18:30:00.410596デフォルトの名無しさん
2011/09/20(火) 20:20:20.020597520
2011/09/20(火) 23:19:31.89メモリ動的確保に対応しました
>>477がC++をやってないのでC言語にも対応しました
ttp://ideone.com/F48Ay
適当に弄って遊んでくださいな
0598477
2011/09/21(水) 10:17:24.18本当に何から何までありがとうございます!
プログラムだけでなく、ベンチマークも非常に参考になります
これからコードを書くときも参考にさせていただきます
0599477
2011/09/21(水) 10:29:13.39double x[N], y[N], z[N];
int b[N], r[N], XY[M];
for(int i = 0; i < max; i++){
const int bi = b[i];
const int xi = x[i];
const int yi = y[i];
const int zi = z[i];
for( int j = i+1; j < max; j++){
r[j] = sqrt((xi-x[j])*(xi-x[j]) +
(yi-y[j])*(yi-y[j]) +
(zi-z[j])*(zi-z[j]))+0.5;
}
for( int j = i+1; j < max; j++)
XY[r[j]] += bi*b[j];
}
このように書けば、書き込みの無駄が省ける事に気づきました
これで1%ほど速度が上がりました
0600477
2011/09/21(水) 10:58:43.15最初はb~z[i],b~z[j]を使っていたので、キャッシュが追い出されて十分に使えなかったんだと思います
しかし、試しに
for( int j = i+1; j < max; j++)
XY[c[j].r] += c[j].b;
を消して計算したところ15秒ほどかかったので、
局所性を使ってもそれほど速度は変わらないかと思いました
>>482で95%がX[r]へのランダムアクセスと書かれていましたが
もしかしたら、どこか他にボトルネックがあるのかもしれません
また、試しに
int B = 0;
for( int i = 0; i < max; i++)
for( int j = i+1; j < max; j++)
B++;
と、書いてみたところ、計測不可能なくらい時間がかかりました
b~z[N]を定義していないプログラムだと3秒程度で計算が終わったので
ヒープ領域が関係あるのかと思いましたが、もし原因がわかる方がいたら教えて下さい。
連投申し訳ありません。
520さんのコードでももう少し調べてみようと思います本当にありがとうございます。
0601デフォルトの名無しさん
2011/09/21(水) 13:14:07.97Windowsが動くようなマシンは、ヒープもスタックもメインメモリ。
つまり変数へのアクセス速度は、ほぼ変わらない。
ただCPUには、メインメモリのキャッシュ領域がある。
そこは、32KB程度の小さい領域。
アクセス先の配列が数十KBくらいなら、CPUのキャッシュが効いて
非常に高速になるはず。
このアルゴリズムでは、全ての配列が大きくて
キャッシュには非効率的になってるんだお。
アクセスする先を数十KB程度毎に区切れるように、
アルゴリズムの最適化するのが、一番。
って話だよ。
0602477
2011/09/21(水) 13:32:18.16>また、試しに
以降は再度計算したら3秒程度で計算が終りました。
>>601
自分の付け焼刃的な考えでは、>>599の
for( int j = i+1; j < max; j++)
XY[r[j]] += bi*b[j];
の部分を消したらキャッシュに全て乗ってかなり速くなると思ったのですが、あまり速くなりませんでした
これはb[N],x[N],y[N],z[N]が大きすぎるため(それぞれ、200KB程度)、配列がキャッシュに乗り切らず、結局は何度もアクセスをしているため、
キャッシュの局所性を利用したぶんしか速くならなかったとういうことでしょうか。
0603デフォルトの名無しさん
2011/09/21(水) 13:36:03.040604デフォルトの名無しさん
2011/09/21(水) 22:02:31.16参考まで。
-O3
res:477 -> 19.3800
res:520 -> 11.8600
res:520s -> 7.1000
-O3 -funroll-loops
res:477 -> 11.4100
res:520 -> 11.0900
res:520s -> 6.7000
0605デフォルトの名無しさん
2011/09/21(水) 22:38:16.56x,y,zがdoubleならそれぞれ400KB程度
0606デフォルトの名無しさん
2011/09/21(水) 22:42:46.59なんでBCCは遅いんだろ
0607デフォルトの名無しさん
2011/09/21(水) 22:45:48.770608デフォルトの名無しさん
2011/09/21(水) 22:49:49.69コンパイルが馬鹿っ速い代わりに最適化無しか
0609デフォルトの名無しさん
2011/09/22(木) 00:30:15.57スレッド2つにすると少しだけ速くなるみたい。
例のテンプレートは使ってないので悪しからず。
0610デフォルトの名無しさん
2011/09/22(木) 00:35:17.69スレッドにするとメモリアクセスがよりランダムになってしまいキャッシュ溢れで遅くなる可能性。
全部CPUキャッシュに乗れば良いが。
環境によって変わる。
0611デフォルトの名無しさん
2011/09/22(木) 00:37:01.92これが言いたかった。
0612デフォルトの名無しさん
2011/09/22(木) 00:51:13.56今の問題はL3/LLがあふれることではなくL2のことでしょ
ならば一般的な2コアCPUの場合は片方のL2が遊んでるから使おうと考えるのが自然
実際うちでは1スレッドで10秒、2スレッドで8秒くらいだしっていう
0614デフォルトの名無しさん
2011/09/22(木) 02:16:26.77>>604が書いているように、ほぼ同等の速度となるものに対して、
>>477が、速くなりました!といっているということは、
少なくともロジック以外の面では改良の余地があったってことじゃないのかな。
0615デフォルトの名無しさん
2011/09/22(木) 03:10:34.27それともそもそもだめなん?
ttp://codepad.org/92NIdZeV
構造体変えると15秒くらいはやくなった。
環境は Linux のみなんで、ごめん。
0616604
2011/09/22(木) 04:48:20.91% gcc 615.c -lm -O3 -funroll-loops
% ./a.out
original took 7.114642 sec
xyz_near took 7.254803 sec
% ./a.out
original took 7.169084 sec
xyz_near took 6.879905 sec
% ./a.out
original took 6.539106 sec
xyz_near took 7.331002 sec
>>520からの流れはC++だったのでオリジナルの速度に差が出ているようで
xyzを近くに配置することの有意差は認められなかったかなぁ。
0617477
2011/09/24(土) 00:54:01.94色々と考えてみましたが、コーディング以外で速度を上げる方法として
1.r[j] がint型であるのでint型を受け取ってint型を返すsqrt関数を用いる
→アルゴリズムは幾つかあったが、sqrtの方が速い
→テーブルを作るにはrが大きすぎる
2.3点a,b,cがあったときa,b,cの座標と、ab,acの長さが既知であるとき、
bcの長さを簡単な計算で求められないか
→ベクトルや、三角関数で考えると無理
→しかしsqrtを使用しないクロック数の少ないアルゴリズムあるかもしれない
3.b[i]最大値は100程度なので、b[N]をchar型にできる。
→キャッシュの大きいマシンがあれば二つ目のループを全てキャッシュに乗せられるかも
4.r[i]をr^2[i]のまま計算を行い、sqrtが40000^2回行われるのを防ぐ
→r^2[i]を入れるXY[M]のMが大きくなりすぎるため、r^2[i]を規格化しなければならないが、その時の誤差がどの程度か
というものを今のところ考えています。
実際に確認してもXY[r[i]]へのアクセスとsqrtの計算は同じくらい時間をとっている事がわかったので、どちらかの計算が省略できれば速度は上がるはずです。
また、並列化や、配列の位置を調整することは、人間の手で行うことが果たして良いことなのかわからないのでICCを使える様になってからにしておきます。
もし何か気づいたことがあれば教えて下さい。
このスレのおかげで、プログラムの速度が上がり知識も増えました。しかし、これ以上の高速化はデータを見ながらの作業だと思います。
ですので、一旦ここでこの話題は終了とさせていただきます。
520さんをはじめ、様々なアイデアをだしていただいた皆様、ありがとうございました。
0618デフォルトの名無しさん
2011/09/24(土) 22:47:13.680619デフォルトの名無しさん
2011/09/27(火) 17:09:25.86上記やりとりも含めた最適化に関するスキルは
みなさんどうやって習得されたのでしょうか?
もちろん「(CPUなどの)仕様を確認」と「ひたすら実践あるのみ」
というのは前提だと思いますが、取っ掛かりや基礎的な知識の
習得などはどうされたのかな、と…
例えばC++の勉強をするのに膨大な仕様書をいきなり読む人と
いうのは中々いなくて、普通は入門書を読むことでスタート地点に
立ちますよね。最適化にはそういった定番の入門書のようなものは
あるのでしょうか?
自分なりに調べてみたところ
プログラマのための硬派なコンピュータ学
http://www.amazon.co.jp/dp/4798023027/
プロセッサを支える技術
http://www.amazon.co.jp/dp/4774145211/
マイクロプロセッサ・アーキテクチャ入門
http://www.amazon.co.jp/dp/4789833313/
この辺りの書籍は参考になるのではないかと思いましたが
これらはあくまでも理論的な背景であって実践的なスキルとは
また別の話になりますよね?
何か参考になる書籍なりサイトなりあれば是非教えてください。
0620デフォルトの名無しさん
2011/09/27(火) 17:19:20.33いるけど
0621デフォルトの名無しさん
2011/09/27(火) 19:42:05.39なんか、このスレとかで。。。
新しいキーワードを見たらそれしらべて、周辺に転がってる情報も集めて。。。
今回の話でいえばループ展開とCPUのキャッシュあたりがキーワードになってるよ。
本ならハッカーズデライトが有名かも。
>>620
なかなかいないって書いてるのに。
0622619
2011/09/27(火) 23:07:30.83書籍についてもありがとうございました。
興味はあったのですが、いまいちどこから手をつけていいのか
わからず困っていたので助かります。
0623デフォルトの名無しさん
2011/09/28(水) 17:04:03.44ここで、速度が気になったらWebを読み漁り、
三項条件演算子やi++を++iに書き換えたり
最適化オプションを色々試して、無駄な努力をする。
IntelC/C++コンパイラでビルドしても
大して変わらない事に失望する。
そのうちに、プロファイラを使い始めて
ボトルネックを発見、解消するw
ここまで来ると、コンパイラによる最適化を意識したソースコードを書くようになる。
気がする。
0624デフォルトの名無しさん
2011/09/28(水) 17:04:45.96ノイマン型のアーキテクチャなら、高速化というのは結局
1) 計算量を下げる
2) IPC = 1 サイクル当たりの実行命令数を上げる
ということに落ち着く。
で、CPU メーカーやコンパイラメーカーの文書に、IPC を向上させるために
自社の製品にどのような技術が使われているかが、自慢げに誇張気味に
書いてあるから片っ端から読むといい。
ところで君の書き込みは、「手抜きしたい」というように感じてしまう。
ほとんどの人は、効率よく勉強したいと考えて上達したわけじゃない。
片っ端から全部学ぶしかないから、図書館で片っ端から読むのがいい。
0625デフォルトの名無しさん
2011/09/28(水) 18:17:43.04でも、熟練度が足りなくて読めなかったら、他の本を読めばいいだけとも
0626デフォルトの名無しさん
2011/09/29(木) 08:28:07.75何も解決しないし、何も身につかないよね。
Intel C/C++ コンパイラも VTuneも試用ライセンスを
無料で取得できるんだから、弄ってみれば良いんだよ。
0627デフォルトの名無しさん
2011/09/29(木) 16:09:22.46(valueは正、digitsは0〜5が保証される)
これ以上速くできる?
double NormalizeDouble(double value, int digits) {
static double t0[] = { 1, 10, 100, 1000, 10000, 100000 };
static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 };
return (int)(value * t0[digits] + 0.5) * t1[digits];
}
0628デフォルトの名無しさん
2011/09/29(木) 19:48:27.50テギョンの所属事務所JYPエンターテインメントは29日、テギョンが「僕とスターの99日」で、キム・テヒに接近する謎の男テソン役にキャスティングされた、と明かした。
テギョンの日本ドラマ出演は、今回が初めてだ。
来月23日より初放送される「僕とスターの99日」は、フジテレビが日本のゴールデンタイムである日曜夜9時に編成した「ドラマチック・サンデー」で放送されるロマンチックコメディー。
韓国のトップスターハン・ユナ(キム・テヒ)と彼女の日本撮影で99日間の契約警護を務めるボディーガード(西島秀俊)の秘密のロマンスを描く。
テギョンが演じるテソンは、やや暗い性格のベールに包まれたキャラクターだ。
彼には夢があるが、実現することができずに夢をあきらめてきた男。誰にも話せない大きな秘密を持っている。
所属事務所は「テソンの秘密は、主人公2人はもちろん、パパラッチ役である要潤まで引き込み、彼らの人生に大きな影響を与える。
ドラマのストーリーを作っていく上で、重要な役柄になるだろう」と伝えた。
なお、テギョンは韓国でドラマ「シンデレラのお姉さん」や「ドリームハイ」を通じて演技に挑戦していた。
http://www.asahi.com/showbiz/korea/AUT201109290027.html
0629デフォルトの名無しさん
2011/09/29(木) 23:30:12.27ある様な無い様な。
10進数で小数点第二位を四捨五入する場合を考える。
この時、0.05以上なら切り上げ。未満なら切り捨てになる。
一方、double型の指数部を見れば仮数部の実際の小数点を特定出来る。
0.05は 0.0000_1100_1100_1100_1101…であるため、特定した小数点の下位ビットから「1100_1100_1100_1101…」に該当するビットと「1100_1100_1100_1101…」とを大小比較する。
小さければ該当ビットをクリア。
大きければ該当ビットをクリアの上、その小数点に0.1を加算する。
なんか間違えている気がする。
0631デフォルトの名無しさん
2011/09/30(金) 02:22:24.82低レベルすぎなので結構です。
0632デフォルトの名無しさん
2011/09/30(金) 02:55:56.63遅くなる。
0633デフォルトの名無しさん
2011/09/30(金) 07:09:21.64例えば0,23は0,2と0.03に分けられるが、0.2を2進数表記すると…。
そう、単純にクリアしたらダメだねぇ〜
どうしても、x10,x100,x1000の処理は必要か。
CPU次第だけど、cacheの境界に合わせれば、floatだと一本に入りきる。
連続しない呼出なら、有効だと思ってみた。
0635デフォルトの名無しさん
2011/09/30(金) 08:37:39.79仮数部をlong型に取り出し、x10dを実行。
すると実小数点は3桁右に移動するので、そこに0.5dを加算。
加算後、実小数点以下はクリア。
/10dを実行すると小数点が元に戻るので、元のdouble型にそのままはめ込む。
こんなんでも同じ結果が得られる。
でも、doubleとlongの乗算時間は同じな気がするし、castが減ってもそんなに早くなるとは思えない orz
FPGAなら間違いなく速くなるんだけどね。
0636デフォルトの名無しさん
2011/09/30(金) 12:28:48.04キャストは大して負荷にならないんだよね。
ところで>>627のコードだと、valueの最大値が21474になってしまうが
それは問題ないの?
0637,, ・´ ∀ `・ ,,)っ-○○○
2011/09/30(金) 12:44:41.470638デフォルトの名無しさん
2011/09/30(金) 13:38:23.570639デフォルトの名無しさん
2011/09/30(金) 13:46:49.17よくそんな役立たずでコテつけれるな。寒心するわ。
0640デフォルトの名無しさん
2011/09/30(金) 14:12:54.47環境によっては int にキャストするより floor のインラインアセンブラや intrinsics を使った方が早いだろうね。
そして呼び出し側の設計しだいでは SIMD 版を作って呼び出すようにするとよりいいだろうね。
許されるなら double ではなく float にすると、SIMD の並列実行数が上がっていいだろうね。
ところで、それを高速化したところで、プログラム全体の処理が目に見えて早くなるとは思えない。
VTunes とかの CPU イベントをカウントできるプロファイラにかけてみた方がいいと思うよ。試用版もあるし。
0641デフォルトの名無しさん
2011/09/30(金) 16:11:27.09大量の座標を処理するようなもので、各座標の値を整数化したいのかもしれないじゃない
0642デフォルトの名無しさん
2011/09/30(金) 18:03:00.812進じゃなくて10進で四捨五入したいからそれだとだめじゃない?
FPGAだとしても。
>>636
それは気づかんかったwでも大丈夫。値域もvalue*pow(10,digits)は
MAXINT以下が保障されるということで。
>>640
CygWinなんだけど、g++-4 の最強オプション教えて。ググっても出てこない...
-mcore=nativeとか使えなくなった?
floor()にしてみたけどインライン展開されなかった。
floorf()にしても展開されなかったけど速くはなった。
0643デフォルトの名無しさん
2011/09/30(金) 18:25:58.87> 2進じゃなくて10進で四捨五入したいからそれだとだめじゃない?
小数点第一位の四捨五入は簡単だよ。
そこが0なら0.5未満だから切り捨て。
そこが1なら0.5以上だから切り上げ。
1ビット見るだけで判断出来るんだ。
0644デフォルトの名無しさん
2011/09/30(金) 18:32:22.83なるほど。
でもx10はいいとして/10はどうすんの?
0645デフォルトの名無しさん
2011/09/30(金) 18:46:53.180646デフォルトの名無しさん
2011/09/30(金) 19:46:54.60ちょっとunsigned long long f:52;とかしてゴニョゴニョやってみたけど
もちろん全然ダメだったw
>>645
いや、FPUがあるのに高速除算機分のセルを使ったりすることもないだろう
と思ってね。
0647デフォルトの名無しさん
2011/09/30(金) 21:00:23.130648デフォルトの名無しさん
2011/09/30(金) 21:08:28.390649デフォルトの名無しさん
2011/09/30(金) 23:11:51.66メインフレームのFORTRAN77にはあった記憶があるが。
0650デフォルトの名無しさん
2011/09/30(金) 23:13:08.600651デフォルトの名無しさん
2011/09/30(金) 23:17:15.140652デフォルトの名無しさん
2011/09/30(金) 23:20:00.70遅くなった。
0653デフォルトの名無しさん
2011/10/01(土) 00:20:25.910654デフォルトの名無しさん
2011/10/07(金) 18:27:10.280655デフォルトの名無しさん
2011/10/07(金) 18:36:55.300656デフォルトの名無しさん
2011/10/29(土) 16:32:36.27And演算やXor演算の倍近くかかるんだけど。
やってる処理は10000×10000、32bit画像の全画素に固定の32bitの値をAnd演算、Or演算、Xor演算するだけ。
環境
Win7 64bit VS2008
計測結果※clock()を使用
&= 69
|= 140
^= 68
せめて80〜100くらいに押さえたい。
0657デフォルトの名無しさん
2011/10/29(土) 17:13:22.26ビット演算自体は高速化できるかよくわからんけど
配列アクセスなどの部分で高速化可能かも。
現ソースどうなってる?
0658デフォルトの名無しさん
2011/10/29(土) 17:28:44.630659デフォルトの名無しさん
2011/10/29(土) 17:57:21.43こんな感じ。
const unsigned int flag;//引数。
int wh=Image.Width()*Image.Height();
unsigned int* ptr=Image.Buffer();
while(wh--){
*ptr&=flag;//ここを|=等に変える。
ptr++;
}
Imageは自作クラスでunsigned intのポインタを持っていてBuffer関数はそのポインタを返すだけの物です。
計測した三つの関数の違いはWhileループの中のコメントがある行だけなんだ。
0660デフォルトの名無しさん
2011/10/29(土) 18:08:12.52試してみたら変わったw
最初が遅いんだ。
キャッシュとかされてるのか?
0661デフォルトの名無しさん
2011/10/29(土) 18:18:57.910662デフォルトの名無しさん
2011/10/29(土) 19:12:05.38キャッシュって数Kバイトときいてたから10000×10000×4バイトもキャッシュするのかなとおもって。
0663デフォルトの名無しさん
2011/10/29(土) 20:33:50.61キャッシュラインサイズ分先読みする.
0664デフォルトの名無しさん
2011/10/30(日) 01:05:52.45ソレは微妙に違う。
0666デフォルトの名無しさん
2011/10/30(日) 11:52:26.60こんな単純なプログラムでもコンパイラの最適化よりアセンブラの方が速くなるのですか?
>>665
後学のためにも教えてもらえると助かります。
0667デフォルトの名無しさん
2011/10/30(日) 16:03:14.78最近の Intel のなら L3 が 8MB くらいあるんじゃないの。
それでも
> 10000×10000×4バイト
なら入らないけど。
もっと大きくして試してみたら。
0668デフォルトの名無しさん
2011/10/30(日) 16:19:06.02まあここでもいいけど
一部を読むだけで1line読み込むから、『微妙に違う』と書いてみただけ。
RMMAだと、
mov eax, [esi-16] // read cache lines
mov eax, [esi-32]
mov eax, [esi-48]
とか書いているね。
0670デフォルトの名無しさん
2012/05/16(水) 14:44:59.050671デフォルトの名無しさん
2012/05/16(水) 14:51:45.880672デフォルトの名無しさん
2012/05/16(水) 20:22:54.83http://pastebin.com/pkrh7E0L
x86だけど演算によって速度に差が出ている様子はないなあ
x64ならcompiler intrinsicsを使えばいいと思うけど
0673デフォルトの名無しさん
2012/05/16(水) 20:23:27.130674デフォルトの名無しさん
2012/05/17(木) 00:35:27.76OSのお陰で暴走しても大抵止められるしとにかく速い
ただ REALTIME_PRIORITY_CLASS には注意が必要だな
これが入っているとドライバにすら優先するのでこれで暴走すると事実上止められない→リセット
NORMAL_PRIORITY_CLASSにすると暴走は止められるが誤差が大きくなるので
確実に暴走しない事を確かめてから REALTIME_PRIORITY_CLASS にすると
正確な値が測定出来る
0675デフォルトの名無しさん
2012/05/17(木) 17:39:10.50> とにかく速い
これだろうか。
0676デフォルトの名無しさん
2012/05/17(木) 18:15:54.21いやそういう意味じゃない
>>672のSetPriorityClass()は一つ使い方を間違えると止まる物も止まらなくなってしまう
という話
しかし簡単に止まるようにすると測定誤差が大きくなるという諸刃の剣
0677デフォルトの名無しさん
2012/05/17(木) 18:28:34.940678デフォルトの名無しさん
2012/05/17(木) 18:30:15.50なんでそんなに突っかかってくんの
0679デフォルトの名無しさん
2012/05/17(木) 18:35:39.79ちなみにプロセス優先度はタスクマネージャからも変えられるから、使ってみるといいかもね
0680デフォルトの名無しさん
2012/05/17(木) 18:42:56.60悪い悪い
でもうっかりRealTimeProcessにして動かしちゃうと、タスクマネージャすら反応しなくなるよ
やってみればわかる
マウスも止まるし
0681デフォルトの名無しさん
2012/05/17(木) 18:54:58.19でも運用環境と似た状態で測定しないと気づかないことも多いと思うよ。
ある程度の指標にはなるだろうけど、その辺って難しいなぁといつも思う
0682デフォルトの名無しさん
2012/05/17(木) 18:56:47.45つーか、そんなに速さを追求したいならWindowsなんて使わなければいいのに。
0683デフォルトの名無しさん
2012/05/17(木) 18:57:26.420684デフォルトの名無しさん
2012/05/17(木) 19:57:53.31os内のプロセスの優先度と
cpuの特権レベルを一瞬混同したのは俺だけでいい
0685デフォルトの名無しさん
2012/05/17(木) 20:08:11.11演算の種類によって本当に差が出るのか調べてみたかったわけです
>>683
そんな事はない
このパフォーマンスカウンタは数年前から使っている
0686デフォルトの名無しさん
2012/05/21(月) 22:56:10.46>最初が遅いんだ。
ディスクキャッシュ関連かな
自分もプログラムの速度を検証するときは、最初は除外しているよ
0687,, ・´ ∀ `・ ,,)っ-○○○
2012/07/06(金) 08:20:34.070688デフォルトの名無しさん
2012/07/06(金) 10:10:40.82むしろコア一つを優先度無視するように設計するのも手だね
0689デフォルトの名無しさん
2012/07/27(金) 06:09:29.14http://toro.2ch.net/test/read.cgi/tech/1334374186/
0690デフォルトの名無しさん
2012/07/27(金) 06:56:42.90明らかにスルースキルの問題だ。
自分らのごみは自分らで始末しろ。
それにここに来たとして、
「インライン展開でコンパイル結果のコード量が減ることがあるよね」
「そうだね」
で終わり。
オーバーロードのあのケースに、ああいう難癖の付け方をするのが、無能か精神疾患だ。
例えば、
「ARM 向け gcc はベクトルレジスタにそこまでの最適化を施さないから、『俺は』演算子オーバーロードではなく3引数の関数で実装する」
ならいいんじゃないの。
演算子オーバーロードを使わない最適化の上での理由はいくつかあっても、あのスレの議論では全然出てきてない。
理解してない問題にかみつくから「彼」が調子に乗るのであって、まるでお前らの責任。
0691デフォルトの名無しさん
2012/07/27(金) 06:58:30.150692デフォルトの名無しさん
2012/07/27(金) 07:43:24.570693デフォルトの名無しさん
2012/09/13(木) 15:28:36.680694デフォルトの名無しさん
2012/09/25(火) 08:31:10.42最低と最高のパフォーマンスを除外して、残りの平均値を取らないの?
0695デフォルトの名無しさん
2012/09/28(金) 20:35:42.190696デフォルトの名無しさん
2012/10/03(水) 04:33:47.23異常値が両端の一件ずつまでで済むという保証はないのだから
平均値なんか使わずに中央値使え
0697デフォルトの名無しさん
2012/10/04(木) 17:27:00.24外れ値の存在を強調してもいかにも言いわけっぽいんだよ。
まじで困っている
0698デフォルトの名無しさん
2012/10/04(木) 17:38:25.69中央値・・パン食い競争
最頻値・・デカパン競争
0699デフォルトの名無しさん
2012/10/04(木) 20:28:39.40被害妄想だな
つべこべ言わず中央値使え
0700デフォルトの名無しさん
2012/10/08(月) 13:55:43.41時と場合によるわ。
0701デフォルトの名無しさん
2012/10/08(月) 14:29:42.77ベンチマーク測定で最大値なんてただのノイズ
そんなもの提示する必要あると言われる会社なら辞めてしまえ
0702デフォルトの名無しさん
2012/10/08(月) 14:39:16.47つ >時と場合によるわ。
0703デフォルトの名無しさん
2012/10/08(月) 16:34:08.78で、ベンチマークの場合は?
0704デフォルトの名無しさん
2012/10/08(月) 17:13:03.09その最大値も大事な情報だから提示する必要性ありなんて主張する奴がいたら
そいつをクビにするよう動くべきだし、それができないならそんな会社捨てろ。
0705デフォルトの名無しさん
2012/10/08(月) 17:15:07.05もう一つ足すなら平均値。
さらにもう一つ足すなら分散値。
さらにさらにもう一つ足すなら歪度。
0706デフォルトの名無しさん
2012/10/09(火) 02:01:02.44逆に最小値と最大値を異常値と見なさず提示する必要まで考慮している、つまり場合によっては報告する必要があるだろうと考えるほど最小値と最大値に価値があるものとする>>700みたいな奴もいる。
この両者の両極端は互いに意見が大きく食い違っているが、同じ穴の狢。
算術平均を使うべきではないところで無理矢理使おうとするからそんな発狂を引き起こす。
なぜ無理に算術平均を使いたがる?
0707デフォルトの名無しさん
2012/10/09(火) 02:21:49.76「中央値取ってきました!最大値?捨てましたよ?」
とか言ってきた馬鹿が居たら首切るよ
0708デフォルトの名無しさん
2012/10/09(火) 02:23:49.07お前はGC書いたことあるの?
最大停止時間を求めるのに実測の最大値を使うとか馬鹿じゃね?
0709デフォルトの名無しさん
2012/10/09(火) 02:24:44.290710デフォルトの名無しさん
2012/10/09(火) 02:28:42.13数学知らんアホだから意味分からんと中央値を妄信してるんだろうな
0711デフォルトの名無しさん
2012/10/09(火) 03:26:22.040712デフォルトの名無しさん
2012/10/09(火) 07:36:10.530713デフォルトの名無しさん
2012/10/09(火) 14:37:00.250714デフォルトの名無しさん
2012/10/09(火) 19:37:33.69平均値や中央値で分布がわかるわけないだろ。中学からやりなおせ。
0715デフォルトの名無しさん
2012/10/09(火) 20:00:34.89誰もそんなこと言ってないのでは?
0716デフォルトの名無しさん
2012/10/09(火) 20:02:02.950717デフォルトの名無しさん
2012/10/09(火) 20:03:44.92はあ?713を読めよ
0718デフォルトの名無しさん
2012/10/09(火) 20:29:11.38代表値と呼ばれるものは平均値、中央値、最頻値など。
この他に基本統計量として最大最小値、標準偏差、四分位、尖度歪度などがある。
しかし歪度まで見ても二山分布とかはわからないから、統計を始めたばかりの者は
まず分布を見ろと口うるさく言われたりする。
0719デフォルトの名無しさん
2012/10/09(火) 20:36:28.340720デフォルトの名無しさん
2012/10/09(火) 20:38:18.010721デフォルトの名無しさん
2012/10/09(火) 20:41:08.940722デフォルトの名無しさん
2012/10/09(火) 20:43:36.41代表値を無視して分布を見るのは不可能じゃないか?
グラフで表示したものを見るにしても、それは代表値の表現方法を変えてるだけで、そこで見えてるのも絵にされた代表値だろ?
0723デフォルトの名無しさん
2012/10/09(火) 20:46:35.68標本と代表値を混同してる?
0724デフォルトの名無しさん
2012/10/09(火) 21:13:13.09標本が100万件あった場合
標本をそのままプロットして100万件の点を描画するのではなく
代表値に変換してそれを折れ線グラフで描画するのが普通では?
0725デフォルトの名無しさん
2012/10/09(火) 21:15:12.54こういうグラフのことか?
こういうグラフならたしかに標本ではなくて代表値を使ってるな
0726デフォルトの名無しさん
2012/10/09(火) 21:19:33.26なんでそこで平均値使いたがるの?
上と下を破棄する考えがあるならその延長線上に中央値があると思うんだけど
0727デフォルトの名無しさん
2012/10/09(火) 21:24:24.85それは統計で言う「代表値」じゃないな。
0728デフォルトの名無しさん
2012/10/09(火) 21:59:39.50素朴な疑問なんだが…。
1秒/2秒/3秒/4秒/10秒の計測値があった場合に「中央値」って、3秒となるの?
0729デフォルトの名無しさん
2012/10/09(火) 22:24:29.71もちろんそうですよ。
明らかに 10 や 1 は異常値でしょう?
0730デフォルトの名無しさん
2012/10/09(火) 22:25:20.690731デフォルトの名無しさん
2012/10/09(火) 22:50:06.30何言ってんの。
四分位数や十分位数や百分位数など分位数はみんな統計上の代表値。
0732デフォルトの名無しさん
2012/10/09(火) 22:51:11.20普通、グラフで現すのは生の標本そのものじゃなくて集計したデータじゃない?
0733デフォルトの名無しさん
2012/10/09(火) 23:30:56.20集団の傾向を少数(普通は1つ)で代表する値だからこそ「代表値」というタームで
呼ばれているわけで。
百分位が代表値だなんて書いている本どこかにあるのか?
おまえさんの脳内定義じゃなくて。
0734デフォルトの名無しさん
2012/10/09(火) 23:39:39.94四分位や十分位は代表値として良く出てくるけど、
あれは代表値ではないと?
0735デフォルトの名無しさん
2012/10/09(火) 23:40:54.19どの本にも書いてます
0736デフォルトの名無しさん
2012/10/09(火) 23:42:37.080737デフォルトの名無しさん
2012/10/09(火) 23:47:32.350738デフォルトの名無しさん
2012/10/10(水) 00:01:12.74N個あれば、N分位数だ。
0739デフォルトの名無しさん
2012/10/10(水) 00:10:19.79>>735
四分位のようなよく使われる統計量を代表値の範疇に含める考え方は
あるかもしれんが、十分位や百分位まで代表値と呼んでいるのは見たこと
ないねぇ。
どの本でもというが、その本では要約統計量ならばすべて代表値としているのか?
0740デフォルトの名無しさん
2012/10/10(水) 00:11:28.79元データが { 1, 2, 5 } の3個の場合、
せめて
0.5 .. 1.5 : 1個
1.5 .. 2.5 : 1個
2.5 .. 3.5 : 0個
3.5 .. 4.5 : 0個
4.5 .. 5.5 : 1個
の5つに分けないと全体の形を正確に知れないのだから、
元が3個でも五分位は必要だ。
0741デフォルトの名無しさん
2012/10/10(水) 00:13:00.12N分位数のうち、四分位数は代表値になれて、十分位数は代表値になれないという意見なんですね。
Nがいくつ以下なら代表値になれるんですか?
そんな話はどこにも見たことがないので詳しく教えてください。
0742デフォルトの名無しさん
2012/10/10(水) 00:13:57.610743デフォルトの名無しさん
2012/10/10(水) 00:15:02.720744デフォルトの名無しさん
2012/10/10(水) 00:28:13.93それは分位数を誤解していると思う
0745デフォルトの名無しさん
2012/10/10(水) 00:30:53.410746デフォルトの名無しさん
2012/10/10(水) 00:33:55.760747デフォルトの名無しさん
2012/10/10(水) 01:03:15.510748デフォルトの名無しさん
2012/10/10(水) 01:11:10.44分布そのものを百分位で表すのはそんなにあるかな?
0749デフォルトの名無しさん
2012/10/10(水) 01:12:50.241 何かと平均値を使いたがる(極力中央値を使わない)
2 最小と最大の一件ずつを異常値として棄却したがる
3 平均値・最小値・最大値を重視
4 代表値を見ずにグラフを見て分布を把握したがる
5 代表値軽視・標本値重視(代表値を使わず標本値を使ってグラフを描こうとする)
6 分位数に馴染みがない
7 分位数は代表値にあらず説を主張する
0750デフォルトの名無しさん
2012/10/10(水) 01:15:29.40分布形状を人間を介さずコンピュータに判断させるときは百分位数が活躍
ネットゲーの負荷解析で何かの閾値を越えたら異常事態としてアラートを発生させるシステムで重要
0751デフォルトの名無しさん
2012/10/10(水) 07:11:25.57> 4 代表値を見ずにグラフを見て分布を把握したがる
これは無いわー。
アホの中央値信者くんだけじゃね?こんなこと言ってんの。
まあ馬鹿だから中央値しか知らんのだろうけど。
ていうか、平均値とりたがるアホも大概だけど、
アホのお前は平均値が意味をなさない条件すら知らなそう。
0752デフォルトの名無しさん
2012/10/10(水) 07:33:42.47たった5個のサンプルで「明らかに異常値」ですかwwwwww
アホはすごいなー
0753デフォルトの名無しさん
2012/10/10(水) 07:43:36.05これ何が悪いのか意味わからんわ。
0754デフォルトの名無しさん
2012/10/10(水) 14:00:09.02分布のグラフは、分位数という代表値をグラフ化したものじゃね?
0755デフォルトの名無しさん
2012/10/10(水) 23:30:30.31分位数の区別が付かないアホが居る事に
驚きを禁じ得ない
0756デフォルトの名無しさん
2012/10/10(水) 23:52:07.50正規性検定が受かってもqqプロットは載せるべきとされてる。
人間の直観はやっぱすごい
0757デフォルトの名無しさん
2012/10/11(木) 00:33:03.57結局は人間の目視を必要とするという考えで作られたシステムとは
例:
全国に大量に配置された地震計のデータを集計し、統計的な処理をした挙げ句、プロットされた絵を担当者が見て「これは地震が発生したな。規模はおそらくマグニチュード△だろう」と判断して、緊急地震速報を発信する
0758デフォルトの名無しさん
2012/10/11(木) 00:34:00.28人間の直観?
人間の直感?
0759デフォルトの名無しさん
2012/10/11(木) 00:38:37.89必要と言うか確認。
逆に、どんな検定でも駄目だったが
ヒストグラムやqqプロットでそれっぽいのでオケとはならない。
0760デフォルトの名無しさん
2012/10/11(木) 01:32:50.99プログラマっぽいくない考えのような
0761デフォルトの名無しさん
2012/10/11(木) 07:18:05.67今は、辞書的に「直感」と「直観」が同じ意味らしいな。
昔は使い分けろと注意されたものだが。
0762デフォルトの名無しさん
2012/11/15(木) 09:22:46.30double sum=0;
for (int i=0;i<N;i++)sum+=a[i];
はNが非常に大きい時、最後の方で大きな数+小さな数となり、
計算精度が落ちてしまうと思うのですが、これを回避するアルゴリズムを教えてください。
0764デフォルトの名無しさん
2012/11/15(木) 10:46:44.57d=0;
t=0;
for (int i=0;i<N;i++){
t=(a[i]+d)+sum;
d=(a[i]+d)-(t-sum);
sum=t;
for (i = 0; i < N; i++) {
t = s + (f[i] + r);
r = (f[i] + r) - (t - s);
s = t;
}
0766デフォルトの名無しさん
2012/11/15(木) 12:51:00.40そんな概念ある言語なんて終わってる
終わりすぎてるってことにいい加減気づけよ
極左かお前らwwwwwwwwwwwwww
0767デフォルトの名無しさん
2012/11/15(木) 13:26:02.38そこまで分かってるんなら、配列分割して、それぞれの合計を足し合わせれば良いじゃない
0768デフォルトの名無しさん
2012/11/15(木) 17:47:34.930769デフォルトの名無しさん
2012/11/15(木) 20:48:17.46a[]をソートして小さい方から足せば桁落ちは最小限に出来る
0770デフォルトの名無しさん
2012/11/16(金) 06:11:59.14精度は落ちるが高速だぜw
つーか、単に「ソートして小さい方から」だと拙い。
0771デフォルトの名無しさん
2012/11/16(金) 14:21:28.89お前は科学技術計算プログラムは作れないな
0772デフォルトの名無しさん
2012/11/16(金) 15:36:21.73doubleの精度で問題になるほどNが大きかったら全部足すのは
無駄だとは思うがw
0773デフォルトの名無しさん
2012/11/16(金) 20:08:56.95絶対値の大きな負数のことを考慮していないって言いたいんだと思う。
精度は落ちるが高速って書いてるからちゃんと分かってる人なんじゃないかな。
引き換え、Nが大きすぎると小さいほうから足すだけじゃだめだという意見はよくわからない。
0774デフォルトの名無しさん
2012/11/17(土) 10:48:08.79この配列のどの位置に該当するかを求める処理があります(std::lower_bound()のような)。
これまではバイナリサーチをしていたのですが、SSEを使って高速化できないかと考えています。
SIMDに適したサーチアルゴリズムなどはないでしょうか?
なお、テーブルは変化しませんので構造を変えてもかまいませんが、入力の方は事前に
ソートなどを行うことは難しいです。
0775デフォルトの名無しさん
2012/11/17(土) 11:02:24.32100件ぐらいしか無いんだから確実で簡単なハッシュ関数作るとかは?
「数値」たって範囲も何も分からんが、バイナリサーチで困るほどなのか……
0776デフォルトの名無しさん
2012/11/17(土) 11:39:33.59どうしても大小比較する必要があります。
バイナリサーチよりさらに高速化したいというのは、単に入力が多いためです。
0777デフォルトの名無しさん
2012/11/17(土) 13:02:21.35入力のサイズとか型とか(整数か実数か、とか)範囲とか
ビット演算とかバケットソートとか、どんな手段が使えそうか分からないとヒント出しようがない
0778デフォルトの名無しさん
2012/11/17(土) 13:43:16.400779デフォルトの名無しさん
2012/11/17(土) 14:48:55.88扱う数値はshortあるいはfloatで、入力は数百万件あります。
スレッドを分割したりしてはいますが、どうしても1秒を超えるくらいの時間が
かかってしまうので、SSEを使ってあと4倍かせめて2倍くらい速くできないかと
考えています。
質問したかったのは、SIMDに適したサーチアルゴリズムがないかということです。
0780デフォルトの名無しさん
2012/11/17(土) 17:39:40.54その過程で分かったことを以下にまとめます。
間違っていないでしょうか?
■WindowsAPIやDirectXなどのAPIは、カーネルモードへの遷移が必要なため、
大きなオーバーヘッド(数千クロックオーダー)が生じる。
DirectXではドライバへのコマンドをある程度キューに蓄積しておき、
まとめて送ることでオーバーヘッドを低減している
■マルチタスクOSでは、単一のプロセッサでプロセスを切り替えて実行
(コンテキストスイッチング)させている。
これはマルチスレッドプログラムにおけるスレッドの切り替えでも発生する。
現代x86CPUはハードウェアによるコンテキストスイッチングを搭載しているにもかかわらず、
Windowsでは技術的な事情からソフトウェアによるコンテキストスイッチングを行っているため、
オーバーヘッドが大きい。
CPUに搭載されている物理コア数に応じたスレッド数を立ち上げて処理させる場合、
コンテキストスイッチングは(他プロセス(ここでは相対的に低負荷とする)との切り替えを除いて)
必要ないはずであるが、実際はコア数に比例したパフォーマンス向上が見られないことから、
なぜか不要なコンテキストスイッチングが働いている。
ちなみに、何千、何万というスレッドを扱うGPUではハードウェアによる1クロック切り替えを行っているので
オーバーヘッドはない。
■SIMD演算もマルチスレッドと同様に(粒度は異なるものの)並列演算手法の一つであるが、
コンテキストスイッチングが発生しないため、並列化数に比例した(場合によってはそれ以上)の
パフォーマンス向上が得られるため効率が良い。
0781デフォルトの名無しさん
2012/11/17(土) 18:33:19.25色々微妙。一番の問題点だけ指摘。
不要なコンテキストスイッチングが発生していないとしても、
コア数に比例したパフォーマンス向上が得られると期待できるケースは稀。
0782780
2012/11/17(土) 18:38:22.67ループ間でのリソース競合がない完全に独立した並列処理(例えば配列要素同士の演算)でもでしょうか?
そのような処理を試しても、並列数(物理コア数)に比例した性能は得られませんでした。
>数百us単位のスループットが要求される処理のソフト化を試みています。
どう見ても主目的は別。
うせろ。
0784デフォルトの名無しさん
2012/11/17(土) 20:34:42.58Windows7(64bit)だとcore数に対してほぼリニアに性能が出た。10%くらい誤差は
あるだろうけど。
逆にSIMDはコンテキストスイッチのオーバーヘッドがないと言っても、処理内容に
よってはそれ以上にプログラミング上のオーバーヘッドが大きかったりして、
演算器の並列数だけきっちり性能が出せる条件は限られる。
0785780
2012/11/17(土) 21:00:39.58自分が試した環境はWindowsXPでした。
Windows7では改善されているんですね。
SIMD化に関するご意見は承知です。
SIMD演算に持っていくためのデータ構造の変換等が避けられないケースがありますし。
ハイパフォーマンスなプログラムを目指す上で、
本質とは関係ない処理をいかに避けるかが課題となるので、
プロファイラを導入するなどして問題個所を潰していきたいと思っています。
0786デフォルトの名無しさん
2012/11/17(土) 21:22:00.02ソートされてて数百万件あったらバイナリサーチが速いに決まってる。
ただ、事前に(例えば)千件ごとに抽出したテーブルを作っておいて、そこから探すというなら、SIMD最適化の余地もあるかもしれない。
最適化であって、サーチアルゴリズムと言うわけじゃないけど。
そしてそれでも、キャッシュメモリの効率を考えると、バイナリサーチより速くなるかは疑問だ。
最適化ってのは例えば 32 回とかのループアンロールして、それを SIMD 並列化ね。
あとは、最近検索された結果を覚えておいて、それをソートしておいて、バイナリサーチすることで、事前に範囲を絞り込める。
検索される値に偏りがあるなら平均時間が改善されるだろう。
最後に、データベースがメインメモリになければ SIMD で最適化する余地はほとんどない。
そして本当にメインメモリにあってバイナリサーチしてるのに1秒もかかるなら検索の問題じゃない。プロファイラなどを試すべきだ。
試しに 1GB の float 配列を全探索するとウチの PC で0.5秒位。バイナリサーチなら数マイクロ秒。
0787774
2012/11/17(土) 21:46:45.55いえ、そうではなくて、100件ほどの配列のサーチを数百万回行うということです。
最初はバイナリサーチをそのまま並列化しようとも考えましたが、配列を参照する
部分が並列化できないので他に良いアルゴリズムがないか探しているところです。
見つからないようであれば、最初の考え通り比較のみの並列化でやろうと思いますが。
0788デフォルトの名無しさん
2012/11/17(土) 21:54:09.570789デフォルトの名無しさん
2012/11/18(日) 16:55:08.89if ( x < 100 ) {
if ( x < 50 )
   ...
else {
   ...
というように全部展開してコンパイルしたら多分速くなるし、並列化の効率も上がるだろう。
short なら結構期待できるし、float でも正の数しかないなら浮動小数点数表現を int で比較できて結構いけるかも。
SIMD 最適化は、SSE だとレジスタ少な過ぎて速くならないのではなかろうか。
GPGPU は案外いけるかも?
いろんなアイデアがあるが、他のことが分からんと、これ以上はなんとも。
0790デフォルトの名無しさん
2012/11/18(日) 18:16:19.250791デフォルトの名無しさん
2012/11/20(火) 14:51:20.280792デフォルトの名無しさん
2012/11/21(水) 02:51:13.42一回の計算あたりのクロック数は減らせても
アルゴリズムの計算量(オーダー)自体を少なくするわけではないから向かないよ
SIMD以外なら
・入力に偏りがあればバイナリサーチの分割点を調整することで速くなりそう
・値範囲がそれほど大きくないなら全範囲を展開したランクテーブルを表引き
例えば0-7の値範囲に対し[0,3,5,6]というランクテーブルを[0,0,0,1,1,2,3,3]と展開
・ >>786 が言うようにループアンロール
・バイナリサーチの範囲をMSB等で最初に絞る方法
例えばMSB4bitに対する上下範囲を16通り作っておいて、バイナリサーチの初期値にする。
0793デフォルトの名無しさん
2012/11/21(水) 08:06:28.610794デフォルトの名無しさん
2012/11/21(水) 08:28:36.54ソートされた木なら比較結果をhaddでまとめて子世代のインデックスを計算すればいいと思うよ。
末端の無効な要素は最大値でも入れときゃなんとかなりそかな。
>>792
昔マンデルブロ集合計算するプログラムで、計算の終わった要素だけ順次差し替えてく方式を試したことがあるよ。
入れ替え処理は重いけど、普通SIMD化する場合は全要素の計算が終わるまでループするからトータルでは速くなった。
単純な処理でなくてもコストに見合う効果が得られる可能性があるから考える価値はあるよ。
実際は難しいケースが多いだろうけど。
0795デフォルトの名無しさん
2012/11/21(水) 19:21:28.04その分割されたレコードがある範囲について数千件程度たまるたびに、その範囲内での正確な位置を検索するスレッドに投げる。
まあ、単に今のをスレッド分割するのに比べて、労力に見合うほどの効果があるかは疑問だけど。
0796デフォルトの名無しさん
2012/11/21(水) 20:00:57.67今時のマルチコアCPUで数百万件の処理に1秒かかるのかなぁ。
4GHz1コアで4百万件のデータでも1処理あたり4.0e9/4.0e6/7=140クロックも必要ないと思うんだよね。
ひょっとしたら再帰使ってたりだとか、分割するところでcmovみたいな計算型の命令使わずにブランチ使うコード吐いてて
大量の予測ミスが発生してたりとか・・
0797デフォルトの名無しさん
2012/11/22(木) 17:19:19.03VC++2008 /O2。最適化なしだと 0.7 秒程度。
ちなみに単純に8000ループごとにスレッド分割するだけで倍速以上になった。
0798デフォルトの名無しさん
2012/11/22(木) 20:21:42.170799デフォルトの名無しさん
2012/11/22(木) 21:21:24.05てのが元の質問だろ。
俺もわからんが。
0800,, ・´ ∀ `・ ,,)っ-○○○
2012/11/22(木) 21:30:38.53何番目の要素がヒットしたかは、pmovmskbで汎用レジスタに転送してbitscanすればわかる
0801デフォルトの名無しさん
2012/11/22(木) 21:39:44.250802デフォルトの名無しさん
2012/11/22(木) 22:17:54.16それって比較だけだよな。
次のインデックスを計算して比較対象をセットする部分はシリアルにやらざるを
得ないんじゃないの?
0803デフォルトの名無しさん
2012/11/22(木) 22:35:07.400804デフォルトの名無しさん
2012/11/22(木) 23:18:40.250806,, ・´ ∀ `・ ,,)っ-○○○
2012/11/23(金) 04:26:03.38ソートって本当に必要?
合計値の誤差を減らしたいだけのためにソートなんて必要無いぞ。
単精度なら倍精度、倍精度なら多倍精度に変換してから加算すればいいだけだろ?
ああもちろんソフトウェア多倍精度は遅いかもしれないが、たいがいDRAM帯域のほうがネックになるからw
0807,, ・´ ∀ `・ ,,)っ-○○○
2012/11/23(金) 04:59:40.87もちろんこれもSSE*がつかえる。
値をブロードキャストしてcmpXXps/pdでビットマスクして論理和とってから加算すればいい。
0808デフォルトの名無しさん
2012/11/23(金) 05:59:38.95数百万個の値を、100程度の区間に分類したいんだと。
分類してどうしたいのかは知らん。
数百万個のレコードを個別に何かするのかもしれないし、個数が必要なだけかもしれない。
0809,, ・´ ∀ `・ ,,)っ-○○○
2012/11/23(金) 06:20:34.09とりあえずいまどきのマシンはSIMD化よりもまず先にメモリ読み書きを最小限にしたほうが性能出ると思う。
0810デフォルトの名無しさん
2012/11/23(金) 09:28:02.90それ前の合計を求める話を混同してるんだな。
0811デフォルトの名無しさん
2012/11/23(金) 09:55:09.640812デフォルトの名無しさん
2012/11/23(金) 16:25:50.38質問者は>>774,776,779,787かな。
0813デフォルトの名無しさん
2012/11/23(金) 16:41:36.63>>797の人のstd::lower_bound()より約6倍高速。
ただし、データ数が2のべき乗の制限があるから余ったところはFLT_MAXでも詰めとく必要があるのと、
VC++2008や2010のfloatでは分岐のあるコードになって半分の速度になって、
逆に整数だと2008や2010の方がこれより5倍近く速くかった。
2012はflotat・intどちらもcmov使ってるけど、最近のCPUはcmov遅いからその影響みたい。
float *top = array;
float key, cmp;
int nelm = 128;
int half;
half = nelm >> 1;
/* ここからコピペで7個ならべる */
cmp = *(top + half);
top += (cmp <= key) ? half : 0;
half >>= 1;
/* ここまで */
0814デフォルトの名無しさん
2012/11/23(金) 16:43:56.27float *top = array;
float key, cmp;
int nelm = 128;
int half;
half = nelm >> 1;
/* ここからコピペで7個ならべる */
cmp = *(top + half);
top += (cmp <= key) ? half : 0;
half >>= 1;
/* ここまで */
0815,, ・´ ∀ `・ ,,)っ-○○○
2012/11/23(金) 19:18:14.69それ毎回ランダムな値で検索してる?
float配列の値に対して比較値の分布は均等になってる?
もし偏りがある状態で反復してみて分岐したほうが速いといってるのなら計測方法見直す必要がある。
ところでcomiss + jcc ってMacro OPs fusion対応してたっけ?
0816デフォルトの名無しさん
2012/11/23(金) 21:19:23.942010の整数はsetとdec使うのに対して2012はcmovなので遅いということで
float・intとも分岐の方が遅くなってます。
>>799,802
SIMD化するとしたら木を浅くするのが効果的だから、_mm_sad_epi8(comp_result, zero)とかが使えるだろう。
0817,, ・´ ∀ `・ ,,)っ-○○○
2012/11/23(金) 22:50:33.17cmovを使わない方法があるとすれば、cmpssでall 1 or 0のビットマスク作って
汎用レジスタに転送(extractps or movd)してandとって加算かな。
何となく遅そうだ。
0818デフォルトの名無しさん
2012/11/24(土) 14:29:08.962012はその組み合わせになってた。
普段のマシンはcore 2だからデコーダの制限でcmovが遅くなってるのかも。
昔は1クロックで実行できてたんだよね。
2012でcmov使うようになったのは/arch:SSE2が標準になったのとネハ以降が主流になったからかもね。
0819デフォルトの名無しさん
2012/11/25(日) 13:29:02.570820片山博文MZボット ◆0lBZNi.Q7evd
2012/12/01(土) 15:07:18.40http://katahiromz.web.fc2.com/sudoku/
これを高速化する方法を教えて下さい。お願いします。
0821,, ・´ ∀ `・ ,,)っ-○○○
2012/12/01(土) 19:13:40.5481ビット×9でボードを用意して、それぞれのマスの1〜9の可能性をビットで表現する。
これならビット演算だけで可能性をマスクする事ができる。
0822デフォルトの名無しさん
2012/12/01(土) 20:00:46.74AI関連のページがやたらと引っかかっていた古き良きSSE2時代
0823デフォルトの名無しさん
2012/12/01(土) 22:17:30.24コードの質問に関係する部分は
unsigned __int64 point;
unsigned __int32 bit;
〜中略〜
//point = 1ull << bit;
point = 0;
_bittestandset64(&point,bit);
でこれをコンパイルして
xor ecx, ecx
bts rcx, rax
の様になるようにはどうすればいい。
当然bitは0〜63の範囲内に入ってます。
__assumeは既に試してみてます。
コンパイラはVS2010、2012で試してみました。
iccなら最適化うまくいくのかな?
0824デフォルトの名無しさん
2012/12/04(火) 03:01:40.530826デフォルトの名無しさん
2012/12/04(火) 20:06:04.650827デフォルトの名無しさん
2012/12/04(火) 22:45:18.64unsigned __int32 bit;
〜中略〜
point = 1ull << bit;
if (!(amp & point))
point = 0;
0828823
2012/12/05(水) 18:30:22.79正しくは
unsigned __int64 point;
unsigned __int32 bit;
〜中略〜
//point = 1ull << bit;
point = 0;
_bittestandset64(&point,bit);
やりたいことはもともとあった
unsigned __int64 point;
unsigned __int32 bit;
〜中略〜
point = 1ull << bit;
を高速化したい。
ターゲットCPUはSandy Bridge以降。
お願いします。
0829823
2012/12/05(水) 18:33:13.010830デフォルトの名無しさん
2012/12/05(水) 20:51:13.55ttp://anago.2ch.net/test/read.cgi/software/1350168418/64
64 名前:名無しさん@お腹いっぱい。 [sage]: 2012/11/08(木) 18:52:58.35 ID:fox14i8S0 (3)
>>63
レスエディタのメニューから特殊文字変換の下の「Space/Tab→&nbsp;」のチェックを外してください
0831デフォルトの名無しさん
2012/12/05(水) 21:59:48.05iint64_t
hoge(int bit)
{
static unsigned int64_t _hage[64]=
{
1,2,4,8,16,32,64,128,以下略
};
return _hage[bit];
}
0832823
2012/12/17(月) 01:21:53.89ありがとうございます。
試してみたところ状況によって速くなったり遅くなったりでした。
他の箇所の最適化をしてみてからまた試してみたいと思います
0833片山博文MZパンク ◆0lBZNi.Q7evd
2013/01/16(水) 23:31:45.440834デフォルトの名無しさん
2013/01/17(木) 00:38:20.090835,, ・´ ∀ `・ ,,)っ-○○○
2013/01/17(木) 01:03:46.59スコープは閉じててもポインタかなんかでアクセスしようがあるから勝手に定数化できない。
constをつければ定数領域からアクセスするだけのコードになる。
x64のバヤイこれだけですむ。_hageはRIP相対の32ビット値。
hoge:
mov rax, [_hage + rcx*8]
ret
んでもってconstになってないと、C/C++ランタイムのスタートアップルーチン(main関数より前の)で
_hageの値を定数領域からwritableな領域にコピーやったりするかもしれない。
これが無駄。
もし逆アセンブルやる機会があったら調べてみて。
ワンチップマイコンだと高速化のためにテーブルを多用するケースがあるんだけど
constならROM化できるというメリットがあるんだわ。
ROMはある程度余裕あるけどRAMリソースは限られてるから書き換える必要のない値は
なるべく固定にしてしまったほうがいい。
0836デフォルトの名無しさん
2013/01/17(木) 01:11:28.510837デフォルトの名無しさん
2013/01/17(木) 13:22:20.63読むだけだから速いってのは…
0838,, ・´ ∀ `・ ,,)っ-○○○
2013/01/17(木) 18:58:16.82CUDAでも定数メモリ(デバイス側から見れば一種のROM)はシェアードメモリ(RAM)より高速で
容量も大きいからパラメータは極力定数化したほうがいい。
しかしstaticでメモリを確保すると、プログラムが動いている間ずっとwritable領域に全てのデータを
配置しておかないといけない。
ランダムテーブル参照に使う配列はともかく、x86は単一の64ビット固定値程度なら
イミディエイト値として命令ストリームに埋め込むことができる。
0839デフォルトの名無しさん
2013/01/17(木) 20:25:30.470840,, ・´ ∀ `・ ,,)っ-○○○
2013/01/17(木) 22:23:12.16どっちかというと速度云々よりRAMの容量の制約という観点で考えて欲しい。
const修飾がついていようがいまいが、どのみち配列はメモリに展開するかもしれない。
別にRAMのほうが速いならそれでもいいんだけど、必要なときに読み出せばいいでしょ
ただのstatic修飾だとプロセスが動いている間【常に】メモリに配置されてるということが無駄なわけよ。
SRAMでも書き換える必要ないものならCPUコア側からみてRead Onlyで使われる。
(CUDAの定数メモリがそうだしL1Iキャッシュもそう)
0841デフォルトの名無しさん
2013/01/17(木) 22:51:50.470842デフォルトの名無しさん
2013/01/17(木) 23:21:12.15組み込みのRAMってどのくらいのサイズなの?
SoCで512バイトって聞いたことあるけど…。
Cでいうローカル変数なんか注意しないといけないし、
関数コールのネストも計算しないとならないですね。
メモリはローカル変数無しのグローバル変数のワークエリア
使いまわしかな。
動きはROMのテーブルか処理(コード)で実装しなければならなさそう。
ああ、512バイトとか、ここまで来たらスレ違いかな。
mallocなんかとても使えなさそう。。
0843デフォルトの名無しさん
2013/01/17(木) 23:42:55.18Cコンパイラの対象外だったけどな、128バイトのモデルからは使える
0844842
2013/01/17(木) 23:51:29.89main以外★mallocの後にfree不要と言うバカいるの?
http://toro.2ch.net/test/read.cgi/tech/1352812333/
と勘違いしてた。。(恥ずかしい)
>>843
レジスタ32個ですか。
8ビットだとすると32バイトのRAMと考えられなくも
ないですが…、すごい世界ですね。
ありがとう
0845デフォルトの名無しさん
2013/01/18(金) 02:40:26.600846デフォルトの名無しさん
2013/01/18(金) 05:54:52.9990年台のパソコンはBIOSのROMをメインRAMにコピーして、アクセススピード稼いでたの知らんのけ?
0847デフォルトの名無しさん
2013/01/18(金) 07:34:09.45VMSは癖があるなぁ
0848デフォルトの名無しさん
2013/01/18(金) 15:02:20.09専用のキャッシュを持った定数メモリを持ち出して速いとか…
しかも速度の話からRAMの容量の話にすり替えちゃってるし…
0849,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 15:38:26.39> CUDAの定数メモリを持ち出してるくせにマスクROMのつもりとか…
CUDAの定数メモリの実体はSRAMだが、CUDAコア側からの書き戻しがされないことが
保障されているから速い。
Writeに割かない分Readに帯域を割いているからね。
コア側からは読み出さないことで一種のROMとして使ってる。
EEPROMだって書き換えを頻繁にやらないからROMだと言ってるだけで実際は不揮発性のRAMだろ?w
普通のPCのアプリの話をするなら、いったんRAM上に展開されて実行される。
でも全部がアプリケーション側で書き換えできるわけではない。
.rodataや.textは読み出し専用のセクションだ。
> しかも速度の話からRAMの容量の話にすり替えちゃってるし…
容量については最初の最初っから言及してましたが?↓
> ワンチップマイコンだと高速化のためにテーブルを多用するケースがあるんだけど
> constならROM化できるというメリットがあるんだわ。
> ROMはある程度余裕あるけどRAMリソースは限られてるから書き換える必要のない値は
> なるべく固定にしてしまったほうがいい。
別に組み込みに限らずconst指定をサボるのは良くないよ。
定数が重複する場合、コードサイズの最適化で1箇所にまとめてしまうようリンカに指示することができるが、
書き換え可能な静的データとして配置されている場合、いくらデータが重複していても纏めることができない。
プログラムサイズが肥大化することになり、結果的にキャッシュのヒット率など速度面にも悪影響を
及ぼす可能性がある。
とはいってもx86の場合は定数データが重複していてもコードのディスプレースメントフィールドが
8ビットに収まるなら結果コードがコンパクトというケースもあるので一概に重複を排除しろとも言えないが
0850デフォルトの名無しさん
2013/01/18(金) 16:04:58.78無能自慢してるのがまだわかってないの?
0851デフォルトの名無しさん
2013/01/18(金) 16:27:19.270852デフォルトの名無しさん
2013/01/18(金) 16:32:17.490853デフォルトの名無しさん
2013/01/18(金) 16:42:31.730854,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 16:43:21.29別にそれが全てではないのも事実ですな
ROMよりRAMのほうが速い環境があるからといってconst指定が不利になる理由はないはずですが
(というかRAMにプログラムを読み出してくるのはどのみちROMなりストレージなんですけどね)
つまらない揚げ足とりに終始して自分のミスを誤魔化そうとするのはみっともないです。
逆に、ROMよりRAMのほうが速いと、定数配列をstatic constではなくmutableなstatic変数として
用いたほうが有利なんですか?
0855デフォルトの名無しさん
2013/01/18(金) 17:16:32.93constあるなしで実行コードの最適化した汗比較してみたけど、変わらんかった、gccは
パソコンなら変数は実行前に配置されてるでしょ
関数内で宣言してるから、外から書き換えられることはない
タンゴはグローバル変数が好きなの?
0856デフォルトの名無しさん
2013/01/18(金) 17:38:45.84const 付けた方が速いから付けろって言ってるから突っ込んだだけ
const 付けた方が速くなる環境もあるかもしれないが、それが const を
付ける本来の理由か?
const 付けたら絶対速くなるのか?
0857,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 17:40:26.61とはいってもポインタでアドレス取ってくればアクセス可能なので、constにする以外で
外部から書き換えできないことが言語仕様上保障できないのがC/C++の制約ですよ。
ある程度共通で使ってる定数配列なら必要に応じてグローバル化するけどね。
たとえば別の関数で全く同じ定数テーブルを使ってる場合はテーブルを共通化したほうが
キャッシュの効率が上がるはずだ。
0858,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 17:42:42.69constにしない理由はないし、しないことで不利なケースのほうが多いだけで。
0859デフォルトの名無しさん
2013/01/18(金) 17:44:13.440860デフォルトの名無しさん
2013/01/18(金) 17:53:19.96同じプログラム内の別の場所に同じようなデータがあっても
書き換えによって別々の値を持つ可能性があるということ。
初期値が同じだからといってテーブルを1つに纏めるような最適化を
コンパイラ・リンカ側でやってくれない。
LUTを使った最適化でのパフォーマンス低下の最大の原因はキャッシュミスだ
十分なプロファイリングをしたうえで本当に全体性能に影響があるかどうかを検討したうえで使う
1割未満の使用率の関数で安易にLUTを使うのは感心しない。
0861デフォルトの名無しさん
2013/01/18(金) 17:54:38.950862デフォルトの名無しさん
2013/01/18(金) 18:12:10.49>>834 に対して >>835 は何?
速度に対する話でしょ
お前の言ってることは
const にすれば ROM化出来る
ROMの方がRAMより速い(アクセスするコードの話も含めて)
だから const 付けろ
これをグダグダ言ってるだけじゃん
速度の話じゃないとしたら
>>838 の「内蔵ROMよりRAMのほうが速い実装なんてあるの?」は
どこから出てきたの?
>>854 の 「つまらない揚げ足とりに終始して自分のミスを誤魔化そうとするのはみっともないです。 」を
そっくりそのまま返してやるよ
0863デフォルトの名無しさん
2013/01/18(金) 18:15:07.44「早くなるのけ?」(速くではなくて?)の回答は環境に依存するが、
少なくともconstを付けたら遅くなるハードウェアなんてものは知らない。
0864デフォルトの名無しさん
2013/01/18(金) 18:33:46.29> _hageの値を定数領域からwritableな領域にコピーやったりするかもしれない。
> これが無駄。
> もし逆アセンブルやる機会があったら調べてみて。
>
> ワンチップマイコンだと高速化のためにテーブルを多用するケースがあるんだけど
> constならROM化できるというメリットがあるんだわ。
これが速度の話じゃ無いとは思わなかったわ
0865,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 18:36:00.790866デフォルトの名無しさん
2013/01/18(金) 18:36:02.660867デフォルトの名無しさん
2013/01/18(金) 18:40:58.81?
0868,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 19:01:45.830869デフォルトの名無しさん
2013/01/18(金) 19:03:57.150870,, ・´ ∀ `・ ,,)っ-○○○
2013/01/18(金) 19:08:35.370871デフォルトの名無しさん
2013/01/18(金) 19:17:30.02link時の配置が通常の初期化付き変数と違う場所になる
関数内でstatic宣言した変数を書き換えられる腕をお持ちの方には参りました。
0872デフォルトの名無しさん
2013/01/18(金) 19:43:26.92int * func()
{
static int static_var;
printf("%d\n", static_var);
return & static_var;
}
`
int * tmp = func();
* tmp = 1;
0873デフォルトの名無しさん
2013/01/18(金) 20:00:15.850874デフォルトの名無しさん
2013/01/18(金) 20:45:44.05お前のせいで台無しだ
0875,, ・´ ∀ `・ ,,)っ-○○○
2013/01/19(土) 01:55:13.69> link時の配置が通常の初期化付き変数と違う場所になる
とは限らないが、.dataと.rodataで配置を分けるから結果的にそうなることが多いかもな
よーするに理屈を全然理解してないのね
>>872みたいに関数内で定義したstatic変数を外部から書き換えできるような関数なんていくらでも作れるし
実際にあるんだよね(C文字列を返せみたいなのは特に多い)
外部参照を意図したものかそうでないかをコードの流れを読んでコンパイラが判断するのは難しい。
>>873
そういう関数と>>831の関数でのstatic変数の使われ方の意味を処理系が容易に判断してくれるとでも?
というか俺的には>>831の一番の突っ込みどころは、CPU組み込みのビットシフト命令は0-63以外の値が
与えられても通常安全だが、そのテーブル参照に置き換えるとページ違反になるかもしれないことね。
俺なら最初に bit &= 0x3f; とでもやっておくわ。
あと容量の問題についてもう少し言及しておくと、inline関数は通常ヘッダに書くものだが
そのヘッダをincludeしたソースごとに_hage[64]の実体が定義されることになるかもしれない。
これが大きな配列だと結構問題になる。
で、肝心のが速いかどうかについてもう少し。
命令のレイテンシを考えればshl rax, clよりmov rax, [mem]が速いわけがないんだが
Sandy Bridge以降ではロードユニット2本あるからシフト(ユニット1本)よりスループットが
稼げるケースも存在しなくはない。
その辺の理屈まで説明できないと片手落ちだわね。
0876デフォルトの名無しさん
2013/01/19(土) 02:03:15.160877823
2013/01/19(土) 14:47:47.17一目見てルックアップテーブルと認識したから
テストしたコードではconst付きで試しています。
ちなみに前提条件としてbitは0〜63に限定してるので
(デバッグビルドではそれ以外の値が来た時点でassertしてる)
テーブル参照でも問題ありません。
0878,, ・´ ∀ `・ ,,)っ-○○○
2013/01/19(土) 17:26:07.87VCの組み込み関数って値を2個以上返す命令は一方の値をポインタで受け取るようにはなってるけど
最適化でレジスタ渡しになるのでストア命令が生成されることはないと把握してる。
オプションは /Ogty になってる?
IACAとかでプロファイルとってみて、btsを発行してるポートがボトルネックになってて
Loadユニットに空きがあるようなら部分的にテーブル参照に置き換えてみるのもいいと思う
→えいちてぃーてぃーぴー://software.intel.com/en-us/articles/intel-architecture-code-analyzer
0879823
2013/01/19(土) 22:06:05.32オプションは /O2を指定してるから問題ないと考えてる。
msdnによると等価オプションに/Og,/Ot,/Oyが含まれてるし……
bittest系の命令はsrcに64以上の値が来た場合、
destで指定されたアドレスからsrcビット目のデータを見るから
うまくコンパイラにsrcが0〜63であることを伝えないと
レジスタ渡しになってくれないみたい。
0880デフォルトの名無しさん
2013/01/19(土) 23:20:56.46基本的にはconst付けたほうが速かった。
割と分かりやすいレベルで変わったな。
__m128に付けたら遅くなったりした。
0881デフォルトの名無しさん
2013/01/20(日) 13:09:43.88>destで指定されたアドレスからsrcビット目のデータを見るから
>うまくコンパイラにsrcが0〜63であることを伝えないと
メモリオペランドでもオペランドのサイズ自体は変わらないから関係ないでしょ。
__assume(bit >= 0 && bit <= 63);とか入れてみても影響ないね。
レジスタだと不都合があるとも思えんし……
コード生成のバグ?なのかね。
0882デフォルトの名無しさん
2013/01/20(日) 14:33:37.91これ興味深いな。何故だろう?
0883823
2013/01/20(日) 15:09:50.32Intelのマニュアルを見れば分かるけどメモリオペランドと
レジスタオペランドで動作が違う。
レジスタオペランドだと剰余を求めてみるビットを決めるが
メモリオペランドだと、例えば6400あたりが渡されたとすると
800バイト先あたりの値を見る。
0884デフォルトの名無しさん
2013/01/20(日) 17:07:50.08おぉ、マニュアル見たら確かにそんな挙動になってるね。
__assmumもダメならVCでは無理なんじゃないの?
_bittestandset64を3つ並べたらleaまで3回出力されてたよ。
0885880
2013/01/20(日) 19:47:03.48クラスのメンバ関数内でローカル変数でconstで指定してたある変数を、他のメンバ関数と共有したくなったので、
クラスのメンバ変数(constなしでコンストラクタで初期化)にしたら遅くなった、ということ。
同じ場所でconst外すのも試しとくべきだったな・・・。
0886デフォルトの名無しさん
2013/01/20(日) 20:01:44.900887880
2013/01/20(日) 20:35:12.950888,, ・´ ∀ `・ ,,)っ-○○○
2013/01/21(月) 03:29:42.38みたいな式で勝手にbtsに展開してくれるのが理想なんですけどね。
ちなみに x << n | x >> (64-n) なら大体のコンパイラでrotlに展開してくれたけど
0889,, ・´ ∀ `・ ,,)っ-○○○
2013/01/21(月) 03:34:57.450890デフォルトの名無しさん
2013/01/21(月) 04:37:34.710891デフォルトの名無しさん
2013/02/02(土) 20:05:03.110892デフォルトの名無しさん
2013/02/10(日) 09:56:29.53vector_size とか便利すぎる。
0893デフォルトの名無しさん
2013/02/18(月) 19:50:58.26VC2010ExpressとIntel Composer XE 2013(体験版)とで実行時間を比較していたのですが、
前者で/O2のみ付けて生成した実行ファイルだけ異常に遅いという現象が発生したのです……。
プログラムは、ヒッチコック・ベアストウ法に従ってn次方程式を解く時間を計測する、といったものです。
計算量のオーダーはO(n^2)になるはずなので、条件を変えつつ平均計算時間を測定していました。
実行バイナリは、
VCの方で「/Od」「/O2」「/O2 /arch:AVX」、
ICXEの方で「(引数無し)」「/QxAVX」の
5パターンを試しました。
「/Od」>>「/O2 /arch:AVX」までは予想通りだったのですが、どうも「/O2」のタイムが振るいません。
具体的には、2000次方程式を100回解いて平均時間(ミリ秒)を出した際に、
それぞれ「312.78」「478.93」「10.24」「11.39」「11.32」となりました。
いくらなんでも「/Od」より遅いとか異常です。
ソースコードと各実行ファイル、測定条件・時間や自環境を記したテキストを以下に配布しますので、
どなたか速度低下の原因を考えてくださいませんか……?
ファイルURL:http://www1.axfc.net/uploader/so/2798834.zip
0894デフォルトの名無しさん
2013/02/18(月) 22:25:09.69まずは結果が一致しているのか確認してみては
0895デフォルトの名無しさん
2013/02/18(月) 22:30:15.36確認しようにも、乱数を元にした初期化を使っているので、単純な比較ができないんですよね‥…
外部ファイルを読み込めるように修正してから再度チェックするべきでしょうか>
0896デフォルトの名無しさん
2013/02/18(月) 22:34:47.860897デフォルトの名無しさん
2013/02/18(月) 22:35:26.88あ、その手がありましたか。早速試してみます。
0898デフォルトの名無しさん
2013/02/18(月) 22:36:04.770899デフォルトの名無しさん
2013/02/18(月) 22:36:42.010900デフォルトの名無しさん
2013/02/18(月) 22:56:41.78「srand(765);」と書き換えて、再度計測しました。結果、
size Od O2 O2AVX icl iclAVX
500. 4.54 . 12.98 1.51 1.63 1.69
707 13.63 . 43.47 1.99 2.22 2.24
1000. 34.67 121.20 3.16 3.48 3.44
1414 113.17 245.40 5.57 6.22 6.26
2000 303.54 432.40 9.79 . 11.03 . 11.02
(100回平均。単位はミリ秒)
また/O2だけ遅いです……。
0901デフォルトの名無しさん
2013/02/18(月) 23:02:24.59/O2 = /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy
らしいので、どれが悪さしてるか調べてみたら?
0902デフォルトの名無しさん
2013/02/18(月) 23:03:46.280903デフォルトの名無しさん
2013/02/18(月) 23:10:55.87最適化による数値誤差で
ループ数に変化がないかだな
0904デフォルトの名無しさん
2013/02/18(月) 23:16:59.90インライン展開されないコードがあるから、遅くなってるとか
0905デフォルトの名無しさん
2013/02/19(火) 06:48:56.88後は、プロファイラでホットスポットを割り出したり。
0906デフォルトの名無しさん
2013/02/19(火) 18:53:01.52/arch:SSE2を追加してみたら?
0909デフォルトの名無しさん
2013/02/19(火) 22:49:17.250910デフォルトの名無しさん
2013/02/19(火) 23:20:37.82BCC 6.4.4でCodeGuardを掛けてみた。
Error 00001. 0x400000 (Thread 0x0124):
Exception 0xC0000091:
| dai2.cpp line 141:
| printf("n = %d ", n);
| lambda = c[n-2] * c[n-2] - c[n-3] * (c[n-1] - b[n-1]);
|>dp = (b[n-1] * c[n-2] - b[n] * c[n-3]) / lambda;
| dq = (b[n] * c[n-2] - b[n-1] * (c[n-1] - b[n-1])) / lambda;
| /* Δp,Δqをp,qに反映 */
Call Tree:
0x004017C4(=dai2.exe:0x01:0007C4) dai2.cpp#141
0x32C9C8CA(=CC32120MT.DLL:0x01:09B8CA)
Exception 0xC0000091とはfloat overflowなので、大きすぎる値が入って実行不能な
状態です。ちなみにn=430〜470位の範囲で(乱数を初期値にしているからか)出ます。
0911片山博文MZパンク ◆0lBZNi.Q7evd
2013/02/23(土) 00:46:59.380912デフォルトの名無しさん
2013/02/28(木) 21:16:59.08時と場合に寄る。
配列を対象に演算したりすんのは、得意だよね。
0914827
2013/03/01(金) 01:50:42.590915デフォルトの名無しさん
2013/03/08(金) 04:15:29.66いまどき速いと言われるCPUで10進演算をサポートするものなんか無いだろ
0916デフォルトの名無しさん
2013/03/08(金) 04:45:05.27一般人には触る機会がほとんど無いが……
0917デフォルトの名無しさん
2013/03/08(金) 13:02:46.16プロセッサで実行するソフトウェア・オン・チップを採用し、最適化されたソフトウェア
との組み合わせで、さらなる飛躍的な性能向上を実現します。
0918デフォルトの名無しさん
2013/03/08(金) 13:20:15.54Javaのシェアをx86からごっそり奪うつもりだろう
それにJavaの超越関数はIEEE754の64bit精度なので、内部で80bit精度で
演算しているx86は結果が異なって来るとしてソフトウェアエミュレーションしてるもんなあ
0919デフォルトの名無しさん
2013/03/08(金) 13:50:30.720920デフォルトの名無しさん
2013/03/08(金) 13:55:28.720921デフォルトの名無しさん
2013/04/11(木) 02:18:29.340922デフォルトの名無しさん
2013/04/13(土) 08:45:59.77そもそもCOBOLはPCでは使われないからなぁ
0923デフォルトの名無しさん
2013/04/13(土) 09:02:39.83http://software.fujitsu.com/jp/cobol/products/#os-linup
http://jp.opencobol.org/
0924デフォルトの名無しさん
2013/04/13(土) 09:44:15.09中間言語or機能拡張前提では言語の種類は問わないってのが今のトレンドなんだな
0925デフォルトの名無しさん
2013/04/13(土) 13:54:21.350926デフォルトの名無しさん
2013/05/04(土) 14:30:59.21http://jbbs.livedoor.jp/bbs/read.cgi/computer/43761/1367197701/l100
0927デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN0928デフォルトの名無しさん
2013/07/07(日) NY:AN:NY.AN0929片山博文MZパンク ◆0lBZNi.Q7evd
2013/07/21(日) NY:AN:NY.ANhttp://katahiromz.web.fc2.com/xword/
これを高速化する方法を教えて下さい。お願いします。
0930デフォルトの名無しさん
2013/07/21(日) NY:AN:NY.AN0931デフォルトの名無しさん
2013/07/21(日) NY:AN:NY.AN0932デフォルトの名無しさん
2013/07/22(月) NY:AN:NY.AN1マス1Byteにしてみれば?
0=空白,1=黒,2=ア みたいに
0933デフォルトの名無しさん
2013/07/23(火) NY:AN:NY.ANマルチポスト
ttp://toro.2ch.net/test/read.cgi/tech/1371305675/615
0934デフォルトの名無しさん
2014/02/26(水) 21:55:57.42初心者〜中級者がやってもほとんど変わらないか、かえって遅くなる
0935デフォルトの名無しさん
2014/02/27(木) 13:09:47.73記述方法を変えるだけで 30% も高速化して、個人的な報酬の面ではうはうはだったけど、
会社としてはまずいんじゃなかろうか、と思った
0936デフォルトの名無しさん
2014/02/27(木) 13:46:48.10寧ろ、もとの関数を書いた奴にこそ文句を言うべきだろうに。
0937デフォルトの名無しさん
2014/03/01(土) 08:00:17.88内容が分からんから何とも
0938片山博文MZ無能 ◆T6xkBnTXz7B0
2014/03/01(土) 23:34:24.850939デフォルトの名無しさん
2014/03/02(日) 02:26:24.260940デフォルトの名無しさん
2014/03/02(日) 17:57:29.70どのオプションが最強?
0941デフォルトの名無しさん
2014/03/02(日) 19:07:36.250942デフォルトの名無しさん
2014/03/02(日) 19:07:42.07-O3 だと、たまに妙なバグを踏んだりする危険がちょっと高いから。
0943デフォルトの名無しさん
2014/03/03(月) 08:49:42.490944デフォルトの名無しさん
2014/03/04(火) 21:14:57.500945デフォルトの名無しさん
2014/03/04(火) 23:37:05.980946デフォルトの名無しさん
2014/03/04(火) 23:47:49.610947,,・´∀`・,,)っ-○○○
2014/03/04(火) 23:52:31.82movzx/movsxなんて通常のmov命令と比べてもゼロコスト同然なんだし
0948デフォルトの名無しさん
2014/03/05(水) 06:22:14.300949デフォルトの名無しさん
2014/03/05(水) 11:31:55.190950,,・´∀`・,,)っ-○○○
2014/03/05(水) 19:44:06.06そうでなければ理解してないので却下
0951デフォルトの名無しさん
2014/03/06(木) 12:57:05.160952デフォルトの名無しさん
2014/03/06(木) 14:07:48.84(できる人も一定割合でいるとは思うけどね)
0953,,・´∀`・,,)っ-○○○
2014/03/07(金) 09:06:44.19どれだけあるのかと。
x86でもQuarkあたりでもmovsx/movzxは使える
0954デフォルトの名無しさん
2014/03/08(土) 00:20:43.400955デフォルトの名無しさん
2014/03/08(土) 05:11:04.710956デフォルトの名無しさん
2014/03/09(日) 01:51:13.04レジスタリネーム機構は毎回新しいレジスタを確保して演算結果を格納するから
部分的な更新があると一回の参照で処理できないからね
movzxとかvzeroupperで依存関係の問題を解決できるのは更新されなかった部分をゼロとみなすことが可能になるから
0957デフォルトの名無しさん
2014/03/09(日) 13:30:34.920958デフォルトの名無しさん
2014/03/09(日) 13:37:53.940959,,・´∀`・,,)っ-○○○
2014/03/09(日) 14:07:41.720960デフォルトの名無しさん
2014/03/10(月) 11:54:06.95gccのソース読め
0961デフォルトの名無しさん
2014/03/10(月) 12:42:32.810962デフォルトの名無しさん
2014/03/13(木) 10:27:06.99ID:lmSU7iga-O2がいいよ
-O3でGCCビルドするとバグって通らない
0963デフォルトの名無しさん
2014/03/13(木) 16:29:25.91ID:ehk1j1eU規格違反のコードを書いてるんだろうな
0964デフォルトの名無しさん
2014/03/13(木) 17:17:38.61ID:wI+RMMKpstrict aliasing ruleについて完璧に理解している奴だけに許された台詞だよなw
0965,,・´∀`・,,)っ-○○○
2014/03/13(木) 19:49:00.09ID:0x0bjcUd↓これもいい例だが
http://homepage1.nifty.com/herumi/diary/1401.html#8
0966デフォルトの名無しさん
2014/03/13(木) 20:20:11.94ID:dyPbFnv9>962の言う「通らない」は何のことなんだろ。
0967,,・´∀`・,,)っ-○○○
2014/03/13(木) 20:28:48.44ID:0x0bjcUd>>965の例のASM出力見る限りでは一応intの境界にあわせてやれば
通るコードにはなってるようだ。
16バイト境界に合ってないからというよりint境界にあってないのが直接の原因。
アラインメント制約が緩いx86だから最適化してない状態ではたまたま動くだけで
RISCだとアラインメント例外吐くかアドレス下位2〜3ビットを無視してロードだろうな。
0968デフォルトの名無しさん
2014/03/13(木) 21:33:51.73ID:nZXH4hR1リンク時の最適化オプション使うと処理が複雑になるからバグやエラーになりやすいのでは?
前に別スレに書いたVC2012の_mm256_extracti128_si256のバグは最適化すると
処理対象のレジスタがおかしくなるってやつだったな。
あれは結局2013で直ってるからそれで解決という返事だったよ…
これね
>VC2012 x64コンパイラの_mm256_extracti128_si256バグにハマってしまった。
>当面は_mm256_extractf128_si256使って回避した方がいいよ。
0969,,・´∀`・,,)っ-○○○
2014/03/13(木) 21:40:51.76ID:0x0bjcUdこんなのあったんだな。
Intrinsicsってキャストがすごいめんどくさいわ無駄なvmov*を吐くわで
自動ベクトル化やりつつ細かいところをNASM/YASMでいいやと
思ってしまった。
ところでcmovに対応する組み込み関数ってないよね?
0970デフォルトの名無しさん
2014/03/14(金) 00:12:42.17ID:YndCz6Usあまり細かいとオーバーヘッドが気になることもありそうな。
intrinsicはインラインで展開されるメリットがあるけど、インラインアセンブラだって
最適化に支障があってもインラインで展開されるんだよなぁ。
VCのx64はそこらが不便だね。
ところで、_mmのSSEコードを_mm256に変換した程度でやたら遅くなる原因ってあるかな?
VEX128のSSEにした時は速くなってるし、インテルのアナライザでもスループットの問題はないから
原因がよく分からなくて。
やたら遅くなるといえばデノーマル数の処理速度には注意って話があったんだけど、
もしかしてAVXのデノーマル数の処理ってSSEの倍くらい掛かる?
0971,,・´∀`・,,)っ-○○○
2014/03/14(金) 00:56:26.52ID:KVEDcQD1小さい関数ならASM化してしまうのも手ですね。
> やたら遅くなるといえばデノーマル数の処理速度には注意って話があったんだけど、
普通にデノーマル数自体が遅い
http://www2.kobe-u.ac.jp/~lerl2/l_cc_p_10.1.008/doc/main_cls/mergedProjects/fpops_cls/common/fpops_denormal_num.htm
ソフト処理だから当然ベクトル幅に比例した時間がかかかる。
0に切り捨てるモード使おうか。
http://www2.kobe-u.ac.jp/~lerl2/l_cc_p_10.1.008/doc/main_cls/mergedProjects/fpops_cls/common/fpops_reduce_denorm.htm
ところで、なんでどこそこにIntelコンパイラのドキュメントのミラーがあるんだろうな
0972デフォルトの名無しさん
2014/03/14(金) 01:39:40.20ID:YndCz6Us>ソフト処理だから当然ベクトル幅に比例した時間がかかかる。
あぁ、やはりベクトル幅が関係しますか。
CPU内部で例外が発生してマイクロコードで実行してるのかな?
0973デフォルトの名無しさん
2014/03/16(日) 21:54:49.99ID:G/OYWqJlhttp://www.isus.jp/article/compileroptimization/avx_part3/
>__assume() を使うことによりコンパイラーの最適化に有用な情報を伝えることが可能です。
>以下の例では変数 num1 が 8 の倍数である(具体的な値は問わない)と指示することで、
>b[0], b[0+num1], b[0-num1] が同じ 32 バイト境界のアドレスにあることがコンパイラーに伝わります。
>void foo(float *restrict a, float *b, int n, int num1){
> int i;
> __assume_aligned(a, 32);
> __assume_aligned(b, 32);
> __assume(num1%8==0);
> for (i=0; i<n; i++){
> a[i] += b[i]+b[i+num1]+b[i-num1];
> }
>}
0974973
2014/03/16(日) 21:59:05.60ID:G/OYWqJlコンパイラへの指示で、使い方の制約じゃないから関係ないや。
0975デフォルトの名無しさん
2014/05/25(日) 16:39:38.96ID:i4MNOuY/0976デフォルトの名無しさん
2014/05/26(月) 21:48:01.23ID:P1pAx+kR0977デフォルトの名無しさん
2014/05/27(火) 22:40:04.85ID:Ic9XwEQT0978デフォルトの名無しさん
2014/05/28(水) 21:10:58.82ID:St2mZNey0979デフォルトの名無しさん
2014/05/28(水) 21:33:03.47ID:r6RWITw20980デフォルトの名無しさん
2014/05/28(水) 21:33:46.46ID:St2mZNey0981デフォルトの名無しさん
2014/05/28(水) 21:36:40.59ID:r6RWITw2感無量だね。
次スレどうするのかしら?
0982デフォルトの名無しさん
2014/05/28(水) 21:40:18.54ID:poDq1Ussというわけで次スレも最適化してしまおう。
0983デフォルトの名無しさん
2014/05/28(水) 22:54:36.10ID:St2mZNey0984デフォルトの名無しさん
2014/05/29(木) 12:11:51.76ID:BzM20fyM0985デフォルトの名無しさん
2014/05/29(木) 12:55:32.37ID:ld2lb9I80986,,・´∀`・,,)っ-○○○
2014/05/29(木) 20:02:12.91ID:lUpNZIqd俺には「高速化手法」スレと何が違うのかわからない
0987デフォルトの名無しさん
2014/05/29(木) 22:09:57.83ID:3vKJnOmW0988デフォルトの名無しさん
2014/05/29(木) 22:32:09.40ID:guk1iO+w以上。
って感じだしなぁ・・・w
0989デフォルトの名無しさん
2014/05/29(木) 22:55:11.20ID:3vKJnOmW0990,,・´∀`・,,)っ-○○○
2014/05/29(木) 23:02:30.51ID:lUpNZIqd・省メモリ化やストリーム制御命令によるキャッシュ効率の向上
・アルゴリズム自体の見直し
大体にC/C++の単発ネタスレ多すぎる気がするんだが
とりあえず俺的に移行先スレはこんなところで。
【C++】高速化手法【SSE】
http://peace.2ch.net/test/read.cgi/tech/1130349336/
アセンブラ 13
http://peace.2ch.net/test/read.cgi/tech/1314512680/
OpenMPプログラミング
http://peace.2ch.net/test/read.cgi/tech/1102483474/
GPGPU#5
http://peace.2ch.net/test/read.cgi/tech/1281876470/
【O(n)】計算量の評価方法について【O(log n)】
http://peace.2ch.net/test/read.cgi/tech/1363854937/
0991デフォルトの名無しさん
2014/05/29(木) 23:19:55.49ID:3vKJnOmW0992デフォルトの名無しさん
2014/05/30(金) 07:02:24.06ID:iM2/XKttご苦労様でした ∠(`・ω・´)
0993デフォルトの名無しさん
2014/05/30(金) 07:48:13.45ID:t9L11UzZ0994デフォルトの名無しさん
2014/05/30(金) 15:51:44.56ID:tQtZpcuA0995デフォルトの名無しさん
2014/05/30(金) 22:56:45.34ID:t9L11UzZ0996デフォルトの名無しさん
2014/05/30(金) 23:00:00.51ID:uSMUGQ910997デフォルトの名無しさん
2014/05/30(金) 23:07:41.63ID:t9L11UzZ0998デフォルトの名無しさん
2014/05/30(金) 23:12:48.41ID:uSMUGQ910999デフォルトの名無しさん
2014/05/30(金) 23:19:35.96ID:IDMDYieI1000デフォルトの名無しさん
2014/05/30(金) 23:20:07.50ID:IDMDYieI10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。