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


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

【C++】高速化手法【SSE】



1 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 02:55:36 ]
C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。

367 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 02:33:02 ]
>>365
Core2とi7を比較すると、とりあえずメモリが速いのと、デュアルコア*2からクアッドコアになったという利点が
あるのはわかる
i5はコア間でのやりとりがずいぶん遅いらしいので、場面によっては結構な影響を与えそう

iシリーズになって各命令が要するクロックとかパイプライン周りは変わってないの?

368 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 03:50:34 ]
>>367
>iシリーズになって各命令が要するクロックとかパイプライン周りは変わってないの?
そのあたりは余り変わっていないと思われるが、大きく変わっているのはSSE4.2?(4.3だったか?)になっている。
メモリ周りと、キャッシュ周りが大きく変わっているので、iシリーズ用に最適化すると早くなるかもしれない。
iシリーズはQPIが速いので、Core2シリーズよりマルチプロセッサになったとき速い。
いずれにしてもメモリ帯域がボトルネックになりそうなプログラムを書くなら、
iシリーズを使った方がパフォーマンスが出る。
キャッシュに収まるレベルで、SSEの新機能を使わなければあまり変わらない。
今からならCore2Quadよりもi5の方がいいと思う。



369 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 04:17:10 ]
i7って64bit時のパフォーマンスはどうなの?Core2より良いという話を聞くけど。

370 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 06:03:53 ]
良いと言われる理由は、Core 2と違ってMacro-Op Fusionが64ビットでも使えることだったと思う。

371 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 17:21:56 ]
2のx乗(xはfloat、絶対値が100未満)を、テーブル参照やFPUなしで、SSEで4並列処理できませんか?
精度は6bit程度で十分なんですが

372 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 20:19:58 ]
無理ぽ

373 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 20:23:04 ]
jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html

374 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/09/09(水) 22:32:19 ]
整数乗なら簡単
指数部に加算するだけですむからな

375 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 22:51:39 ]
お前ら文盲か?
可能なら方法を書け。
できないならできないと書く。
わからないなら黙って首吊って死ね。



376 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 22:56:14 ]
で、それは4並列可能なの?

377 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/09/09(水) 23:12:26 ]
整数+小数点以下にわけて

整数部は指数部直接操作
あと小数点以下はpshufbで勝つる

378 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 23:19:12 ]
釣りにすらならねえ。。。

379 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:03:24 ]
>>373
これ凄いですね
VS2005では_mm_castがないようなので、*(__m128i*)&に直してコンパイルを通しました
自前で用意した64kBのテーブルがばっさり不要になりました
log10を求める処理もあるので、log2のソースと底の変換を使うことでこのテーブルもなくなりました
書き忘れでSSE2までという条件がありましたが、これも満たしていました
完璧です。ありがとうございました

380 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:11:34 ]
あれ。Debugだと上手くいきますが、Releaseだと0とか負の無限大になってしまいますね
直接アセンブラに落として使います

381 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:34:34 ]
連カキ失礼します
Releaseだと、__m128への代入の時点でスタックが何バイトがずれるようです
この後でカウンタを1加算する処理がありますが、0に1を足して1になるはずが-2になっていてびっくりしました
_m128をグローバル変数に置いたら直ったので、とりあえずこれで誤魔化します

382 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:35:11 ]
おい!テーブル使わん言ったじゃねえかよ。死ねカス。

383 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 01:30:43 ]
>>382
>>373
> Polynomial

384 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 08:35:36 ]
>>382は本当にカスだな

385 名前:デフォルトの名無しさん mailto:sage [2009/09/11(金) 01:21:58 ]
>>382
テーブルと多項式の比較だから、下の方を見てみよう。




386 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:31:44 ]
頻繁に整数を6で割った余りを使うプログラムなんですが、
除算が1回40クロック以上もかかると聞いて以下のようなロジック組んでみました。
試してみると若干早くなってるような気もしますが、
これは効率的って言えますかね?

387 名前:デフォルトの名無しさん [2009/10/08(木) 03:33:43 ]
unsigned int mod6(unsigned int m){
unsigned int a = 0;
static unsigned int x[] = {0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4};
__asm{
mov eax, m
test eax, 1
jz Mod3
inc a
Mod3:
shr eax, 1
lea ebx, x
mov edx, eax
and eax, 0000ffffh
shr edx, 16
add eax, edx
mov edx, eax
and eax, 0000003fh
mov ecx, edx
and edx, 00000fffh
shr ecx, 12
shr edx, 6
add eax, ecx
add eax, edx
mov edx, eax
and eax, 0000000fh
shr edx, 4
add eax, edx
mov edx, x[eax*4]
add a, edx
}
return a;
}

