X



アセンブラ初心者スレッド 2©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0550デフォルトの名無しさん
垢版 |
2019/11/28(木) 21:56:14.84ID:aqT8+si8
jbという条件ジャンプ命令は使っているけど
jcという条件ジャンプ命令は使っていないので、キャリーフラグを使うことはない

アホくさ
0551デフォルトの名無しさん
垢版 |
2019/11/28(木) 23:10:51.33ID:xy0IaHJE
>>545
そういう嘘を真に受けてはいけない。
実際のCPU見れば並列実行能力の高い処理系はすべてキャリーフラグ持ってるし、
むしろ並列実行能力がとくに低いMIPSはキャリーフラグ持ってない。
0552デフォルトの名無しさん
垢版 |
2019/11/29(金) 01:09:48.76ID:IDh/GqUP
条件分岐でキャリーフラグの使い方が分からない、使ったことがない、使われることを知らなかった、という人はなんだろう。
6502、Z80、6809、AVR、8086、68K、ARMとメジャーなCPUどれから始めてもマニュアル、入門書には書いてると思う。
0554デフォルトの名無しさん
垢版 |
2019/11/29(金) 15:12:01.44ID:YkvT9y9m
>>551

x86なんかキャリーフラグじゃない別のフラグを使った加算とか
歪んだ方向に行ってる

SIMDによる並列化プログラムも
フラグは単なるループ条件くらいにしか使わん
maskレジスタがその役目を継ぐ
0556デフォルトの名無しさん
垢版 |
2019/11/29(金) 18:54:08.05ID:9qxidx0X
キャリーフラグを持たないアーキテクチャ・・・
MIPS?PPC?IA-64?死屍累々じゃねーかw
0557デフォルトの名無しさん
垢版 |
2019/11/29(金) 19:13:07.84ID:K9qn0Fk+
>>545
>フラグはアウトオブオーダーの妨げになるし
>並列化も出来ないから
また嘘書いてやがる
Core iプロセッサはフラグがあってもアウトオブオーダーしまくりですが?
アウトオブオーダーを正しく理解してたら絶対にこんなことは書かない
分岐も、投機実行で大凡はカバーされるということになっている

フラグの問題は、元の機械語の並べ方に制約が生じるだけで、アウトオブオーダー実行には関係ない
アウトオブオーダーを妨げるケースでも、元のCISCの挙動に合わせるためで、アウトオブオーダーが
関係しているのではない

>SIMDによる並列化プログラムも
>フラグは単なるループ条件くらいにしか使わん
>maskレジスタがその役目を継ぐ
これもまともに理解してないからこそ書ける内容だな
Pen Proになってアウトオブオーダーが使えるようになった時にcmovが導入されたし、
「単なるループ条件」でも投機実行が必要なんだが?

ここまで酷いとお前に語る資格はないよ
0558デフォルトの名無しさん
垢版 |
2019/11/29(金) 19:39:22.16ID:4DEcYZGM
アウトオブオーダーの妨げの意味がわからんのだね
なんでx86に変な命令があるのか考えてみ
0559デフォルトの名無しさん
垢版 |
2019/11/29(金) 19:42:57.97ID:4DEcYZGM
フラグは本来依存性の無い処理まで依存性が出てくる
フラグが共通だから

レジスタのようにフラグが複数セットあって指定出来ないとダメ
そらがmaskレジスタであったりx86の変な命令であったり
0560デフォルトの名無しさん
垢版 |
2019/11/29(金) 20:21:52.83ID:K9qn0Fk+
>>548,549
ID:YkvT9y9mがID変えたのか、別人なのかどっちだ?

アウトオブオーダーってのは、真の依存関係にない部分を抽出して同時に実行するっていう
アーキテクチャーだ
ループの2周目以降は前の分岐に依存しているから、本来は順番にしか実行できない
しかし、分岐は数値演算と違って結果のパターンが極めて限定されているので、
決め打ちで一時的に依存関係を無視して処理を進めるのが投機実行だ
アウトオブオーダー実行にはフラグレジスタの存在など関係なく、結果に依存関係が
あるかどうかが問題なんだよ
そんなことも理解せずに語ってたのかって言ってんだよ
0561デフォルトの名無しさん
垢版 |
2019/11/29(金) 20:34:10.69ID:4DEcYZGM
フラグを使う演算だと依存関係が出るって言ってんの

