片桐孝洋著:「スパコンプログラミング入門−並列処理とMPIの学習−」、
東京大学出版会(2013年3月12日初版)情報提供ページ

拝啓

  このたびは、本書をお買い求めいただき、誠にありがとうございます。
本ページは、出版後に見つかった誤りや、本書に関連する情報を提供するページとして、開設しているものです。
今後、内容を充実していく予定ですので、よろしくお願いします。

敬具

平成二十五年三月六日
片桐孝洋



●本書のWEBでの公開資料一覧(無料)

■本書は、東京大学工学部共通科目「スパコンプログラミング(1)および(T)」、名古屋大学大学院情報学研究科「大規模計算特論A」、および、名古屋大学大学院工学研究科附属 計算科学連携教育研究センター主催「大規模並列数値計算特論」、の参考書です。したがって、無料公開されている同講義資料と合わせて演習をすると、概念が視覚的にも理解しやすくなっております。

以下のページから、該当する最新の資料がダウンロードできます。本書を用いた演習に活用してください。

   片桐孝洋の講義資料置き場

■東京大学情報基盤センターで作成された、以下の講習会用の教育教材のDVD(無料)も、本書の内容を動画で解説しています。こちらと併用することで、インターネット講義と同様の効果が期待できます。

   東京大学情報基盤センターの講習会教育教材のHP

■本書に関連する、よりアドバンスな内容の講義が、以下で行われています。またこの講義では、資料のほかに、講義の動画配信(無料)を行っています。本書と併用して学習することで、上記と同様に、インターネット講義と同様の効果が期待できますので、ご利用ください。

   大阪大学 2013年度 CMSI「計算科学技術特論A」のWEBページ

   大阪大学 2015年度 CMSI「計算科学技術特論A」のWEBページ

       配信講義 計算科学技術特論A (2017) (4月13日〜7月27日)のWEBページ

●本書の関連書籍

  ●岩下武史、片桐孝洋、高橋大介 共著: スパコンを知る: その基礎から最新の動向まで

  ●片桐孝洋 著:ースパコンプログラミング入門ー並列処理とMPIの学習ー

     ●下司雅章 編/片桐孝洋,中田真秀,渡辺宙志,山本有作,吉井範行,Jaewoon Jung,杉田有治,石村和也,大石進一,関根晃太,森倉悠介,黒田久泰 著:計算科学のためのHPC技術1


以下の間違いが判明しております。申し訳ありません。

●4ページ、上から4行目
 誤: 2,566,000 FLOPS, 4,701,000 GFLPS
 正: 2,566,000 GFLOPS, 4,701,000 GFLOPS

●16ページ、上から4行目
 誤: 無限大の台数のCPUを用いて並列化をしたとしたも
 正: 無限大の台数のCPUを用いて並列化をしたとし

●24ページ、上から14行目
 誤: ierr = MPI_BCAST(&a,1,MPI_DOUBLE,iroot, MPI_COMM_WORKD);
  正: ierr = MPI_BCAST(&a,1,MPI_DOUBLE,iroot, MPI_COMM_WORLD);

●30ページ、式(1.4)
 誤: j_local -> i_global / (ib * (myid + 1))
  正: j_local -> i_global % ib

注)ただし、大域インデックスj_globalは、各プロセスにおいて担当範囲内の数値のみ指定するという前提があります。

●30ページ、式(1.5)
 誤: j_local -> i_global / ib
  正: j_local -> i_global / p

●32ページ、式(1.8)
 誤: j_x_local -> i_x_global / (ib_x * (myid_x + 1))
        j_y_local -> i_y_global / (ib_y * (myid_y + 1))
  正: j_x_local -> i_x_global % ib_x
        j_y_local -> i_y_global % ib_y

注)ただし、大域インデックスj_globalは、各プロセスにおいて担当範囲内の数値のみ指定するという前提があります。

●79ページ図3.18「ループ中のIF文の除去」(a)元のコード
 誤:
  for (i=0; i<n; i++) {
    for (j=0; j<n; j++) {
      if ( i = j ) A[ i ][ j ] = B[ i ][ j ];
      else A[ i ][ j ] = 1.0d0;
    }
  }
 
 正:
 for (i=0; i<n; i++) {
    for (j=0; j<n; j++) {
      if ( i != j ) A[ i ][ j ] = B[ i ][ j ];
      else A[ i ][ j ] = 1.0d0;
    }
  }

