[山東大学] マルチコア プラットフォームでの並列コンピューティング - レビュー メモ

前に書いてある

  1. 画像の読み込みに失敗した場合は、科学オンライン
  2. 全文はソフトウェア学部の Liu 氏によるレビューの要点を要約したもので、すべてのテスト会場を網羅しており、レビューの参考としてのみ使用してください。(劉先生、ありがとう!)
  3. 2023 年 5 月 30 日更新: テストのすべての内容はレビューの概要に記載されています。しっかり暗記すれば、良いスコアを獲得できるはずです。劉先生、ありがとうございました。

並列コンピューティング

1. 行列とベクトルの乗算

トピック

シリアルコード

ここに画像の説明を挿入

答え

Pthreads 分割可能なコード

Pthreads 非割り算計算
注: 先生から与えられたコードは n / p ですが、トピック設定は m, t なので、次の n と p は m と t に変更する必要があります。つまり、

quotient = m / t;
remainder = m % t;

ここに画像の説明を挿入

2. MPI_Reduce() の動作の問題

トピック

MPI トピック

答え

プロセス0が対象プロセスの場合、実行終了後、b= 1 + 2 + 1 = 4;d= 2 + 1 + 2 = 5;

プロセス1が対象プロセスの場合、実行終了後、d= 1 + 2 + 1 = 4;b= 2 + 1 + 2 = 5;

3. SISD、SIMD の解釈に関する質問

トピック

フォン ノイマン システムにキャッシュと仮想メモリを追加すると、SISD システムとしてのタイプが変わりますか? パイプラインはどうですか? マルチイシューやハードウェア マルチスレッドはどうですか?

答え

最も基本的なキャッシュと仮想メモリの実装では、同時に実行できる命令の数や操作できるデータの量は変わりません。

パイプライン処理は、1 つの複雑な命令を複数のデータ項目に適用することと考えることができます。そのため、SIMD の一種とみなされることもあります。

複数の問題とハードウェア マルチスレッドにより、異なるデータ項目に異なる命令が適用される可能性があります。したがって、これらは MIMD の例として考えることができます。

4. キャッシュキャッシュヒット問題

トピック

キャッシュキャッシュ

答え

C 言語は行優先の順序で格納されるため、行ごとのアクセスが高速になります。

最初の double for ループの内部ループは行単位でアクセスされ、キャッシュ ヒット率が高く、速度が速くなります。

2 番目の double for ループの内側のループはカラム単位でアクセスされるため、キャッシュヒット率が低く、速度が遅くなります。

5. 組立ラインの計算問題

トピック

組み立てライン

答え

最初の質問

2+1+1+1+1+1+2 = 9ns

2番目の質問

9 × \回× 1000 = 9000 ns

3番目の質問

時間 フェッチ命令 比較 シフト 合計する ノーマライズ 含まれています 保管所
0 0
1 0
2 1 0
3 1 0
4 2 1 0
5 2 1 0
6 3 2 1 0
7 3 2 1 0
8 4 3 2 1 0
9 4 3 2 1
10 5 4 3 2 1
11 5 4 3 2
12 6 ・・・ 4 3 2
13 6 ・・・ 4 3

7 + (1000 × \回× 2) = 2007 ns

6. MPI データ分割の質問

ブロックパーティション、ループパーティション、ブロックサイクルパーティション

トピック

12 タスク、3 スレッド、3 つのタイプに分割するにはどうすればよいですか?

14 タスク、3 スレッド、3 つのタイプに分割するにはどうすればよいですか?

答え

1、

mpiデータ部

2、

プロセス ピース 従う 指輪 ピース - 従う 指輪
0 0 1 2 3 4 0 3 6 9 12 0 1 6 7 12 13
1 5 6 7 8 9 1 4 7 10 13 2 3 8 9
2 10 11 12 13 2 5 8 11 4 5 10 11

7. 2 地点間のコミュニケーションと質疑応答

トピック

ポイントツーポイント通信と集団通信の関係や違いは何ですか?

答え

1. コミュニケータ内のすべてのプロセスは、同じ集合通信関数を呼び出す必要があります。

2. 各プロセスから MPI 集合通信機能に渡されるパラメータは一貫している必要があります。

3. パラメータoutput_data_pはdest_processでのみ使用されますが、パラメータの値がNULLであっても、すべてのプロセスは対応する実際のパラメータを渡す必要があります。

4. ポイントツーポイント通信は、タグとコミュニケーターを通じてマッチングされます。集団コミュニケーションではタグを使用せず、コミュニケーターの順番と呼び出しによるマッチングのみを行います。

