HPC Magazine - OpenACC 2.0 - The new data management features

Listing 6: Sample I/O library using the new link feature.


//---- io.c ----

#pragma acc declare copyin(io_status, io_size) 
#pragma acc declare link(io_buffer) 
int  io_size = 0, io_status = FALSE ;
char io_buffer[10000000] ;
   
#pragma routine(io_putchar)    
void io_putchar(char c) 
{
  if ( io_status == TRUE ) {
    io_buffer[ io_size++ ] = c ;  
  } 
}
   
void io_start() 
{
  io_status = TRUE ; 
  io_size = 0 ; 
  #pragma acc update device(io_size, io_status) 
  #pragma acc enter  data create(io_buffer)
}
   
void io_stop() 
{  
  io_status = FALSE ; 
  #pragma acc update self(io_size) device(io_status) 
  #pragma acc exit data copyout(io_buffer)     
  fwrite(io_buffer, io_size, 1 , stdout) ;
}
     

//---- main.c ----

void main() 
{    
  io_start() ; 
  #pragma acc parallel 
  {
    ... 
    io_putchar('X') ;
    io_putchar('Y') ;
    io_putchar('Z') ;
    ... 
  }       
  io_stop() ;
}