- 1 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 02:55:36 ]
- C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。
- 767 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:28:17.45 ]
- あれ?ifの方が速いんじゃなかったか
- 768 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:53:20.16 ]
- P6,P2,P3,P4はforwardならnot taken backwardならtakenがデフォルト
P4はPrefixでヒントを出せる PM,Core2はランダム ソースはAgner
- 769 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/24(土) 09:22:43.82 ]
- 分岐予測履歴がない場合あるいは予測そのものがない場合、条件付ジャンプは前のアドレスに
飛ぶ場合(多くの場合ループ)は原則ジャンプ、後ろならスルーが多くのCPUの実装ですね。 大体のコンパイラってforやwhile文はこんな感じに展開するでしょ? if (cond) { do { ... } while(cond); }
- 770 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 12:02:04.61 ]
- >>769
モダンなCPUはどんな感じなのよ >>768 はランダムだと言ってるけど モダンなCPUでも静的予想だとifはスキップ whileはループ確定なのけ。
- 771 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 19:11:37.76 ]
- 分岐履歴が無いのに前方への分岐を予測したら命令フェッチをやり直さなきゃならないじゃん
後方への分岐はループの場合が多いから特別扱いなんだと思う
- 772 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:14:58.62 ]
- 大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。
反復も反復する事を優先した方が早いのは解る。 それはいいとして、今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ。 そこを知りたいんだがね。
- 773 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:25:07.37 ]
- >今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ。
パイプラインが深いだけでしょ
- 774 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:33:04.06 ]
- わかってないのにわかったつもりになって
単語だけ並べているように見えるのは何故だろう
- 775 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:41:50.71 ]
- そう思ってくれるのはいいが、間違いの指摘と
実際はどうなってんのか答えてくれ 批難だけの回答はいらん。
- 776 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:45:20.20 ]
- >>773
分岐予測の話はパイプラインが深いこと前提で話してるわけで・・・
- 777 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:50:30.10 ]
- >分岐予測
って、言い方してるだけなの?
- 778 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:52:06.49 ]
- >>775
じゃあ間違いを指摘してやる。 >大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。 前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。 if (xx) return で「すっ飛ばせば云々」なんて、理解していないまま「わかったつもりになってるだけ」の証拠。 >今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ ヒントはともかく、投機はまさに「投機実行するために分岐予測をする」のであって 「投機実行もあるから分岐予測が複雑になる」はナンセンス。 もちろん、エンプラ系/VLIW系では「分岐の有無の両経路を実行する」なんてのもある(らしい)が 一般的とは言いがたい。
- 779 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:59:34.64 ]
- >>778
内容じゃなく国語的に誤解されてるな。 >前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。 if( xx ) throw xxx; throwなんて実行するケース殆ど無いんだから基本if実行しないってのは同じ話。 矛盾してないでしょ。 まず分岐予測が複雑になってるって話はしてないよ。 投棄実行については投棄実行を考慮した上での静的予測方法があるでしょという話。
- 780 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:04:11.41 ]
- >>779
だから、ifの内部は「実行すると予測される」んだよ、バーカ
- 781 名前:779 mailto:sage [2012/03/24(土) 22:05:34.03 ]
- 尤も、わかりやすいからifと書いたけど、
実際はコンパイラの最適化でif、elseは反転するから この言い方は正しくは無いんだけどね。
- 782 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:06:41.25 ]
- せめて正しい漢字使えよ。
一度なら単なる変換ミスとして納得できるけど 繰り返しているってことは、別の意味に捉えているとしか思えない。
- 783 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:09:32.88 ]
- >>780
お前バカだろ みんなアセンブリ前提で言ってんだよ jze label if() { ・・・処理・・・ labeli }
- 784 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:12:25.76 ]
- >>782
ん?尤も(もっとも)か?無い(ない)か?
- 785 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:20:41.79 ]
- >投棄実行については投棄実行を考慮した上での静的予測方法があるでしょ
理解できる日本語で書いてくれないかな。 分岐予測というのは、投機的に(結果が判明する前に)実行する前提でのもの。 (無条件分岐や間接分岐もあるから、厳密には正しくないけど) 予想して(投機的に)実行するのでなければ、単に結果が判明するのを待って、それから実行すればよい。 つまり、投機実行するからこそ分岐予測が必要なのであって 投機実行しないのであれば、分岐予測など元々必要ない。 そのことをちゃんと理解していれば、 そもそも「投機実行を考慮しない分岐予測」などというものが存在しないから >投棄実行を考慮した上での静的予測方法 が意味不明に感じられる気がするんだけどな。 >>783 わかってるよ、そんなこと。
- 786 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:22:22.48 ]
- >>780 ifが優先されると思ってたのは>>767 とお前ぐらいだよ
- 787 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:25:19.71 ]
- >>785
ごめん。もう今更何を言おうが>>780のせいで信用ないわ。
- 788 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:34:54.17 ]
- >>782
ああ投棄実行ね投機の変換ミスそのままにしてたわ
- 789 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:48:33.55 ]
- 投棄実行については誤解してたわ。
2つの分岐を両方実行して実際実行対象にならなかった方の結果を破棄するものだと思ってた。
- 790 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:50:38.87 ]
- >大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。
もう一度考えてみたけど、この意味が全然理解できない。 ぱっと見で、何故returnや、 増してthrowなどという言葉が出るのかわからない。 (GP等の例外の割り込みは全く別物) で、次の行の >反復も反復する事を優先した方が早いのは解る。 の意味は、「ループであることが推測されるから分岐すると予測する」だよね? それとの対比で、「ifをすっとばせば」の意味が 「ifの内部は実行されないと予測」と捉えれば 「ifの部分での分岐は分岐すると予測すれば if内部のreturnやthrowに制御が来ないので別の分岐の予測を避けられる」という意味にもとれる。 それならようやく意味が通じるような気がして、そういう意味だと思ったんだけど。 つまり、ifの部分(=前方分岐)を「分岐すると予測する」という意味だと。 でもそれ(前方へ分岐すると予測する)は実際のプロセッサの動作とは違うわけで ならばどういう意味なのか、さっぱりわからなくなってしまってね。
- 791 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:00:43.72 ]
- お前の文章が解らんわ
- 792 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:01:04.27 ]
- 一応。
突然returnやthrowが出てくるのが if (xx) return という意味じゃないか、というのも勝手に俺が頭の中で補って想像しただけで 実際には何の説明も無く(ifの多くがreturnやthrowというのにも同意しにくい) 唐突な「rerturnやthrow」「すっ飛ばす」を必死に理解しようとしたのがそもそもの間違いかもね。
- 793 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:01:51.31 ]
- 実行時の分岐予測って、どうなってるのかわかってないと、グダグダでしょ
- 794 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:04:39.09 ]
- >>792
>>779で補足だしてるだろしつこいわ
- 795 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:09:08.21 ]
- >>790 >>792 ウゼェ・・・
- 796 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:18:44.32 ]
- >>794
>>779だとしたら>>780だっての。 「前方分岐は分岐しないと予測する」のが実際のプロセッサの動作なわけ。 >>779の「throwなんか滅多に起こらないから実行しない(と予測する)」は 「前方分岐は分岐すると予測する」ことになるから実際の動作と矛盾するという話。 それを、「わかってないくせに」の根拠の一つにしたんだよ。 実際、「分岐予測とはどういうものか」も「なぜ分岐予測するのか」もわかってなかったわけでしょ(>>789)。
- 797 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:09:12.01 ]
- 口汚い言葉で罵倒せずには居られない奴って下品・・・。
団子さんの紳士っぷりを少しは見習ったらどうだろうか。
- 798 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:16:07.87 ]
- もう>>780はいいから団子さんこないかな
- 799 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:24:14.75 ]
- え?指摘するの780だけ?
露骨だなぁ。恥ずかしくないんだろうか。
- 800 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 02:30:29.23 ]
- お前がなwww
- 801 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 03:19:03.04 ]
- 頭が悪すぎて理解できなかったらしいから仕方ないな。
- 802 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 14:12:21.08 ]
- >>796
投機実行という言葉については誤解してました。 分岐予測については、分岐ミスでパイプラインに読み込んだ 命令を破棄が発生するという認識です。 そもそも、それが気にならないのであれば分岐予測なんて 気にする必要はないでしょう。
- 803 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 16:12:43.94 ]
- インテルの最適化マニュアルだと
>インテルPentiumM プロセッサー、インテルCoreSolo プロセッサー、インテルCoreDuoプロセッサーは、 >ジャンプの向きに従った条件分岐を静的には予測しない。これらのプロセッサーでは、 >すべての条件分岐は、最初に発生したときでも動的に予測される。 と書いてあって、wikiで調べたらPenM以降は広域分岐予測を取り入れた関係で静的予測はしなくなったみたいだね ttp://ja.wikipedia.org/wiki/%E5%88%86%E5%B2%90%E4%BA%88%E6%B8%AC >>768の >PM,Core2はランダム というよりも、「前に実行した別の分岐命令の結果も影響する」とした方が適切みたいだ 分岐予測に関して ttp://news.mynavi.jp/column/architecture/index.html の第167回からの解説が参考になるよ
- 804 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 18:09:59.76 ]
- >>803
なるほど。いい話が聞けました。ありがとうございます。
- 805 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 00:06:00.96 ]
- >>803
>と書いてあって、wikiで調べたらPenM以降は広域分岐予測を取り入れた関係で静的予測はしなくなったみたいだね P4もグローバル履歴を使ってるよ おそらくだけど ある分岐命令を最初に実行したかどうかはBTBのエントリが割り当てられているかで判断するので 分岐先予測より分岐予測のヒット率が十分に高い場合は動的分岐予測が当たる条件で誤って静的予測してしまう確率が高いから 1回目の分岐予測を諦めても静的予測をやめたほうがヒット率が上がるということなんじゃないだろうか
- 806 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 00:11:22.64 ]
- ×分岐先予測より分岐予測のヒット率が十分に高い場合
○BTBのヒット率より分岐予測のヒット率が高い場合
|

|