388 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:38:11 ]
条件分岐入れるくらいなら素直に割れ。

389 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:47:13 ]
考え方としては、偶数ビットシフトしても3で割った余りは変わらない
(ただしシフトして消える部分に立ってるビットがない場合のみ)のを利用します。

まず2の剰余を取った後、値を半分にして6の剰余から3の剰余の問題に変えます。
上位16ビットと下位16ビットを加算して17ビットに落とし、
6ビット/6ビット/5ビットに分割して加算して8ビットに落とし、
上位4ビットと下位4ビットに分割して加算して5ビットに落とし、
最後にテーブル参照して、その時点の3の剰余の2倍の値に変換して
最初の2で割った余りを足します。

390 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:59:17 ]
>>388
条件分岐ダメですか?

もう一個レジスタ使って

mov edi, eax
and edi, 00000001h



add edx, edi
mov a, edx

ってやり方にもできますが。

391 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:44:47 ]
x[]を読みに行く方が遅い説

392 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 07:17:20 ]
・6割り算は本当にボトルネックか。
他にどうしようもなく遅い処理があるなら6割り算は無視していいはず。
6割り算だけする関数を作ってそれを呼ぶようにし、インライン展開を抑制してプロファイルを取るくらいはすべき。

・6割り算の代わりに6掛け算は使えないか。
つまり、データの持ち方を工夫して高速化したい処理全体で6で割った商と余りを利用するようにすれば割り算は無視できるはず。
余りも要らないなら、メモリコストも増えないだろう。

・値域はどのくらいか。配列参照で代用できないか。
値域が16ビット程度なら高高数十キロのメモリしか使わないで実現できる。巧くキャッシュに乗れば、速いかもしれない。

393 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 08:35:44 ]
実に適切なレスだな、感動した

394 名前:デフォルトの名無しさん [2009/10/08(木) 09:07:56 ]
結論

人間よりコンパイラの方が賢い

395 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 09:18:27 ]
コンパイラを作ってる人たちより賢いユーザは極少数



396 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:56:15 ]
とも限らない

397 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 14:35:29 ]
ゆとりはRDTSCの使い方も知らんのか

398 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 14:50:11 ]
ちょっと面倒

399 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:58:42 ]
逆数乗算で商を求めて元の値から引いたほうが速い
今のCore MAでは整数乗算は浮動小数除算機と兼用してて
非除数 − (除数×小数点以下切り捨てた商)

まあベンチ取ってみればわかるがコンパイラの吐くコードにも勝てんと思う

400 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:59:25 ]
整数 ×乗算は ○乗算は 浮動小数除算機と兼用してて

401 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 17:45:39 ]
static const int rcp6 = 1.0 / 6.0 * std::pow(2.0,16.0);
int x = 255 - ((255 * rcp6) >> 16) * 6;

確かにこれで十分な気がするし、>>387より速そうだ。


402 名前: ◆0uxK91AxII mailto:sage [2009/10/08(木) 18:41:36 ]
結果を使う40clk程度過去に除算を投げておくとか:b

403 名前:387 mailto:sage [2009/10/08(木) 21:02:29 ]
申し訳ないけど俺のレベルが低すぎてまったく理解できん。

>>399
その「小数点以下切り捨てた商」はどうやって出したらいいの?

>>401

考え方だけでも教えて欲しい。

404 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:55:29 ]
ここはアホしかいないからビット演算スレで適当に質問した方がいいよ

405 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:57:06 ]
>>403
x / 6 = x * 1 / 6
これで、除算がなくなる。
ただ、1/6は小数点数になるから、整数演算じゃ表現出来ない。

>>399は、整数演算も少数演算もコストは同じだから少数でやれと。
>>401は、一時的に2^16倍してるだけ。

>その「小数点以下切り捨てた商」はどうやって出したらいいの? 
std::floor(x * 1.0 / 6.0)



406 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 22:29:32 ]
手持ちのコンパイラで
int hoge(int a)
{
 return a % 6;
}
をコンパイルしてasm吐かせてみてよ
div使われてないと思うよ

