アセンブラ初心者スレッド 2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
これで3回目だが... x86の変なフラグを使う歪んだ命令は何のため? jaもjbもキャリーやゼロや符号の論理演算で表現されるのに、どうしてキャリーフラグが どうのって話になってんの? >>561 お前がアウトオブオーダーを理解できてないのはわかった >フラグを使う演算だと依存関係が出るって言ってんの >関係ない演算でもフラグのせいで依存関係が出る >同じフラグを使うから やはり論理レジスタと物理レジスタの理解も出来てないな フラグを格納できるレジスタが複数あろうがなかろうが、それは命令アーキテクチャの問題であって アウトオブオーダーの問題ではない これでどうしてアウトオブオーダーの妨げになるんだよ? >x86の変なフラグを使う歪んだ命令は何のため? その変な命令って何だよ? >>552 なんか勘違いしてる。CYの使い方がわからないのではなく、使う場面が少ないからあまり意識しないんじゃないかということ。 >>564 mips64 daddu $2,$4,$6 1clock目 sltu $8,$2,$4 1clock目 dext $8,$8,0,32 2clock目 daddu $3,$5,$7 1clock目 daddu $4,$8,$3 3clock目 3clock 演算回数 計5回 (加算3回、減算1回、シフト1回) risc-v add a7,a0,a2 1clock目 sltu a6,a7,a0 1clock目 add t1,a1,a3 1clock目 add a6,a6,t1 2clock目 2clock 演算回数 4回 (加算3回、減算1回) amd64 add 1clock目 adc 2clock目 2clock 演算回数 2回(加算2回) mips、risc-vは必死に並列化してるのに速くならない。 むしろキャリーがあったほうが無駄な演算回数が減り消費電力も減り、 演算器に空きができ、他の計算の余力を得ることになり、並列処理能力は上がることが分かる。 キミのいう依存関係が出てmipsのほうが速い例を挙げてほしい。 >>556 最近巷をさわがせてるRISC-Vもキャリーフラグはないぞ 今あるCPUの中で最も新しいアーキテクチャなんだが MIPSの話が出るとすぐにキャリーフラグを連呼する例の人かな 彼は8bitCPUの話が好きみたいだが もう、既に死んでる6502、Z80、6809、68Kあたりを挙げてるからすぐにわかる 8bitCPUなら多倍長演算はよく使うだろうが64bitCPUではほぼ出番がない >>568 > 関係ない演算でもフラグのせいで依存関係が出る RISC-V信者さんって大学の人でしょ? 例を出してよ。どんな演算? RISC-VならARMのCortex-A72より早いコアができたってさ このクラスの性能のCPUはx86、POWER、ARM以外にないだろうに SiFive readies U8-Series RISC-V core designs to compete with ARM's Cortex-A72 models https://www.notebookcheck.net/SiFive-readies-U8-Series-RISC-V-core-designs-to-compete-with-ARM-s-Cortex-A72-models.440633.0.html >>571 別人の発言なのに敵視した人は誰でも同一人物だと思っちゃう人? >>573 > フラグはアウトオブオーダーの妨げになるし並列化も出来ないから > 変なフラグを使う歪んだ命令は何のため? 逃げてばかりいないでどういうことか説明してくれよ。コード例がひとつも出ないってどういうことだよ。 128bit加算ではMIPSのほうが遅くなってるし。これ依存関係のない128bit加算が複数あったら パイプラインが先に詰まるのは演算回数の多い、MIPS、RISC-Vじゃん。>>566 RISC-Vの中国製チップを使ったマイコンボード手に入れたが、 普通にCortex-A7クラスのIPCがあってびっくりした ARMと違ってRISC-Vなのでおそらく中国の半導体メーカーがコアの設計までしたんだろうな RISC-Vならオープンソースのコアがあるから 中国の半導体メーカーでもそれを参考にして設計できるんだろうね RISC-Vは中国やインドで推進してるから今後普及していくだろうね SIMD命令にキャリーフラグやADC/SBB/RCR/RCL命令が無いのが 演算としては使わないっていう証拠 こういった命令は昔のチープな環境のなごり >>574 たとえば、 CMP EAX,10 JB hogehoge こんなコードだと比較命令でフラグレジスタが変わるが 次の命令ですぐにフラグレジスタを参照してるってことじゃないの? 俺が発言したわけじゃないから知らんけど >>577 mips、risc-vも依存して並列実行できない例を出されてもだな。 しかも投機実行されるintelx64のほうがさらに速くて、mips、risc-vはストールする例だし。 >>578 x86だと演算命令で必ずフラグの値が変わるので 比較命令とジャンプ命令の間にフラグの値が変わるようなほかの命令を挟めないからね そもそもキャリーフラグが有用なのは2進バイナリの多倍長演算の時だけ 64bitCPUではほぼ出番がない 挟むめないって挟む理由あるアルゴリズムなんて存在するか? そんなコード書ける高級言語はないし。キミは一体RISCで何を計算したいんだ? アセンブラの話してるのになんで高級言語の話になるのかな? MIPSならslt $2, $3, 11とジャンプ命令の間にほかの命令を挟めるってこと >>582 そうではない。挟まなきゃならない理由を聞いている。 それで並列化できなかったものが並列化可能なら例になるがそうではない。判定の前に命令書いても依存関係がなければ並列化される。 キミの例は可読性が悪くなる書き方ができるというだけで並列化できる例ではない。むしろMPSの欠点だ。 > フラグはアウトオブオーダーの妨げになるし並列化も出来ないから の例を聞いてるんだよ。ひとつも例が出せてないじゃないか。 演算のたびにフラグレジスタが変化するのは無駄だとは思うけどね 特にアドレス計算のたびにフラグレジスタが変化するのはうっとうしい ARMだと加算減算命令はフラグレジスタが変化するものと変化しないのと2種類用意されてるね しかし、キャリーフラグの話題でここまでスレ伸ばすのはすごいね 8bitのAVR信者っぽいんだけど 8bitだとキャリーフラグがないと何もできないからね 結局、自分から言い出しといて挟まなきゃならない理由も説明してくれないのか。 まだほとんどコード書いたことない初心者なんだね^^ 間に挟みたい場面なんていくらでもあるだろうに 少しは考えたら? >>587 自分で言い出しといて、答え、コード例は絶対に言わないのね。 そりゃコード書かないもんね、大学の人は。初心者だもん。 パイプラインがストールするとか言うから MIPSやRISC-Vならslt命令とbne命令の間に他の命令を挟めるよと言っただけ 自分で発言を誘っておいて意味もわからないんだな >>589 頓珍漢。ストールするのは条件ジャンプだから。挟んでもその後でmipsはストールする。 挟まなきゃならない理由の説明になってなし、並列化できるでなきいの例でもなんでもない。 話戻すよ。mipsは並列化できてフラグありCPUで並列化できない例を挙げてと言ってるんだよ。 まあ、いつものAVRの人の荒らしだからまともに答えるだけ無駄 >>591 たった一つの例が全然例でなかったのに勝利宣言か。だいたいAVRもキミの好きなRISCだろう。 cmp jb 並列化できない!! ←mipsでもできません cmp add jb mipsならこんなことができる!! ↑ 挟む理由は別になし。可読性が低下するだけ。 同じことしたいならadd、cmp、jbの順に書けばいいだけ。これで並列可。 しかもmipsのほうが遅いという。 cmpに時間がかかる(可能性がある)なら挟む 分岐なのでcmp結果はなるべく早く欲しい 当然命令順が速い方が実行順が速い可能性が高くなる アセンブラに可読性? 99.99%のコードはコンパイラを使うから そもそも可読性を考えて命令を作らない キャリーフラグの典型的な用途 多倍長整数の加算 ADCを連続で行うが この間にキャリーフラグを使う命令は入れられない 今時のCPUは整数命令を4個同時に実行出来るので 間に命令をいれないと性能の1/4しか活かせない 性能を活かすには4個パラにするか、 多倍長加算以外の処理を入れることになるが キャリーフラグのせいでこれが出来ない 最大限に最適化する場合はSIMD命令を使うのだが これにもキャリーフラグなんてものは無い 現状RISC-Vの性能はAMD64に及ばなくね?理論がどうであれ実証できなきゃ絵に描いた餅よ IA-32は長らくクソと言わ続けているがIntelとAMDが競争しているおかげか そのハンデをねじ伏せいまだに高性能プロセッサの一角だしな こんな極端な例じゃなくても 実際の実行順に近い順番で命令を書く方が アウトオブオーダーの制約に引っ掛かりにくく 性能を活かせやすい 実際の実行順で キャリーフラグを変更する命令と キャリーフラグを使う命令 の間に何も命令を実行しないなんてことは非常にマレ あったとすれば、 それはCPUの能力を全く活かしてない糞コード >>595 > cmpに時間がかかる(可能性がある)なら挟む また理由は書かないのか。まあ理由は分からないがMIPSはそんな可能性があるとは遅くて大変だな。 インテルの実装は速くなることはあっても遅くはならないから。いつになったらフラグで遅くなる例を出してくれるんだか。 まさか条件分岐でインテルやARMに勝つ気じゃないよね? MIPS vs ARM (またはx86) だと思ってる時点で話にならん >>600 煽る暇があったらフラグで遅くなる例をひとつぐらい出してよ。 128bit加算も条件分岐も全部MIPSのほうが遅い例ばかりじゃん。 いつものAVR信者だからかまっちゃダメ MIPSと聞くと毎回同じようにキャリーフラグの話を始める いつも自分が正義だと思い込んでて他人の都合の悪い意見は全く無視するからね http://rio2016.5ch.net/test/read.cgi/denki/1462177958/134 134 :774ワット発電中さん [↓] :2019/11/30(土) 14:53:33.69 ID:IRFNBB8m.net またMIPS君が他の板で暴れて論破された模様TT フラグで遅くなる例を出せと言われて一つも出せなかったらしい。 >>574 そりゃ逃げ回るでしょ、アウトオブオーダーがどんな仕組みで並列に実行できるのか理解してないんだからw こんなこと書いてるからな >フラグは本来依存性の無い処理まで依存性が出てくる >フラグが共通だから これのどこがアウトオブオーダーによる制限なんだよw 間に挟めないのは元の命令アーキテクチャによる制限だって書いたよな >>596 >今時のCPUは整数命令を4個同時に実行出来るので >間に命令をいれないと性能の1/4しか活かせない また出まかせをw ここ数年インテルがリオーダーバッファのサイズとか強化してるのは何でだよ? メモリアクセスのレイテンシの影響を軽減するためだろ そういう状態ではカウンタとかポインタのインクリメントみたいな処理は前倒しで実行されるから、 間に命令を挟んだのと同じことになるよな 分岐に必要な命令を先に実行するほど頭は良くない 単に実行出来る命令から実行するだけ だからコンパイラがわざわざ順番を変える フラグのせいでそれに大きな制限がつく アウトオブオーダーが完璧ならコンパイラがわざわざ順番を変えたりループを展開したりしないから 同じ命令を使えば誰が書いても同じパフォーマンス そこまで時代は進んでない だからCコードで最適化してコンパイラが最適化してCPUが最適化してるの フラグは8bitとか16bitとか、 非常に規模の小さなCPUにとっては便利だが 規模の大きなCPUでは足かせになる 使用頻度は減って 使用用途はほとんど分岐くらい レジスタの数も少ないと問題だろ? フラグも同じ で >>596 の話 ADCを続けるのにどうやって他の命令を実行する? そもそも記述が出来ない 1000回ADCを行うなら その間にフラグ更新命令を一切記述出来ない CPUの最適化以前の問題 RCR/RCL による多倍長の1ビットシフトなんか最悪だ 依存性が途切れないので1クロックに1回しか出来ない ADCもSBBも依存性が途切れないから もっと頭の良い方法を使うんだけど まあそもそも可読性とか言ってる時点で話にならん アセンブラなんか使わないで素直にCで書いてな ID:zk5zlAHcはID:4DEcYZGMやID:zk5zlAHcなんて擁護すると見識を疑われるぞ! >>604 うわっ、酷っ! >レジスタの数も少ないと問題だろ? >フラグも同じ 結局これしか理解できてないから壮大な妄想を展開してたのかよw ID:4DEcYZGMとID:WebQyLi7 だった 大体、 普段多倍長なんか使わんだろ 頻繁に演算でフラグを使う場面ていつだよ? 64bitありゃ99%は問題ないだろ フラグの用途のほとんどが条件分岐だろうが SIMDにフラグが無い理由を少しは考えろ >>606 >RCR/RCL による多倍長の1ビットシフトなんか最悪だ >依存性が途切れないので1クロックに1回しか出来ない これも突っ込みどころのある発言w どうして依存性が切れないのか、やっぱり理解できてない 1000ワードの多倍長加算を100個 データはキャュシュにあるとして どんなコードにする? 糞遅いコードしか書けないだろうね >>611 多倍長の1ビットシフト って意味わからない? そこから説明しないとダメ? どうして依存性が切れないのか理解できてないのがレベルが低いって言ってんだよ WAW依存とか理解してるか? >>612 の擬似コード for (int i = 0 ; i < 100 ; i++){ . . CLC . . for (int j = 0 ; j < 1000 ; j++){ . . . . ADC dest[i][j], src[i][j] . . } } メモリアクセスや制御時間がゼロとしても 100 x 1000クロックかかる ADCが前のADCの結果に依存するから 順番に処理をするしかない RCL/RCRを使ったシフトも同じ これはコンパイラの最適化やCPUのアウトオブオーダーでは解決出来ない アセンブラで書こうがCで書こうが 頭が悪い人にとってはこれが限界 そういうキャリーが必要な、前の計算結果が必要で依存する計算は、 キャリーがないCPUだとさらに効率は悪化するから例として意味がない。 128bitを1bit左シフト SHL RCL mips64だとどういうコードですか? andi srl sll sll or みたいな? 大変でつね。他に便利な命令でもあるんですかね?RISCに対して失礼な質問でしたね^^ > 頭が悪い人にとってはこれが限界 ほんとそのまんまでわらた 依存性を減らす、隠蔽するのが最適化の肝 ちょっとは考えてね 当然>>616 のままじゃダメ MIPSだろうがARMだろうがx86だろうが 工夫するんだよ その工夫がキャリーフラグを使うとちょっと難しい いや、 そもそも>>616 のままでも制御をフラグ無しでやらないといけないから大変だね 遅い命令を使って保存しておく???? キャリーフラグの人は多倍長1ビットシフトを繰り返す 普通の人はバレルシフタをうまく使う 一度に1000回もADCするとかよほど暇なアプリケーションなのだろうな マイコンのADCと仮定すると速い物でも計0.5〜1msecくらいかかるだろう 単に移動平均が欲しいだけなら必要なコストはADC変換1回に付き加減算各1回+メモリアクセスですむんだし 何で移動平均が突然? 多倍長の話だろ? そもそも多倍長なんか普通は使わない 普通は64bitで収まる だからキャリーフラグを使った足し算なんて普通はしない キャリーフラグを使った演算は 8bit、16bit時代の、遅いCPU時代のなごりだ >>625 ARMは最初から32bitだし、AVRに至っては32bit時代に新規に開発された8bitCPUだし、 共に市場で成功したRISC CPUである。キミがキャリー使わないのは単にコード書かないからに過ぎない。 Cでif文でも書けばコンパイラが必然的に使ってしまう。 >>623 さて、キミの任意bitシフトのバレルシフタのコードみせてもらおう。verilogでいいよ。 >>626 ARMはともかくAVRって 1個ずつ順番にやるしかないCPUは>>616 で良いんだよ このコードが糞なのはスーパースカラーの話 つまり、現代の高速CPU全て スーパースカラーでどうやって速くするか SIMDでどうやって速くするか ベクトルコンピューターでどうやって速くするか 頭が悪いと>>616 が限界 >>627 書いてることがトンチンカン >>623 をもう一回読みなおしてみようか >そもそも多倍長なんか普通は使わない とか書いておきながら100個の多倍長とか、ずいぶんと極端な例を持ち出すことw ローテート命令が依存性を抱えてる理由に即答することもできずに、別の話題で誤魔化そうとしてるから あんたがアウトオブオーダーをまともに理解してないのは確定的だな これで究極の最適化だのほざいてたのかよw 煽れば答えがもらえると思うのは間違い レベルが違い過ぎて話にならんから無視するぞ >>607 「話にならん」が口癖の人には悪いけど、可読性は非常に大事。 MASMならマクロが使えるから、定型的な処理はマクロで書いておけばその処理が必要な部分は1行で書けるし、 if-elseマクロを使うだけでもだいぶわかりやすくなる。 http://shaw.la.coocan.jp/masm/control.php 特に他人が書いたソースをいじらないといけないときは可読性大事。修正や変更の手間が大幅に省ける。 >>629 頓珍漢なレスにマジレスしてやったらそれを理解せず頓珍漢なこと言われてもだな。 それともMIPSは1bitシフトとバレルシフタと命令が別なのかい? RISCなのにw > キャリーフラグの人は多倍長1ビットシフトを繰り返す > 普通の人はバレルシフタをうまく使う とにかく煽りではなくコード見せてよ。 バレルシフタを上手くつかった任意bitのシフトを。キミは普通の人なんだろ? >>631 俺が答えを知らないんじゃなくて、お前が知らないんだろw 煽られても答えることが出来ないからって、レベルが違うとかw 恥も上塗りしまくれば目立たなくなるともお思いで? wwww 100個の多倍長の配列なんて極端な例を持ち出さなきゃ、普通にアウトオブオーダー実行されるってことだよな でなきゃそんな欠陥CPUなんてスパコンで使うはずないだろうに mov edx, 1 … xor eax, eax キャリーを変化させたい命令 cmovc eax, edx ってやりゃ、キャリーフラグの結果をGPRに反映できるはずだから、以降は機械語の制限による 依存は切り離せるはずだよな cmovcじゃなく、 adc eax, 0 でもいいか こっちの方が余計なレジスタ使わなくていいし コンパイラに出力させると 例えば、15bitの左シフトはこんな感じ $3:$2←$5:$4 << 15 dsrl $2,$4,49 dsll $3,$5,15 or $3,$2,$3 dsll $2,$4,15 risc-vのRV64GCだとこう a1:a0←a1:a0 << 15 srl a5,a0,49 sll a1,a1,15 sll a0,a0,15 or a1,a5,a1 arm64だとこう x1:x0←x1:x0 << 15 mov x2, x0 lsl x0, x0, 15 extr x1, x1, x2, 49 任意のシフトはこんな感じ $3:$2←$5:$4 << $6 sll $2,$6,0 dsrl $3,$4,1 nor $7,$0,$6 dsrl $7,$3,$7 dsll $3,$5,$2 andi $6,$6,0x40 dsll $2,$4,$2 or $3,$7,$3 movn $3,$2,$6 movn $2,$0,$6 risc-vのRV64GCだとこう a1:a0←a1:a0 << a2 and a5,a2,64 beqz a5,.L1 sll a1,a0,a2 li a0,0 jal zero, .L2 .L1: srl a5,a0,1 not a4,a2 srl a5,a5,a4 sll a1,a1,a2 or a1,a5,a1 sll a0,a0,a2 .L2: arm64だとこう x1:x0←x1:x0 << w2 mov w4, 63 sub w5, w4, w2 lsr x4, x0, 1 sub w3, w2, #64 cmp w3, 0 lsl x1, x1, x2 lsr x4, x4, x5 orr x1, x4, x1 lsl x4, x0, x3 csel x1, x4, x1, ge lsl x0, x0, x2 csel x0, x0, xzr, lt そういえば最近のx86は 典型的な条件ジャンプは 内部的に比較やテストとあわせて1個のuOP命令になる 内部的にはMIPSの条件ジャンプをリッチにした感じ 比較とブランチで2命令も費やしてたら パフォーマンス的に問題だからね 分岐でも演算でも、 キャリーフラグの出番はもうほとんどない Intel® 64 and IA-32 ArchitecturesOptimization Reference Manual 64-ia-32-architectures-optimization-manual.pdf 248966-033June 2016 109ページ目3-12の3.4.2.2 Optimizing for Macro-fusionに書かれてるね リンクはNGワードで貼れなかったのでググッてね >>640 jcc命令の説明 77 cb JA rel8 D Valid Valid Jump short if above (CF=0 and ZF=0). 73 cb JAE rel8 D Valid Valid Jump short if above or equal (CF=0). キャリーフラグは使われてるぞ ちょっと見難いね JA Jump short if above (CF=0 and ZF=0). JAE Jump short if above or equal (CF=0). >>644 >>642 にマクロフィユージョンで内部的に1命令になるって書いてあるじゃん JA、JAEはTEST、AND、CMP、ADD、SUBがマクロフュージョン可能なようだね >>646 間にフラグをいじらない他の命令挟むとフュージョン出来ないはずだし、 フュージョンした場合でも、フラグレジスタも一緒に更新するので、フラグを使うと考えていい 演算回路のキャリー信号を使わないということは、まず考えられないよ >>643 MIPS君が何者かしらんが おれはx86/ARM/MIPS全てを愛する男 SH/RL78/C6000/C2000/PIC/AVR/RX などなどいろいろと経験あり >>647 内部的に1命令のμOPsになるのに何言ってるの? CFとZFのみを使うやつはCMPでマクロフィユージョン可能のようだね >>650 なんで噛みついて来るんだ? 間にmovが入ったりしてもフュージョンすると思ってる? こういう時は普通にフラグレジスタを参照するぞ 確かマクロフュージョンって、実行キューに入るときには別々のμOPsに分解されたはず 整数パイプと分岐ユニット用にね >>653 また分割しちゃったらマクロフィユージョンで統合した意味なくないか? >>646 のExampleのところにこう書かれてるね Sandy Bridge microarchitecture enables more arithmetic and logic instructions to macro-fuse with conditional branches. In loops where the ALU ports are already congested, performing one of these macrofusions can relieve the pressure, as the macro-fused instruction consumes only port 5, instead of an ALU port plus port 5. >>654 そういや、分解されるのはマイクロフュージョンの方だったか? ポート5でALUと分岐ユニットが一緒になってるから間違ってたかも、ゴメン でも、フュージョン出来ない書き方も可能なはずなので、フラグ参照するパターンもあるはずだよ >>648 MIPSマシン、RISC-Vマシンなんて手に入らないからMIPSの話はMIPSスレでよくね? ここ初心者板だよ? ほんとこんなところでスレチのMIPS、RISC-Vニュースコピペしないでくれるかな。 ここム板だよ。荒らしと変わらないよ。興味あるならMIPSスレのほう除くでしょ。 RISC-Vが手に入るようになったからトランジスタ技術2019年11月号や インターフェースの2019年12月号で特集やってるわけだが RISC-VはMaix Bit、MaixdunoならArduinoで使えるのでかなり敷居は低くなったぞ 価格も3000円から4000円程度 これらがダメというならAVRの話もダメということになるね そもそもこんなに荒れたのは >>529 ->>539 の話があって、>>540 を貼ったらAVR信者が食いついて荒らしただけ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる