Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

8.2.1 「偽りの共有」とは

ほとんどのメモリー共有型マルチプロセッサコンピュータには、各プロセッサに独自のローカルキャッシュがあります。このキャッシュは、低速のメモリーとプロセッサの高速レジスタの間のバッファーとして動作します。メモリー上の場所にアクセスすると、その要求された場所を含む実際のメモリーのスライス (キャッシュライン) がキャッシュにコピーされます。同じメモリー上の場所またはその周囲の場所への以降の参照は、キャッシュとメモリー間の整合性を維持する必要があるとシステムが判断するまで、キャッシュから行われます。

偽りの共有は、異なるプロセッサのスレッドが同じキャッシュ行にある変数を変更すると発生します。この状況は (真の共有と区別するために) 偽りの共有と呼ばれます。スレッドが同じ変数にアクセスせずに、同じキャッシュ行に偶然あった別の変数にアクセスしているためです。

スレッドがキャッシュ内の変数を変更すると、その変数があるキャッシュ行全体が無効としてマークされます。別のスレッドが同じキャッシュ行の変数にアクセスしようとすると、変更されたキャッシュ行がメモリーに書き戻され、スレッドはメモリーからキャッシュ行を取得します。これが発生するのは、キャッシュ整合性をキャッシュ行のレベルで維持するためであり、個別の変数または要素のためではありません。偽りの共有では、アクセスしようとしている変数が変更されていなくても、スレッドは強制的にキャッシュ行のより新しいコピーをメモリーから取得します。

偽りの共有が頻繁に発生すると、インターコネクトトラフィックが増加し、OpenMP アプリケーションのパフォーマンスとスケーラビリティーが大幅に低下します。偽りの共有によってパフォーマンスが低下するのは、次の条件のすべてが満たされる場合です。

  • 複数のスレッドによって共有データが変更される

  • 複数のスレッドが同じキャッシュ行内のデータを変更する

  • データが頻繁に変更される (密なループなど)

読み取り専用の共有データにアクセスしても偽りの共有にはならないことに注意してください。