[表示 : 全て 最新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 ]
他人に伝わらず、自分もよくわからない言葉を使うのは、とりあえずやめよう

468 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 03:17:08 ]
何のためにアドレス調整するのか分かってんのか?


469 名前:456 mailto:sage [2009/10/24(土) 03:40:37 ]
>>467
失礼しました。どうやら混乱してしまったようです。
とりあえず今日把握できた点について整理するために簡潔に書いてみます。

1.はじめに
32bitOSでは、4byte境界というものがある。
クラス・構造体であろうと、int,char,doubleなどのプリミティブ型であろうと、
インスタンスのサイズと開始アドレスは、4byte境界のルールに従うことになっている。。

2.サイズ
構造体やクラスは、4byte単位の大きさに整えられる場合がある。
以下のhogeクラスは5byteだが、4byte単位の大きさに整えられて8byteになる。
従って、sizeof(hoge)の返り値は8byteである。
ただしhelloクラスは4byte単位にされることはなく、
そのまま5byteなので注意が必要である。

class hoge
{
int i;
char c;
};

class hello
{
char c[5];
};

470 名前:456 mailto:sage [2009/10/24(土) 03:41:53 ]
続き

3.開始アドレス
インスタンスが4byte境界を踏み越えないように、注意しなければならない。
具体的には、以下のように分類してインスタンスを配置すれば良い。
(※以下は正しいのか非常に不安)

・4byte以上の大きさを持つインスタンスの場合
開始アドレスが、4の倍数となる番号になるように配置する。

・3byteの大きさを持つインスタンスの場合
開始アドレスが、4byteで割り切れる番号になるように配置する。

・2byteの大きさを持つインスタンスの場合
開始アドレスが、2の倍数となる番号になるように配置する。

・1byteの大きさを持つインスタンスの場合
どこでもよい


参考URL
park21.wakwak.com/~yuiti/program/c/08_boundary_c.htm

471 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 03:49:04 ]
OSつーか、ハードの制約では

472 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 03:53:34 ]
double(IEEE754)を4バイト境界なんかに配置しねーよ。
4byteだと、キャッシュラインをまたぐ位置に置かれる可能性が出てくるからな。
だから32bitOSだから4byteなんて話にはならない。

473 名前:456 mailto:sage [2009/10/24(土) 04:45:04 ]
>>471
>>472
ありがとう。わかった気がする。
アドレスの配置の仕方を訂正〜。

・8byte以上の大きさを持つインスタンスの場合
開始アドレスが、8の倍数となる番号になるように配置する。
(double=8バイトプリミティブを含む可能性があるため)

・4〜7byteの大きさを持つインスタンスの場合
開始アドレスが、4の倍数となる番号になるように配置する。
(int,float,longなど4バイトプリミティブを含む可能性があるため)

・3byteの大きさを持つインスタンスの場合
開始アドレスが、4の倍数となる番号になるように配置する。
(4バイト境界を越えないため)

・2byteの大きさを持つインスタンスの場合
開始アドレスが、2の倍数となる番号になるように配置する。

・1byteの大きさを持つインスタンスの場合
どこでもよい

(x86CPU環境限定)

474 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 04:51:10 ]
そろそろ愚行に気付けばいいのに・・・

475 名前:456 mailto:sage [2009/10/24(土) 04:56:58 ]
「32bitOSの境界は8byte」と認識するだけで十分ですね。



476 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 05:40:30 ]
真性のアフォだ

477 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 07:24:51 ]
javaもコンパクション捨てたよな
D言語は知らんが

478 名前:デフォルトの名無しさん [2009/10/24(土) 12:06:39 ]
>参考URL
>park21.wakwak.com/~yuiti/program/c/08_boundary_c.htm

見てみたが、酷い内容だなw

479 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 12:17:37 ]
情報系の学校でも最近はいきなりJavaとかから入る所もあるらしいしなぁ。

480 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 15:11:33 ]
>>475
OSは全く関係ない。
関係あるのはCPUがメモリにアクセスする粒度。
同じハードウェアなら、16bitOSだろうか32bitOSだろうが64bitOSだろうが一緒。

481 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:22:34 ]
OS が関係あるとしたらミスアラインメント例外を捕捉して(処理速度以外は)
何も無かったかのように振舞う実装をしていた場合だな。
マニュアルとかには良く書いてあるけど、実際に実装されてる OS ってあるのかね?
境界跨ぎじゃなかったかもしれんけど、IRIX では何かやってたようななかったような。

482 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:25:57 ]
>>479
むしろ聞きかじり未満量産所

483 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:29:11 ]
>>481
Linux/ARM(規定で有効)
Windows/IA-64(規定で無効)

484 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:36:56 ]
Linux/ARMは規定有効じゃなかったわ
規定例外だけ無視だわ

485 名前:デフォルトの名無しさん [2009/10/24(土) 21:27:11 ]
>>480
それ嘘だから



486 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 05:24:36 ]
456のベンチまだー?

487 名前:デフォルトの名無しさん [2009/10/28(水) 04:42:22 ]
配列の合計値を求めたいのですが、コンパイラがSSEを使いやすいようなコードはどのように書けばよいのでしょうか?

488 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/28(水) 04:46:10 ]
for (i = 0; i < N; i+=4) {
  sum1 += A[i];
  sum2 += A[i+1];
  sum3 += A[i+2];
  sum4 += A[i+3];
}
sum = sum1 + sum2 + sum3 + sum4;

っていうか組み込み関数使えよ

489 名前:デフォルトの名無しさん [2009/10/28(水) 04:54:38 ]
ありがとう。
SSEに最適化された組み込み関数なんてあるんですか?

490 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/28(水) 05:02:38 ]
_mm_add_ps
_mm_add_pd



491 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 09:37:19 ]
>>487
インテルコンパイラを使って、普通に書けばなんとかしてくれる。
# つーか、そのアセンブリ出力を読むのが先ず一歩目だと思う。

492 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 09:37:28 ]
xmmintrin.h

493 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 21:37:44 ]
そこを高速化して意味があるのかどうか検証するのが先だな。

494 名前: ◆0uxK91AxII mailto:sage [2009/10/28(水) 22:28:29 ]
モノによっては、配列に入れる際に和を求めるっていう手もあるワケで。

495 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 23:17:40 ]
まぁまずはどこがクリティカルなのかを割り出すのが一番大事だよな。



496 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 01:40:16 ]
>>490って>>488の処理の代替になる?

497 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 08:42:12 ]
>>488
これってNがわかっていないと、だめだよね?
ICCだと出来るのかな?
GCCでは無理だった。

498 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 08:44:26 ]
>>488
これってNがわかっていないとコンパイラはやってくれないよね?
ICCだと出来るのかな?
GCCではベクトル化してくれなかった。

499 名前:497 mailto:sage [2009/10/29(木) 08:45:34 ]
>>497
>>498

連投すまそ。書き込みが出来なかったと思った。
スレ汚し申し訳ない。

500 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 11:47:52 ]
>>498
Nが既知でなくてもベクタ化するよ。例えば4で割った余りの分は、ベクタ化しない処理になるだけ。
擬似的には>488にこれが追加されるだけ。
for (; i < N; ++i) {
  sum += A[i];
}


501 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 00:02:08 ]
>>500
そうなんだ。
以前やってみたときはaddssしか出さなくて、
addpsは使ってくれなかった。
ループが深すぎたからかなあ。


502 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/30(金) 00:04:30 ]
Visual C++は何やってもベクトル化しないぞ

503 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 03:22:53 ]
>>502
GCCでもやってみたが、
#define N 4
__m128 vA[N],vB[N],vC[N];
float *A,*B,*C;
A = (float *)&vA;
B = (float *)&vB;
C = (float *)&vC;
for(i = 0; i < N*4; i+=4)
{
A[i+0] = B[i+0] + C[i+0];
A[i+1] = B[i+1] + C[i+1];
A[i+2] = B[i+2] + C[i+2];
A[i+3] = B[i+3] + C[i+3];
}
は出来なくて、
for(i = 0; i < N; i++)
{
vA[i] = vB[i] + vC[i];
}
これはやってくれたよ。

ICCならやってくれるのか?


504 名前:,,・´∀`・,,)っ-○◎○ mailto:sage [2009/10/30(金) 07:55:04 ]
for (i = 0; i < N; i+=4) {
  sum1 += A[i];
  sum2 += A[i+1];
  sum3 += A[i+2];
  sum4 += A[i+3];
}
sum = sum1 + sum2 + sum3 + sum4;

ちなみに>>488は手動でSIMD組み込み関数に置き換えやすい形に展開しただけ
コンパイラの自動最適化使うならここまでやる必要ない


505 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/10/30(金) 07:56:38 ]
↑前文引用してどうする俺



506 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 09:42:57 ]
hello

507 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 09:50:36 ]
Meow

508 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 16:36:44 ]
高速道路無料化に関係ありそうだな( ・ω・)y─┛〜〜

509 名前:デフォルトの名無しさん [2010/01/28(木) 11:52:03 ]
(__m128)num.m128_f32[0]=0;みたいな操作すると
error: request for member 'm128_f32' in 'num', which is of non-class type 'float __vector__'って
怒られるんだが原因わかる?そんなクラスタイプねーよと怒られてる気がするのでインクルード足りない気がするんだが。。。
環境はXcode 3.2にGCC 4.2です。

510 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 12:11:25 ]
(__m128)num->m128_f32[0]=0;
とかやらにゃならんとかいうオチではなかろうな?

511 名前:デフォルトの名無しさん [2010/01/28(木) 13:47:58 ]
>>510
レスthx。試してみたがやっぱダメ。
根本的に__ml128構造体のメンバとしてm128_f32が無いんじゃないかとおもてきた。。。

512 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 16:25:04 ]
>>511
そうかもしれない。
自分とこのMinGW TDM gcc 4.4.1のxmmintrin.hを見たら次のように定義されていた。
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));

513 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 11:27:54 ]
HTTPヘッダを高速に
解析する方法を教えてください

514 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 14:01:37 ]
ggrks

515 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 18:21:28 ]
pc12.2ch.net/test/read.cgi/tech/1264774545/904

なんかわからんけどこんな結論がでているっぽいんで助けてください



516 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 14:45:40 ]
>>515
該当スレは落ちている希ガス。

517 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 22:25:30 ]
保守

518 名前:デフォルトの名無しさん [2010/09/19(日) 14:20:02 ]
for(i=0;i<16;i++)
a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。
C言語からインラインアセンブラで呼び出したいと思うのですが、
うまくいきません。
moveq d,%xmm0
moveq c,%xmm1
paddb %xmm1,%xmm0
moveq a,%xmm1
pxor %xmm1,%xmm0
配列のデータをレジスタにセットするところもわかりません。


519 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 21:15:01 ]
ハッシュ計算で見たような式だな
MASMなら答えれたが残念だ

520 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 22:02:24 ]
95 :デフォルトの名無しさん:2010/09/19(日) 13:38:02
for(i=0;i<16;i++)
a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。

521 名前:デフォルトの名無しさん mailto:sage [2010/09/20(月) 10:44:45 ]
マルチポストか

522 名前:デフォルトの名無しさん mailto:sage [2010/10/11(月) 00:45:27 ]
sse 4.2で大々的に文字列検索の命令追加されてたけど
あれ大文字小文字の変換とかサポートしてくれんの?

523 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 01:43:07 ]
無理じゃね?
単純一致だけだろ

524 名前:,,・´∀`・,,)っ[売り切れだよ] mailto:sage [2010/11/02(火) 14:12:47 ]
>>522-523
Equal Anyモードでいけるでしょ。
journal.mycom.co.jp/photo/articles/2008/04/10/idf09/images/Photo46l.jpg

