平成20年度 筑波大学大学院共通科目
「計算科学のための高性能並列計算技術」
(01ZZ027)

本講義は,CCS HPCサマーセミナー2008と共通です.

日程:2008年7月31日(木)〜8月1日(金)
場所: 筑波大学計算科学研究センター 国際ワークショップ室
問合せ先:hpc-summer-seminar-2008 [at] ccs.tsukuba.ac.jp

本講義の受講者は7月25日(金)までに,TWINSで履修申請してください.

講義概要

計算科学を支える大規模シミュレーション,超高速数値処理のためのスーパーコンピュータの主力プラットフォームはクラスタ型の並列計算機となってきました.ところが,大規模なクラスタ型並列計算機は,高い理論ピーク性能を示す一方で,実際のアプリケーションを高速に実行することは容易なことではありません.

本講義はそのようなクラスタ型並列計算機の高い性能を十二分に活用するために必要な知識,プログラミングを学びます.

講義日程

8:30-10:00 10:30-12:00 13:30-15:00 15:30-17:00
7/31 並列処理の基礎 並列システム OpenMP MPI T2K利用法
8/1 並列数値アルゴリズムI 並列数値アルゴリズムII 最適化I 最適化II

講義内容

セミナー内容 講師
並列処理の基礎 アムダールの法則,並列化手法(EP,データ並列,パイプライン並列),通信,同期,並列化効率,負荷バランスなど並列処理に関する基礎事項を学ぶ. [ 資料1 ] 朴泰祐
並列システム SMP,NUMA,クラスタ,グリッドなどの並列計算機システムと,並列計算機システムの性能に大きく関わる事項(メモリ階層,メモリバンド幅,ネットワーク,通信バンド幅,遅延など)を学ぶ. [ 資料2 ] 朴泰祐
OpenMP 並列プログラミングモデル,並列プログラミング言語OpenMPを学ぶ. [ 資料3 ] 佐藤三久
MPI 並列プログラミング言語MPI2を学ぶ. [ 資料4 ] 建部修見
T2K利用法 T2Kオープンスーパーコンピュータシステムの利用法,特にNUMAやマルチレールネットワークの利用法を学ぶ. [ 資料5 ] 建部修見
並列数値アルゴリズムI 代表的な並列数値アルゴリズムである行列解法(直接解法,反復解法)を学ぶ. [ 資料6 ] 多田野寛人
並列数値アルゴリズムII 代表的な並列数値アルゴリズムである高速フーリエ変換(FFT)を学ぶ. [ 資料7 ] 高橋大介
最適化I 並列計算機システムの計算ノード単体におけるプログラムの最適化手法(レジスタブロック,キャッシュブロック,メモリ割当など)と性能評価に関して学ぶ. [ 資料8 ] 高橋大介
最適化II 並列計算機システム全体における並列プログラムの最適化手法と性能評価に関して学ぶ. [ 資料9 ] 建部修見

レポート課題

各講義で出されるレポート課題のうち2課題以上を選択して提出すること.

提出先:hpc-summer-seminar-2008 [at] ccs.tsukuba.ac.jp
提出期限:2008年8月31日

課題1
  1. 並列処理性能とその効率について以下の設問に答えよ。

    ある処理を1台のプロセッサで実行した時、T1 [sec]で終了する。この処理が完全並列化可能(逐次部分は無視できる)である時、p台のプロセッサでの実行を考える。この処理は完全並列化は可能であるが、p台のプロセッサで並列処理する際、Tcomm(p) [sec]だけの通信時間がオーバヘッドとして発生するとする(通信時間はpの関数である)。

    1. この問題をp台のプロセッサで処理する際の速度向上率s(p)と、並列化効率e(p)を式で表せ。
    2. Tcomm(p)がpに比例し、Tcomm(p)=αpと表せたとする。並列化効率を80%以上に保つには、αはどのような値でなければならないか。T1とpを用いて表せ。
    3. 通信時間を決定するファクタであるαの条件について、T1を問題規模、pを並列度と捉え、論ぜよ。

  2. 3次元の物理問題領域のサイズがN3であるとする。これをn3台のプロセッサでdomain decompositionにより並列処理する。この時、問題領域を特定の1つの次元方向でのみ分割する方法(スライス状分割)と、3つの次元全てに渡って分割する方法(サイコロ状分割)が考えられる。講義資料23ページにあるように、全要素の値を更新する際、互いに隣合う要素の値を参照するとする(ただし資料では1次元空間だがここでは3次元空間とする)。計算量と通信量の観点から、スライス状分割とサイコロ状分割のどちらが一般的に有利であるか論ぜよ。

