- 1 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 02:55:36 ]
- C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。
- 171 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 00:39:33 ]
- だから何故?
煽ってるんじゃなくて純粋に。
- 172 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 19:45:57 ]
- 無知のまま過ごすのは恥だし勿体ないので団子でも名無しでも回答くれないかな。
名無しが答えられるかどうかは疑問だけど。
- 173 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 20:29:55 ]
- ∩___∩
. \ | ノ ヽ \ / ● ● | \| ( _●_) ミ そんなエサでおれが釣られるかクマー! 彡、 |∪| ,/.. ヽ ヽ丿/ /⌒| / \__ノ゙_/ / ===== 〈 _ノ ==== \ \_ \ \___) \ ====== (´⌒ \ ___ \__ (´⌒;;(´⌒;; \___)___)(´;;⌒ (´⌒;; ズザザザ
- 174 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 07:45:25 ]
- 都合が悪くなるとすぐ逃げるか話そらすからな。
結局161が図星だったのか。
- 175 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 10:20:33 ]
- 名無しが寂しそうにしてるから構ってやれよw
- 176 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:41:54 ]
- ビット演算の代数的な性質、それを導き出す公理が知りたい
算術演算から式変形だけでアセンブリ言語のコードを導き出せるようになりたい
- 177 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:31:09 ]
- コンパイラでも作りたいの?
- 178 名前:デフォルトの名無しさん [2009/01/07(水) 23:00:55 ]
- メモリアクセスとかを考慮すると構造体より配列のほうが高速?
- 179 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:02:43 ]
- >>178
同じ。
- 180 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:13:42 ]
- SSE2でnビット左rolってどうやって記述すればいいのですか?
- 181 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:34:34 ]
- Intelのマニュアル読みなさい
- 182 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/08(木) 08:10:02 ]
- 好きなの使え
;;【16bit×4並列】 movdqa xmm1, xmm0 psllw xmm0, N psrlw xmm1, 16-N pand xmm0, xmm1 ;;【32bit×4並列】 movdqa xmm1, xmm0 pslld xmm0, N psrld xmm1, 32-N pand xmm0, xmm1 ;;【64bit×2並列】 movdqa xmm1, xmm0 pslld xmm0, N psrld xmm1, 64-N pand xmm0, xmm1 【↓こっからまだ存在してないCPU向け】 protb xmm0, xmm0, N ;; 8bit×16用 AMD SSE5 protw xmm0, xmm0, N ;; 16bit×8用 AMD SSE5 protd xmm0, xmm0, N ;; 32bit×4用 AMD SSE5 protq xmm0, xmm0, N ;; 64bit×2用 AMD SSE5 あと要素毎に変量が変えられる命令もサポートされてる。 俺は実用性を思いつかないが何かしら使える用途があるんだろう。 ちなみに128ビットフルは、場合によるので省略する。 4バイト単位ならpshufdとかのシャッフル命令使った方がいい。
- 183 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 11:55:57 ]
- 俺の質問には答えずに人の質問には答えるんだな。
要素ごとのは、例えば最上位に立っているビットからNビット欲しいとか色々使い道はあるよ。 floorみたいのを自力で実装しようとすれば分かる。
- 184 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/08(木) 12:46:20 ]
- サーセンwwwpandじゃなくてporだwww
- 185 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 14:29:17 ]
- >>179
うほ? >>178の意味がいまいち分からんが、 char array[0x100]; と struct{char value;} array[0x100]; だったらレジスタサイズにパディングされる分、構造体の方が早くね? ちなみに、同じ事だが容量気にして構造体のなかでshortとか使うと パデイング入るんでメモリに無駄が発生する。 まぁ、パディングを知っていれば無駄を防ぐこともできるけど。
- 186 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 05:48:58 ]
- 構造体にすればパディングされると決まっているわけではない。
だからその例だけだとどちらとも言えない訳だが。 構造体のメンバを一部だけshortにするのは意味が殆どない(寧ろ遅くなる)という点については同意。
- 187 名前:デフォルトの名無しさん [2009/01/11(日) 01:26:48 ]
- >>185
short array[3]; と struct{short value1;short value2;short value3;} array; でどっちが高速かという意味です。
- 188 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:44:37 ]
- 配列のindexが定数なら変わらんだろ
アセンブラ見ろ
- 189 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 01:50:19 ]
- >>185
> struct{char value;} array[0x100]; > だったらレジスタサイズにパディングされる分、構造体の方が早くね? pragmaやattributeでパックしない限りpaddingは入らないだろ。
- 190 名前:,,・´∀`・,,)っ-●◎○ [2009/01/11(日) 06:03:24 ]
- 16とか32になるのはいいけどメモリアドレッシングで使えるscaleが8倍までなんだよな。
添字によるアクセスは思わぬ性能低下を起こすことがある
- 191 名前:,,・´∀`・,,)っ-●◎○ [2009/01/11(日) 06:05:36 ]
- >>189
構造体やその配列の場合、パディングが入る。 デフォルトが4バイト単位だったかな?
- 192 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:18:30 ]
- おまえほんとにだんごか?
デフォルトなんて決まってるわけ無いだろ
- 193 名前:,,・´∀`・,,)っ-●◎○ [2009/01/11(日) 10:25:51 ]
- まあデフォルト値は処理系依存だな。
>>189の言ってることが嘘ってことで。 少なくともパディングが入らない保障はない。
- 194 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 10:51:19 ]
- コンパイラ依存だよな。
歴史的な理由で当時の最長のレジスタがdoubleだからCPUのアライメントが8byte推奨で、コンパイラも8byteに詰めてた気が。 もしかしたらx86じゃなくてPowerPCかも知れん。
- 195 名前:デフォルトの名無しさん [2009/01/11(日) 14:47:57 ]
- VCやGCC辺りはパディングが入る。
Bitmapヘッダをそのまま構造体で読み取ろうとして引っかかった やつも少なくない筈。(VCならpragmaを使えばパディングを消すことができる) 一応32bitCPUならVC、GCC共にcharもshortも32bitで確保される。 64bitなら64bitで確保されるとか聞いたことがあるが真偽は不明。 蛇足だが、VCでchar array[5];などと確保すると確保した容量+3 の領域が確保される。
- 196 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:41:20 ]
- kikyou.info/diary/?200812#i24_1
> つまり最大でポインタ二つ分のデータを保持しています。LP64の場合は128bitとなります。ILP32の場合は64bitとはならず、パディングの関係でLP64と同じく128bitとなります。 8byte?
- 197 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:44:14 ]
- 将来AVXの1024bit SIMDが使えるようになった際に、128byteにパディングされるとかなるとイヤだな。
その頃にはメモリは数十GBで128byteなんてゴミみたいなもんだろうけど。
- 198 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/11(日) 15:47:54 ]
- その頃までにSIB.scaleのビット拡張してほしいね。1ビット増やせばx16, x32, x64, x128になるのに。
- 199 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 15:59:23 ]
- \ \\ ____ // / /
< _-=≡:: ;; ヾ\ > < / ヾ:::\ > < | |::::::| > < ミ|-=≡、 ミ≡==- 、 |;;;;;/ > < || <・>| ̄| <・> |── /\ > < |ヽ_/ \_/ > / > < / /( )\ |_/ > < | | ` ´ ) | > < | \/ヽ/\_/ / | > < \ \ ̄ ̄ /ヽ / / > < \  ̄ ̄ / / \ > / /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ \\ \ \ ___ / ―\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウ /ノ (@)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキ .| (@) ⌒)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッ .| (__ノ ̄| | ///;ト, ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ \ |_/ / ////゙l゙l; ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ \ _ノ l .i .! | ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ /´ `\ │ | .| ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ | | { .ノ.ノ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ | |../ / . ナンミョウホウレンゲッキョウ
- 200 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 00:40:28 ]
- パディングってむやみに入れるとキャッシュヒット率悪くなってかえって効率落ちたりしないんだろか
- 201 名前:,,・´∀`・,,)っ-●◎○ [2009/01/12(月) 00:42:04 ]
- 逆にキャッシュラインを跨ぐと効率悪くなるんだよ
- 202 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 00:44:50 ]
- >>200-201
どっちも一般論だー 場合によるでしょ
- 203 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 00:58:25 ]
- 実測すれば済む話
- 204 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 01:11:32 ]
- >>191
cygwin上のgccで試してみたけど、padding入らないよ
- 205 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 13:59:38 ]
- >>204
CPUによるが struct foo { char a; double b; }; でパディングが入らなかったら例外起きるだろうが。
- 206 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 14:41:55 ]
- 起こんねーよ、CPUによるが。
- 207 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 14:55:43 ]
- struct {char a, b, c;}だったらパディングなくても例外起きないよ。
コンパイラがまともなら。
- 208 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/12(月) 17:32:33 ]
- アラインメント制約の厳しいプロセッサなら、例外が起きないようにコンパイラが勝手にパディングするんじゃないかな。
しかしミスアラインメントのデータに対するロード・ストアの扱いは各CPUアーキ毎に方針が違ってて面白いな x86のSSE以降は、ミスアラインメントを許すが遅い命令と、許さないが高速な命令の2通りを用意。 対して、POWER/CellのSIMDは下位ビットを無視してロードし、プログラマが勝手にPermuteしてくれっていう扱い。
- 209 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 18:31:15 ]
- 下位ビットを無視してくれるのはわざわざAND取ってアライメントする必要がないから楽でいいよな。
- 210 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 18:38:09 ]
- 中を作る側もデコーダが軽くなるからウマー
- 211 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 01:17:59 ]
- >>205
> >>204 > CPUによるが > struct foo { > char a; > double b; > }; > でパディングが入らなかったら例外起きるだろうが。 なぜ勝手にdoubleが入ってるんだww 誰もそんな場合の話はしていない。 団子にこんな基本的なことで嘘つき呼ばわりされたが嘘じゃないってことで >>185 > struct{char value;} array[0x100];
- 212 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 01:46:59 ]
- ところでパディングの入らない環境ってどんな環境だろ?
PC用で32bitプロセッサじゃ大抵入ると思うが。 sizeof(struct{char value;})==4 見たいにね。
- 213 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 02:10:47 ]
- struct{char value;} array[0x100];
printf("%d\n", sizeof(array)); => 256 gcc-4.3.2ではこうなったけど、パディングってそもそも何だ?無効領域?
- 214 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 02:48:14 ]
- >>212
Crayだとchar=short=int=32bitとかが普通らしい。 PC用じゃないけど。
- 215 名前:デフォルトの名無しさん mailto:age [2009/01/13(火) 17:31:55 ]
- >>213
ゴメン sizeof(struct{char value;})じゃ1だね。 sizeof(struct{char v1;short v2})じゃ4になったから試さずに 書いちゃった。メンバーが同じサイズなら配列化されるっぽいね。
- 216 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 19:04:45 ]
- 1つの構造体中でサイズ違いのアクセスが発生するかどうかによって変わるのじゃない。
連続の同一単位アクセスだけなら必要ないし、むしろ最適化にも邪魔だと思うんだよね? struct{char a;} arrayo[10]; struct{char a; char b;} arrayp[10]; struct{char a; char b; char c;} arrayq[10]; struct{char a; int b;} arrayr[10]; /* inserted */ struct{int a; char b;} arrays[10]; /* interted */
- 217 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/13(火) 21:09:54 ]
- 俺的に配列は__declspec(align(32))がデフォです
- 218 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 21:34:41 ]
- 32?
16じゃないのか?
- 219 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/13(火) 23:06:38 ]
- AVX化を視野に入れてるから
- 220 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 08:14:08 ]
- Alphaには16bitレジスタなかったよん
|

|