[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/18 20:43 / Filesize : 166 KB / Number-of Response : 785
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C、C++の最適化について語るスレ 2



1 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 09:54:14 ]
コンパイラ性能、コンパイルオプション、コードの最適化などについて語りましょう。
主に速度面の最適化を中心としますが、サイズなどの最適化もどうぞ。
なお、OS、CPU、コンパイラなどは限定しません

前スレ

C、C++の最適化について語るスレ
pc11.2ch.net/test/read.cgi/tech/1084676298/


263 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:42:52 ]
if((a == 1) && (b == 1)){ asdf; } という処理は論理積 && を使っている以上、分岐が2つある
if(a == 1){ if(b == 1){ asdf } } に等しくて、これだと条件分岐が多くその分投機予想も外れる可能性があがるので
if((a == 1) & (b == 1)){ asdf; } にすべきだ、っていう話を聞いたんですが、これは本当なんでしょうか?
もしくは、そんな事は演算子がオーバーロードされていない限り明確に分かりきった事なので
あらかじめコンパイラが論理積を (a == 1) & (a == 1) と同等の処理に最適化してくれたりとかはないんでしょうか?

264 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:57:59 ]
>>263
実験してみた。最適化できるみたい。
$ cat test.c
void g(void);
void f(int a, int b) { if ((a == 1) && (b == 1)) { g(); } }
$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -S -o - -Os test.c
.file "test.c"
.text
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
pushl %ebp
movl %esp, %ebp
cmpl $1, 8(%ebp)
sete %al
xorl %edx, %edx
cmpl $1, 12(%ebp)
sete %dl
testl %eax, %edx
je L1
popl %ebp
jmp _g
L1:
popl %ebp
ret
.def _g; .scl 3; .type 32; .endef

265 名前:264 mailto:sage [2008/01/29(火) 13:01:03 ]
>>263
使っているコンパイラでは結果が違うかもしれない。そういう環境で、且つ、実際に
そのレベルの高速化が必要ならビット AND への置き換えもありうる。ただしその場合は
しっかりコメントで実験結果に基づくコードだと添えておく必要があるだろうね。

266 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:11:04 ]
なるほど、ありがとうございます。

267 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:35:23 ]
実装が長くても1度しか呼ばれない関数って、普通最適化でインライン展開されますよね?

268 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:41:11 ]
試してみれば?

269 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:46:26 ]
インライン展開されます

270 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:46:55 ]
コンパイラによってはインライン関数がちゃんと展開できたか教えてくれるコンパイルオプションがあるよ
gccの話だけど

271 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:47:27 ]
ごめんなさい忘れてください



272 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:23:04 ]
同じ内容の関数を複数用意して使い分ける意味ってあるんでしょうか?

273 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:21:21 ]
>>272
唐突に質問されても何を聞きたいのか判りませんが。
同じ内容でも型が違う場合はC++ではテンプレート関数で一つで済ませることもできますが、
Cではできません。その辺りの話でしょうか?

274 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:30:48 ]
>>273
そうではなく、

void foo1(int hoge){};
void foo2(int hoge){};
void foo3(int hoge){};
中の処理も全く同一な関数です

オーバーロードだとかそういうのでも全くないです

275 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:35:21 ]
>>274
別に意味なんてないと思うが。訳が分からん。
typedef void (*func_t)(int);
とやっておいて、どこかでfunc_tの変数を宣言してそれらを代入し、
fptr1 = foo1;
fptr2 = foo2;
if(fptr1 == fptr 2){ ... }else{ .. }
として、処理は同じだけど違うものとして動作させたいと言うくらいしか思いつかないな。
意味があるかないか、どちらにしろそのソースコードを書いた人に直接訊いてみれば良い。

276 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:38:01 ]
ただのアホな作りなのか、後の仕変に対応するための措置なのか見極める必要はある。
現状で言えばまとめてしまって構わないとは思うが。

277 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:49:44 ]
I キャッシュの関係で、そういうのを最適化のために使えるケースというのはあった。リンカスクリプトも直す必要があるが。
多分違うケースなんだろうけど。

278 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:56:47 ]
>>272
目的があれば意味があるんじゃないの?

279 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:57:35 ]
string::size と string::length は全く同じメソッドだな。
文字列としては length という言葉を使う方がしっくりくるが、
コンテナとしての要件を満たすには size がないと困る。
なら両方作っちゃえって感じなんだろう。
こういう例ならありうると思う。

280 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:08:27 ]
ファイルやフォルダをコピーしたり消したり作ったり、.NETで言うFileInfoクラスやDirectoryInfoクラスを
自分で実装するのは.NETに頼らなくて済む、以外のメリットないのかなぁ・・
このまま行くと.net病になりそうだ・・・

どうすりゃ効率いいかなぁ・・

281 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:18:24 ]
既存のクラス使う方が仕事の効率は良さそうだな。



282 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:18:25 ]
微妙に誤爆・・だけど平気かぎりぎり・・・いやごめんなさい

283 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:20:15 ]
うひょー、れすがついちゃってた

>>281
Windows専用なら.NET全然良いかな、と思う
でも趣味でやってる分には微妙に素直に割り切れないというかなんというか


284 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:24:31 ]
というかそのFileInfoクラスだけならともかくさ、他にも色々必要だろ
言い過ぎの誇張表現になるけどそのすべてにおいてMS開発陣の書いたコード以上のものを書けるのかってことになる

つまり.NETを1箇所以上で使うなら出来得る限り.NETで実装を

285 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:25:36 ]
効率ってのが速度を表すなら、全ての.NETコードは効率が悪いことになる。

286 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:18 ]
個人でやる分には安心感はあるけどねえ

287 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:47 ]
>>279
lengthはsizeを呼ぶだけとかってなら、アリだね。
極力重複コードは避けるべき。


288 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:28:45 ]
うあー、こんなんにレスつけてくれてありがとうございます

>>284
コードの数割は.NETのを利用したもので、主要な処理の部分だけちょっとがんばって
頼らず書こうかなと思ってたんだけどそのままにしときます

289 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:15:21 ]
まあ.NETのあるクラスのすべてのメソッドをフル活用する状況ならいんじゃないかねえ

290 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:50:44 ]
>>287
重複コードは inline 関数のおかげで簡単に避けられるね。

Ruby とか同じ動作の別名関数が用意されてる事が多い。
A という言語では a という名前で、
B という言語では b という名前な関数を Ruby に作る時には、
a と b の両方の名前を採用しちゃえ、みたいな。

291 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:04:15 ]
そういえばC++には識別子のalias機能がないんだね。



292 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:12:28 ]
で、でふ

293 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:13:17 ]
変数は参照で、
関数はインライン関数で、
型は typedef で、
名前空間は namespace a = b; で、
クラステンプレートは継承でそれぞれ可能ではある。

ただ、インライン関数使うのと、
クラステンプレートを継承するのとは、
結構面倒臭い。

294 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:16:11 ]
このスレ地味に常駐多くないかい

295 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:27:22 ]
C++0xであるかも知れないが、テンプレートのエイリアスは作れないよな。

typedef std::vector my_vector;

みたいなの。>>293にも書いてある継承は可能ってレベルではない。
コンストラクタやらオペレータやら全部知っていて、尚かつ書かないといけない。

296 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:33:01 ]
オペレータは必要ないと思う。
コンストラクタは作らないとダメだけど。

297 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:55:01 ]
>>296これで例として成立してるか自身無いけど。
継承しちゃうとoperatorの返す型と継承した型が異なっちゃうからうまくいかない。

struct c {
  int v;
  c operator+(int n) {
    c t;
    t.v = v + n;
    return t;
  }
};
struct d:public c {};
main() {
  d e, f;

  f + 1; // OK
  e = f; // OK
  e = f + 1; // Error
}


298 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:01:54 ]
>>297
ああ、なるほど。
というか、色んな状況を考えると継承では不完全なのか。

299 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:10:51 ]
if(hoge.piyo == hogehoge.piyo)
 hoge.piyo = hoge.piyo & ~sym.att;

こんなのはこれ以上どうにもなりませんよね?

300 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:04:15 ]
分岐は無くせるけどね。
hoge.piyo = ~(sym.att & -(hoge.piyo==hogehoge.piyo) & hoge.piyo;

x86でPentiumPro以降に限定するなら
hoge.piyo = ~(hoge.piyo == hogehoge.piyo ? sym.att : 0) & hoge.piyo;
はCMOVになる可能性がある。

SSEで書けば次のようにも出来る。
// hoge.piyo = ~(sym.att & -(hoge.piyo==hogehoge.piyo) & hoge.piyo;
hige.piyo = _mm_andnot_ps(_mm_and_ps(sym.att, _mm_cmpeq_ps(hoge.piyo, hogehoge.piyo)), hoge.piyo);

ただSIMD以外は保守性が悪くなるだけであんま効果無いと思う。
実測した方がいい。

301 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:29:28 ]
>>300
なるほど・・-ってのを初めてみたんで調べてきます、ありがとうございます



302 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:44:47 ]
ANSI Cの仕様ではA==Bが真なら1になるから-1(全ビットON)にしてマスク作ってるだけだよ。
x86なら分岐せずにSETcc + NEGにコンパイルされるはず。

303 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:57:10 ]
偉そうな割には右括弧が足りないぞ。

304 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:00:29 ]
どの道やってること同じではないのか

305 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:36:34 ]
まぁ、>299程度ならコンパイラに任せて実測してみてからだな。
CMOVになったところで大した差は出ないだろ。

306 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:37:59 ]
Windows環境でのファイルなんかのコピーを大きくする手段ってないですよね・・

どのみちOSの機能頼りなわけだから

307 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:39:36 ]
コピーしたつもりがおっきくなっちゃうのかー。そりゃねーな。

308 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:41:01 ]
すんません、ガチで寝ぼけてる

早くする、ですほんとごめんなさいごめんなさいごえmんあい

309 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:43:14 ]
早くする手段ならいくらでもあるだろ。
速いかどうかは知らんが。

310 名前:デフォルトの名無しさん [2008/02/04(月) 13:48:24 ]
ストライピング
コードレベルの最適化とは無縁だが。

311 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:54:21 ]
高速化っていうんだから速くか

ストライピング、調べてきました
それだと送り先が2箇所なのかな・・・
コピー元も先も1箇所なんです

というかコードレベルって話じゃないですよね、把握しました



312 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:55:51 ]
単純にバッファをいじるとか

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet
/Control/Session Manager/Memory Management
ここの数値を

というか普通こんなことしねえよな・・

313 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:58:42 ]
>>311
実際問題、ファイルアクセスの速度はデバイス側の事情で決まってしまう。
と言うことで、単純に速くする方法はない。
寧ろ、本当にファイルコピーの時間が問題なのか、例えばレスポンスが問題なのか、検討した方がいい。

314 名前:312 mailto:sage [2008/02/04(月) 13:59:50 ]
うちの環境だと10Mにしてるけどよく考えたら馬鹿すぎる方法だ

確か再起動必要だった気がするし

315 名前:311 mailto:sage [2008/02/04(月) 14:12:46 ]
>>313
最近、.NETFrameworkというものを触ってみまして
色々試してみようとコンソールなんですがファイルをコピー(バックアップ?)する
ものを作ってみたんですが、そこでコピー自体速くならないかなあと思った次第です

>>312>>314
再起動必要じゃあれですね・・・
Win32APIとかってのもWindowsの機能を使うやつだって聞いたんで
それでファイルのコピーするとこを実装すれば速いんだろうか

