⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 level3.c

📁 shpf 1.9一个并行编译器
💻 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 + -