407 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:14:01 ]
VC9だとこうなった。
// const int x  = argc%6;
    mov ecx, DWORD PTR _argc$[esp-4]
    mov eax, 715827883              ; 2aaaaaabH
    imul    ecx
    mov eax, edx
    shr eax, 31                 ; 0000001fH
    add eax, edx
    lea eax, DWORD PTR [eax+eax*2]
    add eax, eax
    mov edx, ecx
    sub edx, eax

↓このブロックでargc/6を計算しているようだが、意味不明w
    mov eax, 715827883              ; 2aaaaaabH
    imul    ecx
    mov eax, edx
    shr eax, 31                 ; 0000001fH
    add eax, edx

つーか、eax * 3を計算するのに、LEAを使うのか。すげーなオイ。

408 名前:387 mailto:sage [2009/10/08(木) 23:24:00 ]
VC6だと確かにDIV使ってたんですが…

今VS2008インストールしてみたら確かに>>407みたいな感じでした。
符号なしの場合で、一部整理すると(popとかも省略)
__asm{
mov ecx, DWORD PTR [m]
mov eax, 0aaaaaaabH
mul ecx
mov eax, ecx
shr edx, 2
lea ecx, [edx+edx*2]
add ecx, ecx
sub eax, ecx
ret 0
}
ぐはっ、まったく意味がわかりません!

409 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:45:46 ]
VC5あたりで整数定数除算は掛け算になってたはず
剰余は確かめたことないな・・・

意味だけど、64bit固定小数点数で、小数点が32bit位置にあると考えると
(0x1_0000_0000 / 6) を掛けることは 6 で割ることになるでしょ

んでもって6掛けて元の数から引けば剰余になる
leaの計算は3倍してて、その後自身とのaddで2倍、都合6倍


>コンパイラを作ってる人たちより賢いユーザは極少数

ときどきasm吐かせてみたりしないと浦島太郎になるね。

410 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:50:55 ]
mingw32 gcc 4.4.0

_hoge:
  pushl  %ebp
  movl   %esp, %ebp
  movl  8(%ebp), %eax
  movl  $6, %edx
  movl  %edx, %ecx
  cltd
  idivl %ecx
  movl  %edx, %eax
  leave
  ret

あれ?

411 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:53:54 ]
マヌケなコンパイラだと大変ですね(^^)

412 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/09(金) 00:08:33 ]
64ビット整数の3の剰余を分岐も乗算使わずにハイパー高速に求めるアルゴリズム

n ^= n >> 32;
n ^= n >> 16;
n ^= n >> 8;
n ^= n >> 4;
n ^= n >> 2;
n &= 3;
n ^= ((n&1) << 1) | (n >> 1);

後半はLUT使ったほうが速いかもな

413 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/09(金) 00:15:01 ]
んで6の剰余ってこれでいいよな?

mod3(n >> 1) * 2 + (n & 1)

414 名前:デフォルトの名無しさん [2009/10/09(金) 01:24:41 ]
>>387
inline unsigned int mod6(unsigned int a){
 unsinged int b = (a >> 3) + (a >> 5); // /6
 unsinged int c = (b << 1) + (b << 2); // *6
 return a - c;
}

415 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 01:49:37 ]
>>414
mod6 : 65536 % 6 = 4096
C    : 65536 % 6 = 4

mod6の/6が0.15625と、精度が悪いせいか?



416 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/09(金) 02:02:30 ]
その通り

417 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/09(金) 02:09:39 ]
でもまあショートカットとしては十分優秀だよ


SSEを用いた3の剰余のショートカット方法

movq xmm0, rcx
pxor xmm1, xmm1
psadbw xmm0, xmm1
movd ecx, xmm0

これで64ビットが11ビットくらいに縮まる

418 名前:414 [2009/10/09(金) 02:22:00 ]
>>415
//もうすこし高精度版
inline unsigned int mod6(unsigned int a){
 unsigned int b = a >> 1;
 unsigned int c = b + (b >> 2);
 unsigned int d = c + (c >> 4);
 unsigned int e = d + (d >> 8);
 unsigned int a_div6 = e + (e >> 16) - b;
 unsigned int a_div6_mul6 = (a_div6 << 1)+(a_div6 << 2);
 return a - a_div6_mul6;
}

