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() ; }