316 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:20:28 ]
>>315
先ず、.Netって時点でスレ違い。
次に、ファイルコピー自体の速度はデバイス依存だ。
.Netでファイルコピーしていて遅いと思うのなら、コードレベルの最適化ではなく.Netの使い方の問題だ。

317 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:23:52 ]
C/C++でファイルコピーなんてファイル開いて読み取って書き込むの繰り返しなんだからさ
たぶん.NETでもAPIでも使った方が良い

ということでもうそれで完成でいいじゃない

318 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:14:23 ]
>>311
Windows 限定なら FastCopy.exe のソースとか見ればいいんじゃないか。

319 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:28:22 ]
オープンソースとか見ると趣味人でもない限りC/C++やWinAPIを使うのってことがどういうことかわかっちゃうよな

320 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:24:12 ]
俺は、お前の言ってることがどういうことかわからん。

321 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:30:10 ]
開発効率と現状溢れかえってるPCのスペックの話だろうか

まあ例外は確かに往々にあるけど例外は圧倒的にマイノリティ
うちも業務じゃC/C++なんて使わないわ



322 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:05:18 ]
何言ってんだこいつ。
Webでもやってろ。

323 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:09:41 ]
webは全然分類違うだろ、どこのアマグラマだよ

324 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:10:33 ]
業務でC++主流だと思ってるのか・・

325 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:14:07 ]
マジョリティマイノリティでわけちゃうとなぁ

まあ業務になると大抵どっちかだけ向いてればいいんだが

326 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:46:26 ]
スレチ自重

327 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 20:32:36 ]
ここに適当なコード張ってみんなで最適化とか考えたけど適当な長さのコードが見当たらなくて10分で諦めた

328 名前:デフォルトの名無しさん [2008/02/07(木) 16:30:40 ]
AMD向けの最適化に関するマニュアルはAMDのホームページにありますが、インテル用のはどこかでダウンロードできなうのでしょうか?

329 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:42:36 ]
>>328
www.intel.co.jp/jp/download/index.htm

330 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:32:52 ]
>>328
ttp://www.agner.org/optimize/

331 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:01:18 ]
おいお前ら、俺のこいつをみてどう思う?

class Vector3
{
public:
union
{
struct {float x, y, z;}
float data[3];
};
Vector3() {}
Vector3(float ix, float iy, float iz)
{
x = ix;
y = iy;
z = iz;
}
};

inline Vector3 operator+(const Vector3 & va, const Vector3 & vb)
{
return Vector3(va.x + vb.x, va.y + vb.y, va.z + vb.z);
}

ベクトル化されるかな



332 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:16:06 ]
人に読んでもらうんならもうちょっとマシなコードを書いて欲しい所

333 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:17:37 ]
横レスだが、別に普通じゃねえかw

334 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:50:50 ]
全角スペースでいいからインデントをだな

335 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:51:35 ]
コードがマシかどうかとは関係ないじゃん

336 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:06 ]
>>332
「もうちょっとマシなコード」をkwsk

337 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:14 ]
>>334だけど>>332じゃないです

338 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:52:45 ]
ここで一つ自演を見付けると

339 名前:331 mailto:sage [2008/02/11(月) 04:00:14 ]
分かった、インデントが無いのは謝る
コンパイラ通してないのも謝る

ただ俺は…ベクトル化について語って欲しかっただけなんだ…

340 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:03:30 ]
コンパイルしてみりゃいいじゃん。

341 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:30:20 ]
>>336
・classじゃなくて別にstructでいいんじゃ?
・無名共同体内無名構造体の後のセミコロンがない
・デフォルトコンストラクタ邪魔
・メンバ初期化子を使って欲しい そして出来れば引数もconst type&で受け取った方が
・演算子オーバーロードを行う関数の引数名はrhs, lhsにするのが普通



342 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:04:44 ]
>>341
・classじゃなくて別にstructでいいんじゃ?
俺は変数だけならstruct、関数あるならclass使ってるが

・無名共同体内無名構造体の後のセミコロンがない
struct {float x, y, z;} ←これか。スマン

・デフォルトコンストラクタ邪魔
コンパイラによっては0で初期化される・・・っていう記憶があるから、
不定値のままでいいから一応書いた

メンバ初期化子を使って欲しい そして出来れば引数もconst type&で受け取った方が
うぉ?!全くその通りだw
Vector3(const float & ix, const float & iy, const float & iz)
: x(ix), y(iy), z(iz)
{}
これでおk?

・演算子オーバーロードを行う関数の引数名はrhs, lhsにするのが普通
知らんかった

レスありがとう

343 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:22:15 ]
忘れるところだった。俺はベクt(ryについて聞いてたんだ
return Vector3(va.x + vb.x, va.y + vb.y, va.z + vb.z);
こいつはベクトル化されるのか?

それとも、
Vector3 v;
for (int i = 0; i < 3; i++) {v.data[i] = lhs.data[i] + rhs.data[i];}
return v;
とか書かないとダメかな

まぁコンパイラ依存な訳だが、どこまで美味く最適化してくれるか知りたいんだ

344 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:27:03 ]
そこだけ見てもベクタ化されるかどうかは不明。
ってことで、クラスの作りだけ見ると、unionにする理由が判らん。
配列のようにも構造体のようにも使いたいのならそういうアクセッサを用意すればいいだけだから、
そもそもデータメンバを公開する理由が判らん。
あーそれから、floatを引き数とするコンストラクタなら参照にしなくて充分。

345 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:29:19 ]
>>343
だから、コンパイラが何か、どんな使い方をするかなども書かれていないのにベクタ化されるかは不明だってば。
わざわざforループにしなくても、ベクタ化できるコンパイラならベクタ化すべきときにはしてくれるだろうよ。

346 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:48:14 ]
これは3次元ベクトルのクラス。できる限りの高速化が望まれる
xyz公開してるのはGetX()とか作ったり使ったりするのが面倒くさいからだ
コンパイラはVisual Stdio 2005のやつ

347 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 06:15:07 ]
「できる限りの高速化」を望みつつ、条件も出さずに実測もしないで、
挙句の果てに「面倒くさい」って、阿呆ですか?

348 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:07:04 ]
>>347
俺が求めてるのは実測とかじゃなくて、最適化についての経験談なんだが
こうした方がベクトル化され易い、とか…
あと、
void Vector3::GetX() const {return x;}
void Vector3::GetY() const {return y;}
void Vector3::GetZ() const {return z;}
とか実装しろと?
最適化、いや高速化に関係するのか?

349 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:42:43 ]
>>348
だから、いろんなサンプル作って実測してみろって。
クラスを作るのなら効率よく組めて且つ速いものも狙うのは当然だろうし、
そうでないなら速度重視でがりがり書くことになるからクラスなんて作る意味がないって。

要は、やることが半端なの。

350 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:17:11 ]
float を参照渡しする意味はあるのか?

351 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:21:53 ]
>>349
自己矛盾乙



352 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:28:39 ]
むしろだめだろう、リテラルわたせないじゃないか

353 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:36:13 ]
一時オブジェクトが生成されるから問題ない。

354 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:37:31 ]
インライン化されるだろうから多分変わりはないだろうが、
積極的に参照にする理由は無いな。

355 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:39:02 ]
そうでしたかごめんなさい

356 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:43:56 ]
>>351
どこが自己矛盾?

357 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:55:47 ]
他人に訊く暇があったらまずやってみろ!
それで自分の力だけではどうにもならない事が起きた時初めて他人を頼る
でないといつまでたっても他人に頼る癖が抜けないぞ

358 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:56:22 ]
インライン化される事を前提としているならconst参照渡しは問題ないというかコンパイラの助けにある程度なるだろうけど、
確かに中途半端に長い関数で1ワードごときの変数を参照にする必要は無い。

359 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:45:14 ]
>>357
ここは相談の場でなくて語り合う場だが?

360 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 04:43:20 ]
void float Func(const float &f)
{
 return (f + f - f) * f / f;
}

イコール

void float Func(const float *f)
{
 return (*f + *f - *f) * (*f) / *f
}

だと思ってた。それとも

void float Func(const float *f)
{
 float g = f;
 return (g + g - g) * g / g;
}

こうか?参照渡しって内部的にどういう処理が行われてるの

361 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:03:41 ]
>>360
最適化されると、後2者の区別はなくなりますが。
# void float とかfloat g = f は兎も角



362 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:12:40 ]
>>360
最適化されると、内部的に変数の所在を渡すよりも変数の値をそのまま渡した方が速度が出るので

void float Func(const float f)
{
 return (f + f - f) * f / f;
}

になる。

363 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:26:12 ]
適当にコピペして解説したんだけど
>void float
まさかこんな風に書いてあったなんて

364 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:27:45 ]
>>362
最早意味不明だし。インライン展開されない限り、参照やポインタ渡しが値渡しになることは有り得ません。
# インライン展開されたらされたで、Func()自体が(その呼び出しについては)消えてなくなるだろうけど。

365 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:41:48 ]
>>364
不動小数点数の演算って、足して引いて 0 とか、かけて割って 1 とか、畳んでいいんだっけ?

366 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:44:28 ]
>>365
実際に最適化されるときに、引き数が明らかなら可能。
そういう意味では、>364は不正解。

367 名前:364 mailto:sage [2008/02/12(火) 12:05:54 ]
>実際に最適化されるときに、引き数が明らかなら可能。
あー失礼しました。
gccでの確認ですが、確かにFunc(1.2f)とかは消えてなくなるけど
Func(atof(argv[1]))とかだとちゃんと四則演算してますね。
--
call __strtod_internal
fstps -4(%ebp)
movss -4(%ebp), %xmm3
movss %xmm3, %xmm1
addss %xmm3, %xmm1
subss %xmm3, %xmm1
mulss %xmm3, %xmm1
divss %xmm3, %xmm1
subl $8, %esp
cvtss2sd %xmm1, %xmm0
movsd %xmm0, (%esp)

368 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:30:06 ]
C/C++でGUIを実装する場合、どういった手段が適当でしょうか?(Windows環境)

色々調べてみたところ
・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う
・WinAPIを直接、みたいなことは趣味でやる人が使う
(山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で)

で、実際人に聞くと今度はMFCという意見が出てきました
調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない

と、こんな感じでして、どっちに進むべきか悩んでいます
やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です
C#/VB.NETというものも一応考慮のうちに入れておきたいです
(GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです)
それではよろしくお願いします

369 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:56:45 ]
スレタイ読め

370 名前:360 mailto:sage [2008/02/14(木) 09:34:39 ]
スマン、遅レスだがvoidは間違いだ
floatもマズかったかな

double Func(const double &d)
{
 return (d + d - d) * d / d;
}

こいつはコンパイルされた後ってどうなるんだ?
アセンブリ知らないから、とりあえずCの文法的に書いてみるけど

double Func(double d)
{
 return (d + d - d) * d / d;
}

になるのか。それとも

double Func(double *d)
{
 return (*d + *d - *d) * (*d) / *d;
}

になるのか。まさか後者みたいなコード吐かないよね
もちFunc関数自体が省略されない場合で

371 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:45:00 ]
>>370
アセンブリ知らないという見方なら C の規格上の実行モデルで考えることになり、
その場合にはそれら2つは引数が値渡しである点を除いてほぼ等価。

違いを知りたければアセンブリを見るしかないでしょ。



372 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:46:13 ]
コンパイルして逆アセンブルしてみればいいんじゃないの?

373 名前:368 mailto:sage [2008/02/14(木) 10:34:16 ]
すんませんごばく

374 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:38:12 ]
>>370
参照で書かれた関数は、ポインタで書かれた関数と同じコードを吐くよ。
その例では、後者と同じと言うことになる。
勿論、後者自体がdouble Func(double * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;}
と殆んど同じコードを吐くという前堤でね。

