並列プログラミング入門と背景知識

なぜ並列計算なのか?

並列処理を気にする必要があるのはなぜですか?シングルプロセッサで十分高速ですか?

なぜより高速なシングルプロセッサシステムを開発しないのか、なぜ並列システムを開発するのか、なぜマルチプロセッサシステムを開発するのか?

シリアルプログラムをマルチプロセッサをフルに活用できる並列プログラムに自動的に変換するプログラムを作成できないのはなぜですか。

1.1なぜ継続的なパフォーマンス改善が必要なのですか

気候シミュレーション、タンパク質の折りたたみ、創薬、エネルギー研究、データ分析、その他の問題など、今検討する必要がある問題の複雑さが増しています。より強力な計算能力が必要です。通常のシリアルコンピューティングは遅すぎます。


1.2なぜ並列システムを構築する必要があるのか

シングルプロセッサのパフォーマンスが劇的に向上する主な理由の1つは、集積回路のトランジスタ密度の増加です。サイズが小さくなると、プロセッサの周波数が高くなり、パフォーマンスが向上ますがエネルギー消費量が増加、熱の形で大量のエネルギーが失われます。プロセッサなどの電子部品の作業環境の温度が高くなると、信頼性が低下しますが、現在の空冷は限界に達しています。

したがって、より高速で複雑なシングルプロセッサを構築する場合は、チップ上に複数のシンプルなプロセッサを配置しないようにすることをお勧めします。これはマルチコアプロセッサと呼ばれます。

表記法:ここでは、コア(Core)プロセッサ(プロセッサ/ CPU)は同じ意味を表します。


1.3なぜ並列プログラムを書くのか

1.3.1はじめに

マルチコアプロセッサを最大限に活用し、プログラムをより高速に実行し、イメージをよりリアルにするには、シリアルプログラムを並列プログラムに書き換えて、プロセッサの実行速度と使用率を向上させる必要があります。シリアルプログラムは、実際には同時に1つのCPUしか使用できず、マルチコアプロセッサのプログラム速度への影響を利用できません。したがって、単純にシリアルプログラムを作成することはできません。マルチコアプロセッサの可能性を探るには、並列プログラムを作成する必要があります。

シリアルプログラムの場合:効率的なグローバルアルゴリズムが事前に定義されていない限り、コンパイラーがマルチコアプロセッサーを最大限に活用するための効率的な方法を見つけることは困難です。したがって、並列化されたシリアル構造のプログラムを作成する必要があります。しかし、プログラムの複雑さが増すと、書き換えのプロセスはより複雑になり、効率的な並列化の追求はより困難になります。

1.3.2例

n個の数値を計算し、それらを累積して合計します。シリアルプログラムコード:

sum = 0;
for(int i=0; i<n; i++)
{
    
    
	x = Compute_value(i)
	sum += x;
}

我々が持っていると仮定すると、Pのコア、及びpは<< nは、N個のデータは、p個の部分に分割することができ、各コアは、N / P値とその総和について必要です。

my_sum = 0;
my_first_i = ... ;
my_last_i = ... ;
for(int my_i = my_first_i; my_i < my_last_i; my_i++) 
{
    
    
	my_x = Compute_value(my_i)
	my_sum += my_x;
}

ここで、my_は現在のコアのプライベート変数です。

すべてのコアが計算を完了した後、結果はコア0で要約できます。

if(It is core 0) 
{
    
    
	sum = my_sum;
	for(each core other than itself) 
	{
    
    
		value = recieve_Value_From_Cores();
		sum += value
	}
}
else
	send_MySum();

または、別の方法で要約することもできます。2つのコアごとに、1つのコアが結果を追加します。次に、⌈p / 2 get \ lceil p / 2 \ rceilを取得しますP / 2 結果は、以下に示すように、最終的な結果を得るために、この操作を繰り返し:
ここに画像の説明を挿入
明らかに、p個のコアで、方法2は、p操作を必要とし、方法1のみ必要が⁡2 P \ log_2 Pログlo g2p回。
ただし、方法2の使用を定義しない限り、一般に、コンパイラーが方法1の代わりに方法2を使用することは困難です。このため、並列プログラムを作成する必要があり、コンパイラや他のソフトウェアがこの操作を完了することは期待できません。


1.4並列プログラムの書き方

1.4.1はじめに

