1read 100read
2012年09月プログラム40: 【C++】高速化手法【SSE】 (864) TOP カテ一覧 スレ一覧 2ch元 削除依頼
monazilla Part 6 (623)
文字コード総合スレ part7 (921)
くだすれDelphi(超初心者用)その54 (902)
【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】 (226)
C/C++の宿題片付けます 160代目 (531)
人気プログラミング言語ランキング (744)

【C++】高速化手法【SSE】


1 :2005/10/27 〜 最終レス :2012/11/02
C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。

2 :
まずはi++は++iにしろよ。

3 :
それで速度があがるならな

4 :
Intelのコンパイラ買って開発したほうがいいんじゃね?
ヘタに素人が最適化なんてやるより

5 :
アルゴリズムよりメモリアクセスが最大のボトルネックだったりする。
結局レジスタやキャッシュを意識するのが重要になってくる。

6 :
>>4
コンパイラを変えるんじゃなくてパフォーマンスの解析ツールを
買わないとダメじゃないかな。
コンパイラ自体はVC7も用途によっては悪くないし。

7 :
>>6
VC++はプロファイラがついてると思うが

8 :
今月のCマガ買って読め。

9 :
STL使うなら自分で同じような物を作ったほうが高速。

10 :
その心は?

11 :
なんでいきなりSTLが・・・

12 :
主要部分をasmで書き直せばOK

13 :
>>7
VC++のプロファイラは、普通に一通りの機能を備えているのに、使われないんだよね。
VC.NET用だと、Compuware(Numega)がプロファイラを無償で提供してくれてるよ。
VC++6.0まで、TrueTimeは売り物だったのにねぇ。

14 :
>1
>>12
インラインアセンブラよりも、組込み関数を使ったほうがいいことが多い。
・コンパイラが最適化をしてくれる
・プログラムの記述が楽で、修正しやすい。
という2つの大きなメリットがあるよ。

15 :
なおVC系の場合、
組込み関数をインライン展開する
というオプションを有効にしてしまうと、
インライン展開されてしまい、最適化されない
という直感的ではない結果になるので、確認しながらやりましょう。

16 :
VCにプロファイラがあるなんて気づかなかった
というか2chで聞いたら無いっていわれてずっと信じてた

17 :
VC7でなくなったんだっけか

18 :
>>13
>使われないんだよね。
GUIに罠が仕掛けてあるからじゃまいか?

19 :
SSE2が付いてるマシンではインラインアセンブラで書かれた処理を実行したいけど、
それ以外のマシンでは普通のC++で書かれた処理を実行したいと言うような場合、
どうすればいい?

20 :
開始時に判別して関数ポインタで入れ替え

21 :
やっぱそれしかないか。
関数のインライン化されにくいなぁとか、
C++のメンバ関数だと面倒だなぁとか思ったんで。

22 :
>>21
インスタンスをやたら作る必要が無いならファクトリーパターンで作り分けしてもらうという逃げ方もある。

23 :
んなややこしいことしなくても、マクロ使って1つのソースから2つのオブジェクトを吐かせればいい。
関数ポインタだってコストかかるので、1つずつの関数を切り替えるのではなく、
2通りのプログラムを1つのプログラムに押し込むくらいの気持ちで、
もっとmain関数に近いところから切り替えてしまおう。

24 :
インテルコンパイラってプリフェッチ命令を挿入するとか言ってるけど
プリフェッチって入れても効果ほとんど無いよね?
あとこれからPen3コアをベースにしたCPUになっていくからPen4用に
最適化はしないほうがいい?

25 :
>>24
場合によるだろ。prefetch命令はL2へのロードのアルゴリズムを
変更するので、場合によってはメモリのレイテンシを劇的に減らす
事が出来る。というかintelのpdf嫁。

26 :
prefetch命令を使って具体的に速度改善を説明する本とかないのかな。
サンプルコードとか載せてるのがあったら欲しい。
Webでも以外と情報無いし。