たとえば"hoge"を大文字小文字区別なしで検索するには、

まず [Hh] [Oo] [Gg] [Ee]の4つのベクトルに分け、ソース2として用いる。
ソース1には検索対象の文字列をロードし、まず[Hh]とのマッチ位置を検索する。
更にpalignrで1文字ずらして[Oo]とのマッチ判定、次は[Gg]とのマッチ判定。
以降、ecxのビットパターンのマスクをとっていって0になる、あるいは[Ee]に達するまで繰り返し。

マッチに失敗すれば次の16バイトをソース1に読み直してまた同じことをやる。


これ文字クラスとか簡単に表現できるよね。
正規表現のJITコンパイラとか作ったら爆速になりそうだから誰か試してみない?
もっとも、SSDでも積まないと大した効果なさそうだけど。

525 名前:デフォルトの名無しさん mailto:sage [2010/11/16(火) 22:35:23 ]
SSEに関する参考書とかってあるんですか?



526 名前:デフォルトの名無しさん mailto:sage [2010/11/16(火) 23:17:26 ]
>>525
団子と寝るか5万払って買ってる

527 名前:デフォルトの名無しさん mailto:sage [2010/11/17(水) 18:09:36 ]
『MMXテクノロジ最適化テクニック』で基本的なことを覚えて
SSE以降はIntelのマニュアルで独学した

528 名前:デフォルトの名無しさん mailto:sage [2010/11/17(水) 21:24:25 ]
ナカーマ

529 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2010/11/18(木) 00:08:02 ]
俺はノンケじゃwwww

530 名前:デフォルトの名無しさん mailto:sage [2010/11/18(木) 09:35:06 ]
女子中学生かもしれんやん。

531 名前:デフォルトの名無しさん mailto:sage [2010/11/26(金) 09:33:13 ]
みんなプロファイラは何使ってるの?

VTune と AQTime の評価版を落としてきて試したんだけど、結果が結構違う。
手法とかが違うのかな。
AQTime は計測対象のプログラムの動作が遅くなるから侵入型なんだろうか。
これは Windows での話ね。

532 名前:デフォルトの名無しさん mailto:sage [2010/11/27(土) 23:26:04 ]
AMDのプロファイラが世界で一番正確
研究者はAMDのプロファイラしか使わない

正真正銘プロのツールだよね

533 名前:デフォルトの名無しさん mailto:sage [2010/11/29(月) 01:19:07 ]
>>532
ヤな言い方だな。何か AMD に恨みでもあるの?

534 名前:デフォルトの名無しさん mailto:sage [2010/11/29(月) 01:56:52 ]
タダのネタでしょ
反応するほうが信者臭がしてキモイ

535 名前:デフォルトの名無しさん mailto:sage [2010/11/30(火) 07:11:38 ]
自演乙



536 名前:デフォルトの名無しさん mailto:sage [2011/01/12(水) 22:32:18 ]
for(int i=0; i<N; i++){
sum += a[i];
}

これってベクトル化効きませんかねぇ・・・

537 名前:デフォルトの名無しさん mailto:sage [2011/01/12(水) 22:35:40 ]
それも分からんようなら諦めな

538 名前:デフォルトの名無しさん mailto:sage [2011/01/12(水) 23:25:35 ]
というか*aとsumが浮動小数点数ならgccでもiccでも自動ベクトル化してくれるが。
問題は、メモリがボトルネックだからそんなの意味ないという事だ。

539 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 11:43:56 ]
x86は浮動小数点が弱くて仕方がないからなあ
8087のコプロセッサの頃からの負の遺産を引きずっている
でもL1/大容量L2キャッシュを媒介にする事によって相当克服して来てはいるんだけどな
PowerPCなどにどうしても勝てない

540 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 11:54:51 ]
釣れますか?

541 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 13:20:30 ]
お前が釣れた

542 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 13:34:01 ]
>>539
インテルは不動整数点が抜群に早い

543 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 20:33:11 ]
糞環境でちまちま最適化した後に
インテルチップでてきとーにビルドしたプログラム走らせると絶望できる

544 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/01/28(金) 20:41:37 ]
>>539
前世紀からタイムスリップしてきた人乙
理論値こんなもん

Core i7 2600(3.4GHz)
54.4GFLOPS/27.2GFLOPS(DP)

POWER7(4.1GHz)
32.3GFLOPS(SP/DP)

545 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 21:26:30 ]
>>542
整数に点はない。
よって、浮動も固定も不動もない。



546 名前:デフォルトの名無しさん mailto:sage [2011/01/30(日) 22:24:57 ]
不動少数点演算を整数演算でってなかったっけ?

547 名前:デフォルトの名無しさん mailto:sage [2011/01/30(日) 22:59:34 ]
「不動少数」なんて言葉はない。
そもそも、「動かない、少ない数」とは何なのだ。
こじつければ「不動小数点数」ならあるかもしれないが、
これは「固定小数点数」と同義と解釈すべきだろう。

548 名前:デフォルトの名無しさん [2011/01/31(月) 01:33:25 ]
>>544
これって1コアあたりの性能?

549 名前:デフォルトの名無しさん [2011/01/31(月) 02:22:04 ]
www.geocities.jp/jagam00z/index.html
これつかえば楽に慣れるさ


550 名前:デフォルトの名無しさん [2011/01/31(月) 02:25:14 ]
www.geocities.jp/jagam00z/index.html

ffftpのID
jaga00z
パスワード
**********


551 名前:jagam00z [2011/01/31(月) 02:27:26 ]
へっへーくやしかったらハッキングしてみろーいバカども!!ww
www.geocities.jp/jagam00z/index.html



552 名前:rv@天才カメラマン@jagam00z@モベキチ mailto:sage [2011/01/31(月) 02:42:47 ]
www.geocities.jp/jagam00z/index.html
おっとヒントはここまでだ。まあきさまらなんざにサイトハックなんざ1000年はやいだろうがなあwwwぶけけけけ


553 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/01/31(月) 06:35:58 ]
>>548
そうだね

554 名前:デフォルトの名無しさん [2011/01/31(月) 13:10:23 ]
10年かかってやっとCellに追いつけたのか。

555 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 17:55:24 ]
sse



556 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 19:52:01 ]
いや俺も「不動点演算子」に、はぁ?と思ったよ。

557 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 20:16:00 ]
山の浮動が居るスレはここですか?

558 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 21:34:07 ]
いや不動点演算子は別に良いだろ
スレチだけどさ

559 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/01/31(月) 23:08:05 ]
>>554
またタイムスリップしてきたあたまのおかしい人か。
2001年にCellがあったんですか?パネエwww


てかCellのスカラ整数演算性能はクロック半分のAtomにも負けてるよ

560 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 23:51:52 ]
俺もCellは肝心なところで使えないと思っていたクチだが、
これ系のスレで毎回スカラを持ち出すお前の頭が分からない。
スレタイ読め。

561 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 02:33:20 ]
スレタイ読んだかスカラ演算がなぜ駄目なのかお前の頭が理解できない。
CellのSPEはC++ライブラリほとんど使えないしましてSSEなんて対応してないぞ。

スカラ整数演算が強い=(SIMDのデータ読み書きを含めた)メモリアドレッシングに強い

562 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 07:40:24 ]
SPUはCのライブラリを使えるし(標準?んなもんは知らない。)C++コンパイラもある。
SIMD演算に特化したSPUは比較対象としては適切と言えなくもない。

だが、Atomのスカラ整数演算能力なんざ完全に場違いもいいとこ。
団子さ、年取って耄碌してきたんじゃない?

563 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 08:00:51 ]
良い訳に必死だこと
ここのテーマは「高速化」であって並列化ではない。

スカラ演算の重要性を理解できないお前の存在自体が場違い。