関係ない演算でもフラグのせいで依存関係が出る
同じフラグを使うから
0563デフォルトの名無しさん
垢版 |
2019/11/29(金) 20:58:00.49ID:K9qn0Fk+
jaもjbもキャリーやゼロや符号の論理演算で表現されるのに、どうしてキャリーフラグが
どうのって話になってんの?

>>561
お前がアウトオブオーダーを理解できてないのはわかった

>フラグを使う演算だと依存関係が出るって言ってんの
>関係ない演算でもフラグのせいで依存関係が出る
>同じフラグを使うから
やはり論理レジスタと物理レジスタの理解も出来てないな
フラグを格納できるレジスタが複数あろうがなかろうが、それは命令アーキテクチャの問題であって
アウトオブオーダーの問題ではない
これでどうしてアウトオブオーダーの妨げになるんだよ?

>x86の変なフラグを使う歪んだ命令は何のため?
その変な命令って何だよ?
0565デフォルトの名無しさん
垢版 |
2019/11/29(金) 21:30:22.27ID:Mi7N2zYE
>>552
なんか勘違いしてる。CYの使い方がわからないのではなく、使う場面が少ないからあまり意識しないんじゃないかということ。
0566デフォルトの名無しさん
垢版 |
2019/11/29(金) 21:44:01.72ID:IDh/GqUP
>>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のほうが速い例を挙げてほしい。
0568デフォルトの名無しさん
垢版 |
2019/11/30(土) 07:32:32.63ID:zk5zlAHc
>>556
最近巷をさわがせてるRISC-Vもキャリーフラグはないぞ
今あるCPUの中で最も新しいアーキテクチャなんだが
0569デフォルトの名無しさん
垢版 |
2019/11/30(土) 07:35:49.37ID:zk5zlAHc
MIPSの話が出るとすぐにキャリーフラグを連呼する例の人かな
彼は8bitCPUの話が好きみたいだが
もう、既に死んでる6502、Z80、6809、68Kあたりを挙げてるからすぐにわかる
0571デフォルトの名無しさん
垢版 |
2019/11/30(土) 07:45:40.61ID:xhEM6aVw
>>568
> 関係ない演算でもフラグのせいで依存関係が出る

RISC-V信者さんって大学の人でしょ? 例を出してよ。どんな演算?
0574デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:05:52.96ID:xhEM6aVw
>>573
> フラグはアウトオブオーダーの妨げになるし並列化も出来ないから

> 変なフラグを使う歪んだ命令は何のため?

逃げてばかりいないでどういうことか説明してくれよ。コード例がひとつも出ないってどういうことだよ。
128bit加算ではMIPSのほうが遅くなってるし。これ依存関係のない128bit加算が複数あったら
パイプラインが先に詰まるのは演算回数の多い、MIPS、RISC-Vじゃん。>>566
0575デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:10:23.93ID:zk5zlAHc
RISC-Vの中国製チップを使ったマイコンボード手に入れたが、
普通にCortex-A7クラスのIPCがあってびっくりした

ARMと違ってRISC-Vなのでおそらく中国の半導体メーカーがコアの設計までしたんだろうな
RISC-Vならオープンソースのコアがあるから
中国の半導体メーカーでもそれを参考にして設計できるんだろうね

RISC-Vは中国やインドで推進してるから今後普及していくだろうね
0576デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:12:36.49ID:WebQyLi7
SIMD命令にキャリーフラグやADC/SBB/RCR/RCL命令が無いのが
演算としては使わないっていう証拠
こういった命令は昔のチープな環境のなごり
0577デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:14:24.92ID:zk5zlAHc
>>574
たとえば、

CMP EAX,10
JB hogehoge

