ループアンロールとストリップマイニングの違い

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重ループとか?