課題2
  1. 実際に構築された大規模並列計算機(講義資料で取り上げたもの、あるいはその他)のうち1台を選び、規模・性能・アーキテクチャ的特徴について詳細を調べてまとめよ。調査にはweb等を活用することを薦めるが、全て出展(URL等)を明らかにすること。

  2. IntelのXeonシリーズCPUと、AMDのOpteronシリーズCPUは、現在共にx86アーキテクチャに基づくマルチコアプロセッサとして広く用いられている。しかし、XeonはSMPアーキテクチャ、OpteronはNUMAアーキテクチャを持ち、その性質は異なる。メモリバンド幅、プログラミング上の注意等の観点から、両者を比較せよ。

  3. 並列処理ネットワークの理論ピークバンド幅は年々急激に増加している。しかし、一般的に、レイテンシの削減はそれほど急激には進まない。この結果として、プログラミングやアプリケーション上でどのような影響が現れるか論ぜよ。

課題3
ナップサック問題を解く並列プログラムをOpenMPを用いて作成しなさい。

例:逐次再帰版

#define MAX_N 100
int N; /* データの個数 */
int Cap; /* ナップサックの容量 */
int W[MAX_N]; /* 重さ */
int P[MAX_N]; /* 価値 */

int main()
{
    int opt;
    read_data_file("test.dat");
    opt = knap_search(0, 0, Cap);
    printf("opt=%d\n", opt);
    exit(0);
}

read_data_file(cha *file)
{
    FILE *fp;
    int i;
    
    fp = fopen(file, "r");
    fscanf(fp, "%d", &N);
    fscanf(fp, "%d", &Cap);
    for(i = 0; i < N; i++)
        fscanf(fp, "%d", &W[i]);
    for(i = 0; i < N; i++)
        fscanf(fp, "%d", &P[i]);
    fclose(fp);
}

int knap_search(int i,int cp, int M)
{ 
    int Opt; 
    int l,r;

    if (i < N && M > 0) {
        if(M >= W[i]) {
            l = knap_search(i + 1, cp + P[i], M - W[i]);
            r = knap_search(i + 1, cp, M);
            if (l > r) Opt = l; 
            else Opt = r;
        } else 
            Opt = knap_search(i + 1, cp, M);
    } else Opt = cp; 
    return(Opt);
}

課題4
行列Aと行列Bの積を計算するプログラムを作成し,結果が正しいことを確認しなさい。ただし,行列A,Bを複数のプロセスで分割して格納し,単一プロセスで全体領域を保持してはならない。分割方法は任意とする。レポートにはプログラム,プログラムの説明,実行結果,実行結果の説明を含めること。

課題5
離散フーリエ変換(DFT)のO(N2)のアルゴリズムと,高速フーリエ変換(FFT)のO(NlogN)のアルゴリズムを任意のプログラミング言語で実装し,n=65536の場合の実行時間を比較せよ.

課題6
  1. 行列

    をCRS形式で保持するプログラムを作れ.

  2. CRS形式の行列ベクトル積を行うプログラムを作れ.

  3. 共役勾配法のプログラムを作り,連立一次方程式 Ax = b を解け.但し,b = A[1,1,...,1]Tとする.行列のパラメータは 2 < γ ≤ 4 に設定せよ.相対残差ノルムが || rk ||2 / || b ||2 ≤ 1.0 × 10-10 を満たしたら反復を停止すること.

  4. 複数のパラメータ γ について実験し,反復過程における相対残差ノルム || rk ||2 / || b ||2 をグラフにプロットせよ.

課題7
以下に示す行列積を行うプログラムを最適化し,最適化する前との実行時間を比較せよ.
#include <stdio.h>
#define N 1000

int main(void)
{
    static double a[N][N], b[N][N], c[N][N];
    int i, j, k;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand(); b[i][j] = rand(); c[i][j] = rand();
        }
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            for (k = 0; k < N; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return 0;
}
課題8
2次元ラプラス方程式をヤコビ法で解くMPIプログラム(参考:「MPI」で紹介したlaplace)を作成し,複数反復をまとめる最適化を行いなさい。最適化前後でtlogによるプロファイルを行い,考察を行いなさい。

計算科学研究センター
Last modified: Tue Jul 1 22:12:18 JST 2008