こんなコードだと比較命令でフラグレジスタが変わるが
次の命令ですぐにフラグレジスタを参照してるってことじゃないの?
俺が発言したわけじゃないから知らんけど
0578デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:25:28.29ID:xhEM6aVw
>>577
mips、risc-vも依存して並列実行できない例を出されてもだな。
しかも投機実行されるintelx64のほうがさらに速くて、mips、risc-vはストールする例だし。
0579デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:30:24.01ID:zk5zlAHc
>>578
x86だと演算命令で必ずフラグの値が変わるので
比較命令とジャンプ命令の間にフラグの値が変わるようなほかの命令を挟めないからね
0580デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:33:19.07ID:zk5zlAHc
そもそもキャリーフラグが有用なのは2進バイナリの多倍長演算の時だけ
64bitCPUではほぼ出番がない
0581デフォルトの名無しさん
垢版 |
2019/11/30(土) 08:45:13.32ID:xhEM6aVw
挟むめないって挟む理由あるアルゴリズムなんて存在するか?
そんなコード書ける高級言語はないし。キミは一体RISCで何を計算したいんだ?
0582デフォルトの名無しさん
垢版 |
2019/11/30(土) 09:00:24.68ID:zk5zlAHc
アセンブラの話してるのになんで高級言語の話になるのかな?
MIPSならslt $2, $3, 11とジャンプ命令の間にほかの命令を挟めるってこと
0583デフォルトの名無しさん
垢版 |
2019/11/30(土) 09:22:02.63ID:xhEM6aVw
>>582
そうではない。挟まなきゃならない理由を聞いている。
それで並列化できなかったものが並列化可能なら例になるがそうではない。判定の前に命令書いても依存関係がなければ並列化される。
キミの例は可読性が悪くなる書き方ができるというだけで並列化できる例ではない。むしろMPSの欠点だ。

> フラグはアウトオブオーダーの妨げになるし並列化も出来ないから

の例を聞いてるんだよ。ひとつも例が出せてないじゃないか。
0584デフォルトの名無しさん
垢版 |
2019/11/30(土) 09:40:23.31ID:zk5zlAHc
演算のたびにフラグレジスタが変化するのは無駄だとは思うけどね
特にアドレス計算のたびにフラグレジスタが変化するのはうっとうしい
ARMだと加算減算命令はフラグレジスタが変化するものと変化しないのと2種類用意されてるね
0585デフォルトの名無しさん
垢版 |
2019/11/30(土) 09:43:31.34ID:zk5zlAHc
しかし、キャリーフラグの話題でここまでスレ伸ばすのはすごいね
8bitのAVR信者っぽいんだけど
8bitだとキャリーフラグがないと何もできないからね
0586デフォルトの名無しさん
垢版 |
2019/11/30(土) 09:53:10.63ID:xhEM6aVw
結局、自分から言い出しといて挟まなきゃならない理由も説明してくれないのか。

まだほとんどコード書いたことない初心者なんだね^^
0588デフォルトの名無しさん
垢版 |
2019/11/30(土) 11:06:05.90ID:xhEM6aVw
>>587
自分で言い出しといて、答え、コード例は絶対に言わないのね。

そりゃコード書かないもんね、大学の人は。初心者だもん。
0589デフォルトの名無しさん
垢版 |
2019/11/30(土) 11:18:54.45ID:zk5zlAHc
パイプラインがストールするとか言うから
MIPSやRISC-Vならslt命令とbne命令の間に他の命令を挟めるよと言っただけ
自分で発言を誘っておいて意味もわからないんだな
0590デフォルトの名無しさん
垢版 |
2019/11/30(土) 11:28:29.70ID:xhEM6aVw
>>589
頓珍漢。ストールするのは条件ジャンプだから。挟んでもその後でmipsはストールする。
挟まなきゃならない理由の説明になってなし、並列化できるでなきいの例でもなんでもない。

話戻すよ。mipsは並列化できてフラグありCPUで並列化できない例を挙げてと言ってるんだよ。
0594デフォルトの名無しさん
垢版 |
2019/11/30(土) 11:49:35.35ID:xhEM6aVw
>>591
たった一つの例が全然例でなかったのに勝利宣言か。だいたいAVRもキミの好きなRISCだろう。

cmp
jb

並列化できない!! ←mipsでもできません

cmp
add
jb

mipsならこんなことができる!!

挟む理由は別になし。可読性が低下するだけ。
同じことしたいならadd、cmp、jbの順に書けばいいだけ。これで並列可。
しかもmipsのほうが遅いという。
0595デフォルトの名無しさん
垢版 |
2019/11/30(土) 12:20:15.39ID:WebQyLi7
cmpに時間がかかる(可能性がある)なら挟む
分岐なのでcmp結果はなるべく早く欲しい
当然命令順が速い方が実行順が速い可能性が高くなる

アセンブラに可読性?
99.99%のコードはコンパイラを使うから
そもそも可読性を考えて命令を作らない
0596デフォルトの名無しさん
垢版 |
2019/11/30(土) 12:54:50.65ID:WebQyLi7
キャリーフラグの典型的な用途
多倍長整数の加算

ADCを連続で行うが
この間にキャリーフラグを使う命令は入れられない