8. キャッシュの一貫性の問題

トピック

キャッシュの一貫性を確保するには、どのような方法がありますか? それぞれの手法にはどのような特徴があるのでしょうか?

答え

1. キャッシュ整合性プロトコルを監視する

  1. 複数のコアが単一のバスを共有します。
  2. バス上で送信された信号は、バスに接続されているすべてのコアによって認識されます。
  3. コア 0 が x のキャッシュ コピーを更新すると、この情報がバス全体に伝播する可能性があります。
  4. コア 1 がバスをリッスンすると、x が変更されたことがわかり、キャッシュ内の x のコピーを不正なものとしてマークし、メイン メモリ内で x を見つけることができます。

2. ディレクトリベースのキャッシュ整合性プロトコル

  1. ディレクトリは、ディレクトリと呼ばれるデータ構造を使用して、各キャッシュ ラインの状態を記録します。
  2. 変数が更新されると、現在のディレクトリが参照され、キャッシュ内の変数のキャッシュ ラインを含むコアのキャッシュ コントローラーが無効になります。
  3. ノードがキャッシュ ラインにアクセスまたは変更する必要がある場合、ディレクトリを使用して、他のノードにリクエストまたは無効化信号を送信する必要があるかどうかを判断できます。

3. 違いまたは関連性:

  1. ブロードキャストのコストが高いため、ディレクトリベースのキャッシュ コヒーレンス プロトコルはモニタリング キャッシュ コヒーレンス プロトコルよりも拡張しやすく、バスに依存しません。
  2. ディレクトリベースのキャッシュ コヒーレンス プロトコルは、維持する追加のディレクトリ構造があるため、より複雑になります。

9. 循環依存関係の問題

トピック

循環依存関係の問題

答え

# pragma omp parallel for num_threads(thread_count) \
	default(none) private(i) shared(a, n)
for (i = 0; i < n; i++)
    a[i] = i * (i + 1) / 2;

10. OpenMPマクロ定義の問題

質問

マクロ定義の問題

答え

#include <iostream>
#ifdef _OPENMP
#include <omp.h>
#endif

using namespace std;

int main() {
#ifdef _OPENMP
  cout << _OPENMP << endl;
#else
  cout << "未定义" << endl;;
#endif
  return 0;
}

出力: 201511。コンパイラーが 2015 年 11 月にリリースされた OPENMP 仕様をサポートしていることを示します。

11. CUDA による 1 次元ベクトルの計算と計算問題

トピック

シリアルコード

cuda一次元シリアルコード

答え

カーネル関数

cuda 1次元並列カーネル

12. CUDA の 2 次元ベクトルと計算問題

このテストコードのエラー修正では、ソースコード内の各変数の意味を理解する必要があります。オフセットを計算します

シリアル

2D ベクトルとシリアル

CUDA並列コード

オフセット = 行 * N + 列 オフセット = 行 * N + 列オフセット_ _ _=ロウ_N+_ _ _

int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int index = row * N + col;

CUDA 2次元ベクトル和

13. CUDA の 2 次元行列乗算

この質問でコードのエラー修正をテストするには、コード内の各変数の意味、特にkの意味とkの位置

シリアルコード

2D行列乗算シリアル

CUDA並列コード

CUDA 2次元行列乗算

14、CUDA削減

トピック

次のコードの潜在的な問題は何ですか? の解き方?

CUDA削減トピック

答え

分析する

1. 剰余演算 (%) が遅い: CUDA にはハードウェアでサポートされている剰余演算がないため、剰余演算が約 20 命令にコンパイルされ、GPU パフォーマンスが非常に低下します。

2. CUDA の GPU は SIMT アーキテクチャを採用しているため、このコードは発散性が高く、同じワープのスレッドに異なる命令を実行させることは不可能であり、GPU は分岐予測を実行できないため、このワープでは次の計算が行われます。 if 判定ステートメント tid が偶数であるかどうかによって、スレッドの半分 (つまり、奇数番号のスレッド) がアイドル状態になり、その結果、重大な分岐が発生し、パフォーマンスが大幅に低下します。
画像-20230529151727086

解決

1. 乗算を使用してインデックスを計算し、剰余演算を削除します。

2. if 分岐を記述しindex < blockDim.x、継続的な条件判定により同じワープ内のスレッドが一律にステートメントを実行または実行しないようにし、パフォーマンスを大幅に向上させます。

CUDA 分岐ソリューション 画像-20230529151836910

おすすめ

転載: blog.csdn.net/m2607219640/article/details/130925742