564 名前:,,・´∀`・,,)<一番良い -○○○ を頼む mailto:sage [2011/02/01(火) 08:29:31 ]
具体的にはCellの整数加減論理演算のレイテンシは2〜6サイクル程度で
クロック半分のAtomはdual issueで1〜3サイクル程度だから実質同程度なんだよ。
CISCのコード密度の優位性と16バイトアライン縛りの問題の分だけAtomのほうがむしろ有利なんだよ。
いくらあがいても速度勝負ではクロック半分のAtomに勝てない。

モバイルデバイスの市場は拡大してるし、Atom向けの最適化技術の重要性は増すと思ってるけど
Cell(SPU ISA)はIBMも東芝も後継プロセッサの開発を事実上放棄してるし
誰もここでCellの話題なんて出さないだろ?


565 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 09:37:18 ]
必死なのはどうみても連投までして言い訳を続けてる団子だろ。
みっともないから少し黙ってろよ。



566 名前:デフォルトの名無しさん mailto:sage [2011/02/02(水) 23:12:42 ]
まあ、日々進歩しているプロセッサと設計がおそらく6,7年前で止まっているプロセッサを比較してもなんだかなあ。
Pentium4とCellはどっちが速い?と言われれば浮動小数演算であれば後者だからな。
Cellがインテル並に進化していたら、整数演算も改善されていたんでは?と思えなくもない。
それはそれで面白いんだろうが。

567 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 10:44:47 ]
うん、まあ取り敢えずお前らまとめてゲハ板にでも行け

568 名前:デフォルトの名無しさん mailto:sage [2011/02/12(土) 02:33:24 ]
gmplib.org/~tege/x86-timing.pdf
これのIntel NHMってやっぱネハレムの事?

569 名前:デフォルトの名無しさん mailto:sage [2011/02/15(火) 02:19:11 ]
16バイトにアラインメントされた構造体の配列を部分的にコピーしたいんですが、hogeが64bit型だとして
_mm_stream_si128(&dest->hoge[0], _mm_stream_load_si128(&src-hoge[0]));
_mm_stream_si128(&dest->hoge[2], _mm_stream_load_si128(&src-hoge[2]));
_mm_stream_si128(&dest->hoge[4], _mm_stream_load_si128(&src-hoge[4]));
 …
のようにすれば速いかと思ったのですがそれほどでもありませんでした
良いアイデアありませんか?

570 名前:デフォルトの名無しさん mailto:sage [2011/02/15(火) 16:43:10 ]
データ設計をやりなおして、部分的にコピーする必要がないように並べる事をオススメする。

571 名前:デフォルトの名無しさん [2011/02/19(土) 16:59:31 ]
行列の演算ですが、高速化する方法はありますか?

for(j=0;j<16;j++){
o=FG[a[j]]^FG[u1.m[j]];
p=FG[b[j]]^FG[u.m[j]];

for(i=0;i<16;i++){
d1[j]^=t[o][h1[p][i]];
d2[j]^=t[o][h2[p][i]];
}
buf[j]=d1[j];
buf[j+16]=d2[j];
}


572 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 17:26:16 ]
>>571
それぞれの配列の構成が判らんとなんとも。
h1みたいな二次元配列っぽいのが配列の配列なのか、ポインタ配列なのか、演算子オーバーロードなのか全く判らん。
兎に角、動く形で提示してくれ。

573 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 17:34:52 ]
この手のものは式テンプレートというものを使うと早いんだそうだが
あまりに複雑でいまだに自分のものにできん^^

574 名前:デフォルトの名無しさん [2011/02/19(土) 18:03:49 ]
unsigned char FG[256],d1[16],d2[16],a[16],b[16],t[256][256],h1[256][16],h2[256][16],buf[32]l\;
これで解りますか?
コードパッドだとエラーが出て動きませんでした・

575 名前:デフォルトの名無しさん [2011/02/19(土) 18:23:07 ]
codepad.org/Dc6LY5cV



576 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 18:39:29 ]
マルチしすぎ

C/C++の宿題片付けます 146代目
hibari.2ch.net/test/read.cgi/tech/1296387672/571

質問にやさしく親切に答えてくれるスレ 4
hibari.2ch.net/test/read.cgi/tech/1222224721/789

【C++】高速化手法【SSE】
hibari.2ch.net/test/read.cgi/tech/1130349336/575

577 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 18:42:17 ]
まぁ高速化の基本だからな。

【マルチコア】並列化について語る【使いこなせ】
hibari.2ch.net/test/read.cgi/tech/1137540671/971-972

578 名前:デフォルトの名無しさん mailto:sage [2011/02/21(月) 05:00:39.65 ]
movdqu命令はレイテンシ6のスループット1だとあります。
movdquを使った1クロック後に、それと依存関係の無い別の命令を実行でき、
movdquと依存関係のある命令は6クロック後まで待つ必要があるってのは分かるんですが
movdquのロード命令と依存関係の無い、別のロード命令を使いたい場合は何クロック待ちになるんですか?

579 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 13:20:09.53 ]
メモリに依る、という回答では駄目だろうか。

580 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 15:09:47.11 ]
素人から見ると団子のレスは読んでて面白いけどな。
批判するほうもちゃんとデータとか出してくれるとより面白いんだけど、俺を楽しませるスレじゃないしな。。。

Cellくそはええ!みたいなのは結局そうでもなかったってことなのかな。
BOINCあたりで活躍してたけど、結局i7とかのがはやいの

581 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 16:18:35.43 ]
>>578
> movdqu命令はレイテンシ6のスループット1だとあります。

それってネトバのmovdqu xmm,xmm命令の事?
もしそうなら、それはxmmレジスタ間コピーのレイテンシ・スループット
であって、ロード命令のレイテンシ・スループットではない。

582 名前:578 mailto:sage [2011/02/22(火) 17:09:50.56 ]
理解しました
測ってみることにします。

583 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:08:10.22 ]
SIMDとは関係ないけど他に見当たらないんで、ここで聞くことにしたけど、
誘導してくれれば幸い。

ビット・オンの最上位のみ残したい場合、
ビットスキャンリバースを使わずに、いい方法ないかな。
ビット・オンの最下位のみ残す場合は、例えば対象の値を80としたとき、

mov eax,80
mov ebx,eax
neg eax
and eax,ebx

こんな感じよね。
これを最上位ビットでやりたいんだが、何かいい方法ないかな。
最下位フラグを消していく方法を繰り返すくらいなら、素直にビットスキャンしちまうんだが。

なければ、ない、と言ってくれ。

584 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:10:21.95 ]
【関数化】ビット演算 0x03
hibari.2ch.net/test/read.cgi/tech/1226143920/

585 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:16:48.53 ]
>>584
サンクス。感謝。
行ってきます。



586 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 03:37:28.61 ]
撃墜100超えたんでやめよっと

587 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 15:07:12.37 ]
すれ違い誘導職人の晩年である

588 名前:のみねーと ◆myadMFZ/7k mailto:sage [2011/04/05(火) 05:50:08.80 ]
                ,.ィ'"               ` 、
               /   ,.--、               :.:.\
          r、 |:.:.:.:.〈;;;;;;;ノ               :.:.:.:.ヽ
          _/△ハ,,__ / ハ !:.:.:.:.:.:.::.:.:.:.:.:.:...        :.:.:.:.ヘ
      /: : : : : :/ ||:.:i/'ーリ―- 、_:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.   :.:.:.:.:.:.ハ
     //: : /: :.:.ト=': : : : :/: : : : : : :. ̄`''ー- 、:.:.:.:.:.:.:.:.:... . .:.:.:.:.:.:!
    / /: : /:.:.:.:.:/: :./: : : /: : : :./: : :/:/: /!: :.i::::``.、:.:.:.:.:.:.:.:.:.:.:.:.:.:!
.      /: :./:.:.:.:.:.:! : /: : : / : : : /: : :/:/!:./ |:.:.l|: : :.:.::::\:.:.:.:.:.:.:.:.:.:.|
    /Vlハ|/!/!|: : !: : : :! : : :.,'!: :.:/:/ |,'  |: :|!: :! : i:.:.::::ヽ.:.:.:.:.:.:.:.:l
         ,イ  /|: :.|: : : :|: : : :.!|: :/:/ |!  .|:.リ|: :|:.:.:|: : : : :ハ:.:.:.:.:.:.!
.       /  / ! ,r|: : : :|: :.'"丁/ ̄` |!   !,'十ァ!、:.|: : : :.|: !:`! _,/
          |:.! |: : : :| ,rfj ̄ヾ、   !   / |ム」_:リ!: : :.,':.:|:::「
          | ト.|: : : :K {| ::::::リ   l  / ,イ}:::::::ハ,!: :.:/:.:.,'::::|
              V:.ハ: : :.|  ゛ー ''        K.__,/ }:.:.:/:.::/::::リ
             V: |: : :ト . xxxx     ,.   `"''" //}:::/: :.,'   ただちに逃げてください...
              V:ハ : |:::\   __     "'''''' /イ:::::/: :./    
            リハハヽ-t`/  \   _,. イ//l/!/|/!      
    ,..、           / /~\ ヽ‐、  /  / / リ 
   /: : :\   _  __,.ィ| イ ,.へ `< ヽr‐ァ―=‐、      
  くr! : : : : : }フ´ \ ̄ハ:.:.:.:ハ  イ ,、〆``ー /:.:/::/   ハ
.  |ト、: : : : :/     ヘ::|: !.:.:.:ハ   ∨ ̄  / .:/::/ /   i!


ただちににげろのガイドライン
www.geocities.jp/ust7800870/index.html


589 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 08:56:35.82 ]
沖縄は良いところです。

590 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 09:24:40.85 ]
ただし原住民にとってのみだが。

591 名前:デフォルトの名無しさん mailto:sage [2011/04/05(火) 20:38:18.40 ]
暑い所は嫌だなあ。PCが熱暴走しやすくなるし。

592 名前:デフォルトの名無しさん mailto:sage [2011/04/16(土) 13:08:21.87 ]
>>591
昨日は暑かったけど、ビデオカードが膨張したのか接触不良を起こして
画面がいろとりどりの模様になって停まっていました。

夏場はエアコンがないと人もPCも死にそうになりますね。

593 名前:デフォルトの名無しさん mailto:sage [2011/05/05(木) 17:29:52.29 ]
アライメントを逐一管理するのがめんどいんですけど、
コンパイラーなりリンカーオプションで、スタックからヒープまで
一括して指定することはできんとですか。
環境:GCC と CL。

594 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 00:29:02.79 ]
マクロ書いて、めんどくさくならない程度に短くして対処するんじゃだめじゃろか。


595 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 09:27:44.52 ]
質問です。
画像処理で画素同士の加算や減算をSSEで高速化したいのですが, 速くなりません。
処理は, int型で,

for(i = 0; i < width*height; i++)
dst[i] = src1[i] + src2[i];

といった簡単なものです。
これに対して, ポインタを__m128iに変え, ループ回数を4分の1にし, 加算を_mm_add_epi32に変更しました。
しかし, 速度はint型とほとんど変化はありません。
平均化フィルタをSSEで実装したところ, 2倍近く高速化できたので, こちらもうまくいくと思ったのですが・・・。
もしどなたか原因がわかる方がいましたら, ご教授お願いします。



596 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 10:20:14.97 ]
結論から言うとメモリの転送がボトルネックです。
書き出しのアライメントを揃える事とstreamを使う事で何割かは改善出来ますが、基本的に速く出来ません。

最適化とは遅い部分を探し出す事に他なりません。
安直にSSEとかマルチプロセッサにしようと思わず、真にボトルネックを見つけられるようになりましょう。

真に遅い部分が分かったなら、平均化フィルタと何が違うのか、どうしてもう速く出来ないのかが理解出来るようになります。

597 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 11:55:38.13 ]
つまり, メモリがボトルネックになっている以上, いくら演算速度をあげても効果は薄いということですね。
高速化に対するアプローチも教えていただき, 大変勉強になりました。
速度に影響する要因をまだ一部しかわかっていない私には難しいかもしれませんが、これから知識を得ていきたいと思います。
御回答ありがとうございました。