今時のCPUは整数命令を4個同時に実行出来るので
間に命令をいれないと性能の1/4しか活かせない
性能を活かすには4個パラにするか、
多倍長加算以外の処理を入れることになるが
キャリーフラグのせいでこれが出来ない

最大限に最適化する場合はSIMD命令を使うのだが
これにもキャリーフラグなんてものは無い
0597デフォルトの名無しさん
垢版 |
2019/11/30(土) 12:58:12.03ID:+5qlZFtZ
現状RISC-Vの性能はAMD64に及ばなくね?理論がどうであれ実証できなきゃ絵に描いた餅よ
IA-32は長らくクソと言わ続けているがIntelとAMDが競争しているおかげか
そのハンデをねじ伏せいまだに高性能プロセッサの一角だしな
0598デフォルトの名無しさん
垢版 |
2019/11/30(土) 13:04:28.68ID:WebQyLi7
こんな極端な例じゃなくても
実際の実行順に近い順番で命令を書く方が
アウトオブオーダーの制約に引っ掛かりにくく
性能を活かせやすい

実際の実行順で
キャリーフラグを変更する命令と
キャリーフラグを使う命令
の間に何も命令を実行しないなんてことは非常にマレ
あったとすれば、
それはCPUの能力を全く活かしてない糞コード
0599デフォルトの名無しさん
垢版 |
2019/11/30(土) 13:09:58.22ID:xhEM6aVw
>>595
> cmpに時間がかかる(可能性がある)なら挟む

また理由は書かないのか。まあ理由は分からないがMIPSはそんな可能性があるとは遅くて大変だな。
インテルの実装は速くなることはあっても遅くはならないから。いつになったらフラグで遅くなる例を出してくれるんだか。
まさか条件分岐でインテルやARMに勝つ気じゃないよね?
0601デフォルトの名無しさん
垢版 |
2019/11/30(土) 13:33:55.49ID:xhEM6aVw
>>600
煽る暇があったらフラグで遅くなる例をひとつぐらい出してよ。
128bit加算も条件分岐も全部MIPSのほうが遅い例ばかりじゃん。
0602デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:27:59.62ID:rGr6foFe
いつもの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

フラグで遅くなる例を出せと言われて一つも出せなかったらしい。
0603デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:30:00.80ID:AFPNe0zJ
>>574
そりゃ逃げ回るでしょ、アウトオブオーダーがどんな仕組みで並列に実行できるのか理解してないんだからw
こんなこと書いてるからな
>フラグは本来依存性の無い処理まで依存性が出てくる
>フラグが共通だから
これのどこがアウトオブオーダーによる制限なんだよw
間に挟めないのは元の命令アーキテクチャによる制限だって書いたよな

>>596
>今時のCPUは整数命令を4個同時に実行出来るので
>間に命令をいれないと性能の1/4しか活かせない
また出まかせをw
ここ数年インテルがリオーダーバッファのサイズとか強化してるのは何でだよ?
メモリアクセスのレイテンシの影響を軽減するためだろ
そういう状態ではカウンタとかポインタのインクリメントみたいな処理は前倒しで実行されるから、
間に命令を挟んだのと同じことになるよな
0604デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:44:48.54ID:WebQyLi7
分岐に必要な命令を先に実行するほど頭は良くない
単に実行出来る命令から実行するだけ
だからコンパイラがわざわざ順番を変える

フラグのせいでそれに大きな制限がつく

アウトオブオーダーが完璧ならコンパイラがわざわざ順番を変えたりループを展開したりしないから
同じ命令を使えば誰が書いても同じパフォーマンス

そこまで時代は進んでない
だからCコードで最適化してコンパイラが最適化してCPUが最適化してるの

フラグは8bitとか16bitとか、
非常に規模の小さなCPUにとっては便利だが
規模の大きなCPUでは足かせになる
使用頻度は減って
使用用途はほとんど分岐くらい

レジスタの数も少ないと問題だろ?
フラグも同じ
0605デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:46:59.54ID:WebQyLi7
>>596 の話
ADCを続けるのにどうやって他の命令を実行する?
そもそも記述が出来ない
1000回ADCを行うなら
その間にフラグ更新命令を一切記述出来ない
CPUの最適化以前の問題
0606デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:49:53.66ID:WebQyLi7
RCR/RCL による多倍長の1ビットシフトなんか最悪だ
依存性が途切れないので1クロックに1回しか出来ない

