はじめに
研究のためスーパーコンピュータを使うこともあるのですが,その原理を簡単に説明します.
「スーパーコンピュータって普通のコンピュータと何が違うの?」,「どういったプログラム方法があるの?」ぐらいのレベルを想定しています.
あくまでメモ程度なので正確性などは保証されていません.希望があればもう少し詳しいことも書きます.
何をもってスパコンとしているのか?
スーパーコンピュータが他のコンピュータと違う点は,大量CPUによる並列計算が得意という点につきます.この辺り非常にあいまいで,並列計算ができればスパコンなのか? 市販のPCでもデュアルコアとかあるぞ,という疑問は色々わいてきますが,その当たりにこだわっても特にいいことがない,ということで実用上は並列計算をするためのコンピュータと思っていてもそれほど困りはしません.
並列計算って具体的に何するのん?
例えば,
do i=1,100 print *, i end do
という簡単なプログラムを考えてみましょう.これを普通に動かせば1から100までが順に出力される,という結果になります.
しかし同じ結果を得ようと思えば,以下のように書いても良い訳です.
do i=1,50 print *, i end do
do i=51,100 print *, i end do
これを二つのCPUに振り分けることを考えましょう.
つまり,
CPU 1担当
do i=1,50 print *, i end do
CPU 2担当
do i=51,100 print *, i end do
これを行うのが,並列計算ということになりそうです.
並列計算用プログラムにMPとかMPIとかあるけど何が違うん?
プログラミングの考え方が違います.一番けんちょに違いが出るのがデータの同期方法です.
MPIはMessage Passingという手法を用いるライブラリの一つです.プロセスに分けて並列化を行い各プロセス毎に通信を行うことによって計算を同期します.メモリが多数ある場合,ほぼこのメモリに計算を振り分けると考えられます.Barrirなど安全な計算手法を用いることができますが,一般にプログラミングが難しくなると言われています.
MPはShared Memoryという手法を用いるライブラリの一つです.スレッド単位で並列化を行い同期を行います.同一メモリの上でスレッドを分けて並列化を行うので,言葉の上では単一メモリで動いていることになります.手軽にプログラミングするならこちらと言われています.
もうちょい詳しい計算例とかないやろか?
例えば一変数のリーマン積分を考えてみましょう.短冊状に積分区間を区切りその面積を足し分けることで積分値を出す計算なわけですが,この短冊同士の面積は独立です.それを並列計算して,最後に足し合わせてみることでシングルコアで計算するよりも早い時間で積分の数値計算ができることになります.
ざっと簡単にではありますが,スーパーコンピュータについて概説しました.
興味がある人にとっての初めの第一歩にでもなれば幸いです.