はじめに
この記事はVoicyアドベントカレンダー17日目の記事です。
こんにちは、ミック ( @mickbare )です。 Voicyではバックエンドの開発を担当しています。
GPUを使った並列コンピューティングをGPGPUといいますが、最近OpenACCという新しい標準が出たので概要を紹介します。
並列コンピューティングの各種 標準について
OpenACCを紹介する前に、他の主要な標準やプラットフォームについてまとました。 登場の順序としては、大体、OpenMP -> CUDA -> OpenCL -> OpenACCです
OpenMP
共有メモリ・マルチスレッド型の並列アプリケーション開発をサポートするために標準化された並列コンピューティングのためのAPI。 ソースコードにディレクティブを挿入することによって並列化を行います。 OpenMPはループの反復処理を自動的に複数のスレッドに分割して並列処理しますが、起動するスレッドの数や、どのようりスレッドに処理を振り分けるかはOpenMP処理系やプログラムの実行環境などの条件に依存します。 OpenMPに対応していない場合にはディレクティブは無視されるため、並列環境と非並列環境でほぼ同等のソースコード利用できることが利点です。
int kernel(char *src, size_t len) { // ディレクティブは #pragmaから始まる #pragma omp parallel for for (int i = 0; i < len; i++) { // 並列処理させたいプログラム result[i] = a[i] * b[i]; } return 0; }
CUDA
NVIDIAが開発しているGPGPUのためのプラットフォーム nvccというLLVMベースの専用のコンパイラやライブラリなどが提供されています。 CUDA C/C++というC言語拡張で記述します。 NVIDIA製のGPUに最適化されていて、ハードウェア性能を最大限引き出せるようになっちえるがNVIDIA製のGPUでしか使えない制約があるのと記述自体が複雑なのが欠点です。
OpenCL
Appleによって提案、標準化団体のクロノスによって策定された、異種混合環境での並列プログラミングのオープンな標準規格とそのAPI。 OpenCL C/C++というC言語拡張で記述します。 組み込みシステム向けにはOpenCL Embedded Profileがあります。 CUDAがNVIDIA製のGPUしか対応しないのに対し、OpenCLはAMDのGPUにも対応していたり、GPU以外での並列処理もサポートするのが利点です。
OpanACCとは
並列コンピューティングための標準の一つ。 クレイ、CAPS、NVIDIA、PGIによって開発されており、世界各地で無料の布教活動を行うなどNVIDIAが本腰を入れて普及させようとしています。 位置付けとしては、CUDA、OpenCLをより標準化したものでOpenMPに近いです。
何が嬉しいのか???
OpenACCは、CUDAがサポートできる一部しか並列化をサポートしない代わりに記述が圧倒的に簡単です。 また、以前は性能差がシビアでしたが、現在は、最適化によってはCUDAよりも高速化できたりと、CUDAと遜色ない性能が出せたという報告が出ています。また、NVIDIAのGPU以外にも対応しており、 FPGAにも対応したコンパイラも開発されています。
サンプル
OpenACCではOpenMPと同じくディレクティブを挿入して並列化します。 CUDAやOpenCLのような独立言語ではないので、既存のCPUコードも簡単にGPU化できる。
int kernel(char *src, size_t len) { // CPUでの演算対象の指定 #pragma acc kernels # 各ループに対する指定 #pragma acc loop independent for (int i = 0; i < len; i++) { // 並列処理させたいプログラム result[i] = a[i] * b[i]; } return 0; }
終わりに
今からGPGPUを始めるならOpenACCが学習コストが低くて導入しやすいのでおすすめです。 OpenACCで並列プログラミングの勘所を掴んだのち、CUDAやOpenCLに進んでも良いと思います。 GPUによる並列化は機械学習ライブラリでも使用されるので、都度キャッチアップしていきたいですね。
次回は@d_saito2110さんです