1 名前:デフォルトの名無しさん [04/05/28 22:00] どうぞ
281 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 14:24:27 ] 光成 SSE でぐぐったらこんなページに出会った。 homepage1.nifty.com/herumi/index.html あー、確かにこれはいいものだわ。
282 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 15:17:55 ] >>281 XBYAK なんじゃこりゃ、すげぇ
283 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 06:38:58 ] むしろこのスレで知らない人が居るのに驚いた訳だが
284 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 10:04:48 ] 禿同
285 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:08:56 ] 今更ながら MMX を使用した MMX_MemCpy() を作ってみたが普通の memcpy() と10%も速度が変わらなくて萎えた…
286 名前:・∀・)っ-○◎● mailto:sage [2007/03/13(火) 22:33:09 ] FSBで律速されるからね。 キャッシュ内で使う場合は十分意味ある。
287 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 22:56:37 ] >>286 の言う通りメモリの速度に依存する。 それに64byteとか128byteごとにキャッシュされるんだから 4byteずつコピーしようが8byteずつコピーしようが殆ど同じ。 重要なのはプリフェッチ。 L1のサイズをきちんと考慮してプリフェッチしてからmemcpy()を繰り返してもいけたりして。
288 名前:285 mailto:sage [2007/03/14(水) 07:59:02 ] そうなのか… 8Byte境界なら MM7 レジスタまで使用して64Byte転送するとかやってみたんだが同じなのか。orz
289 名前:名無し募集中。。。 mailto:sage [2007/03/14(水) 21:13:59 ] 数%でも高速化されるならそれは凄い事だと思うよ
290 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:42:23 ] 後は用途によってノンテンポラル関連を使うとかだよな。
291 名前:285 mailto:sage [2007/03/15(木) 23:32:55 ] >>289 最初はそう思おうとしたが、さらに速いマシンで実行したら効果がさらに薄くなったんだよつД` 1Gコピーしても50msも変わんねぇ
292 名前:・∀・)っ-○◎● mailto:sage [2007/03/15(木) 23:38:30 ] そんな大容量のコピーするからこそかわらんのですよ キャッシュの中でうまく捏ね回すのがSIMDプログラミングの掟
293 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 23:42:26 ] 正直単純なメモリ転送を最適化する暇があるなら、転送中ヒマをもてあましてる演算器の活用方法でも考えたほうが。
294 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 13:38:50 ] 32bitのDIB(R8G8B8A8)を24bitのDIB(R8G8B8)にアルファブレンドする関数を書いているのですが、 Cでテーブルを使って実装すると、テーブルへのアクセスがボトルネックとなって、 他の処理と比べて重くなってしまいます(テーブルは256x512x4で、L2にも入らない)。 そこでMMXを使ってみようと考えたのですが、 MMX命令を用いた計算方法そのものは分かるものの、 ピクセル単位の異なる二つの画像を、上手くMMXレジスタに配置する方法が分かりません。 どなたかご教授下さいませんか。 #どちらのDIBも、横幅が8の倍数であることは保障されています。
295 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 14:25:33 ] mov ecx, pixelcnt mov esi, DIB32 mov edi, DIB24 label: mov mm0, esi mov mm1, edi --なんか処理-- add esi, 4 add edi, 3 loop label 後は最初か最後にediからの読み込みに1Byte前後して読んでシフトする処理が必要になるけど、 ループの外で処理すればいいし、テーブル参照するよりゃ速いんじゃね?
296 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 13:51:06 ] >>295 どうもありがとうございます。 シフト処理を入れたら上手く配置できて、 二倍近く速度が出るようになりました。
297 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 17:21:13 ] >295 どーでもいいけど、 mov mm0, [esi] mov mm1, [edi] じゃね?
298 名前:・∀・)っ-○◎● mailto:sage [2007/04/04(水) 21:13:55 ] っていうかmovdじゃね
299 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 02:13:45 ] movq な。
300 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 02:18:01 ] あ、この場合movqでなくてmovdになるか…。
301 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 04:15:49 ] つまり団子は普通に名無しで潜伏してる
302 名前:・∀・)っ-○◎● mailto:sage [2007/04/06(金) 21:41:06 ] イミフ
303 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 14:50:25 ] ttp://www.cutt.co.jp/book/4-87783-169-1.html こんな本が出てるね。初学者にはありがたいかも。 SSSE3やSSE4の解説は載ってないっぽいけど、仕方ないか・・・。
304 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 20:06:23 ] 上下で都合2マソ取ろうっての?ボッタクリ過ぎだろ。 x86アセンブラ入門+IntelのPDFで十分。
305 名前:・∀・)っ-○◎● mailto:sage [2007/05/27(日) 16:37:14 ] >>303 要らん 操作画面の横でPDF表示する為のサブディスプレイを2万で買ったほうが有意義
306 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 16:53:13 ] ひでぇ商売だ
307 名前:・∀・)っ-○◎● mailto:sage [2007/05/27(日) 16:59:20 ] 著者の情報調べてみた ttp://www.vector.co.jp/vpack/browse/person/an001828.html 最近の作品さっぱり無いな
308 名前:デフォルトの名無しさん [2007/05/27(日) 17:41:16 ] mmxって廃止なの? 代わりに何をつかえばいいの?
309 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 17:44:22 ] >>303 不要。 最近のコンパイラは、SSEを自動的に使ってくれる。 むしろ、その最適化にやさしいコードを書いた方がよい。 手動で最適化したところで、大抵数パーセントも上がらない。
310 名前:・∀・)っ-○◎● mailto:sage [2007/05/27(日) 18:29:03 ] SIMD Intrinsicsの解説やってる実践的な本のほうが欲しいな。 それもIntelで十分か。 どうせならAltiVecとかCellのSPUとかも扱って移植性とパフォーマンスを両立する方法とかね。
311 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 22:26:02 ] >>310 Intrinsicsの解説自体はコンパイラのドキュメント読めば十分理解できるだろ。 むしろ実践的なアルゴリズムをいかにSIMDに落とし込むかという話のほうが読み応えないか?
312 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 18:33:00 ] >>309 アセンブラでSSE使うことが不要というのは言いすぎだと思う。 まあ、結果としてこの本が不要という結論にはなるだろうが。
313 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:27:06 ] >>310 移植とかは、COINSにお任せしておけば良いのでは
314 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:50:18 ] 金融SE、プログラマにこの辺やOpenMPのHPC系技術をおぼえてほしいんだがな。 誰もわからんからユーザーの俺がプログラミング。どういうこっちゃ。
315 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:59:53 ] 金融で、そんなにシングルスレッド性能がいるの??
316 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 01:07:04 ] 金融の一部の分野は大量データの高速計算や 複雑な計算を瞬時に行う必要がある。
317 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 07:57:11 ] へー、どんな計算?
318 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 16:21:28 ] >>316 こういう奴ってさも物事を大げさに書きたがるが、具体的な例や数字は 一つも書かないから結局何を言っているのかさっぱりわからないんだよな。
319 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 19:24:02 ] >>318 こういう想像力の無い奴に物事を説明するのって疲れるんだよな
320 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 19:56:50 ] 想像力……www
321 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:09:35 ] >>318 デリバのプライシングとか、ALMでのVaR計算とかなんだが詳しく書いても 多分分らんと思うが。
322 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:29:00 ] 知らないことを想像しろと言われても、ヒントもなしでは結構難しいと思うのだが。
323 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:31:13 ] リロードしてなかったorz
324 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:37:36 ] >321 それは具体的な「業務内容」であって、具体的な「例」でも「数字」でも無いと思うんだ。 ここが金融系の板ならそれで通じるかもしれんが、ここはム板だから。 例えば必要精度何桁でどんな数式を秒間何万件処理する必要があるとか、そういうこと。 専門用語でお茶を濁す事は具体例では無い。
325 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:52:19 ] >>324 たとえば百万件のデータから求める解を得るためにニュートン法等を数種類、複数回駆使ししたり モンテカルロシミューレーションで数十万回の試行を行ったりといったこと。 これらはスレッド単位の高速化とマルチスレッドでの高速化により絶大な効果が得られる。 しかし高速化の技術を知るエンジニアは極めて少ないのが実情。 ってとこ。
326 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 21:51:55 ] モンテカルロ法でSIMD使って絶大な効果ってどんだけ単純なシミューレションだよ。 マルチコア、マルチCPU環境等でマルチスレッドなら同意できるが、 中途半端にSIMD使っても結局速くなった気がするだけ。 がちがちにコーディングする暇があるなら速くなるかもしれないけど そんなことで工数がホイホイ増えるくらいなら計算機にお金使ったほうがマシ。
327 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 22:00:56 ] >>326 高速化するために数学的手法を駆使したMCなんだが MCがすべて単純な繰り返しと思っているレベルの頭脳では話にならん。
328 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 22:27:38 ] >327 お前プログラマじゃないだろ? 具体例の無い説明といい、「xxを駆使」とかいかにも営業が使いそうな言い回しといい、胡散臭すぎる。
329 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 22:35:50 ] >>328 流れを読め。 オレ=>>314 これからこの話題につながってるんだが。 また別にお前に依頼してる訳ではないから具体的に書く必要性もない。
330 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 23:43:09 ] 以下、「お前こそ」禁止。
331 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 00:14:39 ] うーむ、よくみりゃ誤字ってたな。 >>327 MCが単純って書いた覚えはないよ。 金融工学の問題ってSIMDがクリティカルに利いてくるような 単純な代数計算なのかって話。
332 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 00:43:42 ] たとえばExceで用意されているNormdistといった確率分布関数のようなものは 商用ライブラリーを購入する手があるが、処理スピードと精度のトレードオフの調整が利かない。 これをCで組むと四則演算+EXPの多用となる。普通にプログラミングするとかなり遅いがSIMDを使うと大幅に 高速化する。SIMDにEXPがあると良いのだが。
333 名前:・∀・)っ-○◎● mailto:sage [2007/06/01(金) 00:59:18 ] その辺はニュートン法使ったりテーラー展開したり。 Intelが数学用ライブラリ出してなかった? x87のアレはどうせマクロ命令なので。 ちなみにdivpsとかで得られる商は近似値で精度低い。
334 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 01:06:33 ] 標準関数よりニュートンのほうが早いってことあるのか? ニュートンは方程式を解くのに多用するが初期値問題があるしな。 MKLのEXPは使い方によるだろうが、メモリにデータを貯める必要があるときは高速だろうが そうでないとメモリアクセスの遅さがネックになってあまり役立たない。
335 名前:・∀・)っ-○◎● mailto:sage [2007/06/01(金) 01:12:44 ] SIMDで組み直せば標準関数のスループット越えることなんてざらにあるよ。 あくまでSIMD使うからこそ意味があるんだけど。
336 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 01:24:31 ] へ-そうなんだ。 とすれば試してみる価値あるな。 expのニュートンは簡単そうだし。。。 初期値どうするかな
337 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 01:33:41 ] 金融の問題って収束が遅いモンテカルロでどうにかなるのか。
338 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 01:37:50 ] 使わないですめばそれにこしたことはない。 解析的に求める方法がなければモンテカルロを使うしかない。 という理由で使われる。
339 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 09:24:19 ] 結局金融には直接関係ない部分の話になっちゃったね。
340 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 00:29:40 ] >>335 よく考えたら f(x)=exp(x)で f'(x)=exp(x)だからexpをニュートンで求めるのは無理だな。 テーラー展開でやってみたんだが ・テーラー展開式 exp(x)=肺^n/n! ・階乗部分をすべて初期値設定 0!:n0=1 1!:n1=1 2!:n2=2 ・・・ x:入力値 expsse:求める値 x=_mm_mul_pd(x,x); expsse=_mm_add_pd((expsse, _mm_div_pd(x, n0)); x=_mm_mul_pd(x,x); expsse=_mm_add_pd((expsse, _mm_div_pd(x, n1)); x=_mm_mul_pd(x,x); expsse=_mm_add_pd((expsse, _mm_div_pd(x, n2)); ・・・ こんな感じ。for分使わずn=20までやって精度9桁くらいだったかな。 しかし処理時間は非常に遅かった。 時間がなかったのであまり詳しく調べなかったがコーディングに問題あるかな?
341 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:32:46 ] Visual C++ 2005 で ssse3 の intrinsics が使えるようだ
342 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 06:08:53 ] いつのまにSSSE3まで使えるようになったのか インラインアセンブラのニーモニックは使えるが
343 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 14:01:57 ] >342 お前が>333でネタ振ったんだから責任もって>340のフォローしろや
344 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 19:50:20 ] レイテンシのチェインがある mulpd→divpd→addpd 対象データが複数あるなら複数インターリーブするとスループットが稼げます。
345 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:33:01 ] >>344 その理論で行けばSPEのスカラも多くはスループット1クロックで処理出来るんだがな。 つーかx86にその理論を適用するにはレジスタが足(ry
346 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 20:34:12 ] レジスタリネーム
347 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 20:39:13 ] XORでゼロクリアしたり(Core 2からSIMDレジスタにも適用) データ移動(部分データ移動は不可)するとレジスタリネームのヒントになる SIMDレジスタは内部的に80程度はあるからそこそこいけるんでない? Cellの演算ユニットはIntelアーキのそれの倍のレイテンシがかかる。 SPEのスカラが性能でないのは、そもそもベクタ化すら出来ないデータを 並列処理でレイテンシ隠蔽するには限界があるから。
348 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 21:00:36 ] 演算器が先にストールする。
349 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 21:06:06 ] 連投失礼。 レジスタリネームとかって言ってる人のコードの書き方に興味がある。 よっぽどコンパクトな演算じゃない限り演算結果をレジスタから追い出さなきゃいけないと思うんだが。
350 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 21:36:42 ] 問題は十分な精度が得られないことだと思う 速度を上げることはそんなに難しくない 定数除算を逆数との乗算に置き換える ↓ a4*x^4 +a3*x^3 +a2*x^2 +a1*x + a0 ↓ (((a4*x+a3)*x+a2)*x+a1)*x+a0 ↓ tmp=a[N] for(i=N-1;i>=0;i--) tmp=tmp*x+a[i] ↓ (初期化部分は省略) LOOP: mulpd xmm4, xmm0 mulpd xmm5, xmm1 mulpd xmm6, xmm2 mulpd xmm7, xmm3 addpd xmm4, [esi] addpd xmm5, [esi] addpd xmm6, [esi] addpd xmm7, [esi] add esi, 16 sub ecx, 1 jnz LOOP
351 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 21:50:00 ] いや除算は近似値命令だから乗算に置き換えるだけである程度 精度確保できるんじゃないの? Intelはx87倍精度は内部的に80ビット精度に展開して処理してるけど SSEは精度度外視してたような。 精度が必要ならx87のほうがいいかもしれない
352 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:11:04 ] 近似値なのはrcpps,rsqrtps命令で、 divpsは近似値じゃないんじゃない?
353 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 22:21:41 ] いや近似値。内部的に逆数近似値と乗算してるだけ。
354 名前:・∀・)っ-○◎● mailto:sage [2007/06/05(火) 22:22:19 ] ちなみに本物の除算は何十クロックもかかりますから。
355 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:28:36 ] >>353 そのソースは? rcppsのレイテンシとmulpsのレイテンシを足しても divpsのレイテンシよりずっと短いよ。 インテルの命令セットマニュアルには rcpps,rsqrtpsの説明には近似値であると明記してあるけど、 divpsには近似値なんて書いてないよ。
356 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:32:08 ] x87を比較対象にしてるでしょ。 そら80bitなら何十クロックもかかるわな。
357 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:08:46 ] >>350 スマン、教えてほしい (アセンブラは苦手なだが)多項式近似のパタンは和算→乗算の繰り返しでやるしかないという認識なのだが 乗算を先に4つやって、あとから和算4つ行うって計算は可能なのか?
358 名前:>>357 mailto:sage [2007/06/05(火) 23:13:47 ] >>344 > 対象データが複数あるなら複数インターリーブするとスループットが稼げます。
359 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:31:26 ] >>358 そういう手があるのか サンクス
360 名前:・∀・)っ-○◎● mailto:sage [2007/06/06(水) 00:30:48 ] >>340 と>>350 の式が一致してない気がするの気のせい?
361 名前:・∀・)っ-○◎● mailto:sage [2007/06/06(水) 00:31:53 ] >>355 すまんそうだったかも。 ただ仮数部全部厳密に求めるほど精度なかったと思う
362 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:34:38 ] >>360 別物。テーラー展開とチェビシェフ系の違い。
363 名前:350 mailto:sage [2007/06/06(水) 01:01:20 ] >>360 >>340 のテーラー展開式とintrinsicsでの実装が一致していない
364 名前:340 mailto:sage [2007/06/06(水) 19:11:56 ] >>344 回答ありがとう。 俺の知識ではいま一つ分らんが命令の並び順に工夫がいるということと 他のデータも同時に処理できたら同時に行うということかな。 >>363 確かに最初がまちがっとる。記述ミスなのできにしないでくだはれ。 ま、exp()だと近似式でやったほうが速そうだね。
365 名前:340 mailto:sage [2007/06/06(水) 19:15:18 ] ところで金融システムをやる人たちはこの辺の技術を ほとんど知らないのだけれど皆さんはどの分野でやられてるのでしょうか?
366 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 21:54:11 ] 信号処理とかゲームじゃないかな。 逆に聞きたいのは、金融の分野で応用効くの? 桁数が必要だろうし、スピードよりも可読性が求められそうじゃ無い?
367 名前:340 mailto:sage [2007/06/06(水) 23:23:51 ] 金融では最近一部グリッドが導入されだしたようだけど HPC分野はほとんど未開拓な状態だと思う。 またSIMDとかMPIなどは外資パッケージソフトの一部では使われている。 SEへの「もっと計算を速くできないか」との要請に対し 自分の無知なことも知らず「莫大な金と時間がかかる」の一点張りで受け入れられないケースが多い。 このため多くのユーザーは高速化は無理なことと思っている。 という状況下、前にも挙げたようにリスク管理やデリバティブ関連などでは高速化へのニーズは高く、 この辺からHPC化が進んでいくと思う。 現時点では、すぐ欲しい計算結果も下手をすると数日かかるといったことが、あたりまえにおこなわれているから・・・
368 名前:・∀・)っ-○◎● mailto:sage [2007/06/06(水) 23:36:08 ] っていうかmsdn2みたけど VC++だと数学関数はSSE2対応ならSSE2版使ってくれるようになってるみたい? 純正の最適化ルーチンより速くしようと考えるのはぶっちゃけかなり無謀かと。
369 名前:340 mailto:sage [2007/06/06(水) 23:57:04 ] exp()はそれほど問題になっていないからいいんだけど 問題は上に書いたことなんだ。 皆さん、金融システムやらないかい?
370 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 01:16:32 ] 仕事にする気はないが話題として興味はあるな。 重たいのはDBとかで、SIMD化するようなものでは無いイメージがある。
371 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 01:19:32 ] そんなのアプリによるのでは?
372 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 01:23:59 ] 書き込みタイミングも全体パフォーマンスには注意が必要
373 名前:デフォルトの名無しさん [2007/06/18(月) 23:11:59 ] 【派遣ネガティブ根性チェック】 3つ以上、チェックがつけばアナタの性格はひん曲がっており、 ネガティブ負け組派遣人生を歩んでいます。 □派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □昼食は必ず派遣先の社員と行くべきだ □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □派遣先に尻尾を振り、かわいがってもらうことが大切だ □チビは派遣先にかわいがってもらいやすから派遣には有利だ
374 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 00:18:26 ] ねぇねぇこれSSE使ってかける? int RSHash(string cr) { int b = 378551; //Ramdom Ranges I've chosen (can be modified) int a = 63689; int hash = 0; //Output hash int i; //Temp number that scrolls through the string array for(i = 0; i < cr.length(); i++) //Loop to convert each character { hash = hash * a + cr[i]; //Algorithm that hashs a = a * b; } return (hash & 0x7FFFFFFF); //Returns the hashed string }
375 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 00:43:56 ] PMULUDQか。 2つの文字列を同時に処理するなら使えるかな?
376 名前:・∀・)っ-○◎● mailto:sage [2007/06/22(金) 00:54:28 ] intは32ビットね? MMX/SSE2の掛け算は16ビット×16ビットまでしかできないから 半端に使ってもかえって遅くなるような。 依存関係がきれいに解決できてpmaddwdが適用できれば速くはなりそうだが。
377 名前:・∀・)っ-○◎● mailto:sage [2007/06/22(金) 00:55:54 ] >>375 ああそっちがあったかど忘れしてた
378 名前:・∀・)っ-○◎● mailto:sage [2007/06/22(金) 01:07:24 ] ループの内側を2倍に引き伸ばすとこうか? hash = (hash * a * a * b) + (cr[i] * a * b) + cr[i+1]; a = a * b * b; 引き伸ばしていけば並列演算できそうなところは結構あるんだが、さて・・・ ああ頭いてぇ
379 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:46:48 ] SSE入門したいのですが みんなどこから手をつけはじめたのですか?
380 名前:341 mailto:sage [2007/06/22(金) 02:34:18 ] 使い方 intrin.hをインクルードすることでSSE3のintrinsicsまでは使える SSSE3のintrinsicsは自前で各命令を定義することで使えようになる 例 #include <intrin.h> /* MMX */ __MACHINEX86X_NOWIN64(__m64 _mm_abs_pi8(__m64)) __MACHINEX86X_NOWIN64(__m64 _mm_sign_pi8(__m64, __m64)) __MACHINEX86X_NOWIN64(__m64 _mm_alignr_pi8(__m64,__m64, int)) /* XMM */ __MACHINEX86X_NOIA64(__m128i _mm_abs_epi8(__m128i)) __MACHINEX86X_NOIA64(__m128i _mm_sign_epi8(__m128i, __m128i)) __MACHINEX86X_NOIA64(__m128i _mm_alignr_epi8(__m128i,__m128i, int)) 問題点 palignr命令の3番目の引数が定数でもエラーにならない
381 名前:341 mailto:sage [2007/06/22(金) 02:38:44 ] >>380 の訂正 問題点 palignr命令の3番目の引数が 『定数でない場合に』 エラーにならない
382 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:15:51 ] >>379 俺も最初はこんなのから始めて動作を確認していった。 (この書き方、aがポインタか配列かって区別がややこしいんだが) #include<stdio.h> int main() { int i,a[]={12,23,34,45}; __asm{ movdqu xmm0,a paddd xmm0,xmm0 movdqu a,xmm0 } for (i=0; i<4; i++) printf("%d\n",a[i]); return 0; }
383 名前:・∀・)っ-○◎● mailto:sage [2007/06/22(金) 23:23:53 ] >>381 すまん意味不明。エラーにならないならどんなコード吐くの?
384 名前:341 mailto:sage [2007/06/23(土) 00:28:50 ] 定数の場合 0f 3a 0f c1 01 palignr mm0, mm1, 1 定数でない場合 0f 3a 0f c1 ac palignr mm0, mm1, DWORD PTR _i$[ebp]
385 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:10:46 ] IA-32 SIMDリファレンス買ってみた。 図がいぱい載ってるぞw
386 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 09:40:42 ] >>340 exp(x)=2^(y1+y2)と変換する(y1は整数部y2は少数部) y2を多項式近似で求めると速くできる 10桁程度の精度でよければ7次で可能 >>465
387 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 12:38:59 ] >exp(x)=2^(y1+y2)と変換する(y1は整数部y2は少数部) それをやるならy1は整数、y2は-0.5<=y2<0.5と選んだ方がよさそうだね。
388 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:19:41 ] >>387 そうだね。 ところでy1が正のときはビットシフトで行けるんだが 負の時はいい方法ないかね?
389 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:06:17 ] IA-32SIMDリファレンスブック こんな本が出てるね
390 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 13:24:55 ] >>303-309
391 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:32:30 ] 書店でぱらっと見た感じではSSSE3まで紹介してるみたいだけど これでどうやって下巻を書くつもりなんだろう
392 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:12:54 ] 誰かSSE2にrcppdとrsqrtpdがない理由を合理的に説明してください
393 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:20:39 ] あえて近似解をDoubleで使う必要はないからだろう
394 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:16:16 ] SSEのrcpps,rsqrtpsって |相対誤差|≦ 1.5×2^-12 って書いてあるから、 仮数部12bitくらいの精度しかないって事だよね?
395 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:17:58 ] rcppsからもってけるから。命令数も倍になるがな。 そして倍精度にそんなトランジスタ割けないというのが合理的理由だろう。
396 名前:395 mailto:sage [2007/07/08(日) 01:27:58 ] あー失礼。トランジスタを割けないという主張は同じなんだが 仕組みとしてはテーブルを引いてるだけのはず。 だから24bitとか32bit分ものテーブルを用意出来るわけが無い。 倍精度を使うような人は精度重視なわけで、 divpdあるんだからどうしてもやりたいんだったらソフトウェアでrcppsから精度上げてくれ、 マイクロコードを用意するのはバカバカしい、ということ。
397 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:42:11 ] >>396 能書き垂れてるんだが 結局393と何が違うんだよ
398 名前:395 mailto:sage [2007/07/08(日) 08:28:15 ] >>397 違いは無い。ただ393だけ言われても392が納得しづらいだろう。 テーブルの要素数が 12bit->4096 24bit->1677万 だけ必要であると考えれば物理的に無理な事が納得出来る。
399 名前:・∀・)っ-○◎● mailto:sage [2007/07/08(日) 13:13:44 ] まあマイクロコード組み合わせればできなくも無いだろうけど クロック数かかる上に【近似】解じゃねぇ
400 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:20:07 ] >>389 この本買ってみたけど、リファレンスいうから命令全部載ってるのかと思ったら載ってなかった 手元にリファレンス的なものがあるといいなと思って買ったのに・・・詐欺だわー超高いし
401 名前:薄汚い派遣の国、日本 [2007/07/15(日) 21:35:53 ] 最近、職場で「出戻り寄生派遣」という言葉が囁かれています。 派遣契約を切られたにもかかわらず「次の派遣先でも切られてしまって生活できません」 などと 言って泣き落としで再契約した派遣のことです。 今月初め、半年前に切った派遣が出社してきてみんなびっくりしました。 影でコソコソ偉い人に泣きついて再契約したそうです。同じ部署の人には黙って・・・ そんなことまでして自宅の近くの派遣先にこだわって人間として恥ずかしくないのですか。 派遣でスキルアップ、派遣で収入アップとか言うなら一箇所にしがみつかず 複数の会社を渡り歩いてください。 ひとつの会社で派遣向けの単調な仕事をしていたらスキルアップなんてありえないでしょう。 身分不相応な商品のローンを払うために派遣だと当然足りない収入は親にも寄生して、 いつ切られるんじゃないかとビクビクしながら人事権のある人間とだけ仲良くし、 契約終了を通知されれば泣き落とし。悲惨な人生ですね。 氏んだほうがいいんじゃないですか。
402 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 19:33:12 ] >>400 download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf これでええやん。 あとはビルトイン関数のヘッダ見ればだいたい書けるだろ。
403 名前:デフォルトの名無しさん [2007/07/21(土) 21:32:10 ] 【派遣ネガティブ根性チェック】 3つ以上、チェックがつけばアナタの性格はひん曲がっており、 ネガティブ負け組派遣人生を歩んでいます。 □派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □仕様とは正社員から口伝されるものだ □口伝された仕様を意図どおり理解できなかったのは自分の責任だ □昼食は必ず派遣先の社員と行くべきだ □自分の仕事で問題が発生しても解決するのは派遣の仕事ではない □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □チビは派遣先にかわいがってもらいやすから派遣には有利だ
404 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:34:11 ] SSE2で、ベクトルの各要素ごとに独立なシフト量を設定してシフトを行うことは不可能 という理解で良いですか? a[0] <<= b[0] a[1] <<= b[1] a[2] <<= b[2] a[3] <<= b[3] みたいな事がやりたいんですが。
405 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:05:42 ] >>404 処理速度は劣るが、シフトの代わりに乗算で処理するとか。
406 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:47:27 ] 残念ながらそれだとスカラーよりも遅くなってしまいました。うーむ
407 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 09:54:29 ] そうか。面白そうな問題なので何とかして高速化したいなあ。
408 名前:・∀・)っ-○◎● mailto:sage [2007/07/29(日) 02:13:32 ] >>404 うん無理。AltiVecだとできるんだよねそれ。
409 名前:・∀・)っ-○◎● mailto:sage [2007/07/29(日) 02:26:32 ] 下位ビット落ちるけどこんなのはどう? cvttpi2ps→指数部操作→cvttps2pi
410 名前:341 mailto:sage [2007/08/25(土) 01:58:03 ] VC++ 2008のIntrinsicsは Intel SSSE3/SSE4.1/SSE4.2とAMD ABM/SSE4aに対応しているようだ
411 名前:・∀・)っ-○◎● mailto:sage [2007/08/25(土) 03:04:10 ] Intelでいうとsmmintrin.hって奴か。 なにSって。
412 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 11:25:57 ] 失礼します。 MMXのシフト系の命令って、ソースオペランドに直値、メモリ、MMレジスタのみですよね? 汎用レジスタ(eaxとか)を書いてもうまく動作しなかった気がするんですが、 VC6,VC8ともに、以下のコードがエラーにならず通ってしまいます。 psllq mm0 , eax 何か勘違いしてますか?
413 名前: ◆0uxK91AxII mailto:sage [2007/08/26(日) 13:46:03 ] >>412 disassembleしてみたまえ。
414 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:50:52 ] >>413 eaxって書いたところがmm0になってました。 インラインアセンブラのバグ? VC6のころからそうなのに VC8でも放置してるのはなんか理由があるのかな。
415 名前:・∀・)っ-○◎● mailto:sage [2007/08/26(日) 17:02:22 ] mm0もeaxも3ビット表現の 0 だもの。 汎用・FP/MM・XMMのレジスタ指定はopcodeで決まるから
416 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:31:27 ] >>415 逆アセしてmm0に見える理由がそれだとしても、アセンブラの文法 としてeaxって書くべきではないところに、そう書いてエラーにしない のはおかしいと思いませんか?
417 名前:・∀・)っ-○◎● mailto:sage [2007/08/26(日) 17:32:25 ] movd eax mm0と movd mm0, eax だとどうなるかな。opcodeで区別してるはずだが
418 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:44:31 ] その命令は見た目どおりに動くので、特にいうことはありません。
419 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 17:09:15 ] >>404 AMDが発表したSSE5で独立シフト量ができるようになるね。 SIMDのローテート命令まで追加されてる。 developer.amd.com/assets/sse5_43479_BDAPMU_3-00_8-27-07.pdf
420 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 04:12:12 ] もう32bit fpと整数はAltiVec互換にしてくれよ AltiVecからSSEに仕方なく移ったマカーな俺にはSSEは使いにくすぎる
421 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 04:17:13 ] でもload/storeのアラインメントの扱いが楽なのはちょっといいと思った
422 名前:・∀・)っ-<コ:彡- mailto:sage [2007/09/04(火) 07:15:10 ] SSE4.1でXMM-汎用レジスタ間のデータ出し入れが簡単になるからシフトやローテートは我慢。
423 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:49:14 ] >>422 もー出てるなら我慢できるけどさ、まだ出てないじゃん。
424 名前:・∀・)っ-<コ:彡- mailto:sage [2007/09/06(木) 00:47:16 ] それ言っちゃうとBulldozerはおろかBarcelonaすら出てないが
425 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 17:12:17 ] MMXのpmull, pmulhはどういう使い方が想定されているのでしょうか? なんか使いにくそうに思えるのですが……。
426 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 19:17:59 ] >>425 pmull : 16 bit で済む時 pmulh : 小数部 16 bit の固定小数点乗算したい時
427 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/10/20(土) 01:26:21 ] xbyakを魔改造するか
428 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:36:46 ] IA-32 SIMDリファレンスブック<下> www.cutt.co.jp/book/4-87783-170-7.html SSSE3まで SSE4はない
429 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 22:52:02 ] だから高いって。
430 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 01:49:44 ] ぼったくりでそれか。マジいらん。
431 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/10/25(木) 01:55:23 ] SDK for 45nm Next Generation Intel Core 2 Processor Family and Intel SSE4 にSSE4.1/4.2のマニュアル一式とエミュレーションDLLがついてるからそれで十分。
432 名前:デフォルトの名無しさん [2007/10/27(土) 05:20:50 ] 総和を求めるなど、一つの変数が共通の場合、SSEを使って計算するCコードを教えてください
433 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/10/28(日) 02:23:19 ] 総和なら簡単じゃん __declspec(align(16)) float a[100]; float dest; //SIMD化前 for (int i = 0; i < 100; i++) { sum += a[i]; } //SIMD化後 __m128i sumx = { 0.0f,0.0f,0.0f,0.0f }; for (int i = 0; i < 100; i++) { sumx = _mm_add_ps(sum, *(__m128*)&a[i*4])); } sumx = _mm_hadd_ps(sumx, sum); sumx = _mm_hadd_ps(sumx, sum); _mm_store_ss(sum, sumx);
434 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/10/28(日) 02:24:14 ] 訂正 //SIMD化後 __m128i sumx = { 0.0f,0.0f,0.0f,0.0f }; for (int i = 0; i < 100; i+=4) { sumx = _mm_add_ps(sumx, *(__m128*)&a[i])); } sumx = _mm_hadd_ps(sumx, sum); sumx = _mm_hadd_ps(sumx, sum); _mm_store_ss(sum, sumx);
435 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:29:38 ] movqに対応する組込み関数ってないん?
436 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:57:18 ] _mm_loadl_epi64
437 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 22:03:36 ] Σ(・ω・ノ)ノエッ
438 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 00:19:03 ] __m128i _mm_loadl_epi64(__m128i*) __m128i _mm_move_epi64(__m128i) void _mm_storel_epi64(_m128i*, __m128i)
439 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:28:07 ] sse4のベンチ見てるとちょっと心配になってくるな。
440 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/11/01(木) 23:00:54 ] >>435 MMXのは無い。 __m64 mm0 = a[i]で既にロードに展開される。てか、コンパイラ任せ。
441 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:03:24 ] x86の話なんですが 64ビット整数のグローバル変数1つを操作する関数が 頻繁に呼ばれるプログラムを作っています。 アセンブラ見ると、32ビットずつ操作しているようなんですが これをMMXを使っていっぺんに操作するようにすれば、高速化しますか? 高速化するなら、MMX勉強してみようかなと思ってるのですが。
442 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:57:23 ] しません
443 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:59:23 ] andとかorとかビット演算だけなら可能性がないとも言えない。
444 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:10:28 ] >>441 double でやればー?
445 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/11/14(水) 23:38:44 ] 関数コールのインライン化のほうがまだ効果あるかもな
446 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:14:35 ] 2つの4byteのデータを先頭から任意の ビット数一致しているかチェックするのに SSEって有効に使えそう?1ビットずつチェック とかアホ過ぎて uint32_t chk_bit(uint32_t master, uint32_t src, uint32_t bit){ この中どうしよう。 }
447 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/12/22(土) 23:53:57 ] 【この中】 return ((master ^ src) >> (32 - bit)) != 0;
448 名前:デフォルトの名無しさん mailto:age [2007/12/24(月) 00:16:33 ] xmmレジスタを128bit intとして使う場合, あるbitが立っているかどうかを高速に調べる方法はありませんか? SSE4.1でptst命令が導入されますが,それまで待ってられません.
449 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 00:30:38 ] xmm0に調べたい値ががあるとすれば movdqa xmm1, [pattern] movdqa xmm2, xmm0 pand xmm2, xmm1 pcmpeqb xmm2, xmm1 pmovskb eax, xmm0 test eax, eax でeaxが0以外ならビットが立ってる。
450 名前:ヽ>´∀`<,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 00:31:51 ] pmovmskbに訂正してくだしあ><
451 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 00:46:27 ] THX やはりpmovmskbで移すしかありませんか... Nehalemまでは64bit int x 2でやっとくのが吉?
452 名前:デフォルトの名無しさん [2007/12/24(月) 11:21:12 ] ptestはPenrynじゃね?
453 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 13:14:13 ] LARGE_INTEGER otime, ntime; 〜略〜 double dt = (double)((ntime.QuadPart - otime.QuadPart) * (1000.0f / f.QuadPart)); をSSE使ってVC8のインラインアセンブラで書くとどうなりますか?
454 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:38:49 ] どう考えてもスカラ演算だよね
455 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:04:35 ] 64bit整数を64bit浮動小数点数に返還するSSE命令は 64bitモードにしかありません VCでは64bitモード用のプログラムにインラインアセンブラは使えません
456 名前:ヽ>´∀`<,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 20:30:13 ] *intrin.hのマニュアルを見ればいいと思うが
457 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:32:45 ] SSEで書く利点なくね?
458 名前:ヽ>´∀`<,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 20:37:16 ] 無いな
459 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:58:49 ] 書けても手間損
460 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:00:24 ] ファイヤーウォール作る時に パケット解析するのにSSE使っても 手間になるだけ?
461 名前:ヽ>´∀`<,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 21:02:06 ] そろそろテンプレ作ったほうがいいんじゃないの。 SSEは大量のデータに同じ処理をかけるときにこそ効果を発揮するんであって 細かい所は従来のx86命令のほうがむしろ速い。
462 名前:ヽ>´∀`<,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 21:03:24 ] >>460 そういうのに向いてるって話は聞いたことがない。
463 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:55:34 ] 単一の64bitや128bit値を何回も計算するときは?
464 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:57:38 ] 汎用レジスタに納まらないサイズ弄るなら効果あるんじゃないの?
465 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/12/24(月) 22:04:42 ] アレはあくまで32ビット値を4つ同時に扱うものであって、多倍長扱うならむしろ64ビットモードで汎用レジスタベースでやったほうがいい。
466 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:15:44 ] ( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー
467 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:49:27 ] PADDQとかの事だろうけどC2Dでもレイテンシ2だしね 実装はcarry selectあたりだろうか
468 名前:451 mailto:sage [2007/12/26(水) 11:18:07 ] >>452 遅レスだが ptestはSSE4.1で,PenrynはSSE4じゃなかった?
469 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 11:52:30 ] SSE4はSSE4.1とSSE4.2の両方を含む呼称(正確には、という事になった) Penrynは4.1のみ Nehalemは4.1と4.2の両方 >>452 で合ってるんじゃねーの?
470 名前:451 mailto:sage [2007/12/26(水) 13:20:32 ] >>469 どうもその様ですね,THX. ttp://pc.watch.impress.co.jp/docs/2007/0925/hot507.htm Penrynならそれほど待たなくて済むなぁ,どうしよう.
471 名前:451 mailto:sage [2007/12/26(水) 13:22:02 ] >それほど待たなくて済むなぁ これは価格が手頃になるのを,って意味です
472 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 13:25:45 ] 64bit浮動小数点数の配列があったとき絶対値が最大の要素を 求めたいのですがSSE2を使って高速にできるでしょうか? 普段はVC++を使ってますがより高速化できるならアセンブラ もつかってみようかと考えてます。OSはVista(64bit)です。
473 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 13:54:20 ] >>472 x64用ののVC++だとデフォルトでSSE2を使うようになっている。 下のを cl /c /O2 /FAsc test.c でコンパイルして、test.cod を見てみるとまあまあのコードが生成されているぞ。 double maxabs(double array[], int size) { double ans = 0.0; for (int i=0; i<size; i++) ans = __max(ans, abs(array[i])); return ans; }
474 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:30:53 ] >>473 Cだと「for (int i=0;」のところでエラーになるので #include <cmath> #include <cstdlib> を付け加えてCPPファイルにしてコンパイルしてみました。 movsdx andpd comisd などが使われていますね。これがSSE2かな? でもこれが本当に高速なコードかどうかはわからないですね。 インテルでMKLというライブラリを出してますがこれはすごいですね。 試したのは行列計算の一部だけ(LU分解)ですが数値計算の本に載っている プログラムをVC++でコンパイルしたものより5倍ぐらい高速です。 数学レベルで新アルゴリズムを開発した可能性は低いので実装レベル の技術が高いと思うのです。 5倍の差は大きいのでSSEなどを勉強して何とか近づきたいのですが 大変かな?
475 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:38:45 ] dou you make correlated random number?
476 名前:451 mailto:sage [2007/12/26(水) 20:38:30 ] >>472 P4用でちょっと古いけど 「ストリーミング SIMD 拡張命令 2(SSE2)を使用した、倍精度浮動小数点ベクトルの最大/最小要素とそのインデックスの検出」download.intel.com/jp/developer/jpdoc/w_max_app_j.pdf
477 名前:472 mailto:sage [2007/12/26(水) 23:15:38 ] >>476 やりたいのは絶対値の最大なのでちょっと違うけどなかなか参考になります。 最大と最小をもとめて絶対値の大きな方をとる方法と 絶対値を計算しながら最大をもとめる方法がありますね。 まあこの辺はいろいろ実験してみないとどれがいいのかわからないですね。
478 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/12/27(木) 02:18:53 ] >>473 VC++だとmaxsdしか使わない予感。 >>473 ベースで、arrayの要素が偶数個で128ビット境界にあってるの前提ならこんな感じ たぶんSSE3くらいは使えるよね?たいしたことに使ってないけど。 #include <pmmintrin.h> double maxabs(double array[], int size) { static const union { __m128d pd; __int64 a[2]; } mask = { 0x7FFFFFFFFFFFFFFFi64, 0x7FFFFFFFFFFFFFFFi64 }; double ans; __m128d ans_pd = { 0.0, 0.0 }; for (int i = 0; i < size; i+= 2) ans_pd = _mm_max_pd( ans_pd, _mm_and_pd(mask.pd, *((__m128d*)&array[i])) ); ans_pd = _mm_hadd_pd(ans_pd, ans_pd); _mm_store_sd(&ans, ans_pd); return ans; }
479 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:05:22 ] >>474 SIMD化の方が簡単で面白そうだから目につきやすいんだけど、そこは最後の手段なんだよね。 配列同士の四則演算では極力全ての演算をまとめて行って、代入を1回で済ます。 行列なんかの三次元的なループはキャッシュに入る長方形のブロック単位で処理をする。 そういうところが出来てればSIMD化しなくても前者で最大2倍くらい、後者は計り知れない程速くなる。
480 名前:474 mailto:sage [2007/12/28(金) 23:06:10 ] >>479 気持ちはわかるけど具体的にはどうやるのかな? 短いので高速化したいプログラムをアップしてみる。 #include <cmath> double LU(int n, double** a, int* ip) { int i,j,k,ii,ik; double t,u,det,*w; w=new double[n]; for(k=0;k<n;k++){ ip[k]=k; for(j=0,u=0;j<n;j++){ t=fabs(a[k][j]); if(t>u) u=t; } if(u==0){ delete[]w; return 0; } w[k]=1/u; } det=1; for(k=0;k<n;k++){ u=-1;
481 名前:474 mailto:sage [2007/12/28(金) 23:08:38 ] 続き for(i=k;i<n;i++){ ii=ip[i]; t=fabs(a[ii][k])*w[ii]; if(t>u){ u=t; j=i; } } ik=ip[j]; if(j!=k){ ip[j]=ip[k]; ip[k]=ik; det=-det; } u=a[ik][k]; det*=u; if(u==0){ delete[]w; return 0; } for(i=k+1;i<n;i++){ ii=ip[i]; t=(a[ii][k]/=u); for(j=k+1;j<n;j++) a[ii][j]-=t*a[ik][j]; } } delete[]w; return det; } 最後のforループが3重ループなのでこの付近が一番スピードに関係してそう。
482 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:33:40 ] キャッシュ効率上げればかんり高速化しそうだね
483 名前:479 mailto:sage [2007/12/29(土) 23:23:23 ] 恥ずかしながらLU分解はやった事無いんだけど 3重のループでa[ii]のラインはiに依存して切り替わり、 a[ik]のラインはkに依存して切り替わるでしょ。 a[ik]のラインはkにつき1度しか切り替わらないからキャッシュにずっと入ってるけど、 a[ii]のラインはkが同じでもiが変わったら切り替わってしまう。 a[ii]のラインは最大k回アクセスがあるから、出来れば切り替えたく無い。 そこで折衷案をとって、a[ik]をもう少し頻繁に切り替える代わりにa[ii]をもう少しゆっくり切り替わるようにバランスを取る。 バランスを取るというのはどういう事かと言うと、 二次元の処理で1000x1000の要素があった時に 1ラインずつ処理するのではなく例えば100x100のマスが10x10個あるものとして処理する。 (0, 0)-(999, 0)を処理してから(0, 1)-(999, 1)の処理をするんじゃなくて、 (0, 0)-(99, 0)まで処理して(0, 1)-(99, 1)...(0, 99, 99, 99), (100, 0)-(199, 0)のような処理の仕方。 今回はループが3重だから、書き換えると6重のループになって頭は最高にこんがらがる。 しかもラインがipによって入れ替わるみたいだから、こういう手法が使えるのかよく分らない。ごめん。 ipがどう変わるかを事前に必要なライン数分計算出来ればいいんだろうけど。
484 名前:474 mailto:sage [2007/12/30(日) 21:31:17 ] >>483 コメントありがとうございます 少し詳細に480のプログラム(LU1)と intelのMKLを使った場合(LU2)とをテストしました。 サイズ(n) LU1(VC++) LU2(MKL) 比率 4 0.218μs 1.140μs 0.191 8 0.796μs 2.680μs 0.297 16 4.087μs 7.460μs 0.548 32 0.0246ms 0.0204ms 1.21 64 0.174ms 0.0656ms 2.65 128 1.31ms 0.271ms 4.83 256 10.2ms 1.435ms 7.11 512 82.4ms 9.13ms 9.03 1024 780ms 66.1ms 11.8 2048 7.58s 0.501s 15.1 4096 60.9s 3.79s 16.1 8192 486.5s 29.9s 16.3 CPU:intel Q6700(3.4GHz) サイズが小さい場合はLU1でもキャッシュの利用効率が高いはずですが 予想どうりLU2との差が小さくなりnがごく小さいときは逆転しています。 たぶんLU2は複雑なやっていてそのため遅くなっているのでしょう。 nが非常に大きくなるとLU1はキャッシュ効率が悪いためLU2に大差をつけられてしまってます。 高速化をめざすならSSEの最適化を考える前にキャッシュ効率を上げる工夫をすべきですね。 となると483のような多重ループのブロック化が必然となるか? まあ、難しそうなので具体的な方法は少し考えてみます。 うまいアイデアがありましたらまたコメントください。(ややスレ違いになりつつあるが)
485 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:03:51 ] ここは一応拡張命令のスレだからねえ。 もし移動するならここかな? ttp://pc11.2ch.net/test/read.cgi/tech/1177808054/l50
486 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:07:51 ] ソフトウェア・プリフェッチの話を絡めつつやれば スレ違いにならなずに済むか。
487 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 18:30:07 ] xmm の not を一命令で求める方法はありませんか? ~0 との xor は無しで
488 名前:487 mailto:age [2008/01/16(水) 20:45:05 ] 上げときます
489 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:28:47 ] pandnでもダメだよな。 そうなると、周りの命令と絡めて実質的に1命令で済ますことを考えるくらいか。
490 名前:デフォルトの名無しさん mailto:age [2008/01/17(木) 00:08:24 ] 無理っぽいねぇ.all 1 の定数を read することを考えれば, cmpeq xmm0,xmm0 で all 1 を作る方が速いか?
491 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/17(木) 00:58:10 ] all 1をロードだとレジスタリネーミングされるので先行実行できる可能性がある。 ケースバイケース。
492 名前:デフォルトの名無しさん [2008/02/19(火) 10:43:09 ] メディアンフィルタを作成したいのですが、 コンパイラがSSEを使いやすいコードはどのように書いたらよいのでしょうか?
493 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 07:38:55 ] メディアンフィルタで自動ベクトル化は難しいなあ。 ソートアルゴリズムをGPUでやるやつみたいに直線的なものにすればやってくれない事は無いけど。 とにかく一番内側のループがベクトル同士の演算になるように心掛ける事。
494 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 00:27:56 ] 行列計算をSSEで行った場合の 解説サイトしらないっすか?
495 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 03:21:26 ] www.google.co.jp/search?num=100&q=%E8%A1%8C%E5%88%97%E8%A8%88%E7%AE%97%E3%82%92SSE
496 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:39:47 ] a1=3.1 a2=4.0 a3=5.5 a4=6.1 r1 = a1^2 + a2^2 + a3^2 - a4^2 r2 = a1+a2 - a3*a4 +a1+a3 + a2*a4 r = r1+r2 こんなのSSEで解きたいんだけどどうすればいいんだろう
497 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 16:25:20 ] dvec.hの cmpeq()した結果が全て0かどうやって判別するの?
498 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 20:26:50 ] if ( _mm_movemask_pd(cmpeq(a, b)) == 0 )
499 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:31:44 ] む〜〜〜 倍精度の絶対値はどうすれば求まるの?
500 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:08:16 ] 学校の勉強か?ちったあ頭使えよ。 方法1(ロード無し): // a = a < 0 ? -a : a; F64vec2 z = _mm_setzero_pd(); a = select_lt(a, z, z-a, a); 方法2(ロード有り): static const __int64 _0x7FFFFFFFFFFFFFFFLL = 0x7FFFFFFFFFFFFFFFLL; F64vec2 m(*(double *)&_0x7FFFFFFFFFFFFFFFLL); a &= m;
501 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:11:01 ] 間違った。mは static const F64vec2 m = 以下省略
502 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:17:45 ] >>500 あーそういうのがあるのですね 何分あほ過ぎて、あきれてるかもしれませんがどうもすいません。
503 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:06:49 ] いいってことよ。 ちなみに絶対値の処理がループに入っていて比率が高い場合はロード有り、 絶対値を取る負荷が低いならロード無しが効率的。 ところで最近rcp_nr()やrsqrt_nr()の精度の低さを嘆いていて もう一段階計算するか素直にdivpsを使うか考えてたんだが ググってみるとdivpsとsqrtpsって最近は6 cycleなのな。typoじゃないのか?速すぎる。 なんかrsqrt_nr()はともかくrcp_nr()って要らない子な気がしてきた。 そもそも何故rcpps, rsqrtpsでVMXみたいに12ビット用意しなかったのかと問いつめたい。 プロセッサは日々速くなるんだから12ビットが最初は大きすぎでも用意するべきだったろう。
504 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 10:06:41 ] 6 cycleというのは、2.0 で割るみたいな単純なケースだけじゃないの?
505 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 10:39:18 ] 0除算ってどう扱うべきなの? 常にチェックするのかな
506 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 11:39:56 ] >>504 情報が古いが248966.pdfを読んでも13 cycleだぞ。これでも十分速過ぎるだろ。 ちょっと前まで40 cycleだったのに。 こりゃ中では12bitのrcppsを持ってるな。逆数取って精度上げが1回で済めば13 cycleでも納得出来る。 >>505 0除算は数学上定義されていない。 プログラムとか関係なく、机上で数式書いた時点でつっこむべきだ。 定義されていないので、当然答えは自分で用意する事。 1. 0で除算する時点で数式が間違っていたと認識し、方法を改める。 2. 除数が0にならないようなロジックにする。 3. 除数が0になった場合の回避策を設ける。 3-1. c = a / (b + 0.001) のようなかさ上げを行う。 3-2. c = a / max(b, 1) のような下限を設ける。 3-3. c = b == 0 ? 0 : a/b のような特別な取り扱いを行う。 4. 結果がNANかを調べて後から計算に失敗している事を認識する。 3はプログラムに組み入れる事になる。3-2と3-3は当然事前に分かればそこで取り扱えばいいし、直前まで分からなければ常にチェックする。 処理によっては無理に回避するよりも4が重要な場合もある。
507 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 12:42:58 ] gccに#include <dvec.h>ってないんだな icc買うしかないか
508 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 13:32:06 ] >>505 常にチェックしなくても、__try { } で囲んで、 0除算例外を __except() で受ける方法もあるよ。 例外を発生させるようにfldcwやldmxcsrで設定する必要があるけど。
509 名前:デフォルトの名無しさん [2008/06/25(水) 14:48:40 ] 複数のスレッドで同時にMMX命令を使う場合に スレッドごとにemmsを呼ぶ必要はありますか? それとも以下のように、複数のスレッドから抜け出た後に 一回だけemmsを呼べばOKですか? #pragma omp parallel for for (int i = 0; i < hoge; i++) { // ここでMMXを使用 (x87命令は使わない) } _mm_empty(); // emmsはこの一回でOK?
510 名前:509 mailto:sage [2008/06/25(水) 16:10:01 ] 何かあったら怖いので スレッドごとにemmsを呼び出すことにしました。
511 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:27:18 ] マルチスレッドでMMXは未対応だけどな
512 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 22:59:19 ] そのへんはOS依存じゃないの?
513 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:10:16 ] いやSSEもMMXもマルチコアとマルチスレッド未対応だろ
514 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:40:22 ] マルチスレッド未対応とはコンテキストスイッチへの対応のことを言っているの? MMX/3DNowはx87FPUとレジスタ兼用だから問題無いし、 SSEはFXSAVE/FXRSTORという専用命令があるから、これも問題なさそうだが。
515 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:50:59 ] そうじゃねー マルチプロセスならコンテクストスイッチ時にSSE/MMXレジスタが 保存されるだろうがマルチスレッドは一つのプロセスの中で複数の スレッドを走らせるので汎用レジスタ退避しかない
516 名前:デフォルトの名無しさん [2008/06/27(金) 01:03:32 ] >>515 なにその糞環境? 晒してみ
517 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:10:51 ] マルチスレッドの実装に依存する話だが 少なくとも Linux は大丈夫だったはず ダメな環境を俺も知りたい
518 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:14:56 ] Windows 95とか? プロセス間でもだめだしそもそも(ry なんてツッコミはいやん
519 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:31:10 ] >>515 1.>>514 に書いてあるように MMXレジスタ = x87レジスタ なのだから、 MMXレジスタが保存されないなら小数点演算も同様ではないのか。 2.特権ユーザでもない限りコンテクストスイッチを禁止できない。 さもなければ誰でもシステムを強制停止できてしまう。 (例:Windows 3.1) 制御できないとしたら、ではどのタイミングでレジスタを待避すればよいのか。 3.>マルチプロセスなら ... 中略 ... レジスタが保存される それで、マルチコア非対応になる理由はなに?
520 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 03:03:41 ] シグナル(割り込み)とスレッドの区別の付かない人っているよね。 MMXのレジスタをFDPと共有させたのはOS側の対応を不要にするための 仕掛けだったのだけど今となってはやっちゃったって感じの仕組みと評価されている。
521 名前:519 mailto:sage [2008/06/27(金) 08:30:11 ] おっと、>>515 は対応してない(できない)と言っているのに、 2番ではやり方を聞いてしまってるな。 この質問は撤回するとして、代わりに3番に追加しておこう。 マルチコア非対応というのはマルチプロセッサ(ユニコア) ならばOKということか? SMT(ハイパースレッディング等)の場合はどうなのか。
522 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 08:33:32 ] 基本的にシングルコアでのみ利用可能だ
523 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 10:26:51 ] 新種のキチガイが暴れてるなwww 動かないっつーのが明記されてる資料出せやw
524 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:13:58 ] >>522 まず訂正するとユニコアなる単語はシングルコアの誤りだ。 そんで微妙に通じていないようだからもう一度聞くよ。 複数のシングルコアのCPUを搭載したマルチプロセッサの システムでMMX/SSEは利用可能なのか。 シングルコアなんだけど擬似的にマルチプロセッサの ように振る舞うSMT対応のCPUではどうか。 具体的に言うとHT有効なPentium4でMMXは使えるのか。 結論だけではなくて、理由を教えてもらいたいのだが。
525 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:31:34 ] 誤解のないように追記。 話を簡単にするためマルチプロセスの場合を聞きたい。 とりあえずこの件についてはマルチスレッドは保留で。
526 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:19:45 ] マルチプロセスの場合は 物理CPU1つだけで稼動する 物理CPU2つならそのうち1つだけ 4つならそのうち1つだけ
527 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:15:05 ] 脳内仕様はもういいよ、資料出せ資料を。
528 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/06/28(土) 14:34:24 ] >>496 亀レスだけど、どのへんが難しい? 単精度の場合だけど ;; r1 = a1^2 + a2^2 + a3^2 - a4^2 movaps xmm0, xmmword ptr [a1_a2_a3_a4] ;; a1, a2, a3, a4を並べておく movaps xmm1, xmm0 xorps xmm1, xmmword ptr [MASK_PPPN] ;; MASK_PPPN = { 0x00000000, 0x00000000, 0x00000000, 0x80000000 } ;; これで xmm1 = { a1, a2, a3, -a4 } になる dpps xmm0, xmm1, 0xF1 ;; 内積をとる ;; SSE4.1非対応ならdppsはこれで代替(SSE3必須) ;; mulps xmm0, xmm1 ;; haddps xmm0, xmm0 ;; haddps xmm0, xmm0 ;; SSE3が使えないなら・・・メンドイ・・・ ;; r2側は大して並列化が期待できないのでスカラでやってよし ;; r2 = a1+a2 - a3*a4 +a1+a3 + a2*a4 = a1+a1+a2+a3 + (a2-a3)*a4 movss xmm1, dword ptr [a1] addss xmm1, xmm1 ;; a1+a1 movss xmm2, dword ptr [a2] addss xmm1, xmm2 ;; (a1+a1) + a2 movss xmm3, dword ptr [a3] addss xmm1, xmm3 ;; subss xmm2, xmm3 ;; a2 - a3 mulss xmm2, dword ptr [a4] ;; (a2-a3)*a4 addss xmm1, xmm2 ;; r2 = = (a1+a1+a2+a3) + ((a2-a3)*a4) ;; 最後はこう addss xmm0, xmm1 ;; r = r1 + r2
529 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 14:36:05 ] >>526 回答は1件だけとか、理由を言っては駄目とかいう戒律でもあるの? >>515 でマルチスレッド非対応の原因として、コンテクストスイッチで レジスタの内容が保証されないことを挙げているが、一方で マルチプロセスならレジスタは保存されるとも言っている。 レジスタがきちんと保存されるならMMX/SSEを使わないプログラムと 何も違わないのに、なぜ一つの物理CPUに縛られるのか。 そんでどのCPUに固定的に割り当てられるのか。 そもそもその割り当てをするのはOS,CPU,アプリのうちどれ? OSかCPUならその名称、アプリならAPIの名称を教えてくれ。 すくなくとも最後の質問にだけは答えてほしい。
530 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/06/28(土) 15:03:54 ] >>524 HT Pen4はおろかCore 2 Quadでも余裕で使えてるから問題ない Core 2上だとXMMレジスタ使ったときのちょうど半分のスループットだけどな
531 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 15:05:48 ] >>526 あ、526では"物理CPU"と書いてあるね。 >>524 の質問には両方答えてあったのか。 すまない。 上の 2行目前半部分は、撤回する。 それと上でCPUなら名称を教えてくれと言ったがCPUのモデル名 ではなくて、振り分けを担当する機構の名称を聞きたかった。 (デコーダ、スケジューラ、実行ユニット等) 不注意な点が多いのは申し訳ない。 以後気をつける。
532 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/06/28(土) 15:05:53 ] そもそもコンテクストスイッチのときにMMX/FPステートの退避・復帰もやってるって
533 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 15:07:42 ] >>530 いや、使えるのは知っている。 ていうか使えないと主張しているのが1人いるだけ。
534 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/06/28(土) 15:11:31 ] 要するに www.intel.com/jp/download/index.htm IA-32 インテルR アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、下巻: システム・プログラミング・ガイド なんかをちゃんと読んでない子が1名いるのね
535 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 00:50:52 ] っつーか >MMX/FPステートの退避・復帰 をやってない処理系があるって主張してる子がいるんだろ
536 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 01:17:44 ] >>535 仮にそんな処理系があったとして MMX/SSEがマルチスレッドに対応していないことには ならないよな。あくまでそのクソOSが対応してないだけであって。 つーか、バカバカしいので打ち切りの方向で。
537 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 11:01:50 ] 他にも >>526 とか不可思議な主張してるから、どうしたら そんな世迷い言が出てくるのか聞いてみたくてね。 >>529 の回答がソフトウェアなら糞環境乙だし、ハードなら そんなもんあるわきゃないので、たぶん返答はないだろう けど、あっても次で終わるさ。 はぐらかすようならもう相手にしない。
538 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 23:47:17 ] Core2って1CPUにつき レジスタ何本まで同時に使えるの?
539 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:07:06 ] わかるように質問してくれ CPUというのはコアなのかダイなのか? ニモニックから指定できるレジスタは固定だがどういう意味のレジスタなんだ?
540 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:11:48 ] xmmmmってやつ
541 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/07/09(水) 10:31:48 ] Core 2は3つの汎用ALUと1本のロード・1対のストアがある。 まさにその数分のレジスタが同時に使えるんだよ。 というのも、説明すると add eax, 3という操作があるとする。 実レジスタファイル上のeaxにマッピングされた領域から値をロードし、3を加えて またeaxに格納するってのを1サイクルでこなすのは実際は無理。 ショートカット用のレジスタ(要はアキュムレータ)に値を残すことによって、 次の命令ですぐにeaxの値を参照できるわけだ。 つまり1サイクルってのは実レジスタではなくアキュムレータの更新にかかるサイクル でしかない。 それ以上になると、実レジスタの読み書きの分待たされるので遅くなるわけ。 で、そのショートカットレジスタは実行ユニットの個数分だけある。 64bitでの性能が伸び悩むのも同じ理由だよ。 レジスタ個数が増えた分、レジスタ間オペレーションのインターリーブがしやすくなった。 でもそれによってショートカットの有効利用ができなくなる。 増えたレジスタを有効に使おうとすればするほど、実レジスタファイルへの読み書きが増え、 高速化が使えなくなる。 ちなみにNehalemでは若干改善されるみたいだが。 おそらくは同時にショートカットできるレジスタの個数が増えるのだろう。
542 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/07/09(水) 10:50:03 ] Core 2に限らずP6シリーズは伝統的にこの仕様なんでまあ細かいことは気にするな
543 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:28:30 ] つまり糞ってことだPowerPCと比較して 糞すぎるんだよなぁ
544 名前:デフォルトの名無しさん [2008/07/30(水) 21:25:16 ] 3D Nowの機能を使ったエンコードソフトなどありますか?
545 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 22:18:57 ] 午後のコーダ mencoder ffmpeg
546 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 22:57:31 ] >>509 の辺りをちらりと読んでアレレ?と心配になってしまいました。 でも、考えてみたら、タスクスイッチのときに、 今のコンテキストの情報(全レジスタ丸ごと)をメモリにコピーして スイッチ先タスクのコンテキストの情報を丸ごとメモリから読み込む訳だから、 コアが幾つあっても、タスクを実行するコアが入れ替わっても、 全然問題ありませんよね。
547 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 23:16:18 ] 上によってタスク(スレッド)毎に別のレジスタセットをそれぞれ持っているような状態が作られる訳だから マルチタスク環境での MMX/SSE の使用は問題なくて、 ただ、スレッド開始時のコンテキストの情報がどうなっているかは、環境依存だろうから、 スレッド開始時にフラグを設定しなおした方がいいという事ですよね。 複数の CPU がある場合でも、タスクを実行する CPU が入れ替わらなければ、1 CPU の時と同じだし、 タスクを実行する CPU が入れ替わる場合でも何らかの形でコンテキストの情報丸ごとを受け継がなければ、 タスクの続きを正常に実行できなくなるわけだから、アプリケーションを作る プログラマが心配するような事では全くありませんよね。 なんかグダグダ書いてしまいって、見苦しいですよね。 御不快でしたら、スルーして下さいよね。
548 名前:デフォルトの名無しさん mailto:sage [2008/07/31(木) 11:11:55 ] うるせーペニス
549 名前:デフォルトの名無しさん mailto:sage [2008/08/01(金) 23:37:03 ] 8bit単位のシフトつけてくれ 明日までに欲しい
550 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:28:29 ] 32bit幅の配列があり、 指定の下位nビット(1 <= n <= 32)以外のビットが立っていないときに、 その配列をnビット幅の配列としてメモリ上にギチギチに詰める& 詰めたものを32bit幅の配列に戻す、ということをやりたいです。 詰めるフォーマットは自由で、 詰め元・復元先について先頭のalignmentは揃えられます。
551 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:53:05 ] そうですか。
552 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:57:05 ] そうですね
553 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 03:17:26 ] やればぁ
554 名前:,,・´∀`・,, mailto:sage [2008/09/01(月) 11:12:38 ] >>343 PowerPC(970以降)は命令間レイテンシが大きいからそれはそれで 隙間埋めるのが大変なんだがな。 1回だけ使うデータのロードだけでも1命令分使っちゃうこととか、 32ビット即値をレジスタにセットするのにも2命令かかったりとか、 いざ使ってみるとパフォーマンスにかかわる制約が多すぎる。 Int/FP/SIMD各32本とレジスタ本数が多いのが逆に災いして レジスタリネーミングそのものも弱いから、高速化のためには レイテンシ隠蔽のため静的なアンロールに費やされることになり、 結果的にはx86に対するレジスタ本数差分の優位すら覆されてしまう。 ジョブズの「今までの○倍」ってプレゼンもあながち誇張でもない。 ものによっては確かにそれくらいIntel CPUのほうが性能が出る。 命令セットは汚く論理リソースは限られてるが、その分だけ逆に アグレッシブな動的最適化技術が比較的有効に働くからね。 Java仮想マシンがスタックマシンなのだって、スタック構造は 並列度を抽出しやすいから。また、論理レジスタが少ないほど アウトオブオーダ・レジスタリネーミングのリソース管理が楽。 もちろん、静的な最適化で事足りるならそれに越したことはないんだが 実行ステージのパイプラインが深くなったりするたびに再コンパイル (最悪の場合再コーディング)してられないなど、「コード資産」 という名の制約もあるからね。 Intelのx86は新命令を取り入れつつも、既存のコードもコンパイル しなおさなくてもある程度は速く走ることを主眼に改良してきたから、 いろんな処理を無難にこなせるわけだ。
555 名前:,,・´∀`・,, mailto:sage [2008/09/01(月) 11:13:26 ] >>543 の間違い。しかも亀
556 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 14:05:22 ] PPC信者に触っちゃいけません
557 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 08:53:34 ] PowerPCのアセンブラって、Z80から入った俺にしてみたら すっごくわかりやすかったんだよなぁ 信者になる気持ちもわかる
558 名前:デフォルトの名無しさん [2008/11/15(土) 22:15:50 ] SSE組み込み関数のラッパーを作ったんで 簡単なベンチとったら↓以下のようになった。 SIMDに有利な内容だったとはいえ、SSEは結構すごいんだな floating_point time = 0.012824 std::valarray time = 0.137409 packed_value time = 0.000011
559 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 22:50:49 ] あまりに差が大きいんで、 ベンチを見直したら↓になった そりゃそうだよね orz float time = 0.036192 std::valarray time = 0.117789 packed_value time = 0.026709
560 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 00:46:09 ] _mm_movemask_epi8に 0x00000000000000FF0000000000000000 渡すとなぜ0x8000になるのですか?
561 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 11:54:51 ] >>560 ならないはず。 __m128iにそのデータをセットして_mm_movemask_epi8を 呼び出すまでのコードをアップしてみて。
562 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:45:48 ] >>561 えーと上のコードだと以下の計算で会ってますか? (0x00 >> 7) << 15 | (0x00 >> 7) << 14 | (0x00 >> 7) << 13 | (0x00 >> 7) << 12 | (0x00 >> 7) << 11 | (0x00 >> 7) << 10 | (0x00 >> 7) << 9 | (0xFF >> 7) << 8 | (0x00 >> 7) << 7 | (0x00 >> 7) << 6 | (0x00 >> 7) << 5 | (0x00 >> 7) << 4 | (0x00 >> 7) << 3 | (0x00 >> 7) << 2 | (0x00 >> 7) << 1 | (0x00 >> 7)
563 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 01:27:00 ] >>562 それで0x0100
564 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 22:41:53 ] 0x0100 なんで0x0100するの?どこにもそんなこと出てないけど
565 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/12/05(金) 08:04:19 ] たぶんさ、 デバッグウィンドウに出てきた16進ダンプをビッグエンディアンだと思い込んでるんじゃないの? 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 を0x00000000000000FF0000000000000000だと勘違いし 80 00 を0x0080じゃなくて0x8000だと勘違いしてると。
566 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 10:02:32 ] そうだったりした 許してください