前回に引き続き、OpenACCを使ったICCG法の高速化手法について考えてみます。 オリジナルのプログラムは東大情報基盤センターの講習会、「OpenMPによるマルチコア・メニィコア並列プログラミング入門」のページから入手できます。 ダウンロードしたmulticore-c.tarを解凍した後に出来る、マルチカラー並列化されたICCGソルバーのmulticore-c/L2/src/solver_ICCG_mc.c をベースに解説します。 OpenACCを使ったICCG法の高速化つづき前回は、図1 の solve [M]z(i-1)=r(i-1) 部分のプログラムのOpenACC化を行いました。 以降のループも引き続き、
の2点を意識しながらOpenACC化を進めましょう。 図1:ICCGソルバーのアルゴリズム (OpenMPによるマルチコア・メニィコア並列プログラミング入門より)
配列のサイズ情報を組み込み関数で確認できるFortranと違い、C言語を使う際にはこの手の変更がしばしば必要となります。その過程で、図5のようにOpenACCと関係のないところでバグが顕在化することもあります。 必ず結果を確認しながら、少しずつOpenACC化を進めていくことが、結果として早道になるのです。 図4:solver_ICCG_mc.c, solver_ICCG_mc.hの変更(赤字が変更部分)。 図5:main.cの変更(赤字が変更部分)。配列のサイズ情報を付け加える過程でバグが顕在化する。
これでようやく、最低限のOpenACC実装が完成しました。 CPUと比較してみましょう。 PGIコンパイラでコンパイルするために、Makefileは CC = pgcc, OPTFLAGS = -O3 –acc –ta=tesla,cc60 –Minfo=accel と書き換えています。Makeするとmulticore-c/L2/solver/runに実行ファイルができます。 INPUT.datの一行目が問題サイズを表すので128, 128, 128とし、./L2-solを実行します。 最初に並列化を行うにあたっての色数とカラーリング手法を聞かれるため、ここでは-10(CMRCMによりカラーリングし、色数は10の意味)を入力します。結果は以下でした。 ・OpenACC版のGPU実行: 0.962792秒 (CPU-GPUデータ転送を除くと0.749099) ・オリジナルのCPU1コア実行: 24.847288秒
今回で初級編は終了となりますが、いかがでしたでしょうか。 プログラムをOpenACC化する際に考えることというのは、どんなプログラムでも大体変わらず、
しかし今回の例のように、データサイズを指示文に与えるためにプログラムの変更が必要だったり、goto文があるために基本であるdata指示文が使えなかったりと、対象とするプログラムによって、新たに対処しなくてはならないことが色々出てきます。 次回以降は中級編ということで、さらに実践的なアプリケーションのOpenACC化を行いつつ、様々なケースでのOpenACCでの対処方法などを紹介出来ればと思います。 ここまで読んでいただきありがとうございました。 今回作ったOpenACC版の実装はこちらから入手できます。 < 1ヵ月間有効のスパコンお試しアカウント >
東京大学情報基盤センターでは、教育の一環として、制限はあるものの一ヵ月の間有効なスパコンアカウントを提供しています。 現在3つのスパコンが運用されていますが、そのうちReedbushと呼ばれるスパコンには、一世代前のものではありますがGPUが搭載されていて、OpenACCを使える環境も整っています。 自分でどんどん自習したい場合は、ご利用を考えてみてください。 トライアルアカウント申し込みページ https://www.cc.u-tokyo.ac.jp/guide/trial/free_trial.php < 過去の講習会の資料やプログラム公開中 > 東大センターが行った過去のOpenACCに関する講習会の資料やプログラムも公開されていますので、自習する場合にはぜひご利用ください。 講習会ページ ※オンライン講習会 定期開催中! https://www.cc.u-tokyo.ac.jp/events/lectures/ 講習会で用いているプログラム https://www.dropbox.com/s/z4fmc4ibdggdi0y/openacc_samples.tar.gz?dl=0 |
著者東京大学 |