598 名前:デフォルトの名無しさん mailto:sage [2011/06/13(月) 15:11:06.75 ]
>>596
メモリの転送がボトルネックなのか、演算部分がボトルネックなのかは
どうやって判断すればいいのですか?つまりどこを見たらよいのか。
あるいはあなたはどうやってますか?
ツールとか使うのでしょうか?

599 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 01:59:27.76 ]
メモリに対する操作や演算の大半は、ツールを使って調べるまでもなく、単純で十分に短い。
なので、ソースコードを眺めれば、そこがSIMDを使う事で高速化すべきか否かは、すぐに見分けが付く。
演算そのものが単純で短い場合は、複数種の演算を1命令にまとめることが出来るかどうかで判断していい。

600 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:12:38.27 ]
>>598
理論値と実際の処理時間の差で見積もる。

また、CPU メーカのプロファイラを使えば、命令のリタイア数とか、キャッシュミスなどのイベントの数を計測できる。


601 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:21:34.39 ]
Cのソース眺めるだけじゃわからんだろうに、汗で判断できるぐらいにならんと

602 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 03:46:45.40 ]
最適化もしない状態のことだったりして

603 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 07:12:37.77 ]
CPUのつもりになってメモリアクセスパターンを想像したら見えてくるかもしれんね

604 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 12:49:22.23 ]
>>600
理論値ってアセンブラニーモニックを命令毎にスループットやレイテンシの累計計算して
全体で何クロックかかるかを算出した値という意味ですか?

それで実際にどれだけクロックかかるかとの比較をする、と。


605 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 15:49:14.35 ]
メモリ参照をいかに少なくするかでしょ、今時の高速化は



606 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 20:56:50.75 ]
>>598
すまんレス遅れた。
メモリのアクセス回数と演算回数は見積もれるな?
c[i] += d[i] * e
だったらeはレジスタに乗っているものとして無視して、
読み込み2回(c, d)、書き込み1回(d)、加算1回(+=)、積算1回だ。

回数を見積もったら、加減積算はそのまま、メモリアクセスと除算とsqrtは10倍、その他sin/pow/log/expとかは100倍するんだ。
比率はいい加減なので、数倍しか違わないなら全体的に最適化。

その中で、演算が効いてそうならSIMD化だ。
あとは、何よりも実測が重要。

607 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:38:17.15 ]
>>606
ありがとうございます
ソースの式から各演算毎にウエイトを用いてかかるコストを見積もるって意味だったんですね。
それでメモリアクセスより演算のコストの方が高そうであればSIMD化すると。

例の c[i]+=d[i]*eの場合
メモリアクセスコスト 3*10=30
演算コスト 1+(1*10)=11
なのでメモリアクセスのほうがコストが高いから、SIMD化しても早くならないだろうと考えるわけですね。


>書き込み1回(d)
揚げ足とるつもりではないのですが
これは(c)への書き込みの間違いですよね?


608 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:44:29.40 ]
SSEで例えると、メモリの読み書きはSSEでやったほうが断然高速だから
そんなコストとか馬鹿な計算する以前に速くなることは確定している。

609 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 00:57:58.94 ]
そんな前時代的などんぶり計算しても意味ないよ
プロファイラにかけな

610 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 01:38:06.85 ]
キャッシュが考慮されてないよね

611 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 01:49:45.83 ]
> 間違いですよね?
その通り。

>>608 総和とか本当にメモリがボトルネックだとスカラでやっても大して変わらない。

>>609
そう、机上は本当に大ざっぱな見積もりだけで基本的には実測が重要。
でもVTuneなんかは他にも項目が多過ぎて目星付けるのも勘がいるんだよ。

612 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 16:31:35.18 ]
SSE使わんと絶対にプリフェッチされない、とかだったら正しかった。

613 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 21:26:27.67 ]
>>610 畳み込みとの違いのヒントを示し忘れてた。
同じアドレスを複数回読むなら、最初の1回を見積もりに入れておけばいい。
勿論キャッシュに入らないサイズだと全てカウントする必要がある。

614 名前: ◆0uxK91AxII mailto:sage [2011/06/16(木) 15:08:44.21 ]
メモリ周りがボトルネックなら、prefetch*とmovnt*。
とりあえず、CPUによっては32[bit]のmovntiは遅いから使わない方向で。

実行環境が単一でない場合、大雑把な見積もりで十分だと思ってみる。

615 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:07:18.11 ]
VCの__declspec(align(16))や#pragma pack(push, 16)って
一時オブジェクトには効かないんでしょーか?
std::map、std::pair周りをソースひっぱってきて、__m128を含んだクラスを
受け取れるようにしたんですが、
aligned_stl::pair<int, hoge> pairArg = aligned_stl::make_pair(1, Hoge);
mapFuga.insert(pairArg);
とやるといけるけど
mapFuga.insert(aligned_stl::make_pair(1, Hoge));
とすると、一時オブジェクトがアラインされてなくてこけます・・・・

何か抜け道ないですかね(´・ω:;.:...



616 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:20:21.30 ]
間違えたorz

”make_pairの返す一時オブジェクトが”アウトですた。
make_pair(1, Hoge);       ←×(落ちる。)
aligned_stl::pairArg(1, Hoge); ←○(落ちない。)

なのでコンストラクタで直接渡せばいけるけども。
Hogeにもpairにもアライン指定つけてるんだけどなぁ・・・

617 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 13:22:04.01 ]
また間違えた・・・・連投すみませんorz
誤:aligned_stl::pairArg(1, Hoge); ←○(落ちない。)
正:aligned_stl::pair<int, hoge>(1, Hoge);  ←○(落ちない。)

618 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 22:44:49.03 ]
mapの方がアライメントされてないんじゃない?

619 名前:デフォルトの名無しさん mailto:sage [2011/07/02(土) 23:38:54.68 ]
std::pair<int, hoge>からaligned_stl::pair<int, hoge>へのコードがバグってるんじゃないの

620 名前:618 mailto:sage [2011/07/03(日) 00:21:26.44 ]
適当な事書いたと思ったけど、std::mapにカスタムアロケータでいけるっぽい
ttp://ideone.com/sOWl6



621 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 02:45:36.94 ]
>>618
mapの方は、__declspec(align(16))みたいなことはしてませんが
カスタムアロケータを渡しており、カスタムのpair(aligned_stl::pair)を使うように指定してます。

>>619
わかりづらくてすみませんorz
std::pairは一切使っておらず、aligned_stl::pairのみです。
make_pairもaligned_stl::pairを返します。

>>620
ありがとうございます、Win7 64bitのVC2008Expressで動かしてみましたが
カスタムアロケータのc.insertで、Hoge()の引数なしのコンストラクタで落ちます(x_ = static_x)
Hoge hoge;
c.insert( ::std::make_pair<int,Hoge>(i, hoge) );
とやると、make_pairのところのコピーコンストラクタで落ちます( x_ = src.x_)。
なので、前回書いたのと同様に
Hoge hoge;
std::pair<int, Hoge> pairArg(i, hoge);
とやってからpairArgを渡すと落ちませんでした(c.insertのみ。d.insertは落ちる)。

どうもpairに関してはアラインメント指定しなくても、中のメンバが
アラインメント指定されていれば問題ないようですね(アロケータだけでよい?)。
もうちょっと試してまた報告します。
ただ、2008だとアラインメント指定が一時オブジェクトに対して効かないと考えたほうが
いいのかもしれませんね(´・ω:;.:...  (インライン展開された場合は除く)
ありがとうございました。

622 名前:621 mailto:sage [2011/07/03(日) 03:25:25.25 ]
あと、x64をターゲットにすれば落ちませんでした(デフォルトのアラインメントが16バイトだから?)
ついでに質問なのですが、>>620のchar unused1__とunused2__はどういう意味でしょうか?

623 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 03:47:36.78 ]
それって構造体のメンバのアライメント指定であって、アドレスのアライメント指定する機能って基本的になくね。
x64だと関数の始まりのスタックは16バイトアライメントになるようになってるから、問題発生しにくいとか。
というか、落ちる落ちない以前にデバッガで逆アセ見れば、どういうコードが生成されているかすぐわかると思うんだが。

624 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 04:52:17.82 ]
>構造体のメンバのアライメント指定であって
あああ、なるほど・・・x64なら安全、と考えるのは危険ですね。
>逆アセ見れば
見てます、きっちりmovaps使ってますw
で、ウォッチ窓で見ると一時オブジェクト側のアドレス下位1バイトが0でないので
明らかにアラインされてないのが問題です。

__m128を使うだけなら、構造体の代入演算子やコピーコンストラクタで
_mm_loadu_psとか使えばいいんでしょうけど。
誤解されるような書き方だったかもしれません、決して手詰まりというわけではないです。
どうにかしてアラインメント保ったままmapに突っ込めないかなー、というだけでした。

625 名前:618 mailto:sage [2011/07/03(日) 11:13:12.43 ]
ダメ、だったか・・・ (Initial D 星野好造風に)

2010だからこっちでは本来の動作確認はできないけど、コレならどうだろう
ttp://ideone.com/h4QFh




626 名前:621 mailto:sage [2011/07/03(日) 15:51:09.00 ]
>星野好造風に
渋すぎるwww

ありがとうございます、試して無事動きました(#if 1でも0でも)
予測しておられた?通り、char unused1__が含まれていようと問題ないんですね。
構造体の型自体は(__m128のような16byte境界を要求するものが含まれていれば)
先頭アドレスが16byte境界でさえあればいいような配置になっているけど、
2008は関数の返す一時オブジェクトのアドレス調整が抜けている、ということかな・・・

大変参考になりました、ありがとうございました。

627 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 22:56:56.22 ]
int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。

628 名前:デフォルトの名無しさん mailto:sage [2011/07/03(日) 22:59:55.40 ]
sizeof(str1) != sizeof(str2)

629 名前: ◆0uxK91AxII mailto:sage [2011/07/04(月) 00:40:54.13 ]
str1++;

630 名前:sage [2011/07/05(火) 07:42:33.24 ]
sizeof とか return とかにかならずカッコをつける人がいるけど何で?


631 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:17:06.42 ]
sizeofとdefinedは関数として意味が通ってるから括弧付けちゃうな。
(a || b) && (c || d) も括弧いらないけど、あった方が読みやすいのと似てる。

