- 1 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 02:55:36 ]
- C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。
- 552 名前:rv@天才カメラマン@jagam00z@モベキチ mailto:sage [2011/01/31(月) 02:42:47 ]
- www.geocities.jp/jagam00z/index.html
おっとヒントはここまでだ。まあきさまらなんざにサイトハックなんざ1000年はやいだろうがなあwwwぶけけけけ
- 553 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/01/31(月) 06:35:58 ]
- >>548
そうだね
- 554 名前:デフォルトの名無しさん [2011/01/31(月) 13:10:23 ]
- 10年かかってやっとCellに追いつけたのか。
- 555 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 17:55:24 ]
- sse
- 556 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 19:52:01 ]
- いや俺も「不動点演算子」に、はぁ?と思ったよ。
- 557 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 20:16:00 ]
- 山の浮動が居るスレはここですか?
- 558 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 21:34:07 ]
- いや不動点演算子は別に良いだろ
スレチだけどさ
- 559 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/01/31(月) 23:08:05 ]
- >>554
またタイムスリップしてきたあたまのおかしい人か。 2001年にCellがあったんですか?パネエwww てかCellのスカラ整数演算性能はクロック半分のAtomにも負けてるよ
- 560 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 23:51:52 ]
- 俺もCellは肝心なところで使えないと思っていたクチだが、
これ系のスレで毎回スカラを持ち出すお前の頭が分からない。 スレタイ読め。
- 561 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 02:33:20 ]
- スレタイ読んだかスカラ演算がなぜ駄目なのかお前の頭が理解できない。
CellのSPEはC++ライブラリほとんど使えないしましてSSEなんて対応してないぞ。 スカラ整数演算が強い=(SIMDのデータ読み書きを含めた)メモリアドレッシングに強い
- 562 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 07:40:24 ]
- SPUはCのライブラリを使えるし(標準?んなもんは知らない。)C++コンパイラもある。
SIMD演算に特化したSPUは比較対象としては適切と言えなくもない。 だが、Atomのスカラ整数演算能力なんざ完全に場違いもいいとこ。 団子さ、年取って耄碌してきたんじゃない?
- 563 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 08:00:51 ]
- 良い訳に必死だこと
ここのテーマは「高速化」であって並列化ではない。 スカラ演算の重要性を理解できないお前の存在自体が場違い。
- 564 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 08:29:31 ]
- 具体的にはCellの整数加減論理演算のレイテンシは2〜6サイクル程度で
クロック半分のAtomはdual issueで1〜3サイクル程度だから実質同程度なんだよ。 CISCのコード密度の優位性と16バイトアライン縛りの問題の分だけAtomのほうがむしろ有利なんだよ。 いくらあがいても速度勝負ではクロック半分のAtomに勝てない。 モバイルデバイスの市場は拡大してるし、Atom向けの最適化技術の重要性は増すと思ってるけど Cell(SPU ISA)はIBMも東芝も後継プロセッサの開発を事実上放棄してるし 誰もここでCellの話題なんて出さないだろ?
- 565 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 09:37:18 ]
- 必死なのはどうみても連投までして言い訳を続けてる団子だろ。
みっともないから少し黙ってろよ。
- 566 名前:デフォルトの名無しさん mailto:sage [2011/02/02(水) 23:12:42 ]
- まあ、日々進歩しているプロセッサと設計がおそらく6,7年前で止まっているプロセッサを比較してもなんだかなあ。
Pentium4とCellはどっちが速い?と言われれば浮動小数演算であれば後者だからな。 Cellがインテル並に進化していたら、整数演算も改善されていたんでは?と思えなくもない。 それはそれで面白いんだろうが。
- 567 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 10:44:47 ]
- うん、まあ取り敢えずお前らまとめてゲハ板にでも行け
- 568 名前:デフォルトの名無しさん mailto:sage [2011/02/12(土) 02:33:24 ]
- gmplib.org/~tege/x86-timing.pdf
これのIntel NHMってやっぱネハレムの事?
- 569 名前:デフォルトの名無しさん mailto:sage [2011/02/15(火) 02:19:11 ]
- 16バイトにアラインメントされた構造体の配列を部分的にコピーしたいんですが、hogeが64bit型だとして
_mm_stream_si128(&dest->hoge[0], _mm_stream_load_si128(&src-hoge[0])); _mm_stream_si128(&dest->hoge[2], _mm_stream_load_si128(&src-hoge[2])); _mm_stream_si128(&dest->hoge[4], _mm_stream_load_si128(&src-hoge[4])); … のようにすれば速いかと思ったのですがそれほどでもありませんでした 良いアイデアありませんか?
- 570 名前:デフォルトの名無しさん mailto:sage [2011/02/15(火) 16:43:10 ]
- データ設計をやりなおして、部分的にコピーする必要がないように並べる事をオススメする。
- 571 名前:デフォルトの名無しさん [2011/02/19(土) 16:59:31 ]
- 行列の演算ですが、高速化する方法はありますか?
for(j=0;j<16;j++){ o=FG[a[j]]^FG[u1.m[j]]; p=FG[b[j]]^FG[u.m[j]]; for(i=0;i<16;i++){ d1[j]^=t[o][h1[p][i]]; d2[j]^=t[o][h2[p][i]]; } buf[j]=d1[j]; buf[j+16]=d2[j]; }
- 572 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 17:26:16 ]
- >>571
それぞれの配列の構成が判らんとなんとも。 h1みたいな二次元配列っぽいのが配列の配列なのか、ポインタ配列なのか、演算子オーバーロードなのか全く判らん。 兎に角、動く形で提示してくれ。
- 573 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 17:34:52 ]
- この手のものは式テンプレートというものを使うと早いんだそうだが
あまりに複雑でいまだに自分のものにできん^^
- 574 名前:デフォルトの名無しさん [2011/02/19(土) 18:03:49 ]
- unsigned char FG[256],d1[16],d2[16],a[16],b[16],t[256][256],h1[256][16],h2[256][16],buf[32]l\;
これで解りますか? コードパッドだとエラーが出て動きませんでした・
- 575 名前:デフォルトの名無しさん [2011/02/19(土) 18:23:07 ]
- codepad.org/Dc6LY5cV
- 576 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 18:39:29 ]
- マルチしすぎ
C/C++の宿題片付けます 146代目 hibari.2ch.net/test/read.cgi/tech/1296387672/571 質問にやさしく親切に答えてくれるスレ 4 hibari.2ch.net/test/read.cgi/tech/1222224721/789 【C++】高速化手法【SSE】 hibari.2ch.net/test/read.cgi/tech/1130349336/575
- 577 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 18:42:17 ]
- まぁ高速化の基本だからな。
【マルチコア】並列化について語る【使いこなせ】 hibari.2ch.net/test/read.cgi/tech/1137540671/971-972
- 578 名前:デフォルトの名無しさん mailto:sage [2011/02/21(月) 05:00:39.65 ]
- movdqu命令はレイテンシ6のスループット1だとあります。
movdquを使った1クロック後に、それと依存関係の無い別の命令を実行でき、 movdquと依存関係のある命令は6クロック後まで待つ必要があるってのは分かるんですが movdquのロード命令と依存関係の無い、別のロード命令を使いたい場合は何クロック待ちになるんですか?
- 579 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 13:20:09.53 ]
- メモリに依る、という回答では駄目だろうか。
- 580 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 15:09:47.11 ]
- 素人から見ると団子のレスは読んでて面白いけどな。
批判するほうもちゃんとデータとか出してくれるとより面白いんだけど、俺を楽しませるスレじゃないしな。。。 Cellくそはええ!みたいなのは結局そうでもなかったってことなのかな。 BOINCあたりで活躍してたけど、結局i7とかのがはやいの
- 581 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 16:18:35.43 ]
- >>578
> movdqu命令はレイテンシ6のスループット1だとあります。 それってネトバのmovdqu xmm,xmm命令の事? もしそうなら、それはxmmレジスタ間コピーのレイテンシ・スループット であって、ロード命令のレイテンシ・スループットではない。
- 582 名前:578 mailto:sage [2011/02/22(火) 17:09:50.56 ]
- 理解しました
測ってみることにします。
- 583 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:08:10.22 ]
- SIMDとは関係ないけど他に見当たらないんで、ここで聞くことにしたけど、
誘導してくれれば幸い。 ビット・オンの最上位のみ残したい場合、 ビットスキャンリバースを使わずに、いい方法ないかな。 ビット・オンの最下位のみ残す場合は、例えば対象の値を80としたとき、 mov eax,80 mov ebx,eax neg eax and eax,ebx こんな感じよね。 これを最上位ビットでやりたいんだが、何かいい方法ないかな。 最下位フラグを消していく方法を繰り返すくらいなら、素直にビットスキャンしちまうんだが。 なければ、ない、と言ってくれ。
- 584 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:10:21.95 ]
- 【関数化】ビット演算 0x03
hibari.2ch.net/test/read.cgi/tech/1226143920/
- 585 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:16:48.53 ]
- >>584
サンクス。感謝。 行ってきます。
- 586 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:37:28.61 ]
- 撃墜100超えたんでやめよっと
- 587 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 15:07:12.37 ]
- すれ違い誘導職人の晩年である
- 588 名前:のみねーと ◆myadMFZ/7k mailto:sage [2011/04/05(火) 05:50:08.80 ]
- ,.ィ'" ` 、
/ ,.--、 :.:.\ r、 |:.:.:.:.〈;;;;;;;ノ :.:.:.:.ヽ _/△ハ,,__ / ハ !:.:.:.:.:.:.::.:.:.:.:.:.:... :.:.:.:.ヘ /: : : : : :/ ||:.:i/'ーリ―- 、_:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. :.:.:.:.:.:.ハ //: : /: :.:.ト=': : : : :/: : : : : : :. ̄`''ー- 、:.:.:.:.:.:.:.:.:... . .:.:.:.:.:.:! / /: : /:.:.:.:.:/: :./: : : /: : : :./: : :/:/: /!: :.i::::``.、:.:.:.:.:.:.:.:.:.:.:.:.:.:! . /: :./:.:.:.:.:.:! : /: : : / : : : /: : :/:/!:./ |:.:.l|: : :.:.::::\:.:.:.:.:.:.:.:.:.:.| /Vlハ|/!/!|: : !: : : :! : : :.,'!: :.:/:/ |,' |: :|!: :! : i:.:.::::ヽ.:.:.:.:.:.:.:.:l ,イ /|: :.|: : : :|: : : :.!|: :/:/ |! .|:.リ|: :|:.:.:|: : : : :ハ:.:.:.:.:.:.! . / / ! ,r|: : : :|: :.'"丁/ ̄` |! !,'十ァ!、:.|: : : :.|: !:`! _,/ |:.! |: : : :| ,rfj ̄ヾ、 ! / |ム」_:リ!: : :.,':.:|:::「 | ト.|: : : :K {| ::::::リ l / ,イ}:::::::ハ,!: :.:/:.:.,'::::| V:.ハ: : :.| ゛ー '' K.__,/ }:.:.:/:.::/::::リ V: |: : :ト . xxxx ,. `"''" //}:::/: :.,' ただちに逃げてください... V:ハ : |:::\ __ "'''''' /イ:::::/: :./ リハハヽ-t`/ \ _,. イ//l/!/|/! ,..、 / /~\ ヽ‐、 / / / リ /: : :\ _ __,.ィ| イ ,.へ `< ヽr‐ァ―=‐、 くr! : : : : : }フ´ \ ̄ハ:.:.:.:ハ イ ,、〆``ー /:.:/::/ ハ . |ト、: : : : :/ ヘ::|: !.:.:.:ハ ∨ ̄ / .:/::/ / i! ただちににげろのガイドライン www.geocities.jp/ust7800870/index.html
- 589 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 08:56:35.82 ]
- 沖縄は良いところです。
- 590 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 09:24:40.85 ]
- ただし原住民にとってのみだが。
- 591 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 20:38:18.40 ]
- 暑い所は嫌だなあ。PCが熱暴走しやすくなるし。
- 592 名前:デフォルトの名無しさん mailto:sage [2011/04/16(土) 13:08:21.87 ]
- >>591
昨日は暑かったけど、ビデオカードが膨張したのか接触不良を起こして 画面がいろとりどりの模様になって停まっていました。 夏場はエアコンがないと人もPCも死にそうになりますね。
- 593 名前:デフォルトの名無しさん mailto:sage [2011/05/05(木) 17:29:52.29 ]
- アライメントを逐一管理するのがめんどいんですけど、
コンパイラーなりリンカーオプションで、スタックからヒープまで 一括して指定することはできんとですか。 環境:GCC と CL。
- 594 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 00:29:02.79 ]
- マクロ書いて、めんどくさくならない程度に短くして対処するんじゃだめじゃろか。
- 595 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 09:27:44.52 ]
- 質問です。
画像処理で画素同士の加算や減算をSSEで高速化したいのですが, 速くなりません。 処理は, int型で, for(i = 0; i < width*height; i++) dst[i] = src1[i] + src2[i]; といった簡単なものです。 これに対して, ポインタを__m128iに変え, ループ回数を4分の1にし, 加算を_mm_add_epi32に変更しました。 しかし, 速度はint型とほとんど変化はありません。 平均化フィルタをSSEで実装したところ, 2倍近く高速化できたので, こちらもうまくいくと思ったのですが・・・。 もしどなたか原因がわかる方がいましたら, ご教授お願いします。
- 596 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 10:20:14.97 ]
- 結論から言うとメモリの転送がボトルネックです。
書き出しのアライメントを揃える事とstreamを使う事で何割かは改善出来ますが、基本的に速く出来ません。 最適化とは遅い部分を探し出す事に他なりません。 安直にSSEとかマルチプロセッサにしようと思わず、真にボトルネックを見つけられるようになりましょう。 真に遅い部分が分かったなら、平均化フィルタと何が違うのか、どうしてもう速く出来ないのかが理解出来るようになります。
- 597 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 11:55:38.13 ]
- つまり, メモリがボトルネックになっている以上, いくら演算速度をあげても効果は薄いということですね。
高速化に対するアプローチも教えていただき, 大変勉強になりました。 速度に影響する要因をまだ一部しかわかっていない私には難しいかもしれませんが、これから知識を得ていきたいと思います。 御回答ありがとうございました。
- 598 名前:デフォルトの名無しさん mailto:sage [2011/06/13(月) 15:11:06.75 ]
- >>596
メモリの転送がボトルネックなのか、演算部分がボトルネックなのかは どうやって判断すればいいのですか?つまりどこを見たらよいのか。 あるいはあなたはどうやってますか? ツールとか使うのでしょうか?
- 599 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 01:59:27.76 ]
- メモリに対する操作や演算の大半は、ツールを使って調べるまでもなく、単純で十分に短い。
なので、ソースコードを眺めれば、そこがSIMDを使う事で高速化すべきか否かは、すぐに見分けが付く。 演算そのものが単純で短い場合は、複数種の演算を1命令にまとめることが出来るかどうかで判断していい。
- 600 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:12:38.27 ]
- >>598
理論値と実際の処理時間の差で見積もる。 また、CPU メーカのプロファイラを使えば、命令のリタイア数とか、キャッシュミスなどのイベントの数を計測できる。
- 601 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:21:34.39 ]
- Cのソース眺めるだけじゃわからんだろうに、汗で判断できるぐらいにならんと
- 602 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:46:45.40 ]
- 最適化もしない状態のことだったりして
- 603 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 07:12:37.77 ]
- CPUのつもりになってメモリアクセスパターンを想像したら見えてくるかもしれんね
- 604 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 12:49:22.23 ]
- >>600
理論値ってアセンブラニーモニックを命令毎にスループットやレイテンシの累計計算して 全体で何クロックかかるかを算出した値という意味ですか? それで実際にどれだけクロックかかるかとの比較をする、と。
- 605 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 15:49:14.35 ]
- メモリ参照をいかに少なくするかでしょ、今時の高速化は
- 606 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 20:56:50.75 ]
- >>598
すまんレス遅れた。 メモリのアクセス回数と演算回数は見積もれるな? c[i] += d[i] * e だったらeはレジスタに乗っているものとして無視して、 読み込み2回(c, d)、書き込み1回(d)、加算1回(+=)、積算1回だ。 回数を見積もったら、加減積算はそのまま、メモリアクセスと除算とsqrtは10倍、その他sin/pow/log/expとかは100倍するんだ。 比率はいい加減なので、数倍しか違わないなら全体的に最適化。 その中で、演算が効いてそうならSIMD化だ。 あとは、何よりも実測が重要。
- 607 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:38:17.15 ]
- >>606
ありがとうございます ソースの式から各演算毎にウエイトを用いてかかるコストを見積もるって意味だったんですね。 それでメモリアクセスより演算のコストの方が高そうであればSIMD化すると。 例の c[i]+=d[i]*eの場合 メモリアクセスコスト 3*10=30 演算コスト 1+(1*10)=11 なのでメモリアクセスのほうがコストが高いから、SIMD化しても早くならないだろうと考えるわけですね。 >書き込み1回(d) 揚げ足とるつもりではないのですが これは(c)への書き込みの間違いですよね?
- 608 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:44:29.40 ]
- SSEで例えると、メモリの読み書きはSSEでやったほうが断然高速だから
そんなコストとか馬鹿な計算する以前に速くなることは確定している。
- 609 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:57:58.94 ]
- そんな前時代的などんぶり計算しても意味ないよ
プロファイラにかけな
- 610 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 01:38:06.85 ]
- キャッシュが考慮されてないよね
- 611 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 01:49:45.83 ]
- > 間違いですよね?
その通り。 >>608 総和とか本当にメモリがボトルネックだとスカラでやっても大して変わらない。 >>609 そう、机上は本当に大ざっぱな見積もりだけで基本的には実測が重要。 でもVTuneなんかは他にも項目が多過ぎて目星付けるのも勘がいるんだよ。
- 612 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 16:31:35.18 ]
- SSE使わんと絶対にプリフェッチされない、とかだったら正しかった。
- 613 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 21:26:27.67 ]
- >>610 畳み込みとの違いのヒントを示し忘れてた。
同じアドレスを複数回読むなら、最初の1回を見積もりに入れておけばいい。 勿論キャッシュに入らないサイズだと全てカウントする必要がある。
- 614 名前: ◆0uxK91AxII mailto:sage [2011/06/16(木) 15:08:44.21 ]
- メモリ周りがボトルネックなら、prefetch*とmovnt*。
とりあえず、CPUによっては32[bit]のmovntiは遅いから使わない方向で。 実行環境が単一でない場合、大雑把な見積もりで十分だと思ってみる。
- 615 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:07:18.11 ]
- VCの__declspec(align(16))や#pragma pack(push, 16)って
一時オブジェクトには効かないんでしょーか? std::map、std::pair周りをソースひっぱってきて、__m128を含んだクラスを 受け取れるようにしたんですが、 aligned_stl::pair<int, hoge> pairArg = aligned_stl::make_pair(1, Hoge); mapFuga.insert(pairArg); とやるといけるけど mapFuga.insert(aligned_stl::make_pair(1, Hoge)); とすると、一時オブジェクトがアラインされてなくてこけます・・・・ 何か抜け道ないですかね(´・ω:;.:...
- 616 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:20:21.30 ]
- 間違えたorz
”make_pairの返す一時オブジェクトが”アウトですた。 make_pair(1, Hoge); ←×(落ちる。) aligned_stl::pairArg(1, Hoge); ←○(落ちない。) なのでコンストラクタで直接渡せばいけるけども。 Hogeにもpairにもアライン指定つけてるんだけどなぁ・・・
- 617 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:22:04.01 ]
- また間違えた・・・・連投すみませんorz
誤:aligned_stl::pairArg(1, Hoge); ←○(落ちない。) 正:aligned_stl::pair<int, hoge>(1, Hoge); ←○(落ちない。)
- 618 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 22:44:49.03 ]
- mapの方がアライメントされてないんじゃない?
- 619 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 23:38:54.68 ]
- std::pair<int, hoge>からaligned_stl::pair<int, hoge>へのコードがバグってるんじゃないの
- 620 名前:618 mailto:sage [2011/07/03(日) 00:21:26.44 ]
- 適当な事書いたと思ったけど、std::mapにカスタムアロケータでいけるっぽい
ttp://ideone.com/sOWl6
- 621 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 02:45:36.94 ]
- >>618
mapの方は、__declspec(align(16))みたいなことはしてませんが カスタムアロケータを渡しており、カスタムのpair(aligned_stl::pair)を使うように指定してます。 >>619 わかりづらくてすみませんorz std::pairは一切使っておらず、aligned_stl::pairのみです。 make_pairもaligned_stl::pairを返します。 >>620 ありがとうございます、Win7 64bitのVC2008Expressで動かしてみましたが カスタムアロケータのc.insertで、Hoge()の引数なしのコンストラクタで落ちます(x_ = static_x) Hoge hoge; c.insert( ::std::make_pair<int,Hoge>(i, hoge) ); とやると、make_pairのところのコピーコンストラクタで落ちます( x_ = src.x_)。 なので、前回書いたのと同様に Hoge hoge; std::pair<int, Hoge> pairArg(i, hoge); とやってからpairArgを渡すと落ちませんでした(c.insertのみ。d.insertは落ちる)。 どうもpairに関してはアラインメント指定しなくても、中のメンバが アラインメント指定されていれば問題ないようですね(アロケータだけでよい?)。 もうちょっと試してまた報告します。 ただ、2008だとアラインメント指定が一時オブジェクトに対して効かないと考えたほうが いいのかもしれませんね(´・ω:;.:... (インライン展開された場合は除く) ありがとうございました。
- 622 名前:621 mailto:sage [2011/07/03(日) 03:25:25.25 ]
- あと、x64をターゲットにすれば落ちませんでした(デフォルトのアラインメントが16バイトだから?)
ついでに質問なのですが、>>620のchar unused1__とunused2__はどういう意味でしょうか?
- 623 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 03:47:36.78 ]
- それって構造体のメンバのアライメント指定であって、アドレスのアライメント指定する機能って基本的になくね。
x64だと関数の始まりのスタックは16バイトアライメントになるようになってるから、問題発生しにくいとか。 というか、落ちる落ちない以前にデバッガで逆アセ見れば、どういうコードが生成されているかすぐわかると思うんだが。
- 624 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 04:52:17.82 ]
- >構造体のメンバのアライメント指定であって
あああ、なるほど・・・x64なら安全、と考えるのは危険ですね。 >逆アセ見れば 見てます、きっちりmovaps使ってますw で、ウォッチ窓で見ると一時オブジェクト側のアドレス下位1バイトが0でないので 明らかにアラインされてないのが問題です。 __m128を使うだけなら、構造体の代入演算子やコピーコンストラクタで _mm_loadu_psとか使えばいいんでしょうけど。 誤解されるような書き方だったかもしれません、決して手詰まりというわけではないです。 どうにかしてアラインメント保ったままmapに突っ込めないかなー、というだけでした。
- 625 名前:618 mailto:sage [2011/07/03(日) 11:13:12.43 ]
- ダメ、だったか・・・ (Initial D 星野好造風に)
2010だからこっちでは本来の動作確認はできないけど、コレならどうだろう ttp://ideone.com/h4QFh
- 626 名前:621 mailto:sage [2011/07/03(日) 15:51:09.00 ]
- >星野好造風に
渋すぎるwww ありがとうございます、試して無事動きました(#if 1でも0でも) 予測しておられた?通り、char unused1__が含まれていようと問題ないんですね。 構造体の型自体は(__m128のような16byte境界を要求するものが含まれていれば) 先頭アドレスが16byte境界でさえあればいいような配置になっているけど、 2008は関数の返す一時オブジェクトのアドレス調整が抜けている、ということかな・・・ 大変参考になりました、ありがとうございました。
- 627 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 22:56:56.22 ]
- int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する 簡単。 char str1[] = "abcde"; char * str2 = "abcde"; 上と下は同じでどっちを使ってもいい。
- 628 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 22:59:55.40 ]
- sizeof(str1) != sizeof(str2)
- 629 名前: ◆0uxK91AxII mailto:sage [2011/07/04(月) 00:40:54.13 ]
- str1++;
- 630 名前:sage [2011/07/05(火) 07:42:33.24 ]
- sizeof とか return とかにかならずカッコをつける人がいるけど何で?
- 631 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:17:06.42 ]
- sizeofとdefinedは関数として意味が通ってるから括弧付けちゃうな。
(a || b) && (c || d) も括弧いらないけど、あった方が読みやすいのと似てる。 returnに括弧付ける人の気持ちは聞いた事が無いから分からない。
- 632 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:18:59.63 ]
- 間違えた(a && b) || (c && d)だ。
- 633 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:43:27.32 ]
- >>630
sizeofの中身によって括弧つけたりはずしたりしてるのかい? おれはそんなとこ気を使っても意味ないと思うので常につけてる。 sizeofの括弧省略してるコードってほとんど見たこと無いしな。
- 634 名前: ◆0uxK91AxII mailto:sage [2011/07/05(火) 14:20:59.67 ]
- >>630
struct s{int i;}; sizeof struct s; :b
- 635 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:23:54.89 ]
- 20年以上C書いてるけど、sizeof のカッコが省略可能なんて知らなかった…実際そんな記述を見たことがなかった。
return にはカッコつけない。
- 636 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:33:01.76 ]
- return (0); とかは見たことあるけど、sizeof int は見たことないからなぁ。
- 637 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:36:15.27 ]
- それは違反です
- 638 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 22:56:13.54 ]
- 余分なカッコが多すぎるコードってみにくくて嫌いだ。
if (a == 0 && b == 0 || c == 0 && d == 0) if ((((a == 0) && (b == 0)) || ((c == 0) && (d == 0)))) この二つだと上の方がはるかに見やすいと個人的には思うが、 見やすさを優先してカッコをつけるとか言って下のように書く人がいる。
- 639 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 23:13:08.81 ]
- LISPに慣れているせいか、かっこをつけておくと
式の構造が立体的に(ネストが深いほど浮き上がって)見えるんだ
- 640 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 23:16:36.97 ]
- 確かに人間が見ると見やすいかも知らないが、
人間以外(コードアナライザの類とか)には 見やすくないと判断されるんで仕方がなくつけてる。
- 641 名前:デフォルトの名無しさん mailto:sage [2011/07/06(水) 00:43:52.44 ]
- >>638
if ( ((a == 0) and (b == 0)) or ((c == 0) and (d == 0))) って書く。論理演算はキーワード使う方がビット演算との取り違えも防げる。
- 642 名前:デフォルトの名無しさん mailto:sage [2011/07/06(水) 00:54:25.86 ]
- AndAlsoですね、わかります
- 643 名前:デフォルトの名無しさん mailto:sage [2011/08/01(月) 22:47:25.26 ]
- >>638
何処からが"余分"なのかを巡って紛糾する事も多し。
- 644 名前: ◆0uxK91AxII mailto:sage [2011/08/02(火) 00:52:38.09 ]
- #define EQUAL(a, b) (a==b)
#define OR(a, b) (a||b) #define AND(a, b) (a&&b) if (OR(AND(EQUAL(a, 0), EQUAL(b, 0)), AND(EQUAL(c, 0), EQUAL(d, 0)))) 見づらいって言うか、吐き気がするほど読みづらい。
- 645 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 08:50:56.65 ]
- こんな手法でちまちま高速化したところで、もっと簡単なGPGPUの並列処理に
圧倒されるだけ。
- 646 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 19:46:47.70 ]
- GPGPUが簡単? OpenCLの厄介さを身を以て知って濃い。
- 647 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 22:19:04.98 ]
- if ((!a && !b) || (!c && !d))
- 648 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 22:20:48.41 ]
- 括弧が
- 649 名前:デフォルトの名無しさん [2011/10/10(月) 19:26:30.72 ]
- 指定桁数で四捨五入する以下の関数の実行速度を上げたいの。
(valueは0〜9999、digitsは0〜5が保証される) SSE使って高速化頼む。 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]; }
- 650 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:27:11.99 ]
- ベクトル化は不要よ。
- 651 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:39:28.17 ]
- あら、なんかデジャブ
- 652 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:49:57.12 ]
- >>649
最適化スレで終了宣言してからにしろよ
|

|