Ես փորձում եմ արագացնել այս հանգույցը OpenMP-ի զուգահեռացման միջոցով: Ինձ մոտ այնպիսի տպավորություն էր, որ սա պետք է աշխատանքը բաժանի մի շարք թեմաների: Այնուամենայնիվ, երևի գերավճարը չափազանց մեծ է, որպեսզի դա ինձ արագացնի:
Պետք է նշեմ, որ այս օղակը շատ ու շատ անգամներ է լինում, և հանգույցի յուրաքանչյուր օրինակ պետք է զուգահեռացնել: Հանգույցի կրկնությունների թիվը՝ newNx, կարող է լինել 3-ից փոքր կամ 256-ի չափով: Այնուամենայնիվ, եթե պայմանականորեն այն զուգահեռացնեմ միայն newNx > 100-ի դեպքում (միայն ամենամեծ օղակները), այն դեռ զգալիորեն դանդաղում է:
Այստեղ կա՞ որևէ բան, որը կհանգեցնի նրան, որ դա ավելի դանդաղ կլինի, քան նախատեսված էր: Նշեմ նաև, որ A,v,b վեկտորները ՇԱՏ մեծ են, բայց հասանելիությունը O(1) է, կարծում եմ։
#pragma omp parallel for private(j,k),shared(A,v,b)
for(i=1;i<=newNx;i+=2) {
for(j=1;j<=newNy;j++) {
for(k=1;k<=newNz;k+=1) {
nynz=newNy*newNz;
v[(i-1)*nynz+(j-1)*newNz+k] =
-(v[(i-1)*nynz+(j-1)*newNz+k+1 - 2*(k/newNz)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kup+offA] +
v[(i-1)*nynz+(j-1)*newNz+ k-1+2*(1/k)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kdo+offA] +
v[(i-1)*nynz+(j - 2*(j/newNy))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jup+offA] +
v[(i-1)*nynz+(j-2 + 2*(1/j))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jdo+offA] +
v[(i - 2*(i/newNx))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + iup+offA] +
v[(i-2 + 2*(1/i))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ido+offA] -
b[(i-1)*nynz + (j-1)*newNz + k])
/A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ifi+offA];}}}
collapse
հրահանգներով: 24.10.2013