openacc と openmp の主な違いは何だろうと思っていました。MPI、cuda、opencl はどうですか? openmp と mpi の違い、特に共有メモリと分散メモリに関する部分を理解しています ハイブリッド gpu-cpu 処理セットアップを許可するものはありますか?
4 に答える
OpenMP と OpenACC は、ディレクティブ ベースの並列プログラミングを可能にします。
OpenMP は、マルチコア CPU などの共有メモリ コンピューティング プラットフォームでの並列プログラミングを可能にします。入力ソース コードの並列バージョンの合成をトリガーする並列処理を抽出する方法について、いくつかのディレクティブ (コード注釈またはプラグマ) をコンパイラに伝えるだけで十分なので、使用は非常に簡単です。
プラグマを使用した OpenMP の「Hello World」プログラムの例を次に示します。
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int nthreads, tid;
/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
{
/* Obtain thread number */
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
/* Only master thread does this */
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
} /* All threads join master thread and disband */
}
上記のコードのソースはOpenMP Exerciseであり、そこから他の多くの例を見つけることができます。この「Hello World」の例では、マスター スレッドは関与するスレッドの数を出力し、各スレッドはHello World from thread = xxxを出力します。
OpenACC は、C/C++ または Fortran コードの一部を GPU として接続されたアクセラレータによって高速化するように指定するコンパイラ ディレクティブのコレクションです。これは、OpenMP とほとんど同じ哲学に従っており、アクセラレータ プログラミング言語を管理する必要なく、高レベルのホスト + アクセラレータ プログラムを作成できます。たとえば、OpenACC を使用すると、既存の C/C++ コードを簡単に高速化でき、CUDA を学習する必要はありません (もちろん、パフォーマンスはいくらか低下します)。
一般的な OpenACC コードは次のようになります。
#pragma acc kernels loop gang(32), vector(16)
for (int j=1; j<n-1; j++)
{
#pragma acc loop gang(16), vector(32)
for (int i=1; i<m-1; i++)
{
Anew[j][i] = 0.25f * (A[j][i+1] + A[j-1][i]);
...
}
}
上記のソース コードは、ブログAn OpenACC Example (Part 1)から取得したもので、OpenMP と OpenACC の違いを理解するのに役立つ資料を見つけることができます。
その他のソースは以下
OpenACC API は OpenMP API とどのように関係していますか? .
Shane Cook、CUDA プログラミング、Morgan Kaufmann (第 10 章)
その性質上、OpenACC はハイブリッド CPU+GPU プログラミングを可能にします。OpenMP ディレクティブと OpenACC ディレクティブを混在させることもできます。たとえば、4 GPU システムでは、4 つの CPU スレッドを作成して、コンピューティング作業を 4 つの利用可能な GPU にオフロードできます。これはシェーン・クックの本で説明されています。ただし、OpenMP 4.0 は、接続されたアクセラレーターに作業をオフロードするためのディレクティブも予見していることに言及する必要があります。
OpenAcc と OpenMPI は、ディレクティブ ベースの並列計算を可能にします。OpenMPI は複数の CPU コアを利用しようとし、OpenAcc は GPU コアを利用しようとします。
MPI -- Message parsing Interface は、クラスター内のノード間およびノード内通信のプログラミング モデル仕様です。MPI プログラムのプロセスには、分散メモリ空間 (クラスタ) 上でプログラムを実行できるプライベート アドレス空間があります。通常、MPI はハイ パフォーマンス コンピューティングで使用され、高帯域幅で低遅延の通信プロトコル (Infiniband など) が使用されます。
CUDA や OpenMP などの並列コンピューティング テクノロジの最近の開発により、MPI は、CPU/GPU コアによって提供される並列コンピューティングを利用するための機能を仕様に追加しました。
CUDA-Aware-MPI および/またはハイブリッド プログラミング モデル (MPI + OpenMP) は既に使用されています。これは、エンド アプリケーション プログラマが、CUDA や OpenMP を明示的に処理しなくても、同じ MPI プログラムを記述できることを意味します。これにより、エンドユーザーの負担が軽減されました。
CUDA_aware-GPU のない例では、MPI_Send と MPI_Recv のコードは次のようになります。
//MPI rank 0
cudaMemcpy(s_buf_h,s_buf_d,size,cudaMemcpyDeviceToHost);
MPI_Send(s_buf_h,size,MPI_CHAR,1,100,MPI_COMM_WORLD);
//MPI rank 1
MPI_Recv(r_buf_h,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status);
cudaMemcpy(r_buf_d,r_buf_h,size,cudaMemcpyHostToDevice);
ただし、CUDA_awre_MPI を使用
//MPI rank 0
MPI_Send(s_buf_d,size,MPI_CHAR,1,100,MPI_COMM_WORLD);
//MPI rank n-1
MPI_Recv(r_buf_d,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status);
MPI ライブラリは、ホスト メモリ バッファーを GPU バッファーに変換する際の問題に対処します。