DVMH-Indirect (1158460), страница 4
Текст из файла (страница 4)
! одномерное кольцо
Neighbors(i) = 2
Neighbor(I, 1) = modulo(I, nnode) + 1
Neighbor(I, 2) = modulo(I – 2, nnode) + 1
Enddo
! Новая конструкция:
!DVM$ SHADOW fi(i) with fi(neighbor(I, 1:neighbors(i)))
!DVM$ SHADOW psi(i) with psi(neighbor(I, 1:neighbors(i)))
!DVM$ REALIGN fi(i) with neighbors(i)
!DVM$ REALIGN psi(i) with neighbors(i)
! Functions
!DVM$ PARALLEL(i) on fi(i), shadow_compute
Do I = 1, nnode
Fi(i) = 1
Psi(i) = 2
enddo
! Calculate
Do it = 1, itcount
! Jacobi iteration
!DVM$ PARALLEL(i) on psi(i), shadow_renew(fi)
Do I = 1, nnode
Psi(i) = 0
Do j = 1, neighbors(i)
Psi(i) = psi(i) + fi(neighbor(I,j)) / neighbors(i)
enddo
Enddo
!DVM$ PARALLEL(i) on fi(i), shadow_renew(psi)
Do I = 1, nnode
fi(i) = 0
Do j = 1, neighbors(i)
fi(i) = fi(i) + psi(neighbor(I,j)) / neighbors(i)
enddo
Enddo
enddo
end
Расширение языков C-DVMH и Fortran-DVMH. Текущее состояние
-
indirect-rule :: indirect ( var-name )
-
derived-rule ::= derived ( derived-elem-list with derived-templ )
-
derived-elem ::= int-range-expr
-
int-range-expr ::= прозвольное целочисленное выражение + в индексных выражениях допустимы диапазоны, использование align-dummy переменных.
-
derived-templ ::= var-name [ derived-templ-axis-spec ]...
-
derived-templ-axis-spec ::= [ ] | [ @ align-dummy [ + shadow-name ]... ] | [ int-expr ]
-
Рис. 1. Формула БНФ для новых правил распределения
-
Примеры:
-
#define N 100
-
#pragma dvm array distribute[block]
-
int map[N];
-
#pragma dvm array
-
int *A;
-
A = (int *)malloc(sizeof(int) * N);
-
#pragma dvm redistribute(A[indirect(map)])
-
#pragma dvm array
-
int *C;
-
C = (int *)malloc(sizeof(int) * 3 * N);
-
#pragma dvm redistribute(C[derived(3*i, 3*i+1, 3*i+2 with A[@i])])
-
#pragma dvm redistribute(C[derived(3*i, 3*i+1, 3*i+2 with A[i])])
-
indirect-format
is INDIRECT (array-name)
derived-format
is DERIVED (derived-elem-list) WITH derived-spec
derived-elem
is int-range-expr
int-range-expr
is align-dummy-use
derived-spec
is derived-target [(derived-subscript)]
derived-target
is array-name
derived-subscript
is int-expr
or @align-dummy[ + shadow-name ]...
-
Пример:
-
INTEGER,PARAMETER :: N=100
-
INTEGER map(N)
-
!DVM$ DISTRIBUTE map(BLOCK)
-
INTEGER,ALLOCATABLE:: A(:),C(:)
-
ALLOCATE(A(N))
-
!DVM$ REDISTRIBUTE A(INDIRECT(map))
-
ALLOCATE(C(3*N))
-
!DVM$ REDISTRIBUTE C (DERIVED(3*I,3*i+1,3*i+2) WITH A(@i))
-
!DVM$ REDISTRIBUTE C (DERIVED(3*I,3*i+1,3*i+2) WITH A(i))
-
shadow-add ::= shadow_add ( templ-name [ shadow-axis ]... = shadow-name ) [ include_to ( var-name-list ) ]
-
shadow-axis ::= [ ] | [ derived-elem-list with derived-templ ]
-
Рис. 2. Формула БНФ для задания поэлементных теневых граней
-
Пример:
-
#pragma dvm template[SZ] distribute[block]
-
void *B;
-
#pragma dvm template[SZ] distribute[derived(i-1,i,i+1 with B[@i])]
-
void *A;
-
#pragma dvm array align([i] with A[i])
-
int data[SZ];
-
int left = 2;
-
int right = 2;
-
#pragma dvm shadow_add(A[i-left with A[@i]] = "left" " 1") include_to(data)
-
#pragma dvm shadow_add(A[i+right with A[@i]] = "right") include_to(data)
-
#pragma dvm parallel([i] on A[i]) shadow_renew(data[NAM, STR(left 1)])
-
for (int i = 0; i < 0; i++) {}
-
shadow-add-directive
is SHADOW_ADD
(template-name(shadow-axis-list)=shadow-name)
[INCLUDE_TO (dist-array-list)]
shadow-axis
is (derived-elem-list) WITH derived-spec
-
localize-spec ::= localize ( ref-var-name => target-var-name [ axis-specifier ]... )
-
axis-specifier ::= [ ] | [ : ]
-
Рис. 3. Формула БНФ для директивы локализации значений индексного массива
-
Пример:
-
#pragma dvm array distribute[]
-
int ref[N];
-
#pragma dvm localize(ref => A[:])
-
#pragma dvm parallel([i] on ref[i])
-
for (int i = 0; i < N; i++) {
-
A[ref[i]] = 4;
-
}
-
localize-directive
is LOCALIZE
(ref-array-name =>target-array-name(target-subscript-list))
target-subscript
is *
or :
-
Пример:
-
INTEGER ref(N)
-
!DVM$ DISTRIBUTE ref(*)
-
!DVM$ LOCALIZE (ref=>A(:))
-
!DVM$ PARALLEL (i) ON ref(i)
-
DO i=1,N
-
A(ref(i)) = 4
-
ENDDO