returnに括弧付ける人の気持ちは聞いた事が無いから分からない。

632 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:18:59.63 ]
間違えた(a && b) || (c && d)だ。

633 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 08:43:27.32 ]
>>630
sizeofの中身によって括弧つけたりはずしたりしてるのかい?
おれはそんなとこ気を使っても意味ないと思うので常につけてる。
sizeofの括弧省略してるコードってほとんど見たこと無いしな。

634 名前: ◆0uxK91AxII mailto:sage [2011/07/05(火) 14:20:59.67 ]
>>630
struct s{int i;};
sizeof struct s;

:b

635 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:23:54.89 ]
20年以上C書いてるけど、sizeof のカッコが省略可能なんて知らなかった…実際そんな記述を見たことがなかった。

return にはカッコつけない。



636 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:33:01.76 ]
return (0); とかは見たことあるけど、sizeof int は見たことないからなぁ。

637 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 19:36:15.27 ]
それは違反です

638 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 22:56:13.54 ]
余分なカッコが多すぎるコードってみにくくて嫌いだ。

if (a == 0 && b == 0 || c == 0 && d == 0)

if ((((a == 0) && (b == 0)) || ((c == 0) && (d == 0))))

この二つだと上の方がはるかに見やすいと個人的には思うが、
見やすさを優先してカッコをつけるとか言って下のように書く人がいる。


639 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 23:13:08.81 ]
LISPに慣れているせいか、かっこをつけておくと
式の構造が立体的に(ネストが深いほど浮き上がって)見えるんだ

640 名前:デフォルトの名無しさん mailto:sage [2011/07/05(火) 23:16:36.97 ]
確かに人間が見ると見やすいかも知らないが、
人間以外(コードアナライザの類とか)には
見やすくないと判断されるんで仕方がなくつけてる。

641 名前:デフォルトの名無しさん mailto:sage [2011/07/06(水) 00:43:52.44 ]
>>638
if ( ((a == 0) and (b == 0))
  or ((c == 0) and (d == 0)))
って書く。論理演算はキーワード使う方がビット演算との取り違えも防げる。

642 名前:デフォルトの名無しさん mailto:sage [2011/07/06(水) 00:54:25.86 ]
AndAlsoですね、わかります

643 名前:デフォルトの名無しさん mailto:sage [2011/08/01(月) 22:47:25.26 ]
>>638
何処からが"余分"なのかを巡って紛糾する事も多し。

644 名前: ◆0uxK91AxII mailto:sage [2011/08/02(火) 00:52:38.09 ]
#define EQUAL(a, b) (a==b)
#define OR(a, b) (a||b)
#define AND(a, b) (a&&b)

if (OR(AND(EQUAL(a, 0), EQUAL(b, 0)), AND(EQUAL(c, 0), EQUAL(d, 0))))

見づらいって言うか、吐き気がするほど読みづらい。

645 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 08:50:56.65 ]
こんな手法でちまちま高速化したところで、もっと簡単なGPGPUの並列処理に
圧倒されるだけ。



646 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 19:46:47.70 ]
GPGPUが簡単? OpenCLの厄介さを身を以て知って濃い。

647 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 22:19:04.98 ]
if ((!a && !b) || (!c && !d))

648 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 22:20:48.41 ]
括弧が

649 名前:デフォルトの名無しさん [2011/10/10(月) 19:26:30.72 ]
指定桁数で四捨五入する以下の関数の実行速度を上げたいの。
(valueは0〜9999、digitsは0〜5が保証される)
SSE使って高速化頼む。

double NormalizeDouble(double value, int digits) {
  static double t0[] = { 1, 10, 100, 1000, 10000, 100000 };
  static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 };
  return (int)(value * t0[digits] + 0.5) * t1[digits];
}

650 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:27:11.99 ]
ベクトル化は不要よ。

651 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:39:28.17 ]
あら、なんかデジャブ

652 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:49:57.12 ]
>>649
最適化スレで終了宣言してからにしろよ

653 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:50:50.26 ]
でもベクトル化で少しは早くなるわよ

654 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 19:56:01.06 ]
>>652
あっちはCでだから。
>>653
使う方がスカラーなのよ。

655 名前:デフォルトの名無しさん [2011/10/11(火) 20:37:34.29 ]
>>2
これっていまでのそうなの?



656 名前:デフォルトの名無しさん mailto:sage [2011/10/11(火) 21:19:20.86 ]
>>655
お前はQuickCでも使ってろよ

657 名前:デフォルトの名無しさん mailto:sage [2011/10/13(木) 04:16:06.44 ]
なんで PSLLB だけないんだろう?

658 名前:デフォルトの名無しさん [2011/11/05(土) 00:09:14.57 ]
x64の組み込み命令で、xmmレジスタに定数を代入したいんですが
__m128i xmm0;
xmm0.m128i_u64[0] = 0x1212121212121212;
xmm0.m128i_u64[1] = 0x1212121212121212;
これより速い方法はありますか?
各バイトが必ず同じ数字になるとして

659 名前: ◆0uxK91AxII mailto:sage [2011/11/05(土) 00:32:10.02 ]
>>658
定数はループの外で置きっぱなしにするし、x64だとレジスタが多いから、そのままで良いと思ってみる。

mov eax, 12121212H
movd xmm0, eax
pshufd xmm0, xmm0, 000H

660 名前:デフォルトの名無しさん mailto:sage [2011/11/05(土) 08:34:55.68 ]
VC++だと
__m128i xmm0 = {0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12};
でmovdqaを使うようになる

661 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/11/11(金) 03:05:16.98 ]
VC++だとそれでいいけどGCCだとコンパイル通らなかったりするんだよね。
最適化ルーチンが腐ってなければ大体これでいけるけど。
__m128i xmm0 = _mm_set1_epi8(0x12);

というかアセンブリ出力読むと良いよ。

662 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 22:54:57.76 ]
>>654
お前はスクルトでもツカッテロ

663 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 23:12:10.08 ]
スクカジャの方が良いよ

664 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 22:41:12.80 ]
signed shortの配列に
floatもしくはdouble型の乗算をして
クリップ処理をほどこし
signed shortの配列に戻すのを
SSEにしたいのでやってください


これ

signed short s[100];
float f
init a;

for (a=0;a<100;a++)
s = s[a] * f;

665 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 23:06:34.33 ]
それ、どう考えても実数型⇔整数型のコストがでかすぎる。
たった100件でいいなら実数で持てないの?



666 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 00:38:02.93 ]
>>665
100は例で実際はは数千万程度
waveファイルPCMの加工で

667 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:11:33.16 ]
>>664
自分で学習しないと答えを聞いても使えんよ。
そもそも意味不明なコード書かれても誰も答えられない。

668 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:24:45.87 ]
>>667
ワカンネーならクチダスな

669 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:28:37.19 ]
#1:すぐに話の風呂敷を広げる
#2:よく理解しないまま突っ走る
#3:嫌われていると勝手に思い込んでいる
#4:キレて他人に八つ当たりする
#5:やたらと自分の正当性を主張する
#6:何も自分で決めない
#7:何かにつけて理屈をこねる
#8:やたら褒めてほしがる
#9:他人の話を聞かない
#10:何が言いたいのかわからない
japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20421237-2,00.htm

670 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:29:57.57 ]
自分語り 乙w

671 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 03:08:00.84 ]
s = s[a] * f; って何がしたいんだw


672 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 04:36:52.55 ]
話の内容を察するに、s[a] *= f; ってことだとおもうけれど

673 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:35:15.11 ]
それじゃ飽和処理してないし

674 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:54:06.36 ]
つーか、コンパイル通るの?

675 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 17:04:56.31 ]
何も書いて無いけどどうせ色々特殊処理もあるんだろうから、予め
0x0000-0xffffに対する結果を128K byteのテーブルに計算しておき、
後はテーブルルックアップすれば良いだろw



676 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 18:08:27.37 ]
いっそ0x0000-0xffffffffに対する結果を16GByteのテーブルに(ry

677 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 18:58:44.22 ]
>>666
音を大きくしたり小さくしたりしたいだけなら、0.0〜1.0を、0〜255 とか 0〜65535 とかにして、
整数演算に帰結させてMMXのほうが速いんじゃ…

678 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 23:16:56.16 ]
お前らやさしいな

679 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 02:15:44.43 ]
初めてSSEに触れるので、まずは簡単なコードを作成してみたのですが、
SSEを使わないほうが40倍も速いという驚愕の結果が出ました。
何が間違っているんでしょうか??

コンパイラ:VC++2005(Releaseモード、浮動小数点モデル:FAST)

float* f4pakAdd( float* pfA, float* pfB )
{
  _declspec( align( 16 ) ) static float fC[ 4 ];
  
  _asm
  {
    mov ebx, pfA
    movaps xmm0, oword ptr [ebx]
    mov ebx, pfB
    movaps xmm1, oword ptr [ebx]
    addps xmm0, xmm1
    movaps fC, xmm0
  }
  
  return fC;
}

呼び出し側

for( int i = 0; i < 10000000; i++ )
{
  pfC = f4pakAdd( fA, fB );
}

680 名前:679 mailto:sage [2011/12/19(月) 02:15:55.13 ]
_asmのスコープをコメントアウトして、以下のようにスカラの加算を並べたほうが40倍速くなりました。

fC[ 0 ] = pfA[ 0 ] + pfB[ 0 ];
fC[ 1 ] = pfA[ 1 ] + pfB[ 1 ];
fC[ 2 ] = pfA[ 2 ] + pfB[ 2 ];
fC[ 3 ] = pfA[ 3 ] + pfB[ 3 ];

681 名前:679 mailto:sage [2011/12/19(月) 02:17:15.89 ]
fA、fBは以下のように宣言しています。

_declspec( align( 16 ) ) float fA[ 4 ] = { 1.0f, 2.0f, 3.0f, 4.0f };
_declspec( align( 16 ) ) float fB[ 4 ] = { 5.0f, 6.0f, 7.0f, 8.0f };

682 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 02:34:54.14 ]
パイプライン化したコードでもないし、スタックチェックが行われている気がするが。
逆アセ確認したかい?

683 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 02:52:57.82 ]
40倍も遅いというのはインライン展開されずに普通に関数呼び出しされちゃってるんじゃないの

684 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/19(月) 02:58:55.10 ]
インラインアセンブリは関数のインライン展開を阻害するから
どうしてもASMを使いたいとか宗教的な理由が無い限りintrinsicsを使うべき

