1 名前:デフォルトの名無しさん [04/05/28 22:00] どうぞ
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 ] そうだったりした 許してください