web-dev-qa-db-ja.com

OpenMPをGPUに使用できますか?

私はウェブを検索してきましたが、このトピックについてはまだ非常に混乱しています。誰もがこれをより明確に説明できますか?私は航空宇宙工学の出身です(コンピューターサイエンスの出身ではありません)。OpenMP/ CUDAなどについてオンラインで読んだときのことです。そして、マルチスレッドは、私が言っていることの多くを本当に理解していません。

現在、FORTRANで作成された社内CFDソフトウェアを並列化しようとしています。これらは私の疑問です:

  1. OpenMPは、CPUの複数のスレッドを使用してワークロードを共有します。 GPUが作業の一部を取得できるようにするために使用できますか?

  2. OpenACCについて読みました。 OpenMPに似ていますか(使いやすい)?

私はCUDAとカーネルについても読みましたが、並列プログラミングの経験があまりなく、カーネルが何であるかについての最も暗い考えもありません。

  1. FORTRANの場合、ワークロードをGPUと共有する簡単で移植可能な方法はありますか(OpenMPがそれを行わず、OpenACCが移植できない場合)?

「ダミー向け」タイプの回答をいただけますか?

25
André Almeida

はい。 OpenMP 4ターゲットコンストラクトは、幅広いアクセラレーターをサポートするように設計されています。 NVIDIA GPUのコンパイラサポートはGCC 7+( 1 および 2 を参照してください。後者はOpenMP 4 GPUサポートを反映するように更新されていません)、Clang(-を参照) 、 45 )、およびCray。インテルGPUのコンパイラサポートは、インテルC/C++コンパイラで利用できます(例 6 を参照)。

IBMが開発したNVIDIA GPU用OpenMP 4+のClang/LLVM実装は、 https://github.com/clang-ykt から入手できます。ビルドレシピは "CORAL/OpenPower Heterogeneous Systems用のOpenMPコンパイラ" で提供されています。

Crayコンパイラは、NVIDIA GPUのOpenMPターゲットをサポートしています。 From Cray Fortranリファレンスマニュアル(8.5)

OpenMP 4.5ターゲットディレクティブは、NVIDIA GPUまたは現在のCPUターゲットをターゲットにするためにサポートされています。ターゲットディレクティブを使用するには、適切なアクセラレータターゲットモジュールをロードする必要があります。

インテルコンパイラーは、C/C++用のIntel GenグラフィックスのOpenMPターゲットをサポートしていますが、Fortranはサポートしていません。さらに、teams句とdistribute句は、必要/適切ではないため、サポートされていません。以下は、OpenMPターゲット機能がさまざまな環境でどのように機能するかを示す簡単な例です。

void vadd2(int n, float * a, float * b, float * c)
{
    #pragma omp target map(to:n,a[0:n],b[0:n]) map(from:c[0:n])
#if defined(__INTEL_COMPILER) && defined(__INTEL_OFFLOAD)
    #pragma omp parallel for simd
#else
    #pragma omp teams distribute parallel for simd
#endif
    for(int i = 0; i < n; i++)
        c[i] = a[i] + b[i];
}

IntelおよびGCCのコンパイラオプションは次のとおりです。 NVIDIA GPU用のGCCセットアップはありませんが、適切な-foffloadオプションの documentation を確認できます。

$ icc -std=c99 -qopenmp -qopenmp-offload=gfx -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS
$ gcc-7 -fopenmp -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS
8
Jeff
  1. OpenMP 4.0標準にはアクセラレータ(GPU、DSP、Xeon Phiなど)のサポートが含まれていますが、GPU用のOpenMP 4.0標準の実装はわかりません。 初期の経験 のみです。

  2. OpenACCは確かにOpenMPに似ており、使いやすいです。優れたOpenACCチュートリアル: パート1 および パート2

残念ながら、少なくとも現時点では、CPUとGPUのポータブルソリューションはないと思います(OpenCLを除いて、OpenMPやOpenACCに比べるとレベルが低すぎます)。

ポータブルソリューションが必要な場合は、GPUの代わりに Intel Xeon Phi アクセラレータの使用を検討できます。インテルFortran(およびC/C++)コンパイラーには、CPUとXeon Phiの両方のOpenMPサポートが含まれています。

さらに、本当にポータブルなソリューションを作成するには、適切な並列テクノロジを使用するだけでは不十分です。十分なレベルの並列処理を提供するには、プログラムを変更する必要があります。可能なアプローチの例については、「 構造化並列プログラミング 」または同様の書籍を参照してください。

6
Andrey Sozykin

上記の他のプラットフォームでのサポートについて述べたことに追加するには:IBMは2つのOpenMP 4.5コンパイラーに貢献しています。1つはオープンソースのClang/LLVMです。もう1つは、IBMのXLコンパイラです。両方のコンパイラは同じヘルパーOpenMPオフロードライブラリを共有しますが、GPUに対するコンパイラのコード生成と最適化が異なります。 Fortranの場合、XL Fortranコンパイラーは、バージョン 15.1.5 以降のNVIDIA GPUへのOpenMP 4.5オフロードの大規模なサブセットをサポートします。 (およびバージョン 13.1.5 for XL C/C++)。 2018年の完全なサポートを目指して、今年と来年にはさらに多くの機能が追加されます。POWERを使用している場合は、XLコンパイラベータプログラムに参加して、FortranおよびC/C++の最新のOpenMPオフロード機能にアクセスできます。 。

4
Rafik Zurob

前の回答はそれのほとんどをカバーしていますが、GPUにいくつかの作業を与えることについても話したので、異機種混合のフレームワークを確認することをお勧めします StarP などのコンピューティング(CPU + GPU同時)。

StarPUはC/C++専用であるため、Fortranには ForOpenCL があります。

いずれの場合も、パフォーマンスと利便性のトレードオフを考慮する必要があります。

2
a3mlord