強いて関数呼び出しにするなら__fastcallにするかな。

685 名前:679 mailto:sage [2011/12/19(月) 02:59:52.23 ]
>>682
逆アセしてみました。

■SSE使用

mov ebx, pfA
004115DE mov ebx,dword ptr [pfA]
movaps xmm0, oword ptr [ebx]
004115E1 movaps xmm0,xmmword ptr [ebx]
mov ebx, pfB
004115E4 mov ebx,dword ptr [pfB]
movaps xmm1, oword ptr [ebx]
004115E7 movaps xmm1,xmmword ptr [ebx]
addps xmm0, xmm1
004115EA addps xmm0,xmm1
movaps fC, xmm0
004115ED movaps xmmword ptr [fC (417540h)],xmm0

■SSE未使用

fC[ 0 ] = pfA[ 0 ] + pfB[ 0 ];
004115DE mov eax,dword ptr [pfA]
004115E1 fld dword ptr [eax]
004115E3 mov ecx,dword ptr [pfB]
004115E6 fadd dword ptr [ecx]
004115E8 fstp dword ptr [fC (417540h)]

配列インデックス1以降も同じ感じです。

どちらもまじめに演算しているだけのようですね・・・



686 名前:679 mailto:sage [2011/12/19(月) 03:16:03.78 ]
すみません、>>685はDebugモードでの逆アセで、Releaseモードでは以下のように
インライン展開されていました。
先ほどのはどちらも関数呼び出しを行っていました。(お決まりのpushやret)

■SSE使用

for( int i = 0; i < 10000000; i++ )
{
pfC = f4pakAdd( fA, fB );
004011A6 lea ecx,[esp+10h]
004011AA lea edx,[esp+30h]
004011AE mov dword ptr [esp+28h],ecx
004011B2 mov dword ptr [esp+2Ch],edx
004011B6 mov eax,989680h
004011BB jmp WinMain+190h (4011C0h)
004011BD lea ecx,[ecx]
004011C0 mov ebx,dword ptr [esp+2Ch]
004011C4 movaps xmm0,xmmword ptr [ebx]
004011C7 mov ebx,dword ptr [esp+28h]
004011CB movaps xmm1,xmmword ptr [ebx]
004011CE addps xmm0,xmm1
004011D1 movaps xmmword ptr [__fmode+10h (403380h)],xmm0
004011D8 sub eax,1
004011DB jne WinMain+190h (4011C0h)
}

687 名前:679 mailto:sage [2011/12/19(月) 03:17:00.05 ]

■SSE未使用

for( int i = 0; i < 10000000; i++ )
{
pfC = f4pakAdd( fA, fB );
0040114A fld dword ptr [__real@40c00000 (40213Ch)]
}

これって、定数演算だから、事前に計算した結果をメモリに置いておいて、
ロードするだけってオチでしょうか・・・(汗ンブラ)

688 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 03:18:45.19 ]
SSEなんてたいして効果無いんだろ。
コンパイラまかせでいい。
小手先のテクより、アルゴリズムやGPU使用など劇的変化が見込める所を研究すべき。
SSEは最高が20%とかだろ。

689 名前:679 mailto:sage [2011/12/19(月) 03:19:44.86 ]
>>683
Debugモードではいずれも関数呼び出しありで、
Releaseモードではいずれもインライン展開されていました。
両モードでこういった差があることは意識していなかったので勉強になりました。

>>684
団子さん、ありがとうございます。
今回は勉強の一環としてアセンブラを使いましたが、
できるだけ組み込み関数を使うことにします。
(__fastcallにしたら速度が半分に低下してしまいました・・・)

690 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 03:31:49.83 ]
実用上はインライン展開で速くなることは稀。
関数にするからには一カ所より多くの所からコールされる可能性が高く、
インラインにしなければCPUキャッシュに乗っている場合に関数を使い回しができて高速化される。

691 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/19(月) 03:36:24.22 ]
変数をスタックに積むのって結構無駄だろ?
呼び出し元の関数が小さい場合は特にね。

VC++の32ビット版の場合、__fastcall規約だとxmmレジスタで3つまで渡せるよ。

692 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/19(月) 22:10:00.23 ]
失礼
VC++だと__m128{,i,d}は呼び出し規約にかかわらずレジスタ渡しになるね
てかレジスタ渡し以外不可能。
ちなみにgcc(Linuxなど)とかだといったんストアしてポインタ渡しになる。

693 名前:デフォルトの名無しさん mailto:sage [2011/12/20(火) 02:40:46.25 ]
>>692
なんか昔より太ってね?

694 名前:デフォルトの名無しさん mailto:sage [2011/12/20(火) 02:51:35.79 ]
なりすましとか勘弁してください

695 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 08:12:33.37 ]
>>690
今の時代のインライン展開って、call命令減らすというより、コンパイラの最適化効きやすくするためというほうが大きいんじゃない?
うまくいけば数命令ぐらい減るし。



696 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/22(木) 22:22:40.93 ]
ステップ数の少ない小さい関数限定だな

697 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 23:47:29.24 ]
C++の話なら、たんなる要求に過ぎないので、
ステップ数が大きければコンパイラがinline指定を無視するような気もするな。


698 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 01:18:10.46 ]
gettimeofday()してusecを返すだけの関数はインライン展開したけれど、
(sec%1000)*1000*1000を足したら関数呼び出しになった(gcc4)。

699 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 01:49:52.05 ]
>>698
1関数呼び出しのみの関数はエイリアスとみなしてるんじゃね?

後者は引数渡しのオーバヘッドが無いし、インライン展開のメリットがあるか微妙な線だな。


700 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/23(金) 01:52:20.02 ]
おいらC++の場合だとそれほど大きくないクラスならヘッダ内に関数実装も含めて書いちゃうし
最適化時にどれがどう展開されるかはコンパイラ任せという罠。

701 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 04:20:10.94 ]
インラインやマクロは最初から使わない方が良い。
EXEでかくなり、メモリ使用量も増える。
自分はオプションでインライン展開しない設定にしてる。
それで実測してみて、関数コールが実際に負荷になっていれば書き換えれば良い。
しかしそんなことが有ったことがない。
速いという思い込みでインライン指定してるだけとおもう。

702 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 06:03:00.08 ]
templateなんか駆使すると
インライン展開されないと
桁違いに遅くなるけど

703 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 09:45:11.17 ]
maxとかabsとかSSE一命令でいけるのにわざわざレジスタ退避してcallしてたら
コードサイズもでかくなるしいいことないだろ

関数のサイズをちょっとずつ大きくしてくとわかるけど
インライン展開の閾値を超えた瞬間にインラインで展開されてた数命令規模の関数が
一気にcallに置き換えられてサイズが爆発するから

704 名前: ◆0uxK91AxII mailto:sage [2011/12/23(金) 09:52:16.15 ]
mapとか、コンテナにvoid *を突っ込む癖が付いてしまう。

705 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 09:54:07.89 ]
C++は面罵関数がインライン展開されなかったら話にならないからな。

自分はオプションでインライン展開を積極的に行なう設定にしている。
それで実測してみて、EXEの大きさやメモリ使用量が実際に問題になっていれば書き換えればいい。
しかしそんなことがあったことがない。
増えると言う思い込みでインライン設定を毛嫌いしているだけだと思う。

実際、ベクタ化の方がよっぽどコードサイズが増えるよ。



706 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 09:55:04.79 ]
あと、SSEの場合アラインメントの推論が切れるのがかなり問題で

関数単位でコンパイラが見てしまうと
ポインタにはアラインメントの情報が乗っていないから
iccなんかは気を利かせて一旦アラインメントされたスタック上にコピーする
コードを挿入してしまったりする
アラインメントされてないとペナルティが大きいからね

インライン展開されると
アラインメントされているスタック上の変数や
明示的な_mm_load_psなんかから
変数やポインタのアラインメントを推論するので
アラインメント前提のコードを生成させることができる

707 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 11:26:47.88 ]
どんな変数も問答無用でアライメント16にするようにコンパイルする設定があれば
面倒な記述を減らせると思うんですが、何かデメリットあるんでしょうか?
メモリの隙間ができて勿体無いとかあるかもしれませんが、メモリ量の多い昨今、
それほど問題にならないのでは?と思います。
むしろアライメントすることでメモリアクセスの冗長さを減らせて帯域を節約する効果も
あって一石二鳥ではと思うんです。

708 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 11:59:03.43 ]
gccだと-mpreferred-stack-boundary=4がデフォルトだから既に16バイトアライメントだよ
構造体の詰め物は互換性もあるし難しいじゃないか

709 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 12:28:16.46 ]
>>707
互換性

710 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2011/12/23(金) 12:41:37.02 ]
>>707
なにそれ君いまだにPS3向けのゲームとか組まされてるわけ?

711 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 15:57:24.48 ]
>>708
glibcのmallocは8バイトだよ

>>710
SandyBridgeでもアラインメント取れてないと遅いでしょ

712 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 16:00:51.42 ]
構造体はCの規格だと順番を入れ替えられないだけで詰め物はし放題だよ
実際4バイトアラインメントのアーキテクチャだとコンパイラが詰め物するでしょ

713 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 17:19:17.60 ]
>>711
Nehalem以降はmovups/dquもペナルティ無く使えるでしょ
まあ結局Core2以前も考慮するとコード振り分けるから労力は変わらないのだけれど...

714 名前:707 mailto:sage [2011/12/24(土) 02:12:26.59 ]
すみません、自分は日曜プログラマレベルで、対象CPUはx86、環境はVC++です。
VC++の設定を見ていると、「構造体メンバのアライメント」というのがあって16バイトアライメントを選べるようになってました。
同様に通常の変数もアライメントできる設定があるかと思い探しましたが見付かりませんでした。

715 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 02:18:17.32 ]
どう考えてもこれ以上削れないってくらいの手書きインラインアセンブリコードに対し、
C記述版をVC++のReleaseモード(最適化O2)でコンパイルしたもののほうが1.3倍速かったです。
生成されたアセンブリを覗いてみたところ、

変数 * 3

というコードを

lea edx, DWORD PTR [eax+eax*2]

としていてびっくりしました。
これって、アドレス演算を行うローダ(専用の演算器?)を使うことで、
通常のALUと並行して演算(スーパースカラって言うんでしたっけ?)し
高速化しているということなんでしょうか??



716 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 02:34:46.72 ]
>>714
__declspec(align(N))

