for(int i=0; i<200; i++) a[i] = b[i] * c[i]
ループアンロールは
for(int i=0; i<200; i+=4) { a[i ] = b[i ] * c[i ] 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(int i=0; i<200; i+=4) for(int j=0; j<4; j++) a[i+j] = b[i+j] * c[i+j]
ループアンロールは、ループ回数を減らすのが目的。ループのオーバヘッドが減る。
ストリップマイニングは、大きいループを小さいループに分けるのが目的。キャッシュのヒット率が上がる。(この例だとヒット率は全然変わらないけれど 、、、→ 大きい2次元配列でストリップマイニングでヒット率上がる例がある)
(もちろん、どっちもループの結果は同じ。式の実行順も同じ。しかし、プログラムの表現はかなり違う。何かを変化させているのだが、なんだろう?概念が固まらない。名前はついているか?)
ストリップマイニングとブロック化は同義語。
ベクトル化について。
1.ループアンロール → ベクトル化。
2.ストリップマイニング → ベクトル化。
この例ではどっちにしても結果は同じ。
for(int i=0; i<200; i+=4) *(__m128 *)&a[i] = _mm_mul_ps( *(__m128*)&b[i], *(__m128*)&c[i] );
1. と 2. で結果が違う例?2次元配列の2重ループとか?