📄 level3.c
字号:
// PROGRAM MAIN
// PARAMETER (N=100)
// REAL X(N,N), Y(N,N)
// !HPF$ PROCESSORS P(4)
// !HPF$ TEMPLATE TX(200,200),TY(100,100)
// !HPF$ DISTRIBUTE TX(BLOCK,*) ONTO P
// !HPF$ DISTRIBUTE TY(BLOCK,*) ONTO P
// !HPF$ ALIGN X(i,j) WITH TX(2*i,2*j)
// !HPF$ ALIGN Y(i,j) WITH TY(i,j)
//
// FORALL (i=1:N,j=1:100) X(i,j) = 0
// FORALL (i=1:100,j=1:N) Y(i,j) = i + j
//
// FORALL (i=26:50,j=26:50) X(i,j) = Y(i+1,j) + Y(i,j+1)
// FORALL (i=1:100:2,j=1:N:2,X(i,j)/=0) X(i,j) = 1
//
// CALL FOO(X(1:100:2,1))
//
// PRINT *, (X(i,1),i=1,100,2)
// END
//
// SUBROUTINE FOO(X)
// REAL X(50)
// !HPF$ INHERIT X
// REAL Y(50)
// !HPF$ PROCESSORS P(4)
// !HPF$ DISTRIBUTE Y(BLOCK) ONTO P
//
// FORALL (i=1:50) Y(i) = 2
// FORALL (i=1:50) X(i) = Y(i) + 1
//
// RETURN
// END
#include "ad++.h"
#include "admacros.h"
void foo(Array1<float> x) ;
void main(int argc, char* argv[]) {
AdlibInit(argc, argv) ;
const int n = 100 ;
Procs1 p(4) ;
on(p) {
Range itx(200, p.dim(0), BLK) ;
Range jty(200) ;
Range ix = itx.subrng(n, 1, 2) ;
Range jx = jty.subrng(n, 1, 2) ;
Array2<float> x(ix, jx) ;
Range iy(100, p.dim(0), BLK) ;
Range jy(100) ;
Array2<float> y(iy, jy) ;
// X (i, j) = 0
where(ix) {
where(jx) {
x(ix, jx) = 0 ;
} erewh(jx) ;
} erewh(ix) ;
// Y (i, j) = i + j
where(iy) {
where(jy) {
y(iy, jy) = iy + 1 + jy + 1 ;
} erewh(jy) ;
} erewh(iy) ;
// X (i, j) = Y (i + 1, j) + Y(i, j + 1)
Range itmp1 = ix.subrng(25, 25) ;
Range jtmp1 = jx.subrng(25, 25) ;
Array2<float> tmp1(itmp1, jtmp1), tmp2(itmp1, jtmp1) ;
remap(tmp1, y.sect(iy.subrng(25, 26), jy.subrng(25, 25))) ;
remap(tmp2, y.sect(iy.subrng(25, 25), jy.subrng(25, 26))) ;
where(itmp1) {
where(jtmp1) {
x(itmp1, jtmp1) = tmp1(itmp1, jtmp1) + tmp2(itmp1, jtmp1) ;
} erewh(jtmp1) ;
} erewh(itmp1) ;
// X(i,j) = 1
Range itmp2 = ix.subrng(50, 0, 2) ;
Range jtmp2 = jx.subrng(50, 0, 2) ;
where(itmp2) {
where(jtmp2) {
if(x(itmp2, jtmp2) != 0)
x(itmp2, jtmp2) = 1 ;
} erewh(jtmp2) ;
} erewh(itmp2) ;
// CALL FOO(X(1:100:2,1))
foo(x.sect(ix.subrng(50, 0, 2), jx(0))) ;
// PRINT *, (X(i,1),i=1,100,2)
aprintf("%12.2f\n", x.sect(ix.subrng(50, 0, 2), jx(0))) ;
} no(p) ;
AdlibFinalize() ;
}
void foo(Array1<float> x) {
Group q = x.grp() ;
Range ix = x.rng(0) ;
Procs1 p(4) ;
Range iy(50, p.dim(0), BLK) ;
Array1<float> y(p, iy) ;
// Y(i) = 2
on(p) {
where(iy) {
y(iy) = 2 ;
} erewh(iy) ;
} no(p) ;
// X(i) = Y(i) + 1
Array1<float> tmp1(q, ix) ;
remap(tmp1, y) ;
on(q) {
where(ix) {
x(ix) = tmp1(ix) + 1 ;
} erewh(ix) ;
} no(q) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -