07/10/01 19:33:27
>>123
C++でおk
128: ◆0uxK91AxII
07/10/01 23:04:52
>>123
一つのみも可。
ex) addsd
129:デフォルトの名無しさん
07/12/31 11:50:57
下がり過ぎ
130:デフォルトの名無しさん
08/11/08 21:50:37
SSEで大部分が記述された
正規表現エンジンって知りませんか?
131:デフォルトの名無しさん
08/11/09 00:12:17
闇雲にSSEを使えば速くなるってもんじゃないし、そんな阿呆な代物ないでしょ。
# 速度に寄与する肝腎な箇所に使っているってことなら話は別だが。
132:デフォルトの名無しさん
08/11/09 01:43:59
sseで正規表現・・・どこで使ったものやら
133:デフォルトの名無しさん
08/11/10 14:07:10
SSEって並列処理や積和なんかが1命令化で速くなる。
端からデータを舐めていくような処理はあまり効果ないよ。
特に検索には向かない。
134:デフォルトの名無しさん
08/11/10 14:17:20
bit列のマッチングはどう?
1bitずつずらしたのをxorしてall 0になったかどうか調べるとか
135:デフォルトの名無しさん
08/11/10 21:40:31
strlenをSSE2でやる人がいるくらいだし、その応用でstrchr/strstrのような単純な検索はできると思う。
ただ、正規表現となるとうまく使うのは難しいと思う。
136:デフォルトの名無しさん
08/11/18 03:23:27
sse4.2じゃないのか
137:,,・´∀`・,,)っ-●◎○
08/12/21 11:48:46
固定文字列部分を抽出してBoyer-Moore法とかで検索するのが良く使われる方法。
strstrなんかはSIMDを使った力技検索に置き換えることができる。
>>136
確かにあれは速いようだ
138:,,・´∀`・,,)っ-●◎○
08/12/21 11:51:30
固定文字列部分ならともかく「大部分」をSIMDに置き換えることに意味はない。
文字クラス程度ならSSE4.2で一括判定みたいなのも可能になるかと思うけど
139:デフォルトの名無しさん
08/12/21 12:13:43
つうかそんなのAltiVecでとうの昔にやられてる事だしな。
Intelは必要な命令(シャッフル、MIN/MAXなど)が揃うまでにどれだけかかるんだ。
ルーチンごとにSSE1があるか、2があるかと判定しなくちゃいけなくて面倒くさい。
140:,,・´∀`・,,)っ-●◎○
08/12/21 12:18:35
Macのこと言ってるのか?
SSE3以上使える前提できめうちで組めるからかえって楽だろw
大体にAltiVecに文字列比較命令なんてねーよ。
汎用レジスタ-SIMDレジスタ間のダイレクト転送命令ないし
レジスタ値を比較してbranchフラグを更新する命令もない。
そもそも更新が停まってるだけだろ。
141:,,・´∀`・,,)っ-●◎○
08/12/21 12:30:26
SSE2の16バイト単位の文字列同時比較なんてこれだけだぞ
(MMX(SSE)での8バイト同時比較でもこいつの64bit版を使えばいい)
pcmpeqb → pmovmskb → test → branch
SSE4.1だと
pcmpeqb→ptest→branchでおk
AltiVecだとpmovmskb相当のことをMSBの縮約いちいちマスク&シフトを繰り返した上
いったんメモリにストアしてから汎用レジスタで読み直さないといけない。
pmovmskbなんてIntelプロセッサでは1サイクルでこなせる処理だがAltiVecなんて
ここだけで何十サイクルもかかる。
なにかと俺がコケにしてるCell SPEのほうがまだ使えるよ。
SPUにはMSBじゃなくてLSBのビット縮約命令がある。
要するに
AltiVec=保守されてない時代遅れの命令セット
俺も使ってたからよくわかるよ。
142:,,・´∀`・,,)っ-●◎○
08/12/21 12:47:01
俺の経験上文字列サーチでAltiVec使うと遅くなるケースのほうが多い。
だからMacOSでもstrcpy/memcpyみたいな分岐の必要ない操作に限ってだけAltiVecが内部的に使われてる。
143:デフォルトの名無しさん
08/12/21 13:31:59
同時比較でいいならロードして比較してvec_all_eq()するだけじゃね?
ストアと読み出しはいらん。
144:,,・´∀`・,,)っ-○◎●
08/12/21 18:51:16
>vec_all_eq()
あのさー、それ複合関数だから。
ではマスク生成+縮約+ストア+汎用レジスタにロードって操作を1つの組込関数に纏めただけ。
1インストラクションで済んでるわけではない。
アセンブリコード読んだことある?無いだろうけど。
CPUネイティブのベクトル比較命令であるvcmpequb自体は、SIMDレジスタ上にマスクを生成するのみ。
マッチしたのか、マッチしてないのか、マッチした場合、どこの位置でマッチしたのかっていう判定は
汎用レジスタ側でやるしかないんだよ。
145:デフォルトの名無しさん
08/12/21 19:51:08
お前こそvcmpequbの仕様を読んだ事あるのかと。
> The CR6 is set according to whether all, some, or none of the elements compare equal.
146:デフォルトの名無しさん
08/12/21 19:59:03
最近論調がおとなしくなってきて改心したのかと思えば、
内心人を見下してるのは変わってないんだよな。
147:デフォルトの名無しさん
08/12/21 20:04:05
あ、なんでアセンブリコードとか的外れな事言ってるのかようやく分かった。
最適化オプションを全く指定しないと確かに複合になるね。
ていうかさあ、デバッグ用とはいえ確かにこのアセンブリは変態だけど
つまりはお前は大口たたいておきながら
その実>>143を言われて顔真っ赤にして焦ってアセンブリ出力を確認したんだろ。
恥ずかしいなあ。
148:,,・´∀`・,,)っ-○◎●
08/12/21 20:06:12
「.」付き版はcr6を更新するからptest相当のことだけはできるよ。それは正しい。
どこでマッチしたかを求めるには汎用レジスタ側でやんないといけない。
pmovmskb相当の命令がないから遅いんだって。
Cell SPEだと7ビットシフトしてギャザリングし、ビットスキャンすれば位置が求まるけど
149:,,・´∀`・,,)っ-○◎●
08/12/21 20:07:28
>>147
で、pmovmskbの代用命令はどこにあるの?
150:デフォルトの名無しさん
08/12/21 20:08:21
っヒント:もうL1に乗ってる
151:デフォルトの名無しさん
08/12/21 20:09:45
>>149
無いよ。
そこを叩きたいなら叩いてくれ。
152:,,・´∀`・,,)っ-○◎●
08/12/21 20:11:31
そんなことは聞いてない。
SSE*にはSIMDレジスタ上のベクトルデータのMSBを縮約してダイレクトに汎用レジスタに転送する命令がある。
bsfと組み合わせればマッチ位置まで簡単に求めることができる。
AltiVecには、そういう命令は、ない。
153:,,・´∀`・,,)っ-○◎●
08/12/21 20:12:47
>>151
なら結局遅いじゃん。
154:デフォルトの名無しさん
08/12/21 20:15:38
支離滅裂だな。
それが初めから分かってるなら慌ててアセンブリ確認なんてしてないだろ。
百歩譲って今お前が力説したい事にスポットを当てるなら
all_xx()が複合であるかどうかなんてどうでもいいんだからな。
ていうかstrchなのかstrstrなのかハッキリしろよ。
反論するのに都合の良い方を選択してるだけじゃねーか。
155:,,・´∀`・,,)っ-○◎●
08/12/21 20:16:13
慌ても確認もしてないよ
156:デフォルトの名無しさん
08/12/21 20:17:49
じゃあall_xxが複合だと言ったのはどこのだれですか?
結局gather出来ないんだから、そこはどうでもいいんだけどね。
157:,,・´∀`・,,)っ-○◎●
08/12/21 20:19:12
>>154
どっちもSSEより遅いよ。
PPCからの移植にSSE1まで使えるか2まで使えるかとか気にしなきゃいけないと思う方が馬鹿だよ。
Win32でもSSE2が使えないCPUなんてどのみちSIMDユニットの実装もショボイから最適化対象としては無視して良いくらいだよ。
非SIMDのパスに飛ばしておけばいい。
158:デフォルトの名無しさん
08/12/21 20:22:57
まあそれも論点ずれてるんだが、建設的な話をしたいからお前に合わせよう。
確かにSSE2が使えないCPUは大抵しょぼいから無視しても良いんじゃないかな。
強いて言うならAMD(笑)が例外だが。
でもx86陣営がそういう路線を歩んでいるのは間違いなくて
SSE3, SSSE3, SSE4.1, SSE4.2, AVX, LNIといちいちチェックしなくてはいけない日々が続く事には変わりない。
159:デフォルトの名無しさん
08/12/22 00:20:05
Core2 Duoと比較して、Athlon X2がそれほど酷いとは思えないんだけど。
160:デフォルトの名無しさん
08/12/22 00:39:51
整数演算はひどいな
161:デフォルトの名無しさん
08/12/22 12:59:27
一晩考えて、何故団子がgatherに必死なのかが分かった。
団子はトリップ検索が主だから検索対象が極端に小さくて、
詳細な位置の特定の方がボトルネックになっているんだな。
162:,,・´∀`・,,)っ-○◎●
08/12/22 18:05:57
tawake
163:デフォルトの名無しさん
08/12/22 18:42:38
続きをどうぞ
164:デフォルトの名無しさん
08/12/23 01:34:18
>>161
誰が笑いを取れとw
165:デフォルトの名無しさん
08/12/24 07:45:53
変な事言った?
166:,,・´∀`・,,)っ-○◎●
08/12/24 19:00:25
一晩考えることじゃないだろ。俺のブログ一通り読んだら30分以内に否定される。
167:デフォルトの名無しさん
08/12/24 20:19:04
で?
168:,,・´∀`・,,)っ-○◎●
08/12/24 20:52:06
笑いしかとれなかったね
169:デフォルトの名無しさん
08/12/24 23:46:08
そうだね。俺もだけど団子も痛い子だね。
170:デフォルトの名無しさん
08/12/25 00:24:23
痛いのはお前だけですからwww
171:デフォルトの名無しさん
08/12/25 00:39:33
だから何故?
煽ってるんじゃなくて純粋に。
172:デフォルトの名無しさん
08/12/26 19:45:57
無知のまま過ごすのは恥だし勿体ないので団子でも名無しでも回答くれないかな。
名無しが答えられるかどうかは疑問だけど。
173:デフォルトの名無しさん
08/12/26 20:29:55
∩___∩
. \ | ノ ヽ
\ / ● ● |
\| ( _●_) ミ そんなエサでおれが釣られるかクマー!
彡、 |∪| ,/..
ヽ ヽ丿/ /⌒|
/ \__ノ゙_/ / =====
〈 _ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザザ
174:デフォルトの名無しさん
08/12/27 07:45:25
都合が悪くなるとすぐ逃げるか話そらすからな。
結局161が図星だったのか。
175:デフォルトの名無しさん
08/12/27 10:20:33
名無しが寂しそうにしてるから構ってやれよw
176:デフォルトの名無しさん
09/01/04 11:41:54
ビット演算の代数的な性質、それを導き出す公理が知りたい
算術演算から式変形だけでアセンブリ言語のコードを導き出せるようになりたい
177:デフォルトの名無しさん
09/01/04 12:31:09
コンパイラでも作りたいの?
178:デフォルトの名無しさん
09/01/07 23:00:55
メモリアクセスとかを考慮すると構造体より配列のほうが高速?
179:デフォルトの名無しさん
09/01/08 00:02:43
>>178
同じ。
180:デフォルトの名無しさん
09/01/08 00:13:42
SSE2でnビット左rolってどうやって記述すればいいのですか?
181:デフォルトの名無しさん
09/01/08 00:34:34
Intelのマニュアル読みなさい
182:,,・´∀`・,,)っ-○◎●
09/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:デフォルトの名無しさん
09/01/08 11:55:57
俺の質問には答えずに人の質問には答えるんだな。
要素ごとのは、例えば最上位に立っているビットからNビット欲しいとか色々使い道はあるよ。
floorみたいのを自力で実装しようとすれば分かる。
184:,,・´∀`・,,)っ-○◎●
09/01/08 12:46:20
サーセンwwwpandじゃなくてporだwww
185:デフォルトの名無しさん
09/01/09 14:29:17
>>179
うほ?
>>178の意味がいまいち分からんが、
char array[0x100];
と
struct{char value;} array[0x100];
だったらレジスタサイズにパディングされる分、構造体の方が早くね?
ちなみに、同じ事だが容量気にして構造体のなかでshortとか使うと
パデイング入るんでメモリに無駄が発生する。
まぁ、パディングを知っていれば無駄を防ぐこともできるけど。
186:デフォルトの名無しさん
09/01/10 05:48:58
構造体にすればパディングされると決まっているわけではない。
だからその例だけだとどちらとも言えない訳だが。
構造体のメンバを一部だけshortにするのは意味が殆どない(寧ろ遅くなる)という点については同意。
187:デフォルトの名無しさん
09/01/11 01:26:48
>>185
short array[3];
と
struct{short value1;short value2;short value3;} array;
でどっちが高速かという意味です。
188:デフォルトの名無しさん
09/01/11 01:44:37
配列のindexが定数なら変わらんだろ
アセンブラ見ろ
189:デフォルトの名無しさん
09/01/11 01:50:19
>>185
> struct{char value;} array[0x100];
> だったらレジスタサイズにパディングされる分、構造体の方が早くね?
pragmaやattributeでパックしない限りpaddingは入らないだろ。
190:,,・´∀`・,,)っ-●◎○
09/01/11 06:03:24
16とか32になるのはいいけどメモリアドレッシングで使えるscaleが8倍までなんだよな。
添字によるアクセスは思わぬ性能低下を起こすことがある
191:,,・´∀`・,,)っ-●◎○
09/01/11 06:05:36
>>189
構造体やその配列の場合、パディングが入る。
デフォルトが4バイト単位だったかな?
192:デフォルトの名無しさん
09/01/11 10:18:30
おまえほんとにだんごか?
デフォルトなんて決まってるわけ無いだろ
193:,,・´∀`・,,)っ-●◎○
09/01/11 10:25:51
まあデフォルト値は処理系依存だな。
>>189の言ってることが嘘ってことで。
少なくともパディングが入らない保障はない。
194:デフォルトの名無しさん
09/01/11 10:51:19
コンパイラ依存だよな。
歴史的な理由で当時の最長のレジスタがdoubleだからCPUのアライメントが8byte推奨で、コンパイラも8byteに詰めてた気が。
もしかしたらx86じゃなくてPowerPCかも知れん。
195:デフォルトの名無しさん
09/01/11 14:47:57
VCやGCC辺りはパディングが入る。
Bitmapヘッダをそのまま構造体で読み取ろうとして引っかかった
やつも少なくない筈。(VCならpragmaを使えばパディングを消すことができる)
一応32bitCPUならVC、GCC共にcharもshortも32bitで確保される。
64bitなら64bitで確保されるとか聞いたことがあるが真偽は不明。
蛇足だが、VCでchar array[5];などと確保すると確保した容量+3
の領域が確保される。
196:デフォルトの名無しさん
09/01/11 15:41:20
URLリンク(kikyou.info)
> つまり最大でポインタ二つ分のデータを保持しています。LP64の場合は128bitとなります。ILP32の場合は64bitとはならず、パディングの関係でLP64と同じく128bitとなります。
8byte?
197:デフォルトの名無しさん
09/01/11 15:44:14
将来AVXの1024bit SIMDが使えるようになった際に、128byteにパディングされるとかなるとイヤだな。
その頃にはメモリは数十GBで128byteなんてゴミみたいなもんだろうけど。
198:,,・´∀`・,,)っ-○◎●
09/01/11 15:47:54
その頃までにSIB.scaleのビット拡張してほしいね。1ビット増やせばx16, x32, x64, x128になるのに。
199:デフォルトの名無しさん
09/01/11 15:59:23
\ \\ ____ // / /
< _-=≡:: ;; ヾ\ >
< / ヾ:::\ >
< | |::::::| >
< ミ|-=≡、 ミ≡==- 、 |;;;;;/ >
< || <・>| ̄| <・> |─ /\ >
< |ヽ_/ \_/ > / >
< / /( )\ |_/ >
< | | ` ´ ) | >
< | \/ヽ/\_/ / | >
< \ \ ̄ ̄ /ヽ / / >
< \  ̄ ̄ / / \ >
/ /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ \\ \ \
___
/ ―\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウ
/ノ (@)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッキ
.| (@) ⌒)\ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョウホウレンゲッ
.| (__ノ ̄| | ///;ト, ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
\ |_/ / ////゙l゙l; ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
\ _ノ l .i .! | ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
/´ `\ │ | .| ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
| | { .ノ.ノ ナンミョウホウレンゲッキョウナンミョウホウレンゲッキョウナンミョ
| |../ / . ナンミョウホウレンゲッキョウ
200:デフォルトの名無しさん
09/01/12 00:40:28
パディングってむやみに入れるとキャッシュヒット率悪くなってかえって効率落ちたりしないんだろか
201:,,・´∀`・,,)っ-●◎○
09/01/12 00:42:04
逆にキャッシュラインを跨ぐと効率悪くなるんだよ
202:デフォルトの名無しさん
09/01/12 00:44:50
>>200-201
どっちも一般論だー
場合によるでしょ
203:デフォルトの名無しさん
09/01/12 00:58:25
実測すれば済む話
204:デフォルトの名無しさん
09/01/12 01:11:32
>>191
cygwin上のgccで試してみたけど、padding入らないよ
205:デフォルトの名無しさん
09/01/12 13:59:38
>>204
CPUによるが
struct foo {
char a;
double b;
};
でパディングが入らなかったら例外起きるだろうが。
206:デフォルトの名無しさん
09/01/12 14:41:55
起こんねーよ、CPUによるが。
207:デフォルトの名無しさん
09/01/12 14:55:43
struct {char a, b, c;}だったらパディングなくても例外起きないよ。
コンパイラがまともなら。
208:,,・´∀`・,,)っ-○◎●
09/01/12 17:32:33
アラインメント制約の厳しいプロセッサなら、例外が起きないようにコンパイラが勝手にパディングするんじゃないかな。
しかしミスアラインメントのデータに対するロード・ストアの扱いは各CPUアーキ毎に方針が違ってて面白いな
x86のSSE以降は、ミスアラインメントを許すが遅い命令と、許さないが高速な命令の2通りを用意。
対して、POWER/CellのSIMDは下位ビットを無視してロードし、プログラマが勝手にPermuteしてくれっていう扱い。
209:デフォルトの名無しさん
09/01/12 18:31:15
下位ビットを無視してくれるのはわざわざAND取ってアライメントする必要がないから楽でいいよな。
210:デフォルトの名無しさん
09/01/12 18:38:09
中を作る側もデコーダが軽くなるからウマー
211:デフォルトの名無しさん
09/01/13 01:17:59
>>205
> >>204
> CPUによるが
> struct foo {
> char a;
> double b;
> };
> でパディングが入らなかったら例外起きるだろうが。
なぜ勝手にdoubleが入ってるんだww
誰もそんな場合の話はしていない。
団子にこんな基本的なことで嘘つき呼ばわりされたが嘘じゃないってことで
>>185
> struct{char value;} array[0x100];
212:デフォルトの名無しさん
09/01/13 01:46:59
ところでパディングの入らない環境ってどんな環境だろ?
PC用で32bitプロセッサじゃ大抵入ると思うが。
sizeof(struct{char value;})==4
見たいにね。
213:デフォルトの名無しさん
09/01/13 02:10:47
struct{char value;} array[0x100];
printf("%d\n", sizeof(array));
=> 256
gcc-4.3.2ではこうなったけど、パディングってそもそも何だ?無効領域?
214:デフォルトの名無しさん
09/01/13 02:48:14
>>212
Crayだとchar=short=int=32bitとかが普通らしい。
PC用じゃないけど。
215:デフォルトの名無しさん
09/01/13 17:31:55
>>213
ゴメン
sizeof(struct{char value;})じゃ1だね。
sizeof(struct{char v1;short v2})じゃ4になったから試さずに
書いちゃった。メンバーが同じサイズなら配列化されるっぽいね。
216:デフォルトの名無しさん
09/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:,,・´∀`・,,)っ-○◎●
09/01/13 21:09:54
俺的に配列は__declspec(align(32))がデフォです
218:デフォルトの名無しさん
09/01/13 21:34:41
32?
16じゃないのか?
219:,,・´∀`・,,)っ-○◎●
09/01/13 23:06:38
AVX化を視野に入れてるから
220:デフォルトの名無しさん
09/01/14 08:14:08
Alphaには16bitレジスタなかったよん