375 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:36:36 ]
ちょっとコンパイルしてみた。
--
double func(double const d) {return (d + d - d) * d / d;}
double func(double const & d) {return (d + d - d) * d / d;}
double func(double const * d) {return (* d + * d - * d) * * d / * d;}
double func(double const * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;}
-- 以下適当に行を圧縮
_Z4funcd:
movapd %xmm0, %xmm1 addsd %xmm0, %xmm1
subsd %xmm0, %xmm1 mulsd %xmm0, %xmm1
divsd %xmm0, %xmm1 movapd %xmm1, %xmm0
ret
_Z4funcRKd:
movsd (%rdi), %xmm1 movapd %xmm1, %xmm0
addsd %xmm1, %xmm0 subsd %xmm1, %xmm0
mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0
ret
_Z4funcPKd:
movsd (%rdi), %xmm1 movapd %xmm1, %xmm0
addsd %xmm1, %xmm0 subsd %xmm1, %xmm0
mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0
ret
_Z4funcPKd:
movsd (%rdi), %xmm1 movapd %xmm1, %xmm0
addsd %xmm1, %xmm0 subsd %xmm1, %xmm0
mulsd %xmm1, %xmm0 divsd %xmm1, %xmm0
ret

376 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:55:14 ]
>>375
VC++2003で最適化オプションを全て有効にして、その4つの関数を定義して
連続で呼び出してみたら、インライン展開されて計算は1回だけで結果を
4回コピーするだけのコードになった。完全に同一とみなされてるね。

あと、インライン展開されてないコードではSSEを使っているけど、展開された
部分ではSSEは使ってなかったな。

377 名前:360 mailto:sage [2008/02/16(土) 01:27:08 ]
俺の環境(VS2005SE)で速度重視ならこんな感じ
展開はされてない

func1:
fld qword ptr [esp+4] fld st(0)
fadd st,st(1) fsub st,st(1)
fmul st,st(1) fdivrp st(1),st
ret

func2:
fld qword ptr [eax] fadd st(0),st
fsub qword ptr [eax] fmul qword ptr [eax]
fdiv qword ptr [eax] ret

func3:
fld qword ptr [eax] fadd st(0),st
fsub qword ptr [eax] fmul qword ptr [eax]
fdiv qword ptr [eax] ret

func4:
fld qword ptr [eax] fld st(0)
fadd st,st(1) fsub st,st(1)
fmul st,st(1) fdivrp st(1),st
ret

あれ、これってSSE使われてないよね。なんで?

378 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:17:22 ]
>>370
参照はポインタで渡されるので、関数を呼び出す場合は後者の関数が生成される。
インライン展開されるばあいは、最適化されてポインタが使われない前者と同等になるよ。
>>376
2005proではインライン展開もSSE2になってた。
>>377
SSE2のオプションは確認した?

379 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:22:53 ]
>>378サンクス。オプション忘れてたw
インライン展開されているものは全て同じコード吐いてるっぽい
されていないものはこんな感じ

double func1(double const d) {return (d + d - d) * d / d;}
004018A0 movapd xmm0,xmm1
004018A4 addsd xmm0,xmm1
004018A8 subsd xmm0,xmm1
004018AC mulsd xmm0,xmm1
004018B0 divsd xmm0,xmm1
004018B4 ret

double func2(double const & d) {return (d + d - d) * d / d;}
double func3(double const * d) {return (* d + * d - * d) * * d / * d;}
double func4(double const * d) {double tmp = * d; return (tmp + tmp - tmp) * tmp / tmp;}
00401880 movsd xmm1,mmword ptr [eax]
00401884 movapd xmm0,xmm1
00401888 addsd xmm0,xmm1
0040188C subsd xmm0,xmm1
00401890 mulsd xmm0,xmm1
00401894 divsd xmm0,xmm1
00401898 ret

func1の方が短い事にちょっぴり驚いた。引数でdoubleそのまま使うのも有りって事か?

380 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:18:29 ]
このスレに来て学んだことは「とりあえず素直に書いておけ」

381 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:23 ]
結局、最適化器を書いてるのは人間だから、
「彼らが想定する人間であること」
が大事になってくるわな。



382 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:45:37 ]
double を参照渡しはまずせんわな。

383 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:55:13 ]
たしかに直接にdoubleを参照渡しにすることは無いけど、テンプレートを使うときに引数を参照渡しにすることはよくある。
その結果、doubleを参照渡しにしてしまうことも多々ある。インライン展開なら参照渡しもしっかり最適化されるので助かる。コンパイラ屋さんに感謝だな。

384 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:59:07 ]
値渡し用の型を取得するためのテンプレート使うといいよ。

385 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:59:30 ]
値渡し用の型、じゃねえや。
そういった引数用の型、だ。

386 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:01:08 ]
テンプレートだと、問答無用に値渡ししないか?
と思ったが、bindとかfunctionとか参照渡しだったな。

387 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:04:48 ]
特定の基本型のみ値渡しにし、
他の型は全部 const 参照にするってやつ。
要するに boost::call_traits<T>::param_type 。

388 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:13:07 ]
凄いことができるんだな。テンプレートって奥が深いな


389 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:15:22 ]
つかフツウやるやろ

390 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:16:53 ]
まあ実装はかなり泥臭いがな。
基本的に const 参照にして、基本型全部で特殊化。
実際にはもうちょっと階層的に作ってあるけど、
基本的にはそんなとこ。

391 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 03:33:06 ]
分かりやすいのが一番だと思ってる。でも必要な所はあるわけですよ
・・・このスレに何しに来たっけ

これをどうするか聞きに来たんだっけかw
//----------
class Vector4
{
public:
 float x, y, z, w;

 Vector4(float ix, float iy, float iz, float iw)
  : x(ix), y(iy), z(iz), w(iw)
 {}
};

void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB)
{
 pO->x = iA.x + iB.x;
 pO->y = iA.y + iB.y;
 pO->z = iA.z + iB.z;
 pO->w = iA.w + iB.w;
}
//----------
ベクトル和を計算するAdd関数がある訳だが、とにかく速度が欲しい。
SSEのパックド単精度実数関連の命令(ADDPSとか)使えば早くなるはずだと
というか、最適化で勝手にやってくれると思っていたんだが、パックド使ってるようには見えない
まさか、この程度なら使わない方が早いのか・・・
おまいらならどうコーディングする?

完全にぶりかえしですまん



392 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 04:02:10 ]
コンパイラが場合によって速いほうを選べるように inline にする。
必要な箇所があれば intrinsic でもアセンブラでも使う。

393 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 04:26:20 ]
残念だがそれをaddps1個に翻訳できるほど現時点でのコンパイラは賢くない。だからこそのIntrinsicsなわけで。

394 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:37:36 ]
//----------
#include <dvec.h>
class Vector4 : public F32vec4
{
public:
 Vector4(float ix, float iy, float iz, float iw)
  : vec(ix, iy, iz, iw)
 {}
};

void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB)
{
 *pO = iA + iB;
}

この程度だとラップする意味が無い

395 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:40:31 ]
Intel C++ or VC++なら
#include <fvec.h>

でF32vec4を使う。
テキトーにラップしてよし。
あと、インライン化しないとあんまり効果ないよ。
実関数化するとコールのオーバーヘッドに食われる


396 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/18(月) 06:41:40 ]
class Vector4 : public F32vec4
{
public:
 Vector4(float ix, float iy, float iz, float iw)
  : F32vec4(ix, iy, iz, iw)
 {}
};

に訂正

397 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:29:40 ]
ダンゴさんの連投でスレが活気付いたな

398 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:38:46 ]
活気づいたっていうのかよこれは

399 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:24:21 ]
1人だけで盛り上がっていては活気付いたとはいえない。
実際に活気付くのは397からだから397の話題振りで活気付いたということにしないと。

400 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:34:36 ]
>>391
こうならばどうか?
//----------
class Vector4
{
private:
 float x, y, z, w;
public:
 Vector4(float ix, float iy, float iz, float iw)
  : x(ix), y(iy), z(iz), w(iw)
 {}
void Add(Vector4 * pO, const Vector4 & iA, const Vector4 & iB)
{
 pO->x = iA.x + iB.x;
 pO->y = iA.y + iB.y;
 pO->z = iA.z + iB.z;
 pO->w = iA.w + iB.w;
}
//或いは
void Add(Vector4& pO, const Vector4 & iA, const Vector4 & iB)
{
 pO.x = iA.x + iB.x;
 pO.y = iA.y + iB.y;
 pO.z = iA.z + iB.z;
 pO.w = iA.w + iB.w;
}


401 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:36:08 ]
>>400
最後の行に括弧が抜けてた。
};