ADCもSBBも依存性が途切れないから
もっと頭の良い方法を使うんだけど
0607デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:50:53.74ID:WebQyLi7
まあそもそも可読性とか言ってる時点で話にならん
アセンブラなんか使わないで素直にCで書いてな
0608デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:53:07.85ID:AFPNe0zJ
ID:zk5zlAHcはID:4DEcYZGMやID:zk5zlAHcなんて擁護すると見識を疑われるぞ!

>>604
うわっ、酷っ!
>レジスタの数も少ないと問題だろ?
>フラグも同じ
結局これしか理解できてないから壮大な妄想を展開してたのかよw
0610デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:54:06.44ID:WebQyLi7
大体、
普段多倍長なんか使わんだろ
頻繁に演算でフラグを使う場面ていつだよ?
64bitありゃ99%は問題ないだろ
フラグの用途のほとんどが条件分岐だろうが

SIMDにフラグが無い理由を少しは考えろ
0611デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:57:07.46ID:AFPNe0zJ
>>606
>RCR/RCL による多倍長の1ビットシフトなんか最悪だ
>依存性が途切れないので1クロックに1回しか出来ない
これも突っ込みどころのある発言w
どうして依存性が切れないのか、やっぱり理解できてない
0612デフォルトの名無しさん
垢版 |
2019/11/30(土) 15:59:39.71ID:WebQyLi7
1000ワードの多倍長加算を100個

データはキャュシュにあるとして
どんなコードにする?

糞遅いコードしか書けないだろうね
0615デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:05:29.45ID:AFPNe0zJ
どうして依存性が切れないのか理解できてないのがレベルが低いって言ってんだよ
WAW依存とか理解してるか?
0616デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:29:11.13ID:WebQyLi7
>>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を使ったシフトも同じ
0617デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:32:15.54ID:WebQyLi7
これはコンパイラの最適化やCPUのアウトオブオーダーでは解決出来ない

アセンブラで書こうがCで書こうが
頭が悪い人にとってはこれが限界
0619デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:22:23.36ID:xhEM6aVw
そういうキャリーが必要な、前の計算結果が必要で依存する計算は、
キャリーがないCPUだとさらに効率は悪化するから例として意味がない。

128bitを1bit左シフト
SHL
RCL

mips64だとどういうコードですか?
andi
srl
sll
sll
or
みたいな? 大変でつね。他に便利な命令でもあるんですかね?RISCに対して失礼な質問でしたね^^
0620デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:32:16.88ID:8+8CeiWg
> 頭が悪い人にとってはこれが限界

ほんとそのまんまでわらた
依存性を減らす、隠蔽するのが最適化の肝
ちょっとは考えてね
0621デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:36:12.41ID:8+8CeiWg
当然>>616のままじゃダメ
MIPSだろうがARMだろうがx86だろうが

工夫するんだよ
その工夫がキャリーフラグを使うとちょっと難しい

いや、
そもそも>>616のままでも制御をフラグ無しでやらないといけないから大変だね
遅い命令を使って保存しておく????
0623デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:45:13.95ID:8+8CeiWg
キャリーフラグの人は多倍長1ビットシフトを繰り返す
普通の人はバレルシフタをうまく使う
0624デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:52:27.94ID:21OIT27J
一度に1000回もADCするとかよほど暇なアプリケーションなのだろうな
マイコンのADCと仮定すると速い物でも計0.5〜1msecくらいかかるだろう
単に移動平均が欲しいだけなら必要なコストはADC変換1回に付き加減算各1回+メモリアクセスですむんだし
0625デフォルトの名無しさん
垢版 |
2019/11/30(土) 19:36:02.39ID:8+8CeiWg
何で移動平均が突然?
多倍長の話だろ?

そもそも多倍長なんか普通は使わない
普通は64bitで収まる
だからキャリーフラグを使った足し算なんて普通はしない

キャリーフラグを使った演算は
8bit、16bit時代の、遅いCPU時代のなごりだ
0626デフォルトの名無しさん
垢版 |
2019/11/30(土) 21:00:54.84ID:xhEM6aVw
>>625
ARMは最初から32bitだし、AVRに至っては32bit時代に新規に開発された8bitCPUだし、
共に市場で成功したRISC CPUである。キミがキャリー使わないのは単にコード書かないからに過ぎない。
Cでif文でも書けばコンパイラが必然的に使ってしまう。
0628デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:20:20.00ID:jbs9cucn
>>626
ARMはともかくAVRって
1個ずつ順番にやるしかないCPUは>>616で良いんだよ
このコードが糞なのはスーパースカラーの話
つまり、現代の高速CPU全て

スーパースカラーでどうやって速くするか
SIMDでどうやって速くするか
ベクトルコンピューターでどうやって速くするか

頭が悪いと>>616が限界
0630デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:31:00.07ID:AFPNe0zJ
>そもそも多倍長なんか普通は使わない
とか書いておきながら100個の多倍長とか、ずいぶんと極端な例を持ち出すことw

ローテート命令が依存性を抱えてる理由に即答することもできずに、別の話題で誤魔化そうとしてるから
あんたがアウトオブオーダーをまともに理解してないのは確定的だな
これで究極の最適化だのほざいてたのかよw
0631デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:33:09.34ID:jbs9cucn
煽れば答えがもらえると思うのは間違い
レベルが違い過ぎて話にならんから無視するぞ
0632デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:34:55.48ID:FaWuMeWQ
>>607
「話にならん」が口癖の人には悪いけど、可読性は非常に大事。
MASMならマクロが使えるから、定型的な処理はマクロで書いておけばその処理が必要な部分は1行で書けるし、
if-elseマクロを使うだけでもだいぶわかりやすくなる。
http://shaw.la.coocan.jp/masm/control.php

特に他人が書いたソースをいじらないといけないときは可読性大事。修正や変更の手間が大幅に省ける。
0633デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:37:24.82ID:xhEM6aVw
>>629
頓珍漢なレスにマジレスしてやったらそれを理解せず頓珍漢なこと言われてもだな。
それともMIPSは1bitシフトとバレルシフタと命令が別なのかい? RISCなのにw

> キャリーフラグの人は多倍長1ビットシフトを繰り返す
> 普通の人はバレルシフタをうまく使う

とにかく煽りではなくコード見せてよ。
バレルシフタを上手くつかった任意bitのシフトを。キミは普通の人なんだろ?
0634デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:44:56.42ID:AFPNe0zJ
>>631
俺が答えを知らないんじゃなくて、お前が知らないんだろw
煽られても答えることが出来ないからって、レベルが違うとかw
恥も上塗りしまくれば目立たなくなるともお思いで?
wwww
0635デフォルトの名無しさん
垢版 |
2019/12/01(日) 01:20:15.72ID:npZTl1ra
100個の多倍長の配列なんて極端な例を持ち出さなきゃ、普通にアウトオブオーダー実行されるってことだよな
でなきゃそんな欠陥CPUなんてスパコンで使うはずないだろうに

mov edx, 1

xor eax, eax
キャリーを変化させたい命令
cmovc eax, edx
ってやりゃ、キャリーフラグの結果をGPRに反映できるはずだから、以降は機械語の制限による
依存は切り離せるはずだよな
0636デフォルトの名無しさん
垢版 |
2019/12/01(日) 01:44:07.93ID:npZTl1ra
cmovcじゃなく、
adc eax, 0
でもいいか
こっちの方が余計なレジスタ使わなくていいし
0637デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:42:43.59ID:rpSiZ7Ms
コンパイラに出力させると
例えば、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
0638デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:43:56.72ID:rpSiZ7Ms
任意のシフトはこんな感じ
  $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:
0639デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:44:18.13ID:rpSiZ7Ms
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
0640デフォルトの名無しさん
垢版 |
2019/12/01(日) 11:18:31.61ID:sKSeAmO2
そういえば最近のx86は
典型的な条件ジャンプは
内部的に比較やテストとあわせて1個のuOP命令になる

内部的にはMIPSの条件ジャンプをリッチにした感じ
比較とブランチで2命令も費やしてたら
パフォーマンス的に問題だからね

分岐でも演算でも、
キャリーフラグの出番はもうほとんどない
0641デフォルトの名無しさん
垢版 |
2019/12/01(日) 12:25:49.37ID:rpSiZ7Ms
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ワードで貼れなかったのでググッてね
0643デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:38:02.71ID:N3Tb7oIA
>>640
キミが有名なMIPS君かw
0644デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:45:41.30ID:npZTl1ra
>>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).
キャリーフラグは使われてるぞ
0645デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:47:09.12ID:npZTl1ra
ちょっと見難いね
JA Jump short if above (CF=0 and ZF=0).
JAE Jump short if above or equal (CF=0).
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況