< 目次

基本的な OpenMP* の atomic 操作

ハードウェア・プラットフォームが atomic 操作をサポートする場合、OpenMP* の atomic 操作を使用すると、複数のスレッドが安全に共有数値変数を更新できます。atomic 操作は直後の単一の代入文にのみ適用されます。そのため、細粒度の同期が必要なコードに適しています。

保護する文の前に、以下を追加します。

ヒント

OpenMP* 並列フレームワークを使用してコードを書き直した後、インテル® Advisor でパフォーマンスを解析できます。Vectorization and Code Insights (ベクトル化とコードの調査) パースペクティブを使用して、OpenMP* コードがどの程度ベクトル化されているか解析するか、Offload Modeling (オフロードのモデル化) パースペクティブで GPU でのパフォーマンスをモデル化できます。

例えば、次のアノテーション付きの C/C++ シリアルコードについて考えてみます。

  int count;
   void Tick() {
     ANNOTATE_LOCK_ACQUIRE(0);
        count = count+1;
     ANNOTATE_LOCK_RELEASE(0);
  }
  ...

#include <omp.h>#pragma omp atomic を追加した並列 C/C++ コード:

#include <omp.h> // .dll を検出できないロード時の問題を解決します 
int count; 
void Tick() { 
// ロック・アノテーションと入れ替えます 
#pragma omp atomic 
     count = count+1; 
}
...

次のようなアノテーション付きの Fortran シリアルコードについて考えてみます。

program ABC 
integer(kind=4) :: count = 0
..
contains 
subroutine Tick 
     call annotate_lock_acquire(0) 
          count = count + 1 
     call annotate_lock_release(0) 
end subroutine Tick
..
end program ABC

use omp_lib!$omp atomic ディレクティブを追加した並列 Fortran コード。

 
program ABC
  use omp_lib
  integer(kind=4) :: count = 0
  ...
  contains
   subroutine Tick
      !$omp atomic
       count = count + 1
   end subroutine Tick
 ...
end program ABC

インテル® Advisor の Fortran サンプル nqueens.f90 は、atomic 操作の使用例を示しています。

ここでは基本的な OpenMP* の atomic 操作について説明しました。atomic 構文の後に節を指定する高度な atomic 操作については、高度な OpenMP* の atomic 操作をご覧ください。

関連情報