並列分散コンピューティングの概要:OpenMPステートメントの概要(継続的な更新)

OpenMPステートメント

この章は概要ガイドとして存在します。プログラミング能力が簡単に述べられた効果を理解するのに十分でない場合は、第5章を参照することをお勧めします

ヘッドファイル

#include<omp.h>

ライブラリ関数

int omp_get_num_procs(void);//获取当前可用的物理处理器总数目
int omp_get_thread_num(void);//获取当前线程id
void omp_set_num_threads(int t);//设置程序中激活的线程数

ガイド文X #progma omp X

平行

コードブロックを並列ドメイン、特別なマークがない場合は、並列ドメインのすべてのコードをすべてのスレッドで実行する必要があります

ために

(一般的に並列ドメインで使用されます)次のforループのすべての計算内容は、イテレーターに従って各スレッドに均等に分散されます

並列

以下のforループを並列ドメインとしてマークし、イテレーターに従ってすべてのコンテンツを各スレッドに配布します

クリティカル

(通常、並列ドメインで使用されます)マークされたコードブロックは、同時に1つのスレッドでのみ実行できます(しかし、すべてのスレッドが最終的にコードのこの部分を実行します

主人

(一般的に並列ドメインで使用されます)メインスレッドのみが実行するコードとして、以下のコードブロックを指定します

(IOやその他のエラーが発生しやすい他の場所で使用できます)

シングル

(一般的に並列ドメインで使用されます)以下のコードブロックが1つのスレッドのみによって実行され、他のすべてのスレッドはスレッドがタスクを完了するまで待機することを指定します

(IOやその他のエラーが発生しやすい他の場所で使用できます)

シングルノーウェイト

スレッドの完了を待たずにタスクを続行するように他のスレッドに通知する

バリア

(一般的に並列ドメインで使用)ロードブロッキングを設定し、スレッドグループ内のすべてのスレッドをここで同期します(すべてのスレッドがここに到着した後でのみ、スレッドは後続のタスクを実行
できます(ロードブロッキングは後続のタスクと前のスレッドに使用できます結果が依存している場合)

仕事

新しいタスクがスレッドで生成され、子スレッドによって処理されます

タスクウェイト

ロードブロッキングを設定すると、スレッドのすべてのサブスレッドがここで同期されます(すべてのサブスレッドが前のタスクを完了してここに到着した場合のみ、後続のタスクの実行が許可されます)

ガイド文文Y #pragma omp XY

shared([varibleList])

該当する命令:parallel / for / parallel for

効果:括弧内の変数はすべてのスレッドで共有されます(これにより時間がかかることに注意してください)

private([varibleList])

該当する命令:parallel / for / parallel for

効果:括弧内の変数は各スレッドにプライベートです(これは、スレッド内の変数をある程度宣言する効果に似ています)

注:以前に宣言されたプライベート変数に値が割り当てられている場合でも、各スレッドはその値を受け取りません。したがって、プライベート変数は初期化されていません、再割り当てする必要があります。同時に、並列領域が終了すると、元の変数の値もスレッドでの再割り当てが原因で変更されることはありません

リダクション(operatorX:varibleY)

該当する命令:for / parallel for

効果:各スレッドの演算子Xに対応する初期値(たとえば、演算子+に対応する初期値は0、演算子*に対応する初期値は1)でYを初期化し、各スレッドで累積X演算を実行します。 (累積、累積、乗算など)、最後に各スレッドの結果とYの実際の初期値がXに累積されます(累積の観点から、これは各スレッドの内部合計であり、結果はスレッドのYの形式に割り当てられます。次に、各スレッドの結果を合計し、最後に結果Xを実際のYに与えます)

例えば:

sum=1;
#pragma omp parallel for reduction(+:sum)
for(int i=1;i<=100;i++)
{
    
    
	sum+=i;//每个线程内,sum以0为初值,对自己分到的迭代器做累加
}
//执行完毕后,所有线程的sum进行求和,并加到sum的初始值上
cout<<sum<<endl;//sum=1+1+2+3+...+100

待って

該当する命令:シングル

効果:他のスレッドは、このスレッドのタスクが完了するのを待ちません。

スケジュール(種類、チャンクサイズ)

該当する命令:for / parallel for

効果:イテレータを手動で割り当てる

詳細な説明:

  • 静的ディスパッチ
    • 0-chunkSize-1は最初のスレッドに割り当てられ、chunkSize-2chunkSize-1は2番目のスレッドに割り当てられ、以下同様に続きます。
    • サイズを入力しない場合、デフォルトは等分布になります(サイズ=反復数/切り上げられたスレッド数)
  • 動的スケジューリング
    • 利用可能なスレッドに毎回chunkSizeイテレータを割り当てます
    • つまり、スレッドがアイドル状態の場合、chunkSizeタスクが自動的に取得されます
    • スレッドの開始時間と実行時間は不明であるため、イテレータが割り当てられているスレッドを事前に知ることはできません。
    • デフォルトではサイズを記入しないでください1
  • ヒューリスティックスケジューリングガイド付き
    • chunkSizeは、各割り当てに割り当てられた反復の最小数を表します
    • スレッドに割り当てられる反復回数は毎回異なり、最初は比較的大きく、その後徐々に減少する可能性があります
    • これは、より柔軟な動的割り当てです。タスクの数が多い場合、一度により多くのタスクが割り当てられるため、割り当ての消費量が少なくなり、実行効率が高くなります。タスクの量が少ない場合、一度に割り当てられるスレッドが少なくなるため、よりバランスのとれた負荷
    • デフォルトではサイズを記入しないでください1

おすすめ

転載: blog.csdn.net/Kaiser_syndrom/article/details/105226540