日程: | 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 ] | 建部修見 |
提出先: | hpc-summer-seminar-2008 [at] ccs.tsukuba.ac.jp |
---|---|
提出期限: | 2008年8月31日 |
ある処理を1台のプロセッサで実行した時、T1 [sec]で終了する。この処理が完全並列化可能(逐次部分は無視できる)である時、p台のプロセッサでの実行を考える。この処理は完全並列化は可能であるが、p台のプロセッサで並列処理する際、Tcomm(p) [sec]だけの通信時間がオーバヘッドとして発生するとする(通信時間はpの関数である)。
例:逐次再帰版
#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); }
をCRS形式で保持するプログラムを作れ.
#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; }