掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28190

ビットシフトの処理効率
投稿者---mtsed(2006/09/17 03:45:26)


C言語でのビットシフト演算について、以前処理効率が非常に悪いときいたことがあるのですが、ビットシフトってそんなにステップ数がかかるものなのでしょうか?それともコンパイラに依存しますでしょうか。
ご教授ください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ビットシフトの処理効率 28191 たかぎ 2006/09/17 09:09:06


No.28191

Re:ビットシフトの処理効率
投稿者---たかぎ(2006/09/17 09:09:06)
http://takagi.in/


何と比べて、処理効率が悪いのかにもよりますし、もちろん処理系にもよります。

プロセッサのアーキテクチャによっては、シフト数をレジスタで指定できない場合があります。
最もチープなものであれば、1ビットずつのシフトしかできませんし、中にはキャリーフラグを含めたローテートしかできなかったものもあったように思います。


この投稿にコメントする

削除パスワード

No.28195

Re:ビットシフトの処理効率
投稿者---円零(2006/09/17 13:58:56)


質問は「C言語でのビットシフト演算について」ですから、
ハードウェアは今回の話題の範疇にないのではないでしょうか。
あくまで「C言語を使ったことによって効率が悪くなる」話でしょうから。

私の環境はVC++6.0ですが、コンパイラオプションでアセンブリコードを出しても別段無駄なことをやってるようには見えません。
処理系によって異なる可能性もないことはないですが、
この質問、「そんなことはない」と答えてしまってもいいんじゃないでしょうか。


この投稿にコメントする

削除パスワード

No.28197

Re:ビットシフトの処理効率
投稿者---たかぎ(2006/09/17 16:27:37)
http://takagi.in/


>質問は「C言語でのビットシフト演算について」ですから、
>ハードウェアは今回の話題の範疇にないのではないでしょうか。

コンパイラの出力結果はハードウェアに依存します。したがって、効率の話をするときは、ハードウェアとコンパイラの実装を抜きにすることはできません。

プロセッサが1ビットシフトの命令しか持っていなければ、シフト演算子の右オペランドに定数式以外を指定した場合はループで解決するしかなくなります。また、論理シフトはそんなに効率が悪くなくても、算術シフトになれば効率が非常に悪くなるケースも考えられます。
つまり、ハードウェアのアーキテクチャ次第では、下手をすると乗除算命令を使うより効率が悪くなる場合があるわけです。しかし、どんなにシフト演算命令の効率が悪いプロセッサでも、乗除算器がない場合には、その方が「まし」になります。

>あくまで「C言語を使ったことによって効率が悪くなる」話でしょうから。

これはアセンブリ言語を使った場合に比べて、という意味でしょうか?
それであれば、汎整数拡張の効率などを考えなければなりませんので、やはりハードウェアのアーキテクチャにかなり依存します。



この投稿にコメントする

削除パスワード

No.28200

Re:ビットシフトの処理効率
投稿者---たかぎ(2006/09/17 17:04:35)
http://takagi.in/


>私の環境はVC++6.0ですが、コンパイラオプションでアセンブリコードを出しても別段無駄なことをやってるようには見えません。
>処理系によって異なる可能性もないことはないですが、
>この質問、「そんなことはない」と答えてしまってもいいんじゃないでしょうか。

一応参考までに、H8/300H用のコードを紹介してみます。
処理系はgcc 3.4.5(ターゲットh8300-hms)で、オプションは-mh -O2 -fomit-frame-pointerを使った結果です。
int mult(int lhs, int rhs)
{
  return lhs * rhs;
}

int shiftl(int lhs, int rhs)
{
  return lhs << rhs;
}
をコンパイルすると、
	.section .text
	.align 1
	.global _mult
_mult:
	mulxs.w	r1,er0
	rts
	.align 1
	.global _shiftl
_shiftl:
	mov.b	r1l,r1l
	ble	.L4
.L3:
	shll.w	r0
	add.b	#-1,r1l
	bne	.L3
.L4:
	rts
となります。
正確なクロック数は計算していませんが、シフト演算の方が効率が悪いのは一目瞭然です。
ちなみに、H8/300Hのような古典的なプロセッサでは、1命令を1クロックで実行できるわけではなく、オペランドが長い命令ほど命令フェッチに時間がかかります。



この投稿にコメントする

削除パスワード

No.28201

Re:ビットシフトの処理効率
投稿者---円零(2006/09/18 12:47:23)


正直私のレベルでは難しい話ではありますが…

シフト演算を乗算で代用するのであれば、
シフト演算を乗算に変換するロジックも含めないと比較にならないのでは?


この投稿にコメントする

削除パスワード

No.28202

Re:ビットシフトの処理効率
投稿者---たかぎ(2006/09/18 13:55:06)
http://takagi.in/


>シフト演算を乗算で代用するのであれば、
>シフト演算を乗算に変換するロジックも含めないと比較にならないのでは?

そうなのですが、元々の用途がよくわからないので、単純な比較にしてみました。つまり、何と何を比べて処理効率の良し悪しをいうかによります。
本来乗除算を使うべきところをシフト演算にしようとしているのか、その逆なのか、あるいはもっと別の用途なのかが分からないと、どうしようもありません。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