openacc vs openmp&mpi的区别?

Sid*_*427 20 cuda mpi openmp opencl openacc

我想知道openacc和openmp之间的主要区别是什么.MPI,cuda和opencl怎么样?我理解openmp和mpi之间的区别,特别是关于共享和分布式内存的部分它们是否允许混合gpu-cpu处理设置?

Jac*_*ern 32

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 */

}
Run Code Online (Sandbox Code Playgroud)

上面代码的源代码是OpenMP Exercise,您可以在其中找到许多其他示例.在这个"Hello World"示例中,主线程将输出所涉及线程的数量,而每个线程将从thread = xxx打印Hello World.

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]);
       ...
    }
}    
Run Code Online (Sandbox Code Playgroud)

上面的源代码来自博客An OpenACC示例(第1部分),您可以在其中找到一些更有用的材料来理解OpenMP和OpenACC之间的区别.

其他来源如下

OpenACC API如何与OpenMP API相关?.

OpenACC和OpenMP指令

Shane Cook,CUDA编程,Morgan Kaufmann(第10章)

由于其本质,OpenACC支持混合CPU + GPU编程.您还可以混合使用OpenMP和OpenACC指令.例如,在4 GPU系统中,您可以创建4个CPU线程,以将计算工作卸载到4个可用的GPU.这在Shane Cook书中有所描述.但是,应该提到OpenMP 4.0还预见了将工作卸载到附加加速器的指令,请参阅

有关附加加速器指令的OpenMP技术报告1

  • 所以基本上在这个时候,OpenACC 和 OpenMP 是相辅相成的。我对 OpenACC 不太了解,但我相信 OpenACC 可以生成具有 cpu-gpu 混合处理的程序,但 openMP 不能这样做(仅限于仅适用于多核机器) (2认同)
  • 现在这确实已经过时了。OpenMP 还针对 GPU 和类似设备。 (2认同)