419 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 02:33:18 ]
あんたらよくやるよ
templateで、任意除数版を作ってくれたら
俺様のライブラリに加えてやってもよいぞよ

420 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 02:34:59 ]
>>419
コードが膨らんでキャッシュの効きが悪くなりそう

421 名前:,,・´∀`・,,)っ-○○○ [2009/10/09(金) 03:27:52 ]
>>417
GCC4.4で-O3 -march=core2でコンパイルして
なぞの某パイプラインシミュレータ通したらトータルレイテンシ20サイクル, スループット10サイクルって出た

俺の>>412-413使った方法だとレイテンシ18と6
後半テーブル化すればもう少し減りそう
0, 1, 2, 3になったときに3だけを0に丸めるためだけにあほなビット演算やってるが
なんとかならんかな


422 名前:-〇〇〇 mailto:sage [2009/10/09(金) 10:10:58 ]
>>412は嘘ですたorz
シフト+加算ならいけるんだが

423 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 11:19:23 ]
団子かわいいよ団子


424 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 14:26:12 ]
signedだが
妙に凝ったことやるよりこれが一番速いだろ
inline int mod6(int n) { return n - (_mm_cvttsd_si32(_mm_mul_sd(_mm_set_sd(n), _mm_set_sd(1.0/6))) * 6); }

425 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 19:44:48 ]
mm...mmmとか読みにくくてかなわん
DirectXみたいなセンスが欲しい



426 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:05:31 ]
……?

427 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:56:58 ]
これがエスパー戦争の始まりである

428 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 14:59:45 ]
結論

inline int mod6(unsigned int n) { return n%6; }

でおk

429 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/11(日) 03:12:20 ]
unsignedだとLSB保存して1ビット右シフトすればsignedで扱える
あとは>>424の方法でmod3を求めて2倍してLSB足せばOK

整数ベースでやるにはレイテンシ1の命令だけでなんとか工夫しないと
ちなみにpsadbwはレイテンシ3だからイマイチ
解説してなかったけどpsadbwが使える理由は

mod3(A * 2^24 + B * 2^16 + C * 2^8 + D)
= mod3(A + B + C + D)

だから。
A * 256 + B = (A * 255) + A + B

430 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/11(日) 04:20:21 ]
まあしかし、6の剰余程度だといずれの方法も大した意味は無いな
www.wikihouse.com/x86clocker/index.php?div%CC%BF%CE%E1%A4%CE%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7

431 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 05:07:16 ]
CedarMillの88クロックってひどいな。

432 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:07:44 ]
AMDがいきなりパなしてきたが・・・
ttp://developer.amd.com/CPU/LIBRARIES/LIBM/Pages/default.aspx

433 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/12(月) 21:27:20 ]
この手のはIntelコンパイラに標準で付いてきてるんだがな。まあ有償だが。
どのみちプロプライエタリならGPL/LGPLには組み込めん。


434 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:23:36 ]
>>432
こういうのはコンパイラがチート使ってくれなきゃ
威力半減な気がするんだが、どうなのかね?

435 名前:デフォルトの名無しさん [2009/10/12(月) 23:26:12 ]
それをするのがコンパイラの仕事だろ



436 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/12(月) 23:28:45 ]
AMDは自社コンパイラを持ってないからな(あのお粗末なAMD Stream SDK以外)

437 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 22:23:37 ]
スカラなんかどうでもいいよ。
SIMDをどうにかしろバカIntel。

438 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/14(水) 23:00:54 ]
SIMDでどうにかしろ

439 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 01:11:17 ]
SIMDとか用語が嫌になる
しむど!
かっこわるー

440 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/16(金) 01:12:15 ]
ネイティブはシムディーって言ってるぞ


441 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 01:27:21 ]
MMX
むむっくす!
かっこわるー
ネイティブでは?

442 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 11:21:57 ]
えめめくす

443 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 20:57:46 ]
かっこわるー

444 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 04:41:05 ]
はいはい無限再帰無限再帰
66 e8 fc ff

445 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 23:55:00 ]
かっこいいと思った用語

XMS
EMS
VMS

なんと!最後にMSが付く・・・・



446 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 23:58:17 ]
あっちがっ・モビルスーツ!だからね!
まい・・・・じゃないんだからね!
誤解しないでよね!
↓死ねよガンオタしないでよね!!

447 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/18(日) 00:00:55 ]
>>445
腹筋運動マシン?

448 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 00:15:39 ]
XMS
EMS
VMS
IMS
OMS
UMS
SMS


449 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 21:55:15 ]
Large
Middle
Small

450 名前: ◆0uxK91AxII mailto:sage [2009/10/20(火) 22:20:34 ]
Long, Middle, Short corn.

451 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 01:58:29 ]
CMS忘れるなよ

Chinko Manko, Sexだけどな

452 名前:237 mailto:sage [2009/10/21(水) 21:12:39 ]
久しぶりにスレをのぞいてみたら、昔の自分のスレを発見。
そういや、こんなことしてたな。
団子さん、その節はお世話になりました。
あれからマシンもcore i7に代えたのでせっかくだからSSE4.2をためしてみた。
当たり前だけどやっぱり専用命令は速いね。
ところで_mm_popcnt_u32は使えたのに_mm_popcnt_u64はnot declared in this scopeって言われちゃった。
OSとかgccが32bitなのがいけないのかしら?


453 名前:,,・´∀`・,,)っ-○◎○ mailto:sage [2009/10/21(水) 21:18:27 ]
64bit専用です

