110 likes | 243 Views
Убрзавање алгоритама базираних на Gross Pitaevskii једначини (домен реалних бројева). Саша Стојановић Вељко Милутиновић stojsasa@etf.bg.ac.rs vm@etf.bg.ac.rs. Дио кода који треба убрзати. for( cnti = 0; cnti < Nrun ; cnti ++) { calcnu (psi); calclux (psi, cbeta );
E N D
Убрзавање алгоритама базираних наGross Pitaevskiiједначини(домен реалних бројева) Саша СтојановићВељко Милутиновић stojsasa@etf.bg.ac.rsvm@etf.bg.ac.rs
Дио кода који треба убрзати for(cnti = 0; cnti < Nrun; cnti ++) { calcnu(psi); calclux(psi, cbeta); calcluy(psi, cbeta); calcluz(psi, cbeta); calcnorm(&norm, psi, tmpxi, tmpyi, tmpzi); }
Функција calcnu void calcnu(double ***psi) { long cnti, cntj, cntk; double psi2, psi2lin, tmp; for(cnti = 0; cnti < Nx; cnti ++) { for(cntj = 0; cntj < Ny; cntj ++) { for(cntk = 0; cntk < Nz; cntk ++) { psi2 = psi[cnti][cntj][cntk] * psi[cnti][cntj][cntk]; psi2lin = psi2 * Nlin; tmp = dt * (pot[cnti][cntj][cntk] +psi2lin); psi[cnti][cntj][cntk] *= exp(- tmp); } } } return; }
Функција calclux (calcluyи calcluz су сличне) void calclux(double ***psi, double *cbeta) { long cnti, cntj, cntk; double c; for(cntj = 0; cntj < Ny; cntj ++) { for(cntk = 0; cntk < Nz; cntk ++) { cbeta[Nx - 2] = psi[Nx - 1][cntj][cntk]; for (cnti = Nx - 2; cnti > 0; cnti --) { c = - Ax * psi[cnti + 1][cntj][cntk] + Ax0r * psi[cnti][cntj][cntk] – Ax * psi[cnti - 1][cntj][cntk]; cbeta[cnti - 1] = cgammax[cnti] *(Ax * cbeta[cnti] - c); } psi[0][cntj][cntk] = 0.; for (cnti = 0; cnti < Nx - 2; cnti ++) { psi[cnti + 1][cntj][cntk] = calphax[cnti] * psi[cnti][cntj][cntk] + cbeta[cnti]; } psi[Nx - 1][cntj][cntk] = 0.; } } return; }
Проблем приступа подацима Смјер податакау меморији calclux calcluy calcluz Редослијед приступа унутар bursta читање читање упис упис читање упис
Редослијед обраде података PSI[0] PSI[1] … PSI[N-3] PSI[N-2] PSI[N-1] OP OP … OP OP cbeta[0] cbeta[1] cbeta[N-3] cbeta[N-2] … 0 OP’ OP’ … OP’ OP’ 0 PSI[0] PSI[1] PSI[2] … PSI[N-3] PSI[N-2] PSI[N-1]
Проблем искоришћености пајплајна 0 0 X[0,0] X[0,1] [0,0] [7,0] [6,0] [5,0] [4,0] [3,0] [2,0] [1,0] [0,0] [0,1][7,0] [6,0] [5,0] [4,0] [3,0] [2,0] [1,0] R[0,0] R[0,0] R[0,0]
Проблем приступа подацима Смјерприступа подацима у меморији calclux calcluy calcluz Редослијед приступа унутар bursta … … …
Функција calcnorm void calcnorm(double *norm, double ***psi, double *tmpx, double *tmpy, double *tmpz) { long cnti, cntj, cntk; for(cnti = 0; cnti < Nx; cnti ++) { for(cntj = 0; cntj < Ny; cntj ++) { for(cntk = 0; cntk < Nz; cntk ++) { tmpz[cntk] = psi[cnti][cntj][cntk] * psi[cnti][cntj][cntk]; } tmpy[cntj] = simpint(dz, tmpz, Nz); } tmpx[cnti] = simpint(dy, tmpy, Ny); } *norm = sqrt(simpint(dx, tmpx, Nx)); for(cnti = 0; cnti < Nx; cnti ++) { for(cntj = 0; cntj < Ny; cntj ++) { for(cntk = 0; cntk < Nz; cntk ++) { psi[cnti][cntj][cntk] /= *norm; } } } return;}