HPC Magazine - OpenACC 2.0 - The new data management features

Listing 2: Dynamic offloading in OpenACC v2.0.


void doit( size_t n, struct Value * data[n] ) 
{   
  for (size_t i=0;i<n;++i) 
  {
    struct Value * data = data[i] ;
    #pragma acc enter data copyin(data[0:1]) 
  }

  for (size_t i=0;i<n;++i) 
  {       
    for (size_t j=i+1;j<n;++j) 
    {
      struct Value * data1 = data[i] ;
      struct Value * data2 = data[j] ;
      #pragma acc parallel present( data1[0:1], data2[0:1] ) 
      {
        work_on_a_pair( data1 , data2 ) ;  
      }        
    }
  } 

  for (size_t i=0;i<n;++i) 
  {
    Value * data = data[i] ;
    #pragma acc enter data copyout(data[0:1]) 
  }
}