402 名前:ヽ・´∀`・,,)っ¬ mailto:OH MY LITTLE バール♪ sage [2008/02/18(月) 15:42:20 ]
駄目。それでもスカラにしかならない。

addpsに展開されることが目的なら、配列にして
for(int i=0; i<4; i++) vD[i] = vA[i] + vB[i];

全要素に同じ操作をしてますよってヒントにはループが一番効果的。
手動アンロールしちゃうと効果ない。


403 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:57:21 ]
それバールだったのか。釣竿だと思ってたぜ。

404 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:10:23 ]
内部をバラの変数にしても配列にしても外からはわからない。
これぞクラスで隠蔽する良さだな。

405 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:27:11 ]
遅レスすまん
f・・・vec.h・・・?こんなの知らなかったよ。
fvec.h は実数、dvec. h は整数の CPU 拡張機能を用いた演算関連のヘッダー、でいいのかな

class Vector4 : public F32vec4
{
public:
 Vector4() {}
 Vector4(float ix, float iy, float iz, float iw) : F32vec4(ix, iy, iz, iw) {}
 Vector4 & operator =(const F32vec4 & rhs) {*this = rhs; return *this;}
};

inline void Add(Vector4 * pO, Vector4 & iA, Vector4 & iB)
{
 *pO = iA + iB;
}

inline void Normalize(Vector4 * pO, const Vector4 & i)
{
 F32vec4 v2(i * i);
 F32vec4 norm(sqrt(v2[0] + v2[1] + v2[2] + v2[3]));
 *pO = i / norm;
}

正規化関数も作ってみた。俺の理解力だと今はこれが限界
Vector3 とかも作ってみたいが、float * 4 をパックにしなくちゃいかんから、float 1つ分余計にメモリ必要なんだな
fvec.h & dvec.h は xmmintrin.h をインクルードしてるが、直接使っても構わないかな

>>400
今まではそうしてた。あと、「};」が抜けてるからメンバ関数が inline か否か判らんぞ

追伸:Intrinsics の発音はイントリンシックスでおk?

406 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:22:14 ]
>>405
>\in-?trin-zik, -?trin(t)-sik\
>ttp://cougar.eb.com/soundc11/i/intrin01.wav
よって、「イントリンジク」。

407 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:33:11 ]
>>405
VC++なら
class Vector4
{
public:
 union {
  float d[4];
  struct { float x, y, z, w; };
 };
};
これでAddをforループにしたら、SSE使ってくれたよ。

408 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:23:05 ]
class myvec
{
public:
 union {
  T array[N];
  struct { T a, b, c, d, ... };
 };
};

とする場合、特にTがマシンが扱う1Wordの倍数でないと
元々struct { T a, b, c, d, ... }; 部分の各要素の連続性が保証されてないからどう動くかが分からなくなる。
つまり T array[N] では T はきっちり詰め込まれているものの、 struct { ... }; は中で要素の間に空白のブロックが入る可能性がある。
ふじこふじこ

409 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:09:07 ]
ごめん、407を訂正する。
SSE使っていることには使っているが
 movss xmm4, DWORD PTR [eax-8]
 addss xmm4, xmm0
 movss DWORD PTR [eax-8], xmm4
こんなコード吐いてた。(要素数の数だけ繰り返し)
VC++2003ではベクトル化してくれるほど頭よくないようだ。

これでも普通にFPU使うよりは速いの?

410 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:57:23 ]
>>407
クラスメンバの実体は

private:
float r[4];

にしといて、メンバ関数で

public:
float &x(){return r[0];};
const float &x()const{return r[0];};

などとするのがC++的。

411 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:58:16 ]
>>409
x86-64はSSE使う方が速いし、FPUの利用は推奨されていない。



412 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/19(火) 23:01:55 ]
自動ベクトル化は何故かVC++ではやってくれないね。何年もなるのに未だに対応しない。
まあIntrinsicsを使うのがいいでしょう。

どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので
性能落ちる。F32vec4かもしくは__m128iから派生するのがヨシ。

413 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:49:02 ]
>>410
そういう仕様のベクトル演算クラスって少ないよ。C++でも

414 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/20(水) 02:11:33 ]
より汎用化したいならテンプレートにしてIntrinsicsベッタリな部分はtraitsで実装するとかいう手もあるわな

fvecやdvecはラッパークラスの実装サンプルだと思ってもいい。ちなみにSSE3〜4には対応してない。

415 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 05:15:43 ]
なるほど、実装サンプルね。じゃあdvecが参照してるヘッダを活用して
独自にラッパー作ってもいいわけだ

>どのみち配列にしちゃうと仮に運よくベクトル化できてもメモリアクセスが必ず発生しちゃうので
>性能落ちる
ここの意味がわかりませんぜ親分。うまくベクトル化できてもIntrinsics使ったコードには勝てないのか?

416 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/20(水) 06:12:03 ]
配列=かならずアドレスを持つ=レジスタ変数にできない。
いっぽうで__m128の実体はレジスタに割り当て可能。

レジスタ上に置いて演算を繰り返すような用途には、ロード・ストアは無駄。

417 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:56:09 ]
なんでバールの人はそんなに詳しいの

418 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:25:31 ]
>>416
> 配列=かならずアドレスを持つ=レジスタ変数にできない。

これってどんなコンパイラでもそうなっちゃうの?

419 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:53:19 ]
>>418
最適化によってずっとレジスタに保持するケースもあるとは思うが、
それでも一応メモリ領域に置くだけは置くようだ。

420 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:59:55 ]
>>419
へぇ。そんなこともあるんだ。

で、それは特定のコンパイラでの実験結果であて、規格上レジスタだけで
済ませることができない制約がある、というわけじゃないよね?

421 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:08:55 ]
でもC++はregister変数のアドレスを取れちゃうから不思議。



422 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:23:19 ]
ふと、メンバ変数も仮想関数もない空のクラスでも
アドレス取れないといけないからサイズ0にならないって話を
思い出した。

423 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:03:28 ]
>>421
register はコンパイラへのヒントであって
必ずレジスタに割り付けする必要はないからな


424 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:11:33 ]
>>423
それでもCだと文法エラーなんだよ
この辺が解せない

425 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:23:59 ]
>>424
でも本来の意味的にアドレス取れちゃおかしいよね。

426 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:25:16 ]
インライン関数のアドレスが取れるくらいだからいいんじゃね。

427 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:02:43 ]
ひょっとしてアドレスを取るコードを書いた時点でレジスタに入らなくなったりインライン化されなくなったりする?

428 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:06:35 ]
ローカル変数のスタック・レジスタへの割り当てについては
ダンゴさんが鋭い意見を持っていると思う

再利用とか

429 名前:ヽ・´∀`・,,)っ¬ mailto:OH MY LITTLE バール♪ sage [2008/02/21(木) 00:21:52 ]
CellのSPE用コンパイラはregisterキーワードつけただけでアドレスをとるコードはコンパイルエラー吐く。
レジスタが十分に多くレジスタ間オペレーション前提のアーキはこんなもんでしょ

430 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:24:55 ]
関数はアドレスとろうとどうしようと、インライン展開の妨げにはなりませんな。
なんせ、通常版を展開しておきさえすれば後は何でもありだから。
gccなんかだと、再帰関数でも一段目だけインライン展開してたりして楽しい。

431 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:29:10 ]
>>427
アドレス取る可能性があると、最適化の掛かりが悪くなるな気がする。がっちりprivateで包んで、メンバ変数のポインタを外から取れなくすると効果ある様な気がする。




432 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:36:29 ]
>>427
メンバ変数はすでに this でアドレス取られてるようなもんだろ。 private とか関係ないと
思うよ。

433 名前:432 mailto:sage [2008/02/21(木) 12:36:56 ]
アンカーミスった >432 は >>431 ね。

434 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/21(木) 23:21:34 ]
アクセス属性は最適化のかかりには関係ないです。
friend属性で完全に読めるしね。


なんにせよ「レジスタ型」のラッパークラスって扱いが難しいだろうな

fvecやdvec使ってても、各要素に配列インターフェイスでにアクセスしようとすると
いったんメモリ上にストアしてから各要素を読み出す動作になる。
なぜならそういう作りだから。
SSE4.1のextractps/dならレジスタ間渡しができるだろうけど。

435 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:32:37 ]
正直、クラスメンバはぶっちゃけグローバル変数なんで最適化かかりにくい。

436 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:23:32 ]
大分関係無いけどだんごさんのクロージャに対する意見を聞きたいです

437 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/22(金) 22:57:28 ]
変態boostはおなかいっぱい


438 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:41:48 ]
ダンゴさんは本当に知識豊富だな

439 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:18:13 ]
別に「変態boostはお腹一杯」では何も有益な事は読みとれんだろww
むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。

440 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:54:46 ]
439は本当に知識豊富だな


441 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:55:54 ]
クロージャ使うと遅くなるってイメージがある



442 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/23(土) 01:58:40 ]
っていうかboostってコードサイズをboostするんだよ。


443 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:06:44 ]
別に「別に\「変態boostはお腹一杯\」では何も有益な事は読みとれんだろww\
むしろ\「もうこりごりだ\」っていう反応にも取れるくらいだ。\
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて\
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。」では何も有益な事は読みとれんだろww
むしろ「もうこりごりだ」っていう反応にも取れるくらいだ。
C++のクロージャについてはgccなんかがサポートしてるから、アセンブラを吐かせてみて
そのコードを見るって言うのはどう?結構面白い実装になっていると聞いたことがある。

444 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:07:24 ]
Boostつかうと一気に実行ファイルサイズが10倍に?!

445 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/23(土) 02:08:11 ]
\7

446 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:09:10 ]
>>444
でも使わないと実行時に要するメモリサイズが10倍に!?

447 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:32:18 ]
boost使うとコンパイル時間が4倍位に

448 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:32:46 ]
それはリアルな

449 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:37:29 ]
boost――それは決して便利とは言えない、そして無駄にコンパイルの時間とファイルサイズだけを喰っていってしまう。
しかし必要とあれば使わなければならんのだ――漢にはそういう時が来るものなのだ。

450 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:51:43 ]
必要でもあえて使わないのが漢じゃねーのか?

451 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:59:07 ]
1クロック1バイトまでこだわった俺仕様ライブラリを作るのが漢ってものじゃないのか。




452 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:41:07 ]
昔, RAM 1k とかで 8bit マシンのアセンブラ書いて時は
メモリの 1byte は血の一滴って感じだったけどな…


453 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:50:57 ]
>>450
人、それを馬鹿と言う。

454 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:08:01 ]
>昔, RAM 1k とかで 8bit マシンのアセンブラ書いて時は
1024バイトなんて随分贅沢だなぁ、おい。

455 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 19:12:43 ]
いや、1Kbitじゃないか。


456 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:28:52 ]
6810か

457 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:40:59 ]
>>456
それだったら4114x2の方が安いんじゃないだろうか?


458 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 06:41:38 ]
2114のまちがい


459 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:08:59 ]
"?"不要 話にならない<当時の価格

460 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:10:10 ]
<←これってどこの文化なの

461 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:52:33 ]
こんにちはー(^^)>おーる



462 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:14:31 ]
>>460
DOSのリダイレクト

463 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 16:30:39 ]
仮にもマなら半角の>を使え

464 名前:デフォルトの名無しさん [2008/02/24(日) 20:45:27 ]
てs

465 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 01:54:03 ]
実行速度重視よりもメモリ使用量重視の方が早くなるときがあることについて

466 名前:デフォルトの名無しさん [2008/03/06(木) 02:13:09 ]
>>465
単一のアプリだけで動いている訳じゃないからな
たとえば残り100Mで全部使用したら、OSや他のアプリがメモリ必要とするから追い出されることになる
しかし自分が動くときにはメモリ上に再び持ってくるから、追い出すのとを繰り返しかなり遅くなる
メモリは最低限にするのが速い

467 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:49:27 ]
あとCPUのキャッシュに乗るとものすごく速くなるんで、そのへんも絡んでくるかと

468 名前:デフォルトの名無しさん [2008/03/06(木) 04:09:33 ]
省メモリで動くならCPUキャッシュを考えて良いけど、
スワップが起こりうるならその時間の方が圧倒的にかかる

469 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 04:16:59 ]
結局実測するしかないんだよな

470 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 04:58:27 ]
それもあらゆる環境で。

471 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:02:59 ]
>>470
馬鹿? あらゆる環境で最適な最適化なんてあるわけないじゃん。
「ターゲットとする」と形容するなら兎も角。

実際、Woodcrestで速くなるように最適化したら、Pen4で遅くなったなんてよくある話だ。
# それ以前に、「あらゆる」だと一体どこまで対象にするんだ? Pen3か? 486か?w



472 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:30:20 ]
>>471
日本語読めない馬鹿?

473 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:34:42 ]
自分が説明できていないことを棚に上げて他人をけなすバカ?w

474 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:22:50 ]
恥ずかしい誤読で鼻息を荒くするのも、
まぁ、人生経験のうちではある。

475 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:25:42 ]
>>471
woodcrest, pen4云々とCレベルの最適化技法とは次元が違うでしょw

476 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:28:57 ]
>>465
実際にどんなケースで省メモリコンパイルのほうが速くなる?

477 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:33:47 ]
>>475
>471じゃないが、Cレベルの最適化限定なのか?
だとしたら、キャッシュやスワップがどうこうなんて関係ないと思うのだが。
逆に、キャッシュやスワップを云々するならそれらのサイズに影響するわけだから、
CPUに依存した話になってしまうだろうし。

478 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:19:55 ]
>>477
Pen4が、Pen3がってのは、吐き出すコードの並べ順とかそういう要因だから、Cコード側でどうにもならんだろ。
キャッシュどうこうは、配列や構造体のサイズを変えたりなどのCコードレベルでの最適化ができるだろ。

479 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:21:15 ]
SSEを使ったベクトル化もベクトル化しやすいCコードにするなどCレベルでの最適化の範疇だな。

480 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:29:41 ]
アセンブリまで意識した時点でCレベルではない。
たいていCプログラマに求められるものではあるが。


481 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:02:33 ]
ダンゴさんの鋭い意見が望まれるな



482 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:25:06 ]
かわいそうな奴はもう放っとけよ

483 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:02:27 ]
通院中だから、ちょっと待っててね。


484 名前:デフォルトの名無しさん [2008/03/07(金) 14:42:19 ]
VC++の浮動小数点ですが、
/fp:precise fast strict
の中でどれが一番精度が高いのでしょうか?
デフォルトのpreciseだと思っていたのですが、
floatをdoubleに変えたときの結果に一番近かったのが
fastだったのですが。