●79ページ図3.18「ループ中のIF文の除去」(b)高速化される可能性のあるコード
 
誤:
 for(i=0; i<n; i++){
   for(j=0; j<n; j++){
     A[ i ][ j ]=B[ i ][ j ];
   }
  }
  for(i=0; i<n; i++){
    A[ i ][ j ] = 1.0d0;
  }

  正:
  for(i=0; i<n; i++){
    for(j=0; j<n; j++){
      A[ i ][ j ] = B[ i ][ j ];
    }
  }
  for(i=0; i<n ;i++){
    A[ i ][ 
i ] = 1.0d0;
  }

●85ページ、下から10行目
 誤: 全体のプロセス数nprocs
  正: 全体のプロセス数numprocs

●97ページ、図中
 誤: C_{ij}^{~} = Σ_1^{√n}
  正: C_{ij}^{~} = Σ_1^{√p}

●97ページ、図中
 誤: A_{i,√n }^{~}
  正: A_{i,√p }^{~}

●129ページ、下から3行目、2行目
 誤: NUMPROCS
  正: NPROCS

●132ページ、下から3行目
 誤: NUMPROCS-1
  正: NPROCS-1


●テスト用プログラム Sample-fx.tarについて

本書はMPIの起動テスト用や、簡単なMPI利用サンプルの提供を目的とし、12種(Fortran90言語とC言語の双方。合計24種)がCD-Rで添付されています。

特に本書では説明を割愛しておりますが、Sample-fx.tarのサンプルプログラムについて、MPIの利用のためにまず、本サンプルプログラムの「Helloプログラム」のMPIプログラムの書き方を参考にする必要があります。

以下のMPI_Init関数より下のMPI関数の利用が必須になります。こちらも併せてご確認ください。


●C言語の場合

#include <stdio.h>
#include <mpi.h>

int main(int argc, char* argv[]) {

int myid, numprocs;
int ierr, rc;

ierr = MPI_Init(&argc, &argv);  //MPIの初期化
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);  //myidにランク番号を収納
ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);  //numprocsに全体のプロセス数を収納

printf("Hello parallel world! Myid:%d \n", myid);

rc = MPI_Finalize();  //MPIの終了

exit(0);
}


●Fortran言語の場合

program main
common /mpienv/myid,numprocs

integer myid, numprocs
integer ierr

call MPI_INIT(ierr)   //MPIの初期化
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)  //myidにランク番号を収納
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) //numprocsに全体のプロセス数を収納

print *, "Hello parallel world! Myid:", myid

call MPI_FINALIZE(ierr)  //MPIの終了

stop
end


●テスト用プログラム Sample-fx.tar中の時間計測関数について

テスト用プログラムに含まれる Cpi_m/ 以下のプログラムは、以下の時間計測関数が使われております。
MPIでは、この方法で任意の箇所の時間計測が可能です。適宜、演習に利用してください。


●C言語

double t0, t1, t2, t_w;
..
ierr = MPI_Barrier(MPI_COMM_WORLD);
t1 = MPI_Wtime();

<ここに測定したいプログラムを書く>

ierr = MPI_Barrier(MPI_COMM_WORLD);
t2 = MPI_Wtime();

t0 = t2 - t1;
ierr = MPI_Reduce(&t0, &t_w, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);


●Fortran言語

double precision t0, t1, t2, t_w
double precision MPI_WTIME
..
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
t1 = MPI_WTIME(ierr)

<ここに測定したいプログラムを書く>

call MPI_BARRIER(MPI_COMM_WORLD, ierr)
t2 = MPI_WTIME(ierr)

t0 = t2 - t1
call MPI_REDUCE(t0, t_w, 1, &MPI_DOUBLE_PRECISION, &MPI_MAX, 0, MPI_COMM_WORLD, ierr)


●本書の記述、および、サンプルプログラム共通の並列制御変数

 本書では、以下の変数が並列処理を制御する変数として利用されていますので、
ご確認ください。

  ・myid : 自プロセスのランク番号(プロセス番号)
  ・numprocs : 全体のプロセス数
  ・NPROCS : 同上(プログラム中で、実行プロセス数を定数として利用する場合)


最終更新:2017年5月26日