5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【高速化】ビット演算 0x02

1 :デフォルトの名無しさん:2006/09/16(土) 09:46:26
前スレ
ビット演算
http://pc8.2ch.net/test/read.cgi/tech/1123918075/


関連スレ
アセンブラ… (゜□゜) ↑アッー!↓
http://pc8.2ch.net/test/read.cgi/tech/1148402614/


関連情報
Hacker's Delight
ttp://www.hackersdelight.org/

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
ttp://www.amazon.co.jp/exec/obidos/ASIN/4434046683

ビットを数える・探すアルゴリズム
ttp://www.nminoru.jp/~nminoru/programming/bitcount.html

Bitboard
ttp://en.wikipedia.org/wiki/Bitboard

47 :デフォルトの名無しさん:2006/10/11(水) 06:57:09
Trががあれば、何でもできる。

48 :デフォルトの名無しさん:2006/10/11(水) 13:16:09
Magic Algorithm
http://aggregate.org/MAGIC/




49 :デフォルトの名無しさん:2006/10/11(水) 16:56:33
>>48
ひょっとしてradiumあたりで見た輩か?
>>1のサイトでとりあげられてる。
せめて>>1のサイトくらいみればよいのに・・・

50 :デフォルトの名無しさん:2006/10/11(水) 23:15:53
C++やJavaだとどちらかというと保守性重視だから
性能改善要求出る前にビット演算使うと白い目で見られる。

51 :デフォルトの名無しさん:2006/10/11(水) 23:18:57
>>50
例え処理が1行だけであっても、関数(インラインで良い)にしとけば文句でないはず。

52 :デフォルトの名無しさん:2006/10/11(水) 23:26:39
>>51
勿論明瞭なコメント付きでな。

53 :デフォルトの名無しさん:2006/10/11(水) 23:36:36
>>51
ついでに代替コードを書いておくとなお良い。

54 :デフォルトの名無しさん:2006/10/13(金) 04:27:35
ゴリゴリのチューニングが求めらるような場面でもなければ、たいていはコンパイラの最適化だけで事足りるわけだが。

55 :デフォルトの名無しさん:2006/10/13(金) 05:31:51
スクリプトでマスかいてろ

56 :デフォルトの名無しさん:2006/10/13(金) 09:38:47
>>54
確かにそれで文句が出ないどころかメンテしやすければ褒められるべきところではあるが
多少の遊び心があってもそれはそれで許される。
>>51-53のようなことをしてあれば。
(代替コードのテストも必要なことは当然なので、プログラマの負担はアップするが)

57 :デフォルトの名無しさん:2006/10/13(金) 13:48:49
ビット演算による最適化が必要で
パフォーマンス的に代替が効かないからこそ
そういうコードを書くわけだから
同等以上の速度が出た上に読みやすいコードを出せなければ
批難する事はできない。

もちろん意味もなくビット演算するアホの話は別として。

58 :デフォルトの名無しさん:2006/10/13(金) 16:28:36
でも普通インラインアセンブラ使うよね。そういうビット演算だと。
上で出てるようなCでなんて書かないよ。

59 :デフォルトの名無しさん:2006/10/13(金) 16:34:33
いや、俺はループアンローリングだとかプロセッサのスケジューリング管理
なんか考えたくないからC言語で書くけどね。
まぁ、どうしてもビット回転(rotate)が必要ならインラインアセンブラの
使用も検討するが。

60 :デフォルトの名無しさん:2006/10/13(金) 16:41:08
インラインアセンブラはアセンブラとは違うよ

61 :デフォルトの名無しさん:2006/10/13(金) 18:52:45
>>60
いや、当たり前の事実を主張されてもなぁ。
しかもなぜにこのタイミングで?わけわからん。

62 :デフォルトの名無しさん:2006/10/13(金) 21:02:46
>>60
何が違うの?

63 :デフォルトの名無しさん:2006/10/13(金) 21:26:25
ものほんのアセンブラならそもそも命令セットの数が違うみたいな?

64 :デフォルトの名無しさん:2006/10/13(金) 23:34:07
なんつー理屈だ。

寧ろインラインアセンブラだとCコード部とのI/Fが簡単に書けるメリットはあるね。

65 :デフォルトの名無しさん:2006/10/14(土) 00:47:40
ネイティブアセンブラ
 C言語との連携は関数呼び出しの形でのみによって実現される。
 殆どのメモリアクセスはシンボルではなくオフセット値での指定となるからめんどい。
 最適化の善し悪しはすべて自分の腕にかかっている。

インラインアセンブラ
 Cのソースに埋め込むことが出来るので、必要な箇所を個別に関数化する必要がない。
 関数内の局所変数にシンボリックにアクセスできる。
 一部のコンパイラはインラインアセンブラで書いた箇所も勝手に最適化してくれやがる。

66 :デフォルトの名無しさん:2006/10/14(土) 00:56:32
スレ違いだ。他所でやれ。

67 :デフォルトの名無しさん:2006/10/17(火) 13:52:46
論理演算部分をインラインアセンブラ化するのに、
どうして「プロセッサのスケジューリング管理」なんて話が出てくるのか誰か教えて!

68 :デフォルトの名無しさん:2006/10/17(火) 16:26:53
「プロセッサのスケジューリング管理」の意味はわかっているか?