717 名前:707 mailto:sage [2011/12/24(土) 02:44:05.59 ]
>>716
ありがとうございます。
それは知っているんですが、>>707でも書いた通り、
そういった記述をわざわざせずとも、自動で全てアライメントしてくれるような設定があればイイのでは?
と思った次第です。

しかし、上でも仰られたように、互換性の問題があったりで難しいのでしょうね・・・
でも二重インクルード防止の「#pragma once」のように、互換性を考慮しない機能があったりするくらいですから、
自分のようにずっとVC++しか使わない人間を対象にそういうオプションが用意されていても良いのではと思いました。

718 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 04:29:51.40 ]
>>715
ついでにPartial flags stallも回避できるな

719 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 05:22:08.10 ]
>>717
キャッシュミスが多くなったら速くならない。
だから隙間が多すぎるのは良くない。

まだそのレベルの高速化を気にするレベルじゃないと思うが、気になるなら続きは↓とかで。
toro.2ch.net/test/read.cgi/tech/1322981274/
toro.2ch.net/test/read.cgi/tech/1302223650/

720 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 06:03:11.07 ]
>>713
Nehalemでmovupsのペナルティがなくなったのはアラインメントされている場合だけ
Penrynまではアラインメントされていてもmovapsより遅かった
ハードウェアがどういう実装になっているのかをよく考えてほしい

さらにSandyBridgeでは非アラインメントの場合
2つあるロードユニットが生かされないばかりか追加ペナルティもあるので
アラインメントされている場合に比べて非常に性能が落ちる

movaps/movups使い分けの時代はSegmentation Faultの温床だったので
movupsオンリーで書ける様になったのはうれしいよね

Haswellで32Byteアラインメントが出てくるかと思うと頭が痛いが

721 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 06:12:36.27 ]
>>716
VCの__declspec(align(N)) や gccの__attribute__ ((aligned(N)))は
スタックやベースポインタからのアラインメントは保証されるけど
ヒープにどう確保されるかは保証されないよ
ランタイムライブラリ依存だからね

そのクラスのnew/deleteをオーバーロードするか
大雑把にグローバルでオーバーロードするかしないといけないが
どちらも一長一短ある

722 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 08:19:59.68 ]
>>717
ぶっちゃけそれやってどれだけの速度向上が望めるの?って事情もあるんじゃねーの
たかだか1MBに満たないスタックに、って
最近のCPUだとunalignedアクセスの性能低下も軽減されて古いCPUだと速くなるって言われてもなーって気持ちもあると思う

723 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 08:56:50.23 ]
SandyBridgeもL1D$は1R1Wの4bank構成で
うまくバンクコンフリクトを避けないとペナルティがある
非アラインメントのmovupsは2bank使ってしまう

724 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 12:22:00.92 ]
>>715
手書きでもふつーにやる。

725 名前:715 mailto:sage [2011/12/24(土) 14:11:41.35 ]
>>718
おお、そんなメリットもあるんですね。

>>724
覚えておきます。

コンパイラの吐くアセンブラを見てると眩暈がしてきましたw
SIMDやプリフェッチ等のキャッシュ制御を除けば、
手書きでアセンブリ書くのはほとんど効果的でないような気がしてきました。



726 名前:707 mailto:sage [2011/12/24(土) 14:22:27.84 ]
>>719
なるほど、バイト境界を跨いでしまってアクセス回数が増えることより、
キャッシュに収まって低レイテンシでアクセスし易くなる効能のほうが上回るわけですね。
いかに外部DRAMへのアクセスがコストになっているかがよく分かります。
あと、スレ誘導もありがとうございます。

>>722
>最近のCPUだとunalignedアクセスの性能低下も軽減されて
そうだったんですか。
それだったらmovupsでいいですね。
でも>>723さんの御意見も気になりますので、パフォーマンス測りながら追い込むようにします。

727 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 00:59:58.08 ]
>>720
64ビットだと、当初MMXが使えなくなるとか言ってた関係で
VCはMMX用の組み込み関数が使えないんだよなぁ
でもって、MMXをSSE2に書き換えるとメモリオペランドのアライメントで
例外が発生したりするんだorz


728 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 01:14:13.06 ]
もう最初から全部、256バイト境界にアライメント揃えて実行ファイル作っとくかw


729 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 04:02:17.42 ]
グローバルのnewをオーバーロードしたくなる時は結構ある

730 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 09:57:01.67 ]
32bitOSを切り捨てたい時もよくある

731 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 11:53:57.38 ]
intやポインタが64bitになっても面倒なだけだと思うけどな。

732 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 13:24:45.38 ]
お前がそう思うんならそうなんだろう
お前ん中ではな

733 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 12:53:25.77 ]
unsigned int maxpos(unsigned int src[256])
{
unsigned int i, m = 0;
for(i = 1; i < 256; i++)if(src[m] < src[i])m = i;
return m;
}
これをSSEで高速化する方法があれば教えて下さい

734 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 14:27:48.76 ]
byte配列ならPHMINPOSUWで速くなりそうだけど、そのコード基本的に検索だからSSE向きではないな。
最大値求めて、それを検索して位置返すのもありだが、速いかは知らんw

735 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 15:23:00.43 ]
>>733
src[m]をキャッシュした方が速いと思う。
要は、SSE以前にやることやってからにしろ。



736 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 17:16:54.28 ]
unsigned intだとSSE4使わないと素で書いたより無駄に遅くなりそうなのしか思いつかないわ

737 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 14:03:19.33 ]
SSE使った方が遅くなるのは何故でつか?

738 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 18:35:29.43 ]
日本の道路をF1で走るようなもんだから

739 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 00:41:15.69 ]
>>733
画像とか統計の基礎だな。疑似コードで書くとこんな感じだ

maxpos(src[256]) {
pos = {0, 1, 2, 3};
for(i=0; i<256; i+=4) {
 s=load(&src[i]);
 isGT=maxVal<s;
 maxVal=isGT&s | ~isGT&maxVal;
 maxPos=isGT&pos | ~isGT&maxPos;
 pos += 4;
}
return max_position(
 maxVal[0], maxPos[0],
 maxVal[1], maxPos[1],
 maxVal[2], maxPos[2],
 maxVal[3], maxPos[3]);
}

740 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 01:57:27.28 ]
>>739
SSEは max命令とunpackv命令があるんだから
32bitのsrc[i]値を64bitのsrc[i]<<32|iに変換して最大値を求める方が速いと思うね

741 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 02:00:06.23 ]
740だが、64bitのmax命令はないんだな それなら >>739でいいと思う
スカラーコードより速く
すまん

742 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:51:45.57 ]
>>739
signedの比較命令しかないからダメじゃない?

743 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 13:56:40.66 ]
なんか知らんが、そんなのずらせば済む事だろ

744 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 15:40:49.12 ]
実際にコード書いて検証しようぜ。
思い込みと現実は違う場合が結構あるしさ。

745 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 16:00:05.53 ]
古いPCを使ってるからかもしれんが>>733を単純にアンロールしたのが一番速いな



746 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 00:37:37.24 ]
スレチではあるが、このコードを高速化する必要がある処理を見てみたい気がした。

747 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/12(月) 04:51:41.06 ]
>>742
0x80000000を引く。
足してもいいしXORでもいいけど。

748 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 19:18:44.41 ]
横レスだけどおおすげー。
そもそも正数同士・負数同士の比較ならsigned/unsignedで結果は変わらないので
問題は正数と負数の比較のみ。確かに最上位ビットを反転させれば万事うまくいくね。

749 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 19:42:04.67 ]
256個ぐらいだと、最大値を見つけて最大値と同じのを見つけるのだと遅いかな

750 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 01:41:38.96 ]
signedとunsignedの変換が凄いのか。
この手のテクをまとめようと思ったらどのレベルから書いていいか分からんな。

751 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 02:23:57.53 ]
>>749
俺は実装が面倒という理由でそれでやってるが
やっぱメモリに2週アクセスするから遅いのでは


752 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 05:34:13.85 ]
pxor x2+pcmpgtbとpblendvbで最大値のインデックスを保存
インデックスは0x01010101でインクリメント
最後に4要素を比較

4要素あたり2サイクルで回るかな
signed intだったら4要素あたり1サイクルでいけるかも?

unsignedでもcharだとpsub+pblendvbだけでいけるからよいんだけどね

753 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 05:36:23.52 ]
あpmaxudも必要か

754 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 05:54:27.09 ]
__m128i pos = _mm_setzero_si128();
__m128i maxpos = _mm_setzero_si128();
__m128i maxsrc = _mm_set1_epi32( 0x80000000 );
#pragma unroll(16)
for( int i = 0; i < 256; i+=4 )
{
__m128i signed_src = _mm_xor_si128(
_mm_load_si128( (__m128i*)&src[i] ),
_mm_set1_epi32( 0x80000000 ) );
__m128i mask = _mm_cmpgt_epi32( signed_src, maxsrc );
maxpos = _mm_blendv_epi8( pos, maxpos, mask );
maxsrc = _mm_max_epi32( maxsrc, signed_src );
pos = _mm_add_epi32( pos, _mm_set1_epi32( 1 ) );
}
以下略
実行してないのであってるかは知らん

755 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/13(火) 12:31:21.86 ]
> unsignedでもcharだとpsub+pblendvbだけでいけるからよいんだけどね

その程度ならpacked floatにキャストしてblendvpsでもいけるけどね。

SSE4対応以前ならpmovmskb/maskmovps+test+jccでもいけるか
(メディアンならともかく最大値ならcmovより分岐のほうが速いはず)



756 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 14:51:08.23 ]
>>755
pbledvbは7+8nのビットしか読まないから符号の判定に使える

SSE4以前だとmaskにはand+andnot+orが使われてたね

757 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 14:52:50.84 ]
Penrynだと下手にblendv系使うより速い場合もあったりした

758 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 14:59:06.94 ]
ごめんblendvpsも31+32nビットしか読まないのか
勘違いしてた
符号の判定に使えるね

759 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:38:46.60 ]
>>757
PenrynのPBLENDVBはレイテンシ1、スループット2で
SandyBridgeはレイテンシ2、スループット1か…

Penrynはデコーダの制限もありそうだし、and,orでもよさげ

760 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:46:50.97 ]
HTが使えるCPUならblendの方がいいかな?

761 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/14(水) 07:19:23.65 ]
どうせ全検索するんだしレイテンシの長さ分だけインタリーブすればレイテンシ隠せるよ

762 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/14(水) 07:23:58.09 ]
packed unsigned intの比較(マスク生成)だけど、両項のMSBを反転してからpcmpgtdするより
psubd + psradのほうが速いかもしれない

