Openaccとopenmpの主な違いは何だろうと思っていました。 MPI、cuda、openclはどうですか? openmpとmpiの違い、特に共有メモリと分散メモリに関する部分を理解しています。それらのいずれかでハイブリッドgpu-cpu処理セットアップが可能ですか?
OpenMPとOpenACCは、ディレクティブベースの並列プログラミングを可能にします。
OpenMPは、マルチコアCPUなどの共有メモリコンピューティングプラットフォームでの並列プログラミングを可能にします。入力ソースコードの並列バージョンの合成をトリガーする並列処理を抽出する方法に関するいくつかのディレクティブ(コード注釈、またはプラグマ)をコンパイラーに指示するだけで十分なので、非常に簡単に使用できます。
プラグマを使用したOpenMP「HelloWorld」プログラムの例は次のとおりです。
#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演習 であり、そこから他の多くの例を見つけることができます。この「HelloWorld」の例では、マスタースレッドは関連するスレッドの数を出力し、各スレッドはHello World from thread = xxxを出力します。
OpenACCは、接続されたアクセラレータによって高速化されるC/C++またはFortranコードの一部をGPUとして指定するコンパイラ指令のコレクションです。これはOpenMPとほぼ同じ哲学に従い、アクセラレータプログラミング言語を管理する必要なしに、高レベルのホスト+アクセラレータプログラムの作成を可能にします。たとえば、OpenACCを使用すると、CUDAを学習しなくても、既存のC/C++コードを簡単に高速化できます(もちろん、パフォーマンスが低下します)。
典型的な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]);
...
}
}
上記のソースコードはブログから抜粋したものです OpenACCの例(パート1) ここでは、OpenMPとOpenACCの違いを理解するためのより有用な資料を見つけることができます。
その他の情報源は次のとおりです
OpenACCAPIはOpenMPAPIとどのように関連していますか? 。
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-メッセージ解析インターフェイスは、クラスター内のノード間およびノード内通信のプログラミングモデル仕様です。 MPIプログラムのプロセスにはプライベートアドレススペースがあり、分散メモリスペース(クラスター)でプログラムを実行できます。通常、MPIはHighで使用されます。高帯域幅と低遅延の通信プロトコル(Infinibandなど)が使用されるパフォーマンスコンピューティング。
CUDAやOpenMPなどの並列コンピューティングテクノロジーの最近の開発により、MPIは、cpu/gpuコアによって提供される並列コンピューティングを利用するための機能を仕様に追加しました。
CUDA-Aware-MPIおよび/またはハイブリッドプログラミングモデル(MPI + OpenMP)はすでに使用されています。これは、エンドアプリケーションプログラマーが同じMPI CUDAまたはOpenMPを明示的に処理せずにプログラムします。これにより、エンドユーザーの負担が軽減されます。
CUDA_aware-GPUのない例の場合、MPI_SendおよびdMPI_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バッファに変換する際の懸念に対処します。
共有および分散パラダイムについて読んでください。質問は2つの大学院レベルのコースでより詳細に回答できます。実践的な学習に本当に興味がある場合は、TACC(Texas Advanced Computing Center)サマートレーニングに参加することをお勧めします。