using namespace std; #include #include #include #include #include #include typedef char* pickle_t; typedef char pickle_v; template < typename type > void subv( int n1, int n2, type *a, type *as[] ) { int i; #pragma acc kernels present(a[0:n1*n2],as[0:n1]) { as[0]= a; #pragma acc loop seq for( i=1;i void subv_cpu( int n1, int n2, type *a, type *as[] ) { int i; { as[0]= a; for( i=1;i void pckle( size_t *len, const int n, int *iref, const type *var, pickle_t buf ) { type* tmp=NULL; int i,j; size_t l= (size_t)(n*sizeof(*var)); tmp= new type[n]; #pragma acc enter data create(tmp[0:n]) #pragma acc parallel loop \ present(var[0:n],tmp[0:n],iref[0:n]) \ default(none) for( j=0;j void unpckle( size_t *len, int n, type *var, const pickle_t buf ) { size_t l= (size_t)(n*sizeof(*var)); #pragma acc host_data use_device(buf) { cudaMemcpy( (void*)var, (const void*)(buf+(*len)), l, cudaMemcpyDeviceToDevice ); } (*len)+= l; } int main(int argc, char** argv) { int iv,iq,iss,ise,nmsg,ncpu,ia,id; double *sdata,**data; double *rdata; pickle_v* sbuf; int ssize,*iref; int nq = 4; int nv = 2; size_t len; uintptr_t ***wptr; sdata = new double [nv*nq]; rdata = new double [nv*nq]; ssize= nv*nq*sizeof(sdata[0]); sbuf= new pickle_v[ssize]; data = new double *[nv]; iref = new int [nq]; subv_cpu(nv,nq,sdata,data); nmsg = 2; ncpu = 2; wptr = new uintptr_t** [nmsg]; for(id=0; id