Xeon Phi (60 コア) のベンチマークを作成したいと考えています。私のプログラムでは、OpenMP 標準と Intel 組み込み関数を使用しています。スカラー アルゴリズムよりも 230 倍高速な並列バージョンのアルゴリズム (5 点ステンシル計算) を実装しました。並列コードに SIMD を追加したい。パフォーマンスに問題があります。_m512_store_pd() を呼び出すと、計算のパフォーマンスが低下し、SIMD を使用した並列バージョンは SIMD を使用しないバージョンよりも遅くなります。何が問題ですか?パフォーマンスを向上させるにはどうすればよいですか?
for(int i=start; i<stop; i+=threadsPerCore)
{
for(int j=8; j<n+8; j+=8)
{
__m512d v_c = _mm512_load_pd(&matrixIn[i * n_real + j]);
__m512d v_g = _mm512_load_pd(&matrixIn[(i - 1) * n_real + j]);
__m512d v_d = _mm512_load_pd(&matrixIn[(i + 1) * n_real + j]);
__m512d v_l = _mm512_loadu_pd(&matrixIn[i * n_real + (j - 1)]);
__m512d v_p = _mm512_loadu_pd(&matrixIn[i * n_real + (j + 1)]);
__m512d v_max = _mm512_max_pd(v_c, v_g);
v_max = _mm512_max_pd(v_max, v_d);
v_max = _mm512_max_pd(v_max, v_l);
v_max = _mm512_max_pd(v_max, v_p);
_mm512_store_pd(&matrixOut[i * n_real + j], v_max);
}
}
最初に 1 つのベクトルがあり、最後に 1 つのベクトルがハロー要素であるため、8 から計算を開始します。n_real はベクトルのサイズです -> n + 16. start と stop が計算されます。これは、60 コアの i パーティション マトリックスと、opne 部分 (m/60) が 4 つの HM スレッドによって計算されるためです。