27 :
STL like Template based coding with MMX/SSE extension
http://www.codeproject.com/useritems/STL_like_coding_with_MMX.asp
Intel IPP
Iten OpenCV
そのまま使えば高速じゃん

28 :
>>27
なんだこれ。
マトリクスとかImageとか扱えるものなのか。
結構みんな使ってるんだろーか。

29 :
クイックソート以外の例えばマージソートやバルブソートなどはどのようなときに使うのでしょうか?

30 :
>>29
クイックソートは万能ではない。
特にソートする要素数が少ないときには他の方法が早い。
また、安定でないという欠点もある。(マージソートは安定)

31 :
>>29じやないんだが
>また、安定でないという欠点もある。(マージソートは安定)
これどーゆー意味なんよ?
高速化のスレだから速度の事を言ってるのか?

32 :
>>31
ソートで不安定といったら
比較関数の評価で重みが重複した場合に順序関係が保存されない
ことだと思うが…(;´Д`)

33 :
>>31
>>31
>>31

34 :
出席番号順にソート済みの身体測定データを身長順にソートしたいとする。
ただし、同身長の人間がいる場合は出席番号の若い順に並んだままになっていて欲しい。
そういうときは「安定したソート」の出番よ。
クイックソートだと出席番号はバラバラになるからな。
まあ「安定した速度」って点でもマージソートはなかなかのもんだと思うけど
それにしても

35 :
それは、キーの指定が悪い。

36 :
>>31
基本情報の資格でも取ったほうがいいお
言葉が通じないと頭良くても吸収できないでしょ

37 :
>>35
ソートで大小の評価を、
身長だけではなく、出席番号も加味してやればいい
と言いたいのだろう。
でもね、出席番号がついてなかったら、どーするの?

38 :
一般的にソート前のインデックス順序を比較で使えばいい
二次キーとして出席番号があるならそれを使えばいいし

39 :
インデックスがついていなかったら?

40 :
アドレスで比較すればいいだろ馬鹿か?

41 :
アドレスで比較? なに馬鹿いってるの?

42 :
IntelのライブラリはAMDでワザと遅くなるようにしてそうなんで
一般向けには使ってません

43 :
高速なメモリコピーするにはmemcpy?
それともキャシュ無視するためにSSEとか利用するのか?

44 :
memcpyの実装はたくさんあるから一概には言えないぞ。
最もシンプルなのは1バイトずつコピーしているし、
コンパイラによってはインライン展開どころか組込み関数として処理しちゃうぞ。

45 :
へぇー、組み込み関数(SSE?)で処理しちゃうのか。
ネットで調べてたらSSEのレジスタ4つにまず読んで、それを
また4つ書き出すとレイテンシとやらを隠蔽できるとかなんとか
あったけどそんな感じかな。
とりあえずmemcpy使っておきます。

46 :
組込み関数の意味がわかってない希ガス。

47 :
関係ないけど __divdi3 は組み込み関数なんだろうか。

48 :
直にCPUの命令またはその組み合わせに展開してしまえる関数だね。
組み込み関数の利用は#pragma intrinsic で明示できるよ。
逆に出来ない場合は組み込み関数として用意されてないといえる。」

ぶっちゃけIntel C++のオートベクトライズなんてあんま役に立たない。
処理を並列化できるところは明示的にMMX/SSEの組み込み関数
使って最適化したほうがいい。
CPUの動きを知り尽くしてレジスタカラーリングしてくれるから
へたなアセンブリコード書くより速い。
あとIntel C++なんかは、インライン関数を基本的に展開しない。
STL使ったら重いってことは結構ある。
ただし __forceinliceは受け付ける。

VC2005はcpuidとかローテート命令まで組み込み関数として使える
ようになったから、アセンブラ嫌いにはかなりフレンドリーになった希ガス。

49 :
ローテートはVC6の頃から組み込み関数であった希ガス。

50 :
2005は8bit版や16bit版も用意されてる
http://msdn2.microsoft.com/library/hd9bdb82(en-US,VS.80).aspx

51 :
                       U
                \     |
                  \   人  /
                    メ´  ヾ  _,−'
                 −―<  , -、 て_
        C++とSSE!      ) / / (´
                          / / ⌒ 、
                  (⌒V ,'´`ヽ
        ト、       ,ヘ   ヽ  !   :〉
        ト、ヽ    / /!    /   、゙ーァ'
        |,ノ ´ ̄` ヾ!  /   /`~´
        ,' >   < ゙, /   /
          l   、ー―:ァ  i/   /
          ゙、   Y⌒/  ,/   /
        `''ァ‐`ー'      /
         / i      /

52 :
だんごって何の仕事してんの?

53 :
.NEETでFA

54 :
倍精度実数、うらやましいなー

55 :
constで最適化が促進させられる理由ってなんでそ?

56 :
書き込むスレ間違えました。失礼しました。

57 :
[1] 授業単元: 数値計算法 
[2] 問題文(含コード&リンク): @f (x) = cos (x) - x2 = 0 の根のうち、0 < x < 1 を満たすものを2分法で求める 
初期値 a, b が入力でき、 6桁推定された解と関数 f (x) を呼びだした回数を出力するようにしなさい。 
[3] 環境 
 [3.1] OS: WindowsXP 
 [3.2] コンパイラ名とバージョン: VC 6.0 
 [3.3] 言語: C 
[4] 期限: (2006年06月08日まで 
よろしくお願いします 

58 :
やべっ 二分法って何だっけ
忘れちゃったよ

59 :
>>58
カップラーメンを従来の1.5倍の速度で完成させる最適化技法

60 :
調理時間の短いラーメンほど短時間で伸びる

61 :
グルテンを加えるといい

62 :
麩になっちまう

63 :
即値で掛け算する場所を書き直してみたら?

64 :
PenMのSSE2って遅くね?

65 :
デコーダがネック。複合デコーダパスだからね。
汎用&MMレジスタベース命令と交互に配置するとデコーダネックを隠蔽できる。
Yonahでは解消されてる。てかめちゃくちゃスループットいい

66 :
じゃあPenMだったら無条件でSSE2不使用、ってコーディングはもうしちゃ駄目だね。

67 :
そもそもYonahな時点でPenMじゃないし。
つかPenMって3年前から更新されてない一昔前のチップだろ。

68 :
ド忘れされてるDothanとi915萌え
YonahもBanias、Dothanと同様Pentium-Mですよ。
ただ発表後にPentiumブランド消失と絡んでIntel Coreとも名付けられちゃったが。
ブランド展開がまだよく分からんのでこの先どうなるか知らんが

69 :
面白い話題なんでもっと調べたいんですが、
いい本ないでしょうか?
やっぱりパターソン&ヘネシーですか?

70 :
メーカのドキュメント

71 :
SSEはコンパイラが自動的に使ってくれるのですか?

72 :
コンパイラによる。VCだとスカラ演算のみ。
自動ベクトル化が可能なコンパイラはgcc4.0系とかiccとかPGIとか。

73 :
SSEで最適化してもメモリアクセスのほうがボトルネックになんね?
キャッシュとかよく分かんねけどメモリよりキャッシュを意識せな
いかんのだろうけど。

74 :
処理の内容によるんじゃない?
動画の画像処理みたいにプリフェッチの予測が当たりやすい処理だと
メモリ帯域の方がボトルネックになってる感じはしない。
他の分野についてはわかりません。

75 :
>>73
同じデータを色々な組み合わせで何度も使う場合
キャッシュをうまく効かせるのが腕の見せ所。

76 :
誰かSSEのプリフェッチをどう使えばいいのかまとめてくれ。

77 :
めちゃくちゃ大雑把に話せば、
メモリを使う100クロック前くらいで
64byteごとに1回プリフェッチ命令を置く。
どの命令がいいかは、全部試して速いのを採用。
詳しくは、たくさんコードを書いてから
キャッシュについて勉強してくれ。
俺も勉強せねば・・・。

78 :
GPUと組み合わせ使うて場合って
GPUができる計算はみんななげちゃうって方針でいいの?
低次元行列計算はDirextXでできるみたいだから、
DirextXになげちゃおかと思ってるのだけど

79 :
>>78
DirectXは誰が動かしていると思っているの?
ユーザプロセスは?
OSカーネルは?

80 :
インテルのペンティアムプロセッサのマシン語で
高速化を勉強できる良い入門書みたいなのあったら教えてください
ホント、よろしくお願いします。
         
このとおり!m(_ _;)m m(-.-;)m m(_ _;)m

81 :
>>4

82 :
そうおっしゃらず。。
なにとぞ、お願いします〜m(_ _;;)m

83 :
>>83
いやマジで、下手な本買うよりiccのアセンブラ出力眺めた方がよっぽど勉強になるって。

84 :
なるほど、そういう意味でしたか。

85 :
>>80
MMXテクノロジ最適化テクニック(ISBN4-7561-0797-4)の5章

86 :
>>85さん、ありがとうございます。
早速書店で探してみます。m(_ _)mペコリ

87 :
SSEでどこか参考になるサイトはありませんか?

88 :
つ[google]

89 :
最近のコンパイラはSSEなどは指定しなくても自動的に使ってくれるのでしょうか?

90 :
ではまず最近のコンパイラの定義から(ry

91 :
>>89
そういうコンパイラもあります。

92 :
インテルコンパイラです

93 :
自動的に使うようになってると、SSEがないCPUでは動作しないのでは。

94 :
O3を指定した場合、自動的に検出され使われる

95 :
  _  ∩
( ゚∀゚)彡 オッサン!オッサン!
 ⊂彡

96 :
ここってこんなに人居たんだ

97 :
>>95
オマイの駄洒落のほうが・・

98 :
/Qx*とか/Qax*なしで使うことってあったっけ?
とりあえずboost:mt19937はICCのオートベクトライズでやたら速くなるが

99 :
Auto-vectorization in GCC
ttp://gcc.gnu.org/projects/tree-ssa/vectorization.html

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
電卓作る (223)
【.cmd】 バッチファイルスクリプト %9 【.bat】 (300)
iPhone iPad iOSプログラミング Part1 (541)
Visual Studio 2008 Part 21 (721)
C/C++の宿題片付けます 160代目 (531)
Androidアプリ制作依頼スレ (618)
--log9.info------------------
勘違いしてた事 (225)
そのほうがよかろう (780)
■ホークウィンド■ (578)
Bill Bruford PART2 (540)
キング・クリムゾン「アイランズ」 (630)
marillion マリリオン 2 (233)
プログレCD購入先情報を交換するスレ (968)
【鬱】Opeth【暗黒】 (218)
「ああ、俺ってプログレッシャー…」と思う瞬間 (806)
イル・ヴォーロはイタリアンロックの最高峰 (295)
レコメンとか (590)
DREAM THEATER Part.1 (379)
CMでキング・クリムゾンをカバーしているビリー・バンバンはプログレ (611)
【県相】KENSO II【ケンソー】 (852)
ポリスは、さすがにプログレだろ? (347)
Durutti Column ドゥルッティーコラム (769)
--log55.com------------------
【日本11位】福岡 vs 大阪名古屋横浜【top4】
「 都構想消滅で大阪滅亡!!!!! 」
悲報  大阪猿がついに愛知に抜かれる
2014年度 都道府県別 人口転入超過数が出た
愛知に惨敗する、大阪とかいう糞田舎wwwwww
大阪の都市計画について語るスレ Part52
政令市の称号を安売りしすぎ!
名古屋