485 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:48:46 ]
>>484
まず、floatをdoubleにした結果に一番近いの意味が不明

486 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:16:52 ]
>>484
x86のFPUはfloatだろうとdoubleだろうと、内部では80bitで計算している。
そのために、floatの計算で本来なら丸め誤差が発生するはずのところで、
誤差が発生しないという問題が生じる。

厳密に規格で決められた通りの精度で計算するためには、1つの計算が
終わるたびに丸め操作が必要になる。

その辺のコントロールをするのが/fpオプションで、fastは速度優先で
最低限の丸め操作しかしないので計算の精度が必要以上に上がってしまう。
また、どのタイミングでメモリにストアされるかによっても、計算結果が
変わってしまうので、全く同じ入力を与えても常に同じ結果になることが
保証できない。

487 名前:♪(*^ ・^)ノ⌒☆ mailto:sage [2008/03/07(金) 18:40:21 ]
>>480
命令の並び順こそモダンなCPUではOoOがあるからあんまり影響しない。

レイテンシの極端に大きい命令に展開されるのがわかってる場合は
アンロールしてソフトパイプライニングするのも有効。もちろんCレベルでできる。

C++なら機種依存の手続きをトレーツ(笑)にしてインターフェイスを汎用化する手もあるね。

>>481
黙れスイーツ(笑)

>>****
ご希望にお答えしてお前は放置

>>483
おう、闘病がんがれよ

488 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:08:28 ]
NGnameが増えたのか?