763 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 09:52:48.15 ]
>>762
どっちも2命令でXORの方が実行出来るポートが多い分有利そうに感じるのだが

764 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 20:30:50.02 ]
pdangod

765 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 10:59:48.11 ]
>>762
blendvps用のマスクならpsubdだけでよい
blendvpsは最上位ビットしか見ないから



766 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 21:47:07.57 ]
話の流れぶった切るけど団子さんよ〜。
今の静的分岐予想って相変わらずifよりelseの方が速いの?
ifとelseのどっちが速いか正確に計測するにはどういうコード書いたらいい?

767 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:28:17.45 ]
あれ?ifの方が速いんじゃなかったか

768 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:53:20.16 ]
P6,P2,P3,P4はforwardならnot taken backwardならtakenがデフォルト
P4はPrefixでヒントを出せる
PM,Core2はランダム
ソースはAgner

769 名前:,, ・´ ∀ `・ ,,)っ-○○○ mailto:sage [2012/03/24(土) 09:22:43.82 ]
分岐予測履歴がない場合あるいは予測そのものがない場合、条件付ジャンプは前のアドレスに
飛ぶ場合(多くの場合ループ)は原則ジャンプ、後ろならスルーが多くのCPUの実装ですね。
大体のコンパイラってforやwhile文はこんな感じに展開するでしょ?
if (cond) { do { ... } while(cond); }

770 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 12:02:04.61 ]
>>769
モダンなCPUはどんな感じなのよ
>>768 はランダムだと言ってるけど
モダンなCPUでも静的予想だとifはスキップ
whileはループ確定なのけ。

771 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 19:11:37.76 ]
分岐履歴が無いのに前方への分岐を予測したら命令フェッチをやり直さなきゃならないじゃん
後方への分岐はループの場合が多いから特別扱いなんだと思う

772 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:14:58.62 ]
大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。
反復も反復する事を優先した方が早いのは解る。
それはいいとして、今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ。
そこを知りたいんだがね。

773 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:25:07.37 ]
>今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ。
パイプラインが深いだけでしょ

774 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:33:04.06 ]
わかってないのにわかったつもりになって
単語だけ並べているように見えるのは何故だろう

775 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:41:50.71 ]
そう思ってくれるのはいいが、間違いの指摘と
実際はどうなってんのか答えてくれ
批難だけの回答はいらん。



776 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:45:20.20 ]
>>773
分岐予測の話はパイプラインが深いこと前提で話してるわけで・・・

777 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:50:30.10 ]
>分岐予測
って、言い方してるだけなの?

778 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:52:06.49 ]
>>775
じゃあ間違いを指摘してやる。

>大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。
前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。
if (xx) return
で「すっ飛ばせば云々」なんて、理解していないまま「わかったつもりになってるだけ」の証拠。

>今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ
ヒントはともかく、投機はまさに「投機実行するために分岐予測をする」のであって
「投機実行もあるから分岐予測が複雑になる」はナンセンス。
もちろん、エンプラ系/VLIW系では「分岐の有無の両経路を実行する」なんてのもある(らしい)が
一般的とは言いがたい。

779 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 21:59:34.64 ]
>>778
内容じゃなく国語的に誤解されてるな。

>前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。
if( xx ) throw xxx;
throwなんて実行するケース殆ど無いんだから基本if実行しないってのは同じ話。
矛盾してないでしょ。

まず分岐予測が複雑になってるって話はしてないよ。
投棄実行については投棄実行を考慮した上での静的予測方法があるでしょという話。

780 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:04:11.41 ]
>>779
だから、ifの内部は「実行すると予測される」んだよ、バーカ

781 名前:779 mailto:sage [2012/03/24(土) 22:05:34.03 ]
尤も、わかりやすいからifと書いたけど、
実際はコンパイラの最適化でif、elseは反転するから
この言い方は正しくは無いんだけどね。

782 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:06:41.25 ]
せめて正しい漢字使えよ。

一度なら単なる変換ミスとして納得できるけど
繰り返しているってことは、別の意味に捉えているとしか思えない。

783 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:09:32.88 ]
>>780
お前バカだろ
みんなアセンブリ前提で言ってんだよ

jze label   if() {
・・・処理・・・
labeli     }


784 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:12:25.76 ]
>>782
ん?尤も(もっとも)か?無い(ない)か?

785 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:20:41.79 ]
>投棄実行については投棄実行を考慮した上での静的予測方法があるでしょ

理解できる日本語で書いてくれないかな。

分岐予測というのは、投機的に(結果が判明する前に)実行する前提でのもの。
(無条件分岐や間接分岐もあるから、厳密には正しくないけど)
予想して(投機的に)実行するのでなければ、単に結果が判明するのを待って、それから実行すればよい。

つまり、投機実行するからこそ分岐予測が必要なのであって
投機実行しないのであれば、分岐予測など元々必要ない。
そのことをちゃんと理解していれば、
そもそも「投機実行を考慮しない分岐予測」などというものが存在しないから
>投棄実行を考慮した上での静的予測方法
が意味不明に感じられる気がするんだけどな。

>>783
わかってるよ、そんなこと。



786 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:22:22.48 ]
>>780 ifが優先されると思ってたのは>>767 とお前ぐらいだよ

787 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:25:19.71 ]
>>785
ごめん。もう今更何を言おうが>>780のせいで信用ないわ。

788 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:34:54.17 ]
>>782
ああ投棄実行ね投機の変換ミスそのままにしてたわ

789 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:48:33.55 ]
投棄実行については誤解してたわ。
2つの分岐を両方実行して実際実行対象にならなかった方の結果を破棄するものだと思ってた。

790 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 22:50:38.87 ]
>大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。

もう一度考えてみたけど、この意味が全然理解できない。
ぱっと見で、何故returnや、
増してthrowなどという言葉が出るのかわからない。
(GP等の例外の割り込みは全く別物)

で、次の行の
>反復も反復する事を優先した方が早いのは解る。
の意味は、「ループであることが推測されるから分岐すると予測する」だよね?
それとの対比で、「ifをすっとばせば」の意味が
「ifの内部は実行されないと予測」と捉えれば
「ifの部分での分岐は分岐すると予測すれば
if内部のreturnやthrowに制御が来ないので別の分岐の予測を避けられる」という意味にもとれる。
それならようやく意味が通じるような気がして、そういう意味だと思ったんだけど。
つまり、ifの部分(=前方分岐)を「分岐すると予測する」という意味だと。

でもそれ(前方へ分岐すると予測する)は実際のプロセッサの動作とは違うわけで
ならばどういう意味なのか、さっぱりわからなくなってしまってね。

791 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:00:43.72 ]
お前の文章が解らんわ

792 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:01:04.27 ]
一応。

突然returnやthrowが出てくるのが
if (xx) return
という意味じゃないか、というのも勝手に俺が頭の中で補って想像しただけで
実際には何の説明も無く(ifの多くがreturnやthrowというのにも同意しにくい)
唐突な「rerturnやthrow」「すっ飛ばす」を必死に理解しようとしたのがそもそもの間違いかもね。

793 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:01:51.31 ]
実行時の分岐予測って、どうなってるのかわかってないと、グダグダでしょ

794 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:04:39.09 ]
>>792
>>779で補足だしてるだろしつこいわ

795 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:09:08.21 ]
>>790 >>792 ウゼェ・・・




796 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:18:44.32 ]
>>794
>>779だとしたら>>780だっての。
「前方分岐は分岐しないと予測する」のが実際のプロセッサの動作なわけ。
>>779の「throwなんか滅多に起こらないから実行しない(と予測する)」は
「前方分岐は分岐すると予測する」ことになるから実際の動作と矛盾するという話。
それを、「わかってないくせに」の根拠の一つにしたんだよ。

実際、「分岐予測とはどういうものか」も「なぜ分岐予測するのか」もわかってなかったわけでしょ(>>789)。

797 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:09:12.01 ]
口汚い言葉で罵倒せずには居られない奴って下品・・・。
団子さんの紳士っぷりを少しは見習ったらどうだろうか。

798 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:16:07.87 ]
もう>>780はいいから団子さんこないかな

799 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:24:14.75 ]
え?指摘するの780だけ?
露骨だなぁ。恥ずかしくないんだろうか。

800 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 02:30:29.23 ]
お前がなwww

801 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 03:19:03.04 ]
頭が悪すぎて理解できなかったらしいから仕方ないな。

802 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 14:12:21.08 ]
>>796
投機実行という言葉については誤解してました。
分岐予測については、分岐ミスでパイプラインに読み込んだ
命令を破棄が発生するという認識です。

そもそも、それが気にならないのであれば分岐予測なんて
気にする必要はないでしょう。

803 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 16:12:43.94 ]
インテルの最適化マニュアルだと
>インテルPentiumM プロセッサー、インテルCoreSolo プロセッサー、インテルCoreDuoプロセッサーは、
>ジャンプの向きに従った条件分岐を静的には予測しない。これらのプロセッサーでは、
>すべての条件分岐は、最初に発生したときでも動的に予測される。
と書いてあって、wikiで調べたらPenM以降は広域分岐予測を取り入れた関係で静的予測はしなくなったみたいだね
ttp://ja.wikipedia.org/wiki/%E5%88%86%E5%B2%90%E4%BA%88%E6%B8%AC

>>768
>PM,Core2はランダム
というよりも、「前に実行した別の分岐命令の結果も影響する」とした方が適切みたいだ

分岐予測に関して
ttp://news.mynavi.jp/column/architecture/index.html
の第167回からの解説が参考になるよ


804 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 18:09:59.76 ]
>>803
なるほど。いい話が聞けました。ありがとうございます。

805 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 00:06:00.96 ]
>>803
>と書いてあって、wikiで調べたらPenM以降は広域分岐予測を取り入れた関係で静的予測はしなくなったみたいだね
P4もグローバル履歴を使ってるよ

おそらくだけど ある分岐命令を最初に実行したかどうかはBTBのエントリが割り当てられているかで判断するので
分岐先予測より分岐予測のヒット率が十分に高い場合は動的分岐予測が当たる条件で誤って静的予測してしまう確率が高いから
1回目の分岐予測を諦めても静的予測をやめたほうがヒット率が上がるということなんじゃないだろうか



806 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 00:11:22.64 ]
×分岐先予測より分岐予測のヒット率が十分に高い場合
○BTBのヒット率より分岐予測のヒット率が高い場合






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

前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