69 :デフォルトの名無しさん:2006/10/17(火) 17:04:37
大方タイムスライスと勘違いしているんだろうけど。

70 :デフォルトの名無しさん:2006/10/17(火) 17:27:16
>>67
パイプラインでな、処理を円滑に進めるためには、命令の実行順序を適切に
並び替える必要があるんだ。命令実行順序の決定をスケジューリングという。
命令実行スケジューリングはふつうコンパイラが最適化の一環として施すが
インラインアセンブラで記述した部分はそのままの順序で出力されて最適化
されないことが多い。

71 :デフォルトの名無しさん:2006/10/26(木) 23:04:23


72 :デフォルトの名無しさん:2006/10/30(月) 22:09:37
あげ

73 :デフォルトの名無しさん:2006/10/30(月) 22:39:25
テンプレにある
>ハッカーのたのしみ
は、アマゾンで評価が高いみたいですが
本当に読んで面白い本なんですか?

74 :デフォルトの名無しさん:2006/10/30(月) 22:47:16
>>73
それはお前がビット演算を楽しめるかどうかによる。

75 :デフォルトの名無しさん:2006/10/31(火) 03:09:00
>>73
もしもあなたが書き溜めたソースコードを持っているのなら…

76 :デフォルトの名無しさん:2006/11/15(水) 19:13:21
ビット演算で絶対値を求めることってできますかね?
条件分岐をしないで絶対値を求めたいのですが…

77 :デフォルトの名無しさん:2006/11/15(水) 20:26:02
>>76
このへん見てみたら?
http://www.thescripts.com/forum/thread212935.html

78 :デフォルトの名無しさん:2006/11/15(水) 21:53:55
int y=x>>31;
return (x^y)-y;
か。
今ならcmovのほうが速いだろうけど

79 :デフォルトの名無しさん:2006/11/15(水) 22:56:58
ふーむ…
とりあえずリンク先を参考に試してみようと思います
ありがとうございました

80 :デフォルトの名無しさん:2006/11/26(日) 15:29:11
age

81 :デフォルトの名無しさん:2006/12/02(土) 22:52:42
age

82 :デフォルトの名無しさん:2006/12/03(日) 07:55:42
とにかく徹底的にif文使いたくないんだけど、
根本的に排除する方法ってないんですか?
こういう場合はできるよってのがあったらそれも知りたいです。
もうビット演算のこと以外考えたくないんです。

83 :デフォルトの名無しさん:2006/12/03(日) 08:40:06
>>82
論理回路にif演算器はない。

84 :デフォルトの名無しさん:2006/12/03(日) 08:40:31
if(a){
 x;
} else {
 y;
}



switch(a){
default:
 x;
 break;
case 0:
 y;
}

85 :デフォルトの名無しさん:2006/12/03(日) 08:50:26
じゃあ僕は条件分岐と一生付き合わなきゃいけないんですか?
一生、縁が切れないんですか??
もう勘弁しいてほしいんです。
ソース読みにくいのってみんなif文の所為じゃないですか。
この絶望のまま生きていたくない。

並列計算がうまくいかないのだってきっと条件分岐のせいですよ。
諸悪の根源と思っていますよ、もう。

ところで、論理シフトとかってあれは論理演算が関係してるんですか?

86 :デフォルトの名無しさん:2006/12/03(日) 09:38:32
if(a>b){
 x=c;
} else {
 x=d;
}

x=(a>b)*c;
x+=!(a>b)*d;

こんな感じかな?
ビット演算じゃ無いけど


87 :デフォルトの名無しさん:2006/12/03(日) 10:20:41
if(a){
 x;
} else {
 y;
}



n_if(a){
 x && a || y && !a;
}

88 :デフォルトの名無しさん:2006/12/04(月) 17:34:01
平凡にジャンプテーブル
void f();
void g();
int hoge;

  before:
if (hoge != 0)
  f();
else
  g();

  after:
typedef (*func_t)();
func_t table[] = {f, g};
table[hoge != 0]();

89 :・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 :2006/12/04(月) 22:59:51
関数コールのペナルティ>>>分岐予測ミスのペナルティ


d = a ? b : c;

とかでも使えば?組み込みのCMOV命令に展開してくれたりするし
SIMD系の命令セットは比較命令はマスク生成のことが多い


90 :デフォルトの名無しさん:2006/12/04(月) 23:03:57
P4だと、テーブル参照方式はペナルティが信じられんほど凄い。
命令20ぐらいをズラスラ書いたのより、テーブル参照1つの方が遅かったりする。

91 :デフォルトの名無しさん:2006/12/07(木) 00:04:36
最近それ経験した。
switchで振り分けた方が遥かに速かったわ。恐るべし分岐予測。

92 :・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 :2006/12/07(木) 00:39:10
>>82はPS3かなんかの開発やらされてるゲームプログラマなんじゃね?

93 :82:2006/12/11(月) 04:57:32
もうジャンプするのも嫌になりました。
if文なしのジャンプなしで何とかならないでしょうか??

94 :デフォルトの名無しさん:2006/12/11(月) 18:38:36
てきとーに制限つけてその条件内で考えさせたいだけでしょ。

95 :デフォルトの名無しさん:2006/12/18(月) 22:14:18
age

96 :デフォルトの名無しさん:2006/12/25(月) 20:04:45
sub a, b
adc pc, a


25 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)