How does the OpenACC API relate to the OpenMP API?

The OpenMP API was adopted in the mid-1990s in response to efforts by multiple system vendors to define a standard for multi-threaded programming of symmetric multiprocessor (SMP) systems. At the time, systems had relatively few processing cores (two to 32 processors). With the development of CUDA and OpenCL, access to massively parallel many-core GPUs for general purpose computing became practical. Several high-level directive based models for these systems quickly followed. Much like SMP in the 1990s, users and vendors recognized the need for a directive-based many core parallel programming standard. Cray, PGI and NVIDIA, along with CAPS, formed the OpenACC standards organization ( in 2010.

There were two primary reasons why the OpenACC standards group was established to address this need instead of relying on the existing OpenMP Architecture Review Board (ARB). First, due to its existing commitments, the OpenMP ARB was not able to take up the issue in a timely manner. Second, the rapid rate of accelerator innovation made it neccessary for the specification to adapt quickly, something much easier for a small focused group of four members than for the diverse 17-member (now 28 member) ARB. In the inverval since the founding of OpenACC, the OpenMP specification has been extended to include support for coprocessors, which have much more in common with SMP systems than GPUs. While work continues (the creators of the OpenACC API are all members of the OpenMP Working Group on Accelerators), efforts so far to include support for GPUs in the OpenMP specification are -- in the opinions of many involved -- at best insufficent, and at worst misguided.

Today, OpenACC and OpenMP are complements to each other, much like OpenMP and MPI. The OpenACC API is defined -- and has been demonstrated to be -- interoperable with OpenMP.