489 名前:ヾ(*´∀`*)ノ mailto:sage [2008/03/07(金) 20:57:02 ]
どうぞどうぞ

490 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 00:15:33 ]
>>486
コードが同じならメモリにストアされるタイミングも同じで、
同じ入力を与えたら同じ結果になるんじゃないの?
それとも、入力ってのはソースファイル(コンパイラに対する入力)のことかな?

491 名前:デフォルトの名無しさん [2008/03/08(土) 00:45:47 ]
>>490
レジスタからあふれてメモリに追い出されるときに丸めが生じる。
同じ式が違う場所にあるときに丸めるタイミングが違ってくる可能性がある。



492 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 00:51:19 ]
同じ位置にあるコードでの話じゃなかったのか。

493 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:24:27 ]
同じ位置にあっても、コンパイルされるたびに毎回同じ結果に
なることが保証できない。

494 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:32:41 ]
つまり、入力ってのはソースファイル(コンパイラに対する入力)のことになるわけだね?

495 名前:486 mailto:sage [2008/03/08(土) 02:03:49 ]
いや、関数に対する入力のつもりで書いたんだが。
言いたいことは491の言ってることだな。
クライアントとサーバで同じ式を書いても同じ結果にならなかったり、
デバッグ用のコードを入れたら結果が変わったり、インライン展開
されるかどうかで結果が変わってしまう。

496 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:16:10 ]
コンパイルしてしまった後のプログラムがあって、
それの全く同じタイミングに実行される全く同じ位置のコード(マシン語レベルで)に
全く同じ入力を与える場合を想定してたんだぜ。

497 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:43:10 ]
ダンゴさんのレスでスレが一気に加熱したな。

498 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:46:36 ]
メモリ4倍にしたらCPUの処理速度が40%以上遅くなった。

499 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:49:01 ]
CPU の問題じゃなくて、サイズの違うメモリを使ってるからじゃないのか?

500 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:00:59 ]
単純に、交換したメモリが遅いだけじゃないの?

501 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:29:12 ]
CPU が遅くなったと言うなら、
レジスタのみの演算をぶん回して
比較しないとな。



502 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/08(土) 13:26:10 ]
Intel入ってないだけじゃないの?
Athlon 64の前のモデルではメモリ増やすと逆に遅くなる現象があるらしーな。

503 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:39:40 ]
PenDの速さの実感できなさ具合は異常

504 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:24:45 ]
あぼーん推奨ワード:ダンゴさんの

505 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/08(土) 17:28:20 ]
同意

506 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:40:05 ]
ダンゴさんが復活したおかげでレス数がうなぎのぼりだな

507 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 04:12:57 ]
あぼーん推奨ワード:ダンゴさんが

508 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 05:24:38 ]
あぼーん推奨ワード:ダンゴ、団子

509 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:06:41 ]
だんご大家族♪

510 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:48:39 ]
DANGOさんのおかげでEDが直りました

511 名前:498 mailto:sage [2008/03/09(日) 23:25:11 ]
superπでチェックしたが明らかにCPUトロくなった。256を1Gに変えたのだが。



512 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:25:18 ]
弾固さんのおかげで層化学会に入ることができました

513 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:26:32 ]
どうせ128MBの板を何枚もポトペタしただけなんだろ?

514 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/09(日) 23:51:13 ]
板です。128kgまで耐えられます。

515 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:54:19 ]
面白くないから黙ってろ

516 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 00:03:49 ]
>>511
OSは?Windows 2000は512MB以上はほとんど管理してないよ

517 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:30:06 ]
>>515
お前も面白くない。自分に適用しないジャッジを人に適用しないようにな。

518 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:32:22 ]
以降、面白さを最適化するスレになりますた。


519 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:36:11 ]
面白さのサイズが最小になるのか

520 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 17:59:24 ]
以降、面白さを最適化するスレを最適化するスレになりました。

521 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:20:10 ]
>>1 に goto >>1000 って入れときゃいいんじゃね?



522 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:11:35 ]
僕らが一つと半分のスレッド、時間にしてほぼ4年の月日を消費して分かった事、それは
どんなにメモリを必要とするプログラムを書いても副作用がなければそのプログラムは
何もせずにOSに制御を返す1024バイトにも満たないデータ列と同じだという事。

523 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 22:18:01 ]
いや、今わかったのはたぶんあんただけよ。


524 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:36:50 ]
DANGOさんのベンチマークは副作用で満たされているな

525 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/10(月) 22:52:46 ]
それを言うな

526 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:27:17 ]
副作用でスレが荒れる


527 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 13:14:19 ]
メモリ2G積んでるけどそっちがフル稼働するずっと前にCPUがまんまんになる

528 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 18:32:21 ]
以降下ネタ禁止

529 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:18:20 ]
ISAバスのEMSメモリカードが遅くて泣いたのはいい思い出

530 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:21:26 ]
私のPCは、CPU温度は低いのにGPUはちんちんに熱くなる。

531 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:21:14 ]
それ普通



532 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:47:44 ]
>>527
それは今時普通ですから

533 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:00:28 ]
ある C++ のメソッドを アセンブラに書き換えたら、かえって実行速度が遅くなった orz

534 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:12:21 ]
あるある。
コンパイラってマジ賢いわ。

535 名前:533 mailto:sage [2008/03/12(水) 22:25:43 ]
それがさー 多倍長整数の1ビットシフトと論理積処理なんだぜ

r = (r << 1) & mask; // r, mask は多倍長整数

こんな単純な処理はキャリービットを使ったシフト命令が使えるアセンブラの方が絶対速いはずなのだが
アセンブラにすると、グローバルな最適化がうまくできないみたいで、C++ よりも遅くなったみたい


536 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:28:49 ]
そう言うときはどういう処理吐いてるか見た方がいいよ。

537 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:30:44 ]
>>535
差し支えなければC++とasm双方晒してくれ。

538 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:31:22 ]
局所的な最適化は必ずしも大局的な最適化とはならない事のいい例だね。
例えば最近のコンパイラなんかは、一回のコンパイル時間が長くなっても
エラーメッセージなどを丁寧に出力するから、結果的にコードを修正する時間が短くなって
コンパイル回数も減り、開発時間が短くなる事に寄与している。
コンパイラ賢い。

539 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:01:49 ]
>>535
パイプラインが詰まるようなコード書いたんじゃねーの。

540 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:05:20 ]
キャリーっていう1つしかない資源を使う限り、
詰まらざるを得ないんじゃないかな。

541 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:19:41 ]
多少コードが増えてもCPIが上がれば逆転するから、安易なインラインアセンブラの使用は割に合わない。



542 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:36:23 ]
asmのおかげで回りの最適化が効かなくなってんじゃないか?処理時間の短い関数をasmにしても逆効果だよ。
ループを含めるとか、ある程度処理時間がかかる部分をasmに直そうよ。

543 名前:536 mailto:sage [2008/03/13(木) 19:09:16 ]
もちろんコンパイラが吐き出してるソースチェックしたよ
そしたら グローバルに最適化されてるってことがわかったんだよ

544 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:10:14 ]
>>537
うーん、そのままだとちょっと差し支えがあるので、
晒せるように書き直せるかどうか試してみるよ

545 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:20:37 ]
>グローバルに最適化

の意味が解らん

546 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:42:37 ]
以下のようなクラスがあって

class CShiftAnd
{
uint m_nReg;
uint *m_pR;
uint *m_pCV;
uint m_exitIndex;
uint m_exitMask;
public:
CShiftAnd(int);
~CShiftAnd();

bool setEntryState();
void transition(uchar);
void transition_asm(uchar);
};

547 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:42:59 ]
bool CShiftAnd::setEntryState()
{
*m_pR |= 1;
return (m_pR[m_exitIndex] & m_exitMask) != 0;
}

void CShiftAnd::transition(uchar ch)
{
uint *ptr = m_pR;
uint *pCV = m_pCV + (ch * m_nReg);
uint carry = 0;
for(uint i = 0; i < m_nReg; ++i, ++ptr) {
uint nextCarry = *ptr >> 31;
*ptr = (*ptr << 1) + carry;
*ptr &= *pCV++;
carry = nextCarry;
}
}

548 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:43:53 ]
void CShiftAnd::transition_asm(uchar ch)
{
uint *pR = m_pR;
uint *pCV = m_pCV + (ch * m_nReg);
uint nReg = m_nReg;
__asm {
mov edi, pR ;; edi = m_pR
mov esi, pCV
mov ecx, nReg
xor eax, eax ;; clear carry
L01:
mov eax, [edi]
adc eax, [edi]
and eax, [esi]
mov [edi], eax
lea edi, [edi+4]
lea esi, [esi+4]
loop L01
}
}


549 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:45:47 ]
以下のコードでタイムを計測した
buf のサイズは1000なので、10億回ループする
{
StopWatch<> sw;
CShiftAnd sa(31);
for(int i = 0; i < 10000 * 10; ++i) {
int count = 0;
for(cchar *ptr = buf; ptr < buf + sizeof(buf); ) {
if( sa.setEntryState() )
count += 1;
sa.transition(*ptr++);
}
}
}


550 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:47:27 ]
おいらの環境でタイムを計測すると
1.125秒

sa.transition(*ptr++); を sa.transition_asm(*ptr++); に変えてタイムを計測すると
1.469秒
だった

551 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:05:19 ]
中身全然理解してないけど
なんでedxを使わないでレジスタ変数に使われる(push/popが必要な)esiやediを使ってるの、とか
あなたの読んだ最適化に関する文書に、LOOPを使うことについて何か触れられてなかったのか、とか



552 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:20:27 ]
>>551
じゃ、アセンブラでどう書いたら高速になるのかコードを晒してくおくれ

553 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:24:49 ]
何が「じゃ」なんだろ。まったく話が繋がってない。

554 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:30:54 ]
>>552
最適化技法の専門書でも読め

555 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:38:59 ]
C++のソースレベルで見ても
ロード/ストアの形にするのも基本だし
カウンタ(i)を用意して非定数のlimitと比較するくらいなら、first/last形にするのが常識だし
(まあこれは0との比較に変えてるみたいだからいいか)

といっても、その程度は最適化コンパイラなら当たり前にやっていることだけど

556 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:42:18 ]
で、結局、「グローバルに最適化」とは何なのだろう。

557 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:16:13 ]
>>538の「大局的な最適化」と同じ意味だろう。
別に何かの規格で定められた専門的な用語ではないはずだ。

いや、わかっててネチっこく絡んでるだけなら、野暮な説明だけど。

558 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:29:52 ]
おまいらもっと速いアセンブラのコード晒してやれよ

559 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:33:39 ]
>>557
いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。
単に「自分の書いた(付け焼刃の)アセンブラより速かったから
大域的な最適化をしているに違いない」と言ってるとしか見えないわけさ。

560 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:51:33 ]
>>559
543 名前:536[sage] 投稿日:2008/03/13(木) 19:09:16
もちろんコンパイラが吐き出してるソースチェックしたよ
そしたら グローバルに最適化されてるってことがわかったんだよ

561 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 21:55:30 ]
VC++は、インラーインアッセンブルルルルァ使った関数はインライン展開とかできません。



562 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:58:27 ]
余計意味わかりませんけど。
例えば、そのグローバルな最適化によって、
>>547はどのようなアセンブラコードになるのですかね?

563 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:00:06 ]
      ☆ チン     マチクタビレタ〜
                        マチクタビレタ〜
       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ヽ ___\(\・∀・) < 速いアセンブラソースまだ〜?
            \_/⊂ ⊂_ )   \_____________
          / ̄ ̄ ̄ ̄ ̄ ̄ /|
       | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
       |  愛媛みかん |/

564 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:34:20 ]
団子さんのレスが期待されるところだ

565 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:43:23 ]
いやもうレスしただろ

566 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 22:57:30 ]
SSEの使えないコードは汗んブラないのが俺のモナー
よく読んでないけど使えそうだけどな


567 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:16:51 ]
>>559
> いや、だから「どこを見てコンパイラが大域的な最適化をしていると判断したか」という話よ。
このタイミングで急に新しい話題始めるんですかー。

568 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:17:12 ]
loop は遅いから使わないってのは基本だと思うんだがなあ。

569 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 23:27:44 ]
コンパイラより自分でアセンブったコードの方が速いと根拠もなく信じてる人もたまにいるので。

570 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:29:10 ]
そんなん信じてる馬鹿ここにはまずこないんじゃないの

571 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:31:02 ]
x86・RISCやキャッシュてんこ盛りのプロセッサだと今時のコンパイラを超えるのは至難だろうな。
組み込み系の貧弱な石ならアセンブラの方が速い事は多々あるけど。



572 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:31:52 ]
コンストラクタ無し/デストラクタ無し/初期化されず説明の無いメンバ変数。
速いコードは書けないが、動かないコード晒されると更にやる気を削がれるな。

>>556 SSE使えるならむしろCって考え方も。
>>568 最近はmicro op fusionとかやってるから高級な命令の方がAMDみたく都合よくなるんじゃない?

573 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:34:07 ]
安価ミスった。556じゃなくて>>566

574 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/13(木) 23:36:35 ]
VCなんかだとthisポインタはecx渡しになるからそこんとこ考えてコード組む必要がある。


575 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 00:20:39 ]
>>548
ところで、このコードは正しい結果が出るか確認したか?


576 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/14(金) 00:23:47 ]
んでもって>>548はecx使っちゃってるね

577 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:16:54 ]
>>548
86のアセンブラなんて10年以上やってないんで自信ないんだが、途中でキャリーフラグ消えてないか?
キャリー使わずにCで書いても同じくらいの速さのコードは出そうだが。

578 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:01:13 ]
>>577
mov, lea, loop はキャリーに影響しない
add edi, 4 でなく lea edi, [edi + 4] とするのはそのためでもある

579 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:39:30 ]
>>578
andも?


580 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:07:37 ]
>>579
少しは自分で調べろ

581 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/15(土) 00:05:39 ]
andは書き換えるだろ。

MMX/SSEもフラグレジスタを書き換えない。



582 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:24:25 ]
Cとインラインアセンブラのソースを睨めっこしても意味ないだろ
逆汗しないと

583 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:36:22 ]
はぁ?

584 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:57:39 ]
はぁ。

585 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 12:13:54 ]
ハァ〜ン

586 名前:デフォルトの名無しさん [2008/03/18(火) 20:20:53 ]
例A)
gethoge()->fuga();
gethoge()->piyo();

例B)
hoge *p = gethoge();
p->fuga();
p->piyo();

gethogeはprivate変数へのアクセサと仮定して、
この場合例AとBでどっちの方が早いのだろう?

fugaやpiyoがもっとたくさんあるのなら後者だろうけど
2回だけだとポインタこさえるコストも考えるとごっちゃになってきた。

587 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:40:21 ]
ちゃんとインライン化されれば同じようなもんだろ。

588 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 10:47:54 ]
>>586
処理時間で A >= B って感じ。

「ポインタこさえるコスト」とか言うが、 A でもコンパイラが
ポインタを作る。しかも繰り返し。

589 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 12:29:58 ]
fugaの中でhogeが書き換わる可能性を考慮すると、AとBでは結果が異なる可能性がありそうな気も

590 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:27:23 ]
それをいうならgethogeじゃない? fuga一回しか呼んでないじゃん

591 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 21:02:41 ]
fugaとpiyoを呼んでprivate変数の状態を変えるとか考えないのか?



592 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 09:42:59 ]
vtuneって各関数でのメモリアクセス数って調べられますか?

593 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 12:24:39 ]
遅延量や、キャッシュミスもわかる。

594 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 14:16:56 ]
memoryのpageinput/outputを監視すれば
各関数のメモリアクセスは調べられそうですね
ありがとうございます。

595 名前:デフォルトの名無しさん [2008/03/26(水) 14:44:33 ]
>>594
writeとreadはいらないの?

596 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 15:25:04 ]
>>595
メモリアクセスはin/outだけじゃ・・・

597 名前:デフォルトの名無しさん [2008/03/26(水) 16:07:31 ]
vtunesの使いかた分かんね。
どうやったらプログラム実行終了時の
各関数のそれぞれにおいてのメモリアクセス数が出るんだ

598 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 18:58:16 ]
>>597
命令ごとのメモリや演算器、キャッシュ、バスのタイミングが見える。プロファイラなんかとは次元が違う。

599 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 21:43:23 ]
>>598
それぞれのメモリアクセスはどこみればいいのか分からん
全体の1秒あたりのメモリアクセスは出てるけど


600 名前:デフォルトの名無しさん [2008/03/29(土) 09:07:38 ]
vectorって配列に比べて最適化されにくい?

601 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/29(土) 09:13:42 ]
そうでもないよ



602 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 09:40:39 ]
ダンゴさんは博識にもほどがあるな

603 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 09:56:57 ]
スタックに置く場合以外は同じだろうね。

604 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 12:12:58 ]
602 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

605 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/29(土) 12:29:13 ]
上に同じ

606 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:47:37 ]
「TASさん」みたいなノリですね、わかります。

607 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:55:13 ]
ダンゴさんの書き込みでスレが再加熱したな

608 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:59:22 ]
607 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

609 名前:デフォルトの名無しさん [2008/03/30(日) 02:23:09 ]
608 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん


610 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 10:57:30 ]
あぼ〜ん推奨ワード:ダンゴ、だんご、団子

611 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 11:22:37 ]
610 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん



612 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:47:20 ]
>>610-611


613 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:51:59 ]
w ってどういう意味?

614 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 03:08:41 ]
藁w

615 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 00:18:25 ]
>>614 には失望した

616 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 01:05:43 ]
なら俺は干草

617 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 10:00:38 ]
>>600
コンパイラによるがされにくい。
PGIでは、vectorのまま[]でアクセスしたループはベクトル化してくれないが、
一旦ポインタに変換してループを書くとベクトル化する。

618 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 10:52:06 ]
vector使うなら、operator[]を使わずにiteratorを使うだろ。常考

619 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 15:40:33 ]
iteratorなんかつかったら余計に最適化されねーっての。

620 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 16:37:25 ]
されますが何か。

621 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 15:05:29 ]
その手があったか。
vectorに限って言えばiteratorはまず間違いなくポインタだろ。
ということは最適化される。



622 名前:619 mailto:sage [2008/04/02(水) 16:20:53 ]
すんません。
vector<double>::iterator p = v.begin();
を使って、
p[i]
でアクセスしたらポインタと同等の最適化されました。

ただ、for文の終了条件を p != v.end() なんてことしたら
ループの回数が不明ということで最適化除外されました。


623 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/02(水) 17:00:57 ]
std::vector<F32vec4>

から派生の方向で

アクセッサ?ほぼ再実装だね

624 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/02(水) 17:02:21 ]
>>622
コンパイラは?

625 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:37:03 ]
ダンゴさんはVCの最適化については一言言いたいところがあるようだな

626 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:48:28 ]
>>624
PGI

627 名前:デフォルトの名無しさん [2008/04/03(木) 00:23:08 ]
623 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん


628 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 13:17:37 ]
>p != v.end()
毎回インスタンス変数見るのか。

for(int i=0,sz=v.size(); i<sz; i++){...}

for(iterator i=0,end=v.end(); i!=end; i++){...}

のどちらかだろ常考。

629 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 14:51:29 ]
本来その程度の事は自動でやってくれるべきだけどね。
高級アセンブラだから細かいところに気を使うんだよな。

630 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 15:13:25 ]
それを自動でやったらvolatileを勝手に外すくらいの暴挙じゃね?

正当にやれるのは、v自体がローカル変数で、
ポインタを取られてないことを解析出来る場合だけど、
その前提を維持するより一時ローカル変数に移した方が簡単だと思う。

631 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 16:33:26 ]
ああそうか。あー!面倒くさい!
もうローカルでポインタを取得してないメンバ変数やグローバル変数が
外から変更される可能性がある場合は全部volatile付けるって事でいいよw

なんてやってるとvolatileだらけでどっちが面倒くさいんだか分からなくなってくるな。



632 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 18:15:58 ]
パソコンだとマルチスレッドなんてあるから、
volatileが付いていてもいなくても
付いているのと同じように扱われている気がする(ローカルな自動変数以外)。

633 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 19:18:06 ]
volatileは厳密にメモリのアクセス回数を決めるための物だから
同じってことは無いだろうけどね。

634 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 19:31:48 ]
>>633
釣りかネタだよね?

635 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:56:39 ]
バカの可能性もあるな。(w

636 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:06:50 ]
流れ見てないんだが…
ここは「volatile 宣言最強!!!」って言わなくちゃいけないところですか?
はずしてたらごめんなさい


637 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:08:45 ]
volatile は毎回メモリにアクセスするようにするものだとか
マジレスしたらいけない流れなんだろうな。

638 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:32:10 ]
お前らボラれてるぞ

639 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/03(木) 21:33:36 ]
volatileは最適化抑制です。

640 名前:636 mailto:sage [2008/04/03(木) 21:36:48 ]
>>637
> volatile は毎回メモリにアクセスするようにするもの
なのは, いいんだけど >>634 な, ものがあったから
ちょっと言ってみたかった


641 名前:636 mailto:sage [2008/04/03(木) 21:43:32 ]
>>639 そんなもん分かってて遊んでるんだからほっとけや




642 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 21:49:31 ]
volatile is a hint to the implementation to avoid aggressive optimization
involving the object because the value of the object might be changed
by means undetectable by an implementation.

643 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 01:29:39 ]
ダンゴさんのレスがピシッと決まったな。

644 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 02:20:00 ]
643 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

645 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 04:20:10 ]
さすがダンゴさん

646 名前:デフォルトの名無しさん [2008/04/04(金) 11:12:12 ]
644 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん


647 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 11:15:58 ]
>名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

これもあぼ〜んしとくわ

648 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 21:51:09 ]
>volatileは最適化抑制
厳密には違うけどまぁ別にいいや

649 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 21:56:37 ]
volatile は処理系には検知できない手段によってオブジェクトの値が変更をうける可能性がある場合に
オブジェクトへの積極的な最適化を抑制するための処理系へのヒントである。

650 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:19:36 ]
1: int i;
2: i = 1;
3: i = 2;
4: i = 3;

こうしたとき2行目3行目の代入された数値は使われないので、最適化されて消される。
しかしデバイス制御などでiがデバイスのアドレスの場合、消されては困る場合がある。
こういう時、宣言の前にvolatileを付けたら最適化されないので意図した動きを得られる。

651 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:22:27 ]
マルチスレッドかメモリマップド I/O で使うのが定番だな。



652 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 22:56:39 ]
> マルチスレッド

マルチスレッドでのvolatileについてはダンゴさんが一言ありそうだ

653 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:02:50 ]
クリティカルセクション自身も volatile にするだろ?

654 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 23:04:19 ]
フラグ程度なら害はない。

655 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:15:04 ]
volatileで万全!

656 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 00:16:34 ]
double-checked locking とか泥くせえよなあ

657 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 06:42:33 ]
メモリオーダリングはしょうがない。volatileは悪くない。

658 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:05:07 ]
もう -O0 でいいじゃん。

659 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:41:28 ]
-O0 で毎回メモリ読みに行くことは保証されてるのか?

660 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 09:52:28 ]
それ以前に volatile では保証されてんのか?

> 処理系へのヒントである。

とか書いてあるとちょっと不安なんだが。

661 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:01:27 ]
規格上はメモリアクセスは保証されない
ターゲットにメモリが存在するとも限らないし



662 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 10:29:51 ]
Java だと昔 volatile がちゃんと実装されてないとか聞いた事あったけど、
C/C++ でそういう処理系は聞いた事ないな。
inline や register みたいにヒント扱いだから
規格上はそのあたりの挙動は処理系依存なのかもしんないけど、
先ず心配しないでいいとは思う。

663 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 17:18:06 ]
A8.2 型指定子によると
| volatileオブジェクトについては、処理系独立な意味付けは行われていない。
とあるから安心していいのでは。


664 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:40:18 ]
register を無視するコンパイラがあるように
volatile を無視するコンパイラ程度はあってもいい気はする。

665 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:02:06 ]
>>664
volatileを無視するコンパイラは最適化禁止だな。

666 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:10:12 ]
特に最適化しなければ volatile だから
全て volatile なコンパイラはあっても
volatile 無視するコンパイラは少なそうか?

667 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:18:00 ]
元の意味が「揮発性」だっけ。



規格準拠をうたうコンパイラで、そういうのは聞いたことはない。

まあ、そういう処理系を作ろうと思えば作れるんじゃないの?

668 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:30:53 ]
こうですか?
#define volatile


669 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:35:44 ]
__declspec(align(32)) みたいなのを規格化してほしーな

670 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:37:09 ]
アラインメント関連は C++0x にもう入ってるだろ?

671 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 21:44:14 ]
どっちかというとCに入れて欲しいんだが



672 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:45:40 ]
それは確かにw

673 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 22:05:57 ]
ダンゴさんの書き込みへのレスのすばやさは宇宙一とおもわれるほどだな

674 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/05(土) 22:11:24 ]
673 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

675 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 22:14:57 ]
メモリバリアはcpuか評価環境で変わってくるんじゃないの?
ほとんどosにそれを通知するような機構があると思うんだけど。
javaのvolatileはそれを保証するものになるらしいが。

676 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 23:14:20 ]
本当に意味のある最適化が仕様的に禁止されてる言語に対して何期待してるんだ?
実質的に高級アセンブラじゃん, 言語仕様が…


677 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 23:58:13 ]
なんか、また変なのが涌いてきたぞ...

678 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:59:17 ]
まぁマテ、じっくり話を聞いたらなんてこたぁない普通の話かもしれん。
聞きたかないが。

679 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 07:19:16 ]
ポインタがあるせいで禁止される最適化の話じゃないのかな?

680 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:27:34 ]
>>666
gccに-fvolatileと-fvolatile-globalってオプションがあったらしい。
前者はポインタからの間接参照、後者はグローバル変数の参照を
全てvolatile扱いするというもの。

見付けたドキュメントは古そうなのだったから、
最近のgccにもあるかどうかは知らないけど。

681 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 16:08:47 ]
スレが静まり返ったな



682 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:27:33 ]
組み込み行きたい、.net開発とかいやだよもう

683 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:39:41 ]
>>682
私と一緒に働きましょう!
就職フェアでお待ちしてます。

684 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:48:52 ]
後置インクリメント/デクリメントなんて消えればいいのに

685 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:51:04 ]
消えてるし

686 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:59:31 ]
後置インクリメントを使ってるソースは消えればいい
特にパラメータ化された型のインスタンスに対して使ってるやつ

687 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 11:15:41 ]
一時オブジェクトが必要になるしな。

688 名前:後置インクリメント mailto:sage [2008/04/21(月) 12:57:17 ]
わたしのこと、そんなに嫌い・・・?

689 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 17:35:02 ]
むしろ後置の動作が前置になって前置がなくなればいいと思う

690 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 19:52:26 ]
それもそうだな。

691 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 20:20:52 ]
>>683
もう働いてるんだって、前は自動車のOSとかやってた



692 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:06:12 ]
>>691
最近だとトヨタさんががんばってるみたいだけどあれどうよ?

693 名前:683 mailto:sage [2008/04/22(火) 00:09:19 ]
あー、うちの課の私の隣のチームがトヨタさんのシステムやってますね。
# 私は非組み込み。

694 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:25:12 ]
実際他社のそれってあんま知らない

というか正直1年もいないで他のチームいったからな
あの数ヶ月は楽しかった
Javaを経てそっちいって今は標準化()わらいチームだ

695 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:36:24 ]
むしろ標準化の方がよっぽどいきたくないな、いい会社ならやりがいありそうではあるが・・

696 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 12:07:43 ]
自分のソースを貼ったら最適化してくれるスレってある?

697 名前:デフォルトの名無しさん [2008/04/27(日) 12:18:53 ]
張ってみ

698 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:07:48 ]
貼るなら普通にSourceForgeとかに置いて、
その辺のスレで添削のお願いとかした方がいいんじゃね?
運が良ければバグとか直してくれる暇人とか来るだろうし。

699 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:11:20 ]
>>696
数学板とかいくとアルゴリズムレベルで最適化してくれるが
# 早い話、俺はどこまでアフォなのかを教えてくれる


700 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 14:52:19 ]
2次元拡散方程式の最強のコードを教えてください

701 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 04:53:20 ]
>>700
貴方がこれから知ったことをすべて教えてくれるのなら...



702 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:04:29 ]
>>700
ちょっと調べて見たけど、隣り合うところとしか計算しないから
並列化することで計算速度はあがりそうに思える。
しかし単純にスレッド化しても、パフォーマンスがあがるわけではない。
なぜならCPUのキャッシュにヒットするかどうかが鍵になるので
キャッシュ漏れが発生するような並列化をしてしまうと
ペナルティが発生してしまうためである。

またL2キャッシュ漏れが発生して当然というぐらい大量の要素数について
計算するのであれば、並列化することで高速化は図れると思うが
やってみないとわからないし、環境に依存する。

よって最強を求めるならば
要素数や初期条件で最適化は変わるのは当然なので
何がやりたいかちゃんとかかないとだめ。



703 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:30:26 ]
最強 == 汎用
汎用 != 最強

704 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:52:26 ]
キャッシュ漏れってなんだ?

705 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:59:10 ]
キャッシュミスのことかな?


706 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/04/30(水) 19:54:07 ]
 

707 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:42:56 ]
>>702
「ラムダ持ち上げとかやって本当にグローバルに取らなきゃいけない変数は
まとめて局所的に集約した形でヒープに、そうでない変数はスタックに取る」
とか
「計算方法と使用可能なリソースを分析して配列自体の要素のならびを
スパースに取る(CPU n 個いれば, キャッシュラインサイズ * n で集めら
れるように配列を配置しておいて, N スレッドに自動配分する」
ってのが、賢いコンパイラ

高級アセンブラの C とか C++ とかは上記のような最適化を許されない言語
仕様が結構あると思うんだが…

# 結構がんばってるんだけどな, 大規模並列用の C コンパイラ
# だけど fortran とか, チューニングされた lisp 系言語には負けてるよな


708 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 22:53:26 ]
下手に最適化しすぎるとgccに対するLinusみたいにボロクソ言われるしな。
言語仕様として低レベルと高レベルを同じ次元で扱ってるのが問題。

709 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:28:06 ]
スピルアウト?

710 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:29:48 ]
誤爆

711 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:22:32 ]
キャッシュミスのことです。L2キャッシュに乗らない場合のことね。

アセンブラ無しのCと計算目的に最適化されてる言語と比較したら
Cには軍配あがらないよなー
てか、それでCのほうが早かったらその言語の意味ないし。
Cにこだわらないで目的に応じたツールを使うってのは
研究者としては全然ありだと思う。

最近のコンパイラは割りと賢くなってきて、
固定値になる場合は計算した結果を使ってくれるようになったけど
基本C言語ってそういうのは実装する人が考えて実装するのであって
最適化はしてくれたらラッキーぐらいのものが多い。

あくまでもC/C++のフレームワークの範囲での最適化といったら
コンパイル結果がどれぐらい小さくなるか考えたりとか、
わざとキャッシュにヒットしないようにデータを配置するとか
その程度だろうし。
あとはそういう計算に向いている汎用ライブラリを使う。OpenMPとか。

で、本当の本当に最適化したかったらアセンブラになってしまい
すれ違いになってしまうという。



712 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:36:27 ]
そういうのに向いている高級言語って何?
アセンブラってマイクロレベルじゃよいと思うけど大域的には無理じゃない?

713 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 01:38:22 ]
FORTRANなんか最適化に有利なんじゃないか


714 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 08:04:49 ]
> 最近のコンパイラは割りと賢くなってきて、
> 固定値になる場合は計算した結果を使ってくれるようになったけど
> 基本C言語ってそういうのは実装する人が考えて実装するのであって
> 最適化はしてくれたらラッキーぐらいのものが多い。

いったいいつの時代の人なんだ?

715 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:28:08 ]
VCなんかは最近はセキュリティオプション強化してるから
最適化とは逆の方向にいってるよね。

#define SECURE_SCL 0

つければ大丈夫みたいだけど、
知らないと最新の最適化するコンパイラを使っているはずなのに
パフォーマンスが落ちる。
コンパイラの努力をライブラリが無駄にしてるわけですよ。

あとCの最適化って基本的に書いて見てコンパイルさせて
アセンブラ見て最適化されてるか確認して初めてわかるものじゃない?
バージョンがかわったりオプションかわったりすれば
コードが変わるから、それが正しいかどうか判断できないし。
ちょっと上にも誰かが書いてあるけど、最適化するには条件があって
その条件をちょっとでも外れると最適化されないし。

どこまで要求するかで話変わるし
最適化と一言でいっても人によって受け止め方は違うんですよ
自分は最適化してくれたらラッキーぐらいのコードを書くことが大半ですから
最適化がそのプログラムの根幹に関わるようなことはあんまりないです。
ある場合はSSEの出番だし。

自分にとっての最適化はアセンブラだし
人によってはいかにコピーを発生させないかというレベルのものだろうし
研究用との人なんかは結果が速く出れば計算機資源は関係ない人もいるだろうし

ただ、下手なコード書いても速くならないこともしっている。
コンパイラも賢いからね。


716 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:32:15 ]
コンパイラは何を使ってる?

717 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:05:25 ]
まぁ、SSE使うのも今のコンパイラだったら当然視野に入っているしね。
一番困るのは、「forよりwhileが速い」とか「[]で書くより*で書くほうが速い」と言った古い流儀を引き摺ることだったり。
特にiccのようなコンパイラは、典型的なforの使い方をした場合により最適化するようだしね。

718 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:43:37 ]
>>707, >>711, >>715, >>717
ネットかなんかで見たこと書いてるだけなんだろうけど、微妙に理解力が
足りない感が痛々しいな。

719 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:46:55 ]
inline fortranはまだか

720 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:47:46 ]
extern "FORTRAN" のほうが欲しい

721 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:59:21 ]
>>718
どこが足りないのか指摘してください。
勉強になるんで。




722 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:46:37 ]
「微妙」とか「感」という表現からして、あんまり期待はできないかと。

自分のふとした思いつきとか、「何となくそんな気がする」というフィーリングが、
この世の何かを「ピタリ当てている」と信じたい、そういう年頃ってあるでしょ。

723 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:50:00 ]
48歳位か

724 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:53:26 ]
実際、人によっては一生モノではあるね。

725 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:26:25 ]
>>718
715の最適化についてのレスを書いたのは俺だが
715はメインがSSEとかアセンブラって言ってるから的を外してないと思うぞ。

>>719, 720
俺の経験上、ベクトル化はマジ信用出来ない。
有効に働くのは全要素に単純に四則演算と超越関数を与えるときだけだから
融通のきかなさはGPU以上。
ぶっちゃけそんな単純なコードならCでfor回したって読みにくくならないし、gccもVC++もベクトル化してくれるんだよ。

ただその他のレジスタの使い方とかインライン化みたいな
帯域的な最適化は賢いから高級アセンブラとしては依然有効。
あとcomplexをベクトル化するのも面倒くさいから有効。

726 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:33:25 ]
分かりにくかったな。
俺は715じゃなくて、715が参照してる最適化についてのレスを書いた人。

んで、超越関数はgccやVC++ではベクトル化出来ないから
単純な計算式に超越関数が入ってる時はIntelのコンパイラが有効。

まあそれにしたって対象が全要素じゃない事も多いし
結局自分でSSEで書いてる。

727 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 18:02:55 ]
丁度今日はとあるメモリアクセスを伴うロジックで最適化オプションをいろいろ試してた。
--
gccのオプション→  なし -O  -O2 -O3 Xeon w/icc
旧アルゴリズム(SoA) 1.06 0.71 0.82 0.98   0.05
新アルゴリズム(SoA) 0.16 0.12 0.06 0.06   0.03
新アルゴリズム(AoS) 0.42 0.10 0.03 0.02   0.02
--
旧アルゴリズムは何故かO2以降で遅くなるし、
新アルゴリズムは最適化しない場合を除きAoSの方が速いし。
最後のXeonを除くと、他はPen4なのでその所為なのかも知れず。
つーか、折角の新アルゴリズムの効果がXeonだとあんまり目立たないのねん。

728 名前:デフォルトの名無しさん [2008/05/01(木) 19:11:21 ]
Xeonだからって10倍も速くなるものだらうか。
gcc/icc の違いによるのではないだらうか。

729 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/01(木) 19:47:09 ]
ベクトル化でうまくはまれば10倍も十分ありうる。

730 名前:727 mailto:sage [2008/05/01(木) 21:56:39 ]
新アルゴリズムはgccとiccの(時間的な)差は出ませんでしたね。
結論から言えば、CPUをWoodcrestXeonにしてiccをv10にして-Xtにすればもう少し速くなるのだけれど。

731 名前:デフォルトの名無しさん [2008/05/02(金) 08:00:07 ]
超越関数ってexpとか?



732 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:14:14 ]
超越数でぐぐれ

733 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 09:35:06 ]
キャッシュのヒット率大きいんじゃあないか


734 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:20:26 ]
キャッシュベンチしてもねえ

735 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 12:34:02 ]
キャッシュにヒットするようにコンパクトにするっていうのも
最適化の一つだけどね。
ベンチが自分のやりたいことにあってるかどうかが重要。


736 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:00:19 ]
キャッシュサイズがどんどん大きくなってるから
そういうチューンは無駄かも

737 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/02(金) 14:52:38 ]
L1は増えない

738 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 17:56:58 ]
何でAMDは、Intel C++ Compilerみたいなの出さないのかなぁ・・・。

739 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 20:23:18 ]
ライフがすでにマイナスだから(笑)

740 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:01:04 ]
2のベキ乗間隔でメモリアクセスするとキャッシュミスヒットしやすいと、RS6000だかの説明にあった。


741 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:11:24 ]
うん、キャッシュラインが上書きされる可能性が高くなって、キャッシュに存在する可能性が下がって効率が悪くなるからだね。




742 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:48:56 ]
結論: メモリアクセスは素数間隔で行うべし

743 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 21:58:27 ]
系)配列のサイズ(一番下)を2の冪にしてはいけない

744 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:10:12 ]
そうは言ってもループバッファとか扱ってると余りは求めたくないしねえ。

745 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:13:08 ]
ループ?
全部展開しろカス

746 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:14:31 ]
リングバッファって言えばいいか。

747 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 22:24:15 ]
2のべき乗の配列を取りたいなら、
セットのサイズ(キャッシュサイズをセット数で割った数)の倍数のアクセスが増えると効率が悪くなるので、計算順序を変えるとかでそれを外せばOK。
セットのサイズに満たない配列は気にする必要はないかな。


748 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:43:03 ]
>>747
セットってのは, コンパレータの個数で ok?
でもって、ラインサイズと素な数で戦えば ok と言ってる?


749 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:45:49 ]
間違ってた
ラインサイズxコンパレータ数と素な数


750 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 09:40:56 ]
>>748
下の絵でアドレスでコーダがセットのライン数になる
upload.wikimedia.org/wikipedia/ja/d/d2/Read_4waycache.png
素因数にラインサイズxライン数が含まれると効率が下がる。
でもラインサイズに合わせるのは正解なので、ラインサイズx素数または、ラインサイズx(ライン数を因数として含まない数)がいいんじゃないかな。


751 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:37:21 ]
int[][]こんな感じのデータ構造に対する
効率化の手法まとめたページどこにいったっけ?



752 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:48:51 ]
if(n % 2 == 0) n / 2
if(n % 2 == 1) n * 3 + 1

753 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/05/23(金) 21:03:06 ]
int *[]にして列を都度割り当てすれば・・・

754 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 21:58:30 ]
ダンゴさんの書き込みでスレがdat落ちの危機に瀕したな。

755 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 00:13:09 ]
ダンゴさん兄弟

756 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 00:20:12 ]
やはり皆、半月以上レスが無くてもスレ見てるんだなw

757 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:23:33 ]
専ブラ使っているんで、レスがあれば一目で分かります。

758 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:26:11 ]
風呂から出てチンチンブラブラしてますたー

759 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:26:30 ]
それは非専ブラ組の発想ではないかな。
専ブラ組からすれば、新着レスのあるスレを一覧上部に集めて順に見ていく作業の一過程。
つまりdat削除しない限り、忘れてても縁は切れない。新着レスがあるたび、こうして思い出すことになるw

760 名前:126 mailto:sage [2008/05/24(土) 01:27:29 ]
う、かぶった。

実際、専ブラによって色々とスタイル変わってくるよね。
・・・良いんだか悪いんだかわからないけどw

761 名前:759=760 mailto:sage [2008/05/24(土) 01:29:48 ]
ごめん、名前間違えた。
これも専ブラならではか?(マウスホイールしちゃって、前回別の場所で使った名前が出た)。



762 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:34:00 ]
ずっともぐってたスレが一度あがって半端におちてると見失うw

763 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 08:35:41 ]
そういう時は履歴!

764 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 14:05:25 ]
代々木の
カレーライスうまいよね

765 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:36:24 ]
uint64_tの値を

16bitずつ小分けに取得したいのですが
何型にキャストするのが正しいのですか?

766 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:16:39 ]
uint16_t でええんちゃう?
そもそも、質問の意図が、そう言う話とはちゃってる?


767 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:24:12 ]
union知らんのって話でしょ

768 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:25:12 ]
>>765
キャストは最後の手段にしようぜ。
ふつうに u64 & 0xffff, (u64 >> 16) & 0xffff, .... でいいでしょ。

769 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:49:17 ]
ここは最適化のスレだから、一番最適化がかかりそうな
方法を聞いているに違いない。
配列としてアクセスするのが一番期待できるかな?

770 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:55:12 ]
>>769
動作保証が無けりゃ問題外でしょ。ビットシフトで取り出すように書いとけば、
コンパイラが勝手に 16 ビットずつメモリから読み出すように最適化することも
できるだろうし。むしろメモリへのアクセスを陽に書かないほうが早い可能性もある。

771 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 03:03:50 ]
union



772 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:12:11 ]
>>767,771
エンディアンに依存したらダメじゃね?

773 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:14:54 ]
そんなあなたに #if

774 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:18:29 ]
最適化するんだからマシン固有の癖(エンディアン)に
依存する問題まで考えて移植性を重視する必要ねーだろ

775 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:19:09 ]
それぞれの環境ごとに最適化すればいい

776 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/06/14(土) 00:43:50 ]
pextrwで(ry

777 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:49:04 ]
bswapも(ry

778 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:01 ]
小分けしたいだけなんだからエンディアン考えなくてもいいんじゃないかと思う

779 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:31:12 ]
union 使うなら考えんといかんだろ?

そもそも今時のプロセサならバレルシフタぐらいは積んでるだろうから、
>>768 で十分だと思うが。

780 名前:デフォルトの名無しさん [2008/06/17(火) 08:53:09 ]
ビット演算だけで、剰余を求める方法を教えてください

781 名前:デフォルトの名無しさん [2008/06/17(火) 08:58:26 ]

646 名前:デフォルトの名無しさん[] 投稿日:2008/01/23(水) 21:06:35
割り算を掛け算とビットシフトに置き換える計算式求めるプログラムできた

#include <iostream>
using namespace std;
main(){
unsigned int N,n,k;
for(N=2; N<65000 ; N++){
for(n=0; (1<<n)<N ; n++); n+=15;
double X=(pow(2,n)/N);
unsigned int Y=(unsigned int)X;
unsigned int d=0;
if(X-Y<=Y+1-X)d=(unsigned int)(pow(2,n)- (N-1)*Y)-1; else Y++;
printf("x /%5d = ( x * %5d + %5d ) >> %2d",N,Y,d,n);
for(k=1; k<(1<<16) ; k++) if(k/N != ((k*Y+d)>>n))break;
if(k==(1<<16))printf(" OK\n"); else printf(" ERR\n");
}}

647 名前:646[] 投稿日:2008/01/24(木) 15:42:18
64bit機か、内部で64bitまで計算結果を保持しているなら
32bitの割り算も出来るけど646は16bit同士です



782 名前:デフォルトの名無しさん [2008/06/17(火) 08:59:56 ]
2^n の剰余 とそれに近い数の剰余は簡単にも止まる。

783 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:37:14 ]
止めんなw

784 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:51:07 ]
>>780
あらかじめ除数がわかってないと>>781は使えないよ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<166KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef