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之间的区别.
其他来源如下
Shane Cook,CUDA编程,Morgan Kaufmann(第10章)
由于其本质,OpenACC支持混合CPU + GPU编程.您还可以混合使用OpenMP和OpenACC指令.例如,在4 GPU系统中,您可以创建4个CPU线程,以将计算工作卸载到4个可用的GPU.这在Shane Cook书中有所描述.但是,应该提到OpenMP 4.0还预见了将工作卸载到附加加速器的指令,请参阅