2

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 スレッドによって計算されるためです。

4

1 に答える 1

0

誰か (おそらくあなた) がhttps://software.intel.com/en-us/forums/topic/531721の Intel Developer Zone で同じ質問をしたようです (少なくとも、引用されたコード サンプルはあなたのものと同じです) 。答えがある場所 (40% のパフォーマンス向上を得た書き直しを含む)。

おそらくそれを読むことは役に立つでしょうか?

(もしそれがあなたなら、両方の場所で質問することに異論はありませんが、ここで人々にあなたがすでに質問したことを伝えるのは礼儀正しいでしょう。そうすれば、人々が他の場所ですでに与えた回答を再現するのに時間を無駄にしないでしょう.フォーラム)。

于 2014-09-26T08:18:15.823 に答える