並列プログラムを作成します。基本的な考え方のほとんどは、各コアに割り当てられたタスクです。広く使用されている2つの方法があります。タスクの並列処理 (タスクの並列処理)データの並列処理 (データの並列処理)です。タスクの並列処理とは、実行のために各コアに問題を解決するためのさまざまなタスクの割り当てを指し、各コアによって実行される操作は異なります。データの並列処理とは、問題を解決するために必要なデータを各コアに割り当てることであり、各コアによって実行される操作はほぼ同じです。

異なるコア間で必要な調整は次のとおりです。

  • 通信:1つ以上のコアが結果の一部またはすべてを他のコアに送信します。
  • ロードバランシング:各コアによって割り当てられる作業データの数はほぼ同じであると予想されます。
  • 同期:ほとんどのシステムでは、ニュークリアスは自動的には同期しませんが、独自のスペース内で機能します。

現在、書き込み用の明示的な並列構造を介し最も強力な並列プログラムは書き込まれた拡張C / C ++を使用しています。ただし、このような並列プログラムがシングルコアプロセッサでのみ実行される場合でも、より複雑な並列要件に従って実行されます。

1.4.2 1.3.2例に基づく説明

通信:結局、いくつかのコアは計算結果を他のコアに送信する必要があることがわかりますこれは一種の通信です。

ロードバランシング:すべてのコアのワークロードはほぼ同じです。これにより、不均一な作業の分散が原因で一部のコアがより高速に実行され、他のコアが作業を完了するのを待つことができます。

同期:すべてのデータを計算する必要はないが、標準入力stdinから読み取られ、0番目のコアを使用して配列xを初期化すると仮定します。次に、他のコアはすぐには実行されないが、コア0がデータの読み取りとx配列の初期化を完了するまで待ってから実行を開始します。同期ポイントが必要です。この時点で、コアはここで待機し、すべてのコアが合計に達してから続行します。例えば:

if(It is core 0)
	for(int i=0; i<n; i++)
		scanf("%d", &x[i]);
Synchronize_core();		//	同步点
Calculate();			//	计算

1.5学習目標

表示並列プログラムの作成方法を学びます。学習目標は次のとおりです。

  • 3つの理由でC言語とC拡張機能の使い方を学びます。メッセージパッシングインターフェース (メッセージパッシングインターフェース、MPI)POSIXスレッド (スレッドPOSIX、Pthreads)OpenMPは実質的に並列プログラムで記述されています。

これらの3つの拡張は並列システムに関連しています。2つの並列システムが心配です。詳細については、第2章を参照してください。

  • 共有メモリシステム(共有メモリシステム):各コアはコンピュータメモリへのアクセスを共有でき、各コアはメモリのすべての領域を読み書きできます。共有メモリデータを検出して更新することで、コアを調整できます。pthread OpenMPは、共有メモリシステム用に設計されています。
  • 分散メモリシステム(分散メモリシステム):各コアには独自のプライベートメモリがあり、コア間の通信が表示され、ネットワークでメッセージを送信するのと同様のメカニズムを使用して通信を実行する必要があります。MPIは分散メモリシステム用に設計されています。

分散メモリと共有メモリ

1.6並行性、並列、分散

並列計算 並列計算並列計算 (並列計算)および分散計算 (分散計算)主な違いは次のとおりです。

  • 並列計算:同じ期間内の複数のプログラムタスクを同時に実行できます
  • 並列計算:問題を解決するために密接に連携て複数のタスクを実行するプログラム
  • 分散コンピューティング:プログラムは、問題を解決するために他のプログラムと連携する必要があります。

並列および分散プログラムは同時実行プログラムです。マルチタスクオペレーティングシステムなどの一部のプログラムも同時実行されます。これは、単一のコアコンピュータ上でも、同時に複数のタスクを同時に実行できるためです。並列プログラムと分散プログラムの間には明確な境界線はありません。

並列プログラムは、多くの場合、共有メモリまたは高速ネットワーク接続を介して、物理空間に近い複数のコアで複数のタスクを実行します。並列計算コア間の調整はより頻繁に行われ、オーバーヘッドが低く、粒度が細かく、信頼性が高くなります。並列計算処理の実行時間が短くなります。

分散プログラムはより「疎結合」(疎結合)であり、タスクは複数の計算ノードで実行され、計算ノードは遠く離れており、タスクは完了した独立したプロセスを作成することです。分散コンピューティングコア間の調整はまれであり、粒度が粗く、信頼性はあまり高くありません。分散コンピューティングプロセスの実行には時間がかかります。

おすすめ

転載: blog.csdn.net/weixin_43762938/article/details/108741244