454 名前:237 mailto:sage [2009/10/21(水) 21:28:49 ]
func =  reference :clock   =   14540000
func =        bit32 :clock   =    1710000
func =        bit64 :clock   =    4620000
func =           sse :clock   =     680000
func =  dango-sse :clock   =     430000
func =        sse42:clock   =     270000

文字数制限うぜぇ。削るのに手間取っちまった。しかも微妙にずれてるし。



455 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 21:32:01 ]
>>453
どもです。
世間がwindows 7 で64bitへ本格的に移行してくれることを期待してまつ。




456 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:07:47 ]
C/C++でメモリプール(int, doubleなど様々な型が共存)を作り、
メモリプール内部でメモリの詰め直しを行って最適化しようと試みています。

入門書+α(boostがわかるぐらい)なので、
キャッシュやメモリに関する特殊なことは全然わかりません。
何か気をつけなければならないことや忠告があれば教えてください。

457 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:23:42 ]
>>456
メモリのことを知らずにどうやって最適化する気なのかね?

458 名前:456 mailto:sage [2009/10/22(木) 04:45:35 ]
高速化が必要というわけではなくて、ガベージコレクションの宣伝文を見て
興味本位に詰め直しをやってみようと思いました。

空き領域を整えるだけでなく、アドレス配置を上手くソートすれば
キャッシュヒット率の向上ができると思いますが、それは難しいので
今回はプール内の空き領域を整えることだけに目的を留めて置きます。

プールはchar型の配列で確保し、memmove()でclassやプリミティブを
移動させる予定です。何か規則に反することなどがあれば教えてください。

459 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 05:00:47 ]
そんな無駄な事をする意味がわからない

460 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 05:32:17 ]
メモリコンパクションを実装するということは、
生ポインタから、ハンドル経由のアクセスに切り替えることになると思うけど

461 名前:456 mailto:sage [2009/10/22(木) 06:01:05 ]
>>460
自作のスマートポインタを利用してアクセスを管理する予定になっています。
スマートポインタとコンパクションが同一のスレッドになければ危険ですが。

462 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 03:31:47 ]
やってみりゃいいんじゃないの

463 名前: ◆0uxK91AxII mailto:sage [2009/10/23(金) 04:39:52 ]
下手の考え休むに似たり。

464 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 04:48:37 ]
バウンダリに気を付けろよ

465 名前:456 mailto:sage [2009/10/23(金) 17:53:10 ]
アライメント(構造体のサイズをバイトorワード境界に調整)はsizeof(...)使えば済むと思う。
でも開始アドレスもバイトorワード境界に調整する(これがバウンダリ?)のは知らなかった。





466 名前:456 mailto:sage [2009/10/24(土) 01:53:17 ]
いや、アライメントを制御することをバウンダリと呼ぶという記事を見つけた。
だとすれば開始アドレスは特に気をつけることはないはず……。

467 名前:デフォルトの名無しさん [2009/10/24(土) 02:02:00 ]
他人に伝わらず、自分もよくわからない言葉を使うのは、とりあえずやめよう






[ 続きを読む ] / [ 携帯版 ]

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

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