OpenACC Tutorial - Adding directives: Difference between revisions
(Created page with "<languages /> {{Objectives |title=<translate>Learning objectives</translate> |content= <translate> * Understand the process of ''offloading'' * Understand what is an OpenACC...") |
(No difference)
|
Revision as of 14:48, 9 May 2016
- Understand the process of offloading
- Understand what is an OpenACC directive.
- Understand what is the difference between the loop and kernels directive.
- Understand how to build a program with OpenACC
- Understand what aliasing is in C/C++
- Learn how to use compiler feedback and how fix false aliasing.
Offloading to a GPU
The first thing to realize when trying to port a code to a GPU is that they do not share the same memory as the CPU. In other words, a GPU does not have direct access to the host memory. The host memory is generally larger, but slower than the GPU memory. To use a GPU, data must therefore be transferred from the main program to the GPU through the PCI bus, which has a much lower bandwidth than either memories. This means that managing data transfer between the host and the GPU will be of paramount importance. Transferring the data and the code onto the device is called offloading.
OpenACC directives
OpenACC directives are much like OpenMP directives. They take the form of pragma in C/C++, and comments in Fortran. The advantages of this method are numerous. First, since it involves very minor modifications to the code, changes can be done incrementally, one pragma at a time. This is especially useful for debugging purpose, since making a single change at a time allows one to quickly identify which change created a bug. Second, OpenACC support can be disabled at compile time. When OpenACC support is disabled, the pragma are considered comments, and ignored by the compiler. This means that a single source code can be used to compile both an accelerated version and a normal version. Third, since all of the offloading work is done by the compiler, the same code can be compiled for various accelerator types: GPUs, MIC (Xeon Phi) or CPUs. It also means that a new generation of devices only requires one to update the compiler, not to change the code.
In the following example, we take a code composed of two loops. The first one initializes two vectors, and the second performs a SAXPY, a basic vector addition operation.
C/C++ | Fortran |
---|---|
#pragma acc kernels
{
for (int i=0; i<N; i++)
{
x[i] = 1.0;
y[i] = 2.0;
}
for (int i=0; i<N; i++)
{
y[i] = a * x[i] + y[i];
}
}
|
!$acc kernels
do i=1,N
x(i) = 1.0
y(i) = 2.0
end do
y(:) = a*x(:) + y(:)
!$acc end kernels
|