13

今日、「偽共有」とは何かについて、並列プログラミングのクラスで教授と別の理解を得ました。私の教授が言ったことはほとんど意味をなさないので、すぐに指摘しました。彼女は、「偽の共有」がプログラムの結果に誤りを引き起こすと考えました.

「偽共有」は、異なるメモリアドレスが同じキャッシュラインに割り当てられている場合に発生し、そのいずれかにデータを書き込むと、別のアドレスがキャッシュから追い出されると言いました。プロセッサが 2 つの誤った共有アドレスの間で書き込みを行ったり返したりすると、両方ともキャッシュにとどまることができなくなるため、すべての操作が DRAM のアクセスになります。

それがこれまでの私の意見です。実際、私が言ったことについてもはっきりとはわかりません.誤解がある場合は、それを指摘してください.

そこでいくつか質問があります。キャッシュは、64 バイトにアラインされた 4 ウェイ セット アソシアティブと見なされます。

  1. 64 バイト以上離れた 2 つのアドレスが「偽共有」である可能性はありますか?
  2. 単一のスレッド化されたプログラムで「偽の共有」の問題が発生した可能性はありますか?
  3. 「偽の共有」を再現するための最良のコード例は何ですか?
  4. 一般的に、プログラマーの「偽共有」を避けるために注意すべきことは何ですか?
4

1 に答える 1

6

あなたの質問に対する私の見解を共有します。

  1. ブロックのサイズよりも多くのバイトで区切られた 2 つのアドレスは、まったく同じキャッシュ ラインには存在しません。したがって、コアのキャッシュに最初のアドレスがあり、別のコアが 2 番目のアドレスを要求した場合、その要求のために最初のアドレスがキャッシュから削除されることはありません。したがって、偽の共有ミスは発生しません。

  2. キャッシュラインをめぐって競合するのは単一のスレッド以外にないため、同時実行性がまったくない場合に偽共有がどのように発生するか想像できません。

  3. hereから取得し、OpenMP を使用して、偽の共有を再現する簡単な例は次のようになります。

    double sum=0.0, sum_local[NUM_THREADS];
    
    #pragma omp parallel num_threads(NUM_THREADS)
    {
        int me = omp_get_thread_num();
        sum_local[me] = 0.0;
    
        #pragma omp for
        for (i = 0; i < N; i++)
            sum_local[me] += x[i] * y[i];
    
        #pragma omp atomic
        sum += sum_local[me];
    }
    
  4. 誤った共有を避けるために私が考えることができるいくつかの一般的な注意事項は次のとおりです。

    を。プライベートデータを可能な限り使用します。

    b. 共有データが存在する同じキャッシュに他の変数が存在しないことを確認するために、データを整列するためにパディングを使用できる場合があります。

修正や追加は大歓迎です。

于 2014-11-19T16:29:19.013 に答える