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

■ このスレッドは過去ログ倉庫に格納されています
2017/04/13(木) 17:35:55.70ID:1WMn3pSz
初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…

前スレ
アセンブラ初心者スレッド
http://echo.2ch.net/test/read.cgi/tech/1314502612/

関連スレ
アセンブラ 13
http://echo.2ch.net/test/read.cgi/tech/1314512680/
539529
垢版 |
2019/11/23(土) 11:50:40.96ID:U8iKLMmJ
自己訂正です。
実は、色々と間違いがあり、次のようになっています:
>>529 : 間違い。
530 : 正しい。
531 : 正しい。
>>532 の前半 : 正しい。
>>532 の後半 : 間違い。

改めて、>>529 の根本的な間違いとして、carry flag は、演算前の最上位ビットだけでは決まる、
というのが大間違いでした。下位ビットからの桁上がりがあるためです。

まとめると、x, y が符号なし整数の場合、

1. a = x - y に対する carry flag :
  cf = (x < y);
  または。
  cf = (a > x);

2. a = x + y に対する carry flag :
  cf = (x < (-y));
  または。
  cf = (a < x);

です。上記の「または」以後のやり方は、>>536 537 538 で思い出させていただきました。
一年ほど前に見たやり方がそれだったと思います。とてもエレガントですね。
2019/11/25(月) 14:32:25.64ID:1+9AnSdf
MIPS64やRISC-VのRV64Iで128bit加算減算のアセンブラ出力してみると
おなじようなことやってるね

mips64 128bit加算 $4:$2 ← $5:$4 + $7:$6
    daddu    $2,$4,$6
    sltu     $8,$2,$4
    dext     $8,$8,0,32
    daddu    $3,$5,$7
    daddu    $4,$8,$3

mips64 128bit減算 $4:$2 ← $5:$4 - $7:$6
    dsubu    $2,$4,$6
    sltu     $8,$4,$2
    dext     $8,$8,0,32
    dsubu    $3,$5,$7
    dsubu    $4,$3,$8

risc-v RV64I 128bit加算 a6:a7 ← a1:a0 + a3:a2
    add     a7,a0,a2
    sltu    a6,a7,a0
    add     t1,a1,a3
    add     a6,a6,t1

risc-v RV64I 128bit減算 a1:a2 ← a1:a0 - a3:a2
    sub     a2,a0,a2
    sgtu    a0,a2,a0
    sub     a1,a1,a3
    sub     a1,a1,a0
2019/11/25(月) 18:08:28.75ID:FcoOoav6
だろうね
2019/11/28(木) 08:12:36.09ID:xy0IaHJE
>>525
何かいろいろ勘違いしてるようだが、キャリーフラグは条件ジャンプのときにも参照するんだぞ。
MIPSが欠陥品だと言われる理由がこれで分かるだろう。
2019/11/28(木) 08:14:06.75ID:xy0IaHJE
MIPS以降の多くのRISCベースのCPUはすべてキャリーフラグがある。
とても効率的で不可欠だからだ。
2019/11/28(木) 19:38:36.20ID:jGkkl6Qu
>>543
Zeroフラグは良く使うがCarryフラグはほぼ使ったことがない。
どういうときに使う?
2019/11/28(木) 19:56:47.34ID:PoPpbfsh
フラグはアウトオブオーダーの妨げになるし
並列化も出来ないから
高速化に対してはイマイチ
2019/11/28(木) 20:01:39.23ID:aqT8+si8
>>544
比較や減算で上か下か
どうやって判断してると思ってるんだよ・・・
2019/11/28(木) 20:15:33.90ID:jGkkl6Qu
>>546
それって一々フラグを意識しないだろ。
2019/11/28(木) 20:34:30.59ID:d3vL2dOV
話にならねえな
2019/11/28(木) 21:08:35.99ID:jGkkl6Qu
じゃあ止めよう
2019/11/28(木) 21:56:14.84ID:aqT8+si8
jbという条件ジャンプ命令は使っているけど
jcという条件ジャンプ命令は使っていないので、キャリーフラグを使うことはない

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

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

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

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

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

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

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

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

関係ない演算でもフラグのせいで依存関係が出る
同じフラグを使うから
2019/11/29(金) 20:35:56.20ID:4DEcYZGM
これで3回目だが...

x86の変なフラグを使う歪んだ命令は何のため?
2019/11/29(金) 20:58:00.49ID:K9qn0Fk+
jaもjbもキャリーやゼロや符号の論理演算で表現されるのに、どうしてキャリーフラグが
どうのって話になってんの?

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

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

>x86の変なフラグを使う歪んだ命令は何のため?
その変な命令って何だよ?
2019/11/29(金) 21:18:44.73ID:4DEcYZGM
命令を調べて出直しておいで
2019/11/29(金) 21:30:22.27ID:Mi7N2zYE
>>552
なんか勘違いしてる。CYの使い方がわからないのではなく、使う場面が少ないからあまり意識しないんじゃないかということ。
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のほうが速い例を挙げてほしい。
2019/11/29(金) 21:59:54.67ID:/ptQUX0m
>>562
2019/11/30(土) 07:32:32.63ID:zk5zlAHc
>>556
最近巷をさわがせてるRISC-Vもキャリーフラグはないぞ
今あるCPUの中で最も新しいアーキテクチャなんだが
2019/11/30(土) 07:35:49.37ID:zk5zlAHc
MIPSの話が出るとすぐにキャリーフラグを連呼する例の人かな
彼は8bitCPUの話が好きみたいだが
もう、既に死んでる6502、Z80、6809、68Kあたりを挙げてるからすぐにわかる
2019/11/30(土) 07:38:44.36ID:zk5zlAHc
8bitCPUなら多倍長演算はよく使うだろうが64bitCPUではほぼ出番がない
2019/11/30(土) 07:45:40.61ID:xhEM6aVw
>>568
> 関係ない演算でもフラグのせいで依存関係が出る

RISC-V信者さんって大学の人でしょ? 例を出してよ。どんな演算?
2019/11/30(土) 07:55:34.04ID:zk5zlAHc
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
2019/11/30(土) 08:04:40.62ID:zk5zlAHc
>>571
別人の発言なのに敵視した人は誰でも同一人物だと思っちゃう人?
2019/11/30(土) 08:05:52.96ID:xhEM6aVw
>>573
> フラグはアウトオブオーダーの妨げになるし並列化も出来ないから

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

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

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

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

CMP EAX,10
JB hogehoge

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

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

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

まだほとんどコード書いたことない初心者なんだね^^
2019/11/30(土) 11:02:33.57ID:WebQyLi7
間に挟みたい場面なんていくらでもあるだろうに
少しは考えたら?
2019/11/30(土) 11:06:05.90ID:xhEM6aVw
>>587
自分で言い出しといて、答え、コード例は絶対に言わないのね。

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

話戻すよ。mipsは並列化できてフラグありCPUで並列化できない例を挙げてと言ってるんだよ。
2019/11/30(土) 11:30:10.99ID:zk5zlAHc
まあ、いつものAVRの人の荒らしだからまともに答えるだけ無駄
2019/11/30(土) 11:41:14.59ID:WebQyLi7
x86のイビツな命令は調べたの?
2019/11/30(土) 11:42:25.43ID:WebQyLi7
SIMD用キャリーフラグがあるCPUってある?
2019/11/30(土) 11:49:35.35ID:xhEM6aVw
>>591
たった一つの例が全然例でなかったのに勝利宣言か。だいたいAVRもキミの好きなRISCだろう。

cmp
jb

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

cmp
add
jb

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

糞遅いコードしか書けないだろうね
2019/11/30(土) 16:00:43.39ID:WebQyLi7
>>611
多倍長の1ビットシフト
って意味わからない?

そこから説明しないとダメ?
2019/11/30(土) 16:01:19.45ID:WebQyLi7
レベルが低すぎて会話にならない
2019/11/30(土) 16:05:29.45ID:AFPNe0zJ
どうして依存性が切れないのか理解できてないのがレベルが低いって言ってんだよ
WAW依存とか理解してるか?
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を使ったシフトも同じ
2019/11/30(土) 16:32:15.54ID:WebQyLi7
これはコンパイラの最適化やCPUのアウトオブオーダーでは解決出来ない

アセンブラで書こうがCで書こうが
頭が悪い人にとってはこれが限界
2019/11/30(土) 17:01:55.28ID:rGr6foFe
ただの荒らしにマジレスしても疲れるだけだよ
2019/11/30(土) 17:22:23.36ID:xhEM6aVw
そういうキャリーが必要な、前の計算結果が必要で依存する計算は、
キャリーがないCPUだとさらに効率は悪化するから例として意味がない。

128bitを1bit左シフト
SHL
RCL

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

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

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

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

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

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

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

頭が悪いと>>616が限界
2019/11/30(土) 22:23:01.70ID:jbs9cucn
>>627
書いてることがトンチンカン
>>623をもう一回読みなおしてみようか
2019/11/30(土) 22:31:00.07ID:AFPNe0zJ
>そもそも多倍長なんか普通は使わない
とか書いておきながら100個の多倍長とか、ずいぶんと極端な例を持ち出すことw

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

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

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

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

mov edx, 1

xor eax, eax
キャリーを変化させたい命令
cmovc eax, edx
ってやりゃ、キャリーフラグの結果をGPRに反映できるはずだから、以降は機械語の制限による
依存は切り離せるはずだよな
2019/12/01(日) 01:44:07.93ID:npZTl1ra
cmovcじゃなく、
adc eax, 0
でもいいか
こっちの方が余計なレジスタ使わなくていいし
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
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:
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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