Skip to the content.
目次

背景

東京大学情報基盤センターと筑波大学計算科学研究センターが共同で運営する最先端共同HPC基盤施設(JCAHPC)のOakforest-PACSシステム(OFP)は2022年3月末で無事運用を終了いたしました。現在、JCAHPCでは2024年4月運用開始を目指して、OFPの後継機種(OFP-II、ピーク性能200 PFLOPS以上を目標)の導入を進めております。スパコンへの性能要求とともに省電力、脱炭素化という昨今の状況を考慮すると、GPU等の演算加速装置の導入は不可避と考え、OFP-IIはGPU搭載ノードを中心としたシステムとする予定です(一部CPUのみのノードもあります)。 また、OFP-IIのプロトタイプとしてWisteria-Mercuryという小型のシステムを導入する予定です。

東大情報基盤センターのシステムはこれまで汎用CPUを中心としたシステムが中心でしたので、アプリケーションの移植が大きな課題となります。3,000人近い利用者の皆様に2024年4月にOFP-IIの利用を開始していただくためには、コードの移植を遅くとも2022年末までに開始する必要があります。そこで、2022年春に各社GPUを対象として7種類のプリベンチマークを実施し、その結果を踏まえ、6月にはMercury及びOFP-IIにはGPUとして「NVIDIA H100及びその後継機種」を採用することを既に決定しております。

本サイトでは、2024年4月のOFP-IIの利用開始に向け、皆様の既存コードをご自身でGPUへ移植するために、役立つ情報を集約しています。

GPU移行に関する情報

移行の概要

既存のCPUコードをNVIDIA GPUへ移植して高い性能を得るために大事なことは、

です。これに対して、どこまで性能を追求するか、開発コストをかけられるか、ソースコードのメンテナンス性を高めるかで、選択すべき移植方法が変わってきます。

既存のCPUコードをNVIDIA GPUへ移植するためには、いくつかの方法があり、代表的な方法は次のとおりです。 1番から3番に行くにつれて、達成できる性能は高くなる傾向にありますが、反対に開発効率が低下していきます。 OpenMP + MPIで並列化済みであれば、一般的には OpenACC + MPI へ移行することがおすすめです。

  1. GPU対応ライブラリを用いる
  2. コンパイラの支援を利用してGPU移植する
    • 既存のCPUコードにOpenACC指示文(ディレクティブ)を挿入する
    • 既存のCPUコードにOpenMP指示文(ディレクティブ)を挿入する
    • 標準言語の並列処理でGPUを利用する
  3. GPU専用言語(CUDA)で書き換える

GPU計算の概要、NVIDIA GPU への移植方法についての比較は、下記の動画を参照ください。

GPUへの移植方法の特徴

GPU対応ライブラリを用いる

特定のアルゴリズムについては、GPU向け(CUDA)ライブラリが存在しています。既存のCPU向けライブラリをGPU向けライブラリに入れ替えると、その部分のみですが、GPUで高速に計算されます。GPU向けライブラリとしては、下記のようなものがあります。OpenACCやCUDAとの併用は可能で、ライブラリで対応できない部分は、OpenACC などでGPU化する必要があります。

既存のCPUコードにOpenACC指示文(ディレクティブ)を挿入する

OpenACC指示文(ディレクティブ)を既存のCPUコードに挿入することで、GPU向けコードをコンパイラが作成します。OpenACCは並列計算を容易に実現するもので、GPUを主な対象とし、C言語とFortranに対応しています。指示文で、ループ部分のGPU化、CPUとGPU間のデータ通信の挿入などを行うことができます。また、CUDAでは記述が複雑なリダクション計算もOpenACCでは簡単に記述できます。既存CPUコードに指示文を挿入するため、CPU向けのコードと共通化することが可能です。

詳細は下記のセンター開催の講習会資料と録画を参照ください。

既存のCPUコードにOpenMP指示文(ディレクティブ)を挿入する

OpenMP指示文(ディレクティブ)は、主に共有メモリ型マルチプロセッサの並列プログラミングに利用されます。OpenMP 4.0から、並列処理をGPUなどアクセラレータへオフロードする機能が提供されています(GPU Offloading)。OpenACCと同様なことがOpenMPでも実現できるようになりました。しかし、現時点では、NVIDIA GPUでは、OpenMP GPU Offloading よりもOpenACCの方が高い性能がでる傾向にあります。

標準言語の並列処理でGPUを利用する

最近のC++やFortranを利用することで、標準言語自体が提供する機能によって並列処理することができます。C++ではC++17以降に提供される並列プログラミングの機能でコードを記述することで、それをGPUで実行することができます。また、Fortran では、Fortran 2008 で並列プログラミングをサポートするための機能が追加され、Fortran 2018 ではその機能を強化されています。CPUとGPUのどちらからもアクセス可能なメモリ(Unified memory)と併用するため、明示的なメモリ転送は不要です。このため、ソースコードは完全に標準言語のみで記述可能で、高い移植性を実現できます。性能としては、明示的なメモリ転送ができないこと、細かいGPU実行の制御ができないこと、コンパイラが開発途上であることから、OpenACCよりも若干性能が劣る傾向にあります。

詳細は下記の参考資料を参照ください。

CUDAで書き換える

CUDAはNVIDIA GPU向けの開発環境および言語であり、C++言語を拡張した CUDA C++ と Fortran を拡張した CUDA Fortran があります。ユーザがゼロからGPU向けコードを記述する必要があります。柔軟性が高く、高性能なコードを作成可能ですが、既存のCPUコードからの書き換え量は多く、生産性は高くありません。CUDAコードはCPU向けのコードとは別にメンテナンスする必要があり、コードの保守の観点でもコストが高いです。

GPU移行実践

講習会

東京大学情報基盤センターではGPUプログラミングに関する講習会を定期的に開催しております。受講料無料のオンライン講習会であり、過去開催時の資料や録画映像もご参照いただけます。

詳細は下記をご参照ください。

ミニキャンプ

東京大学情報基盤センターでは、既存のCPUシミュレーションコードをCUDA、OpenACC、ライブラリでGPU化したり、既存の単体GPUコードを複数GPUコードにすることなどに取り組む「GPUミニキャンプ」を定期的に開催しております。皆様のCPUコードのGPU移植をサポートするため、2022年12月以降は頻度を増やして開催いたします。本ミニキャンプはZoomによるオンライン開催を予定しており、受講料は無料です。

詳細は下記をご参照ください。

相談会

(現在日程調整中)