OpenACC is not an island. To the contrary, OpenACC code interoperates nicely with the broader ecosystem of libraries and parallel programming languages for accelerator development. Developers may choose to do the vast majority of their application development with OpenACC, but this does not preclude them from taking advantage of the other tools within the ecosystem where it makes sense for providing maximum performance, code reuse, and productivity.
For example, developers might mix OpenACC with CUDA C or CUDA Fortran, selecting whichever model performs best on a given operation. Furthermore, OpenACC interoperability improves programmer productivity by allowing the use of common GPU libraries, such as the cuBLAS, cuRAND, and cuFFT libraries that come standard with the NVIDIA CUDA Toolkit. In short, OpenACC's interoperability means that the developer can use whichever technology works best in a given situation.
Interoperability typically takes one of two main forms. In the first, an application is accelerated primarily using OpenACC, but it needs to utilize some aspect of another programming paradigm. In this case, the data management of the application is handled using OpenACC directives. In the second, an application has been developed using another parallel programming model, such as CUDA C or CUDA Fortran, but the programmer wishes to accelerate additional parts of the application using OpenACC. In this case, the data management has typically been performed in the original parallel programming model. The mixture of programming models may not always be so black and white, but this is a convenient way to divide the samples below.