29

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

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

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

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

CUDA とカーネルについても読んだことがありますが、並列プログラミングの経験があまりなく、カーネルが何であるかについてのかすかな考えもありません。

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

「ダミー用」のタイプの答えを教えてもらえますか?

4

4 に答える 4

14

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

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

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

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

Intel コンパイラは、C/C++ の Intel Gen グラフィックスの OpenMP ターゲットをサポートしていますが、Fortran はサポートしていません。さらに、teamsanddistribute句は必要/適切ではないため、サポートされていません。以下は、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

$ 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
于 2017-07-27T21:32:23.323 に答える
9
  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アクセラレータの使用を検討できます。Intel Fortran (および C/C++) コンパイラには、CPU と Xeon Phi の両方の OpenMP サポートが含まれています。

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

于 2015-03-11T07:13:18.780 に答える
2

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

StarPU は C/C++ 専用なので、FortranにはForOpenCLがあります。

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

于 2